跳转到正文
生产环境文档契约 1.5.169
正在核对线上版本…

等待结果 ​

采集是异步的。平台会主动回调通知结果; 本页的两个查询接口是兜底手段,用于回调丢失、客户端重启补偿或人工排查。

轮询间隔

查询间隔不得低于 15 秒,建议 15–30 秒。不要用页面进度百分比作为业务判断依据。

订单查询 ​

GET /api/v1/channel/orders/{external_order_id}

返回该业务订单最近一轮授权的整体状态。

bash
curl -sS "$RPA_BASE_URL/api/v1/channel/orders/BANK-20260812-0001" \
  -H "X-Channel-Key: $RPA_CHANNEL_KEY"

订单状态一览 ​

state含义是否结束
CONNECT等待用户提交授权否
PROCESS排队、采集、校验、上传或准备本单交付结果中否
INTERACTION等待短信或图形验证码否
SUCCESS采集及本单结果准备完成是
ERROR授权、采集、结果生成或订单核验失败,或已取消、未提交授权已过期是;恢复方式需按原因判断

SUCCESS 可能带质量警告

税务某个非阻断子项目超时、来源不足或记录不完整时,平台会保留已取得的数据继续处理。 订单仍可为 SUCCESS,同时返回 qualityStatus=WARNING、 collectionResult=COMPLETED_WITH_WARNINGS。因此还要读取 dataQuality 和 qualityIssues,不能把 SUCCESS 直接解释成“所有来源都完整”。

授权端的进度提示 ​

“授权成功”表示身份验证完成,采集和结果准备可能仍在进行。页面显示部分完成或待核验时,应查看质量说明;报告生成中则等待报告自身状态结束。

“取消处理中”表示取消请求已提交,仍须等待执行节点确认。只有返回最终取消或失败状态,才表示本轮已经结束;终态不能继续解释为等待授权或普通采集进度。恢复或重新授权按页面的具体操作提示执行。

客户提示 ​

从 API 1.5.169 起,订单查询统一补齐以下提示。

订单查询复用现有三个展示字段,覆盖授权、排队、验证、采集、核验、报告、取消和过期。三个字段只用于展示;程序继续根据原有 state、processCode、errorCode、recoveryAction 和报告状态判断业务结果。

字段含义
customerTitle当前最需要关注的情况,例如“收入交叉核验未通过”“报告生成中”“订单已取消”
customerMessage具体原因或进度;收入核验保留实际比较期间、金额和差异率
customerGuidance下一步操作;无需客户操作时为 null

提示按当前授权代次及执行批次生成。多个问题由主提示概括,完整明细继续读取 qualityIssues、dataQuality、collectionPresentation、revenueCheck、pdfReports 和 htmlReports。采集完成、核验结果和报告就绪分别判断;未生成完全部所选报告时不提示“数据和报告已就绪”。内部诊断文字不复制到这三个展示字段,客户页面不应直接展示原始 reason。

未提交授权的取消、过期仍按原规则返回订单状态;已经撤销资料权限或超过资料保留期时,继续返回 HTTP 410,原 code、message 和期限字段不变,在 details 内补充同名三个提示字段,不返回资料或下载地址。例如:

json
{
  "code": "ORDER_DATA_ACCESS_REVOKED",
  "message": "Order data access was revoked",
  "details": {
    "customerTitle": "订单已取消",
    "customerMessage": "本次订单已终止,不会继续采集。",
    "customerGuidance": null
  }
}

示例省略了原有期限字段。HTTP 200 时从响应顶层读取提示;SM4 订单先按原协议解密,再读取提示。HTTP 410 时从 details 读取提示。401、403、404 保持原有处理规则,不提供其他渠道订单的信息。

兼容范围:请求参数、HTTP 状态、原有业务字段与数据结构、加密信封均不变。老客户可继续使用原有接口逻辑;已经展示这三个字段的页面会获得补齐后的提示,尚未读取这些字段的页面需要增加展示代码。此次统一提示仅作用于订单查询,不改变产品查询和回调的既有返回。

四个编号 ​

响应里有四个标识,作用各不相同,建议在自己的数据库里全部存一份:

字段作用
external_order_id客户业务订单号
authorization_code当前这轮授权的编号。只有平台创建新一轮授权时才变化;通过原授权页重新录入凭据会沿用它
job_id采集任务标识。这就是数据接口里的 orderNo
attempt_id当前采集尝试。平台系统重试或原授权页重新录入凭据后会变化,job_id 不变

用 attempt_id 区分两类重试

job_id 不变、attempt_id 变化 = 同一任务进入新的执行尝试,客户端继续跟踪即可。 authorization_code 变化 = 平台创建了新的授权代次;不要仅凭是否需要用户重新录入凭据 来推断它一定变化。

响应示例 ​

json
{
  "external_order_id": "BANK-20260812-0001",
  "authorization_code": "550e8400-e29b-41d4-a716-446655440000",
  "job_id": "1e3f2f55-8da4-4ba9-b941-84860eb1d243",
  "attempt_id": "a2ad4ec4-b878-42c5-b623-4d962f350e72",
  "state": "SUCCESS",
  "dataDeliveryMode": "STRUCTURED",
  "invoice_period": "LAST_36_MONTHS",
  "invoice_period_label": "近36个月",
  "invoice_start_date": "2023-08-12",
  "invoice_end_date": "2026-08-12",
  "result": {},
  "qualityStatus": "PASSED",
  "qualityIssues": [],
  "collectionResult": "COMPLETED",
  "dataQuality": {},
  "artifacts": [],
  "authorizationExpiresAt": "2026-08-12 18:30:00",
  "publicResultAccessDays": 7,
  "publicAccessExpiresAt": "2026-08-19 18:41:07",
  "dataRetentionDays": 30,
  "dataAccessExpiresAt": "2026-09-11 18:41:07",
  "updated_at": "2026-08-12T10:41:07"
}

访问期限 ​

订单同时返回 authorizationExpiresAt、publicAccessExpiresAt、dataAccessExpiresAt 以及实际采用的分享和资料保留天数。截止时间按北京时间 YYYY-MM-DD HH:mm:ss 解析;后两项在尚未就绪或历史订单上可为 null,不代表永久可访问。

资料到期后查询返回 410 ORDER_DATA_ACCESS_EXPIRED,details 中保留这五项期限信息。完整规则见期限说明。

质量字段 ​

字段常见值处理方式
qualityStatusPASSED / WARNING / UNVERIFIED作为整体质量结论保存
collectionResultCOMPLETED / COMPLETED_WITH_WARNINGS后者表示已有数据可用,但存在非阻断问题
qualityIssues问题对象数组保存问题代码、严重度及可重试提示
dataQuality覆盖率、partial、usable、问题与隔离制品用于判断具体缺失范围,不要只看顶层状态

非阻断缺口会保留已取得的数据;必需主表缺失、分页或完成清单不一致仍会阻止成功交付。 税局账号锁定、会话失效和浏览器启动失败的处理不同,应按授权页与产品错误提示恢复, 不要对所有失败循环提交账号密码。

授权过期与结果准备 ​

新建且未提交的授权到期后,查询仍使用 state=ERROR,增量包含:

字段返回值
processCodeAUTHORIZATION_EXPIRED
errorCodeAUTHORIZATION_EXPIRED
reason客户可见的授权过期说明

这三个字段不保证出现在其他状态中,也没有新增过期回调。重新生成规则见 未提交授权到期。 采集完成后,如果本单输出仍在准备,订单继续为 PROCESS;不能仅凭 Worker 已结束就取数。

开启详版、简版在线报告,或申请 TAX_RISK 时,响应会增量包含 htmlReports; 通过 pdf_report_types 申请报告时,响应会同时增量包含 pdfReports,未申请则省略该字段。 选择 WORKER_RAW 时,artifacts 会列出原始文件及其 downloadUrl。

订单不存在时返回 404 CHANNEL_ORDER_NOT_FOUND。

收入交叉核验与交付失败 ​

订单响应的 revenueCheck 是本单当前批次已保存的收入核验结果,尚无结果时为 null。渠道可由平台开启此项核验,不需要客户在授权请求中增加参数。

revenueCheck.status含义
DISABLED本次核验未开启
PASSED已有可比较期间,差异率绝对值均低于 40%
UNVERIFIED采集范围、覆盖或金额不足,无法形成可靠比较,不表示通过
FAILED至少一个可比较期间的差异率绝对值达到 40%
ERROR核验执行异常

比较只采用税务和发票共同覆盖的完整申报期间,按实际采集的增值税申报收入与销项发票未税净额计算;不把缺失金额填零,也不因缺少导出查询总数直接判为收入差异。rows 保留各期金额和差异,failedPeriods 列出未通过期间,jobId、attemptId 标识核验批次。

核验未通过时,订单 state=ERROR,并返回 errorCode=VAT_INVOICE_REVENUE_MISMATCH、recoveryAction=REAUTHORIZE,须按平台入口重新授权采集;核验异常为 REVENUE_CHECK_ERROR、CONTACT_SUPPORT。这两种情况不会改写已取得的采集证据,不能因单个产品仍有可用数据就把整单判为成功。

采集成功而本单必需产物最终生成失败时,订单也会为 ERROR。请保留 pdfReports 等实际结果并联系平台处理,不能对所有此类错误重新授权。processCode、errorCode、recoveryAction 仅在契约声明的具体情形返回,不是所有失败都保证带齐。

PDF 报告状态与下载 ​

在支持 pdfReports 的部署中,一次订单查询即可同时获取在线 HTML 与可下载 PDF 报告信息:

字段含义
pdfReports.statusPENDING、SUCCEEDED、PARTIAL、FAILED
pdfReports.reports[]本单申请的每份报告;未生成时也会返回 PENDING 项
pdfReports.reports[].status单份状态:PENDING、QUEUED、RUNNING、SUCCEEDED、FAILED
pdfReports.reports[].downloadUrl / pdfDownloadUrl同一个 PDF 签名下载地址,生成成功后返回
pdfReports.reports[].htmlDownloadUrl同源 HTML 文件的签名下载地址
pdfReports.reports[].errorCode / errorMessage最终失败的错误信息

每份报告还包含文件名、大小、SHA-256 和 PDF 页数,完整示例见 PDF 与 HTML 报告。 报告异步生成,需独立检查 pdfReports,不能仅凭订单 state 判断 PDF 已可下载。 尚未完成时继续按 15–30 秒间隔查询订单;下载链接过期后也通过订单查询刷新。

旧报告状态接口计划弃用

POST /api/channel/data/reports/status 当前保留兼容,具体下线时间另行通知。 目标环境支持 pdfReports 后,新接入方统一使用订单查询,已有客户端将旧响应的 data 改为读取 pdfReports。 PDF 与 HTML 文件下载接口继续保留,详见迁移说明。

产品查询 ​

GET /api/v1/channel/orders/{external_order_id}/products/{product}

product 只允许 TAX 或 INVOICE。按产品分别返回采集状态、数据集清单与质量信息。

bash
curl -sS "$RPA_BASE_URL/api/v1/channel/orders/BANK-20260812-0001/products/INVOICE" \
  -H "X-Channel-Key: $RPA_CHANNEL_KEY"

取数前提 ​

两个条件缺一不可

state == "SUCCEEDED"  &&  available == true

只满足其一都不能取数。

这两个条件表示产品结果可以交付。若 qualityStatus=WARNING 或 collectionResult=COMPLETED_WITH_WARNINGS,仍需把质量明细与业务数据一起落库, 由下游按可接受的覆盖范围决定是否继续。

state含义是否结束
PENDING还没有最终结果(排队中或采集中)否
SUCCEEDED该产品采集完成是
FAILED该产品最终失败是
SKIPPED本单未执行该产品是

retryable 说明该失败是否可由平台自动重试; error_code / error_message 给出失败原因。

响应示例 ​

json
{
  "external_order_id": "BANK-20260812-0001",
  "authorization_code": "550e8400-e29b-41d4-a716-446655440000",
  "job_id": "1e3f2f55-8da4-4ba9-b941-84860eb1d243",
  "attempt_id": "a2ad4ec4-b878-42c5-b623-4d962f350e72",
  "product": "INVOICE",
  "dataDeliveryMode": "STRUCTURED",
  "state": "SUCCEEDED",
  "available": true,
  "dataset_count": 4,
  "record_count": 2841,
  "qualityStatus": "PASSED",
  "qualityIssues": [],
  "datasets": [
    { "id": "ds-0001", "name": "发票基础信息", "product": "invoice", "row_count": 1204 }
  ],
  "artifacts": [],
  "error_code": null,
  "error_message": null,
  "retryable": false,
  "available_at": "2026-08-12T10:41:07Z"
}

常见错误 ​

HTTPcode含义
404CHANNEL_ORDER_NOT_FOUND订单不存在
404PRODUCT_NOT_REQUESTED本单未申请该产品
422INVALID_PRODUCTproduct 不是 TAX / INVOICE

PDF 状态不在这里

PDF 报告状态不通过产品接口查询,应读取订单查询响应的 pdfReports,见 PDF 与 HTML 报告。

推荐的等待策略 ​

mermaid
flowchart TD
  A[收到 authorization_url] --> B[等待回调]
  B -->|收到最终结果回调| C[验证签名 + 按 event_id 去重入库]
  B -->|超时未收到| D[轮询订单查询, 间隔 15-30 秒]
  D -->|state 未结束| D
  D -->|state = SUCCESS| E[逐产品查询]
  C --> E
  E -->|SUCCEEDED 且 available| F[取数]
  E -->|FAILED| G[读 error_code 决定重试或转人工]

文档契约 API 1.5.169