Skip to content

业务回调

场景:服务商通过此接口配置回调参数,当数字农人产生交易的时候,将通过回调地址回推给到服务商。

通用回调协议

适用于所有回调类型的统一接口规范。

  • 请求方式:POST
  • Content-Type:application/json
  • 请求超时:30 秒
  • 请求头serviceid — 服务商 ID,用于身份识别

请求结构体

所有回调请求都采用统一的包装格式。请求体已进行 SM2 加密处理,接收方需要先解密后再进行业务处理。同时请求包含 SM2 签名,需要进行验签以确保数据完整性。

json
{
  "timestamp": 1704067200000,
  "callbackType": "ORDER_STATUS_CHANGE",
  "appId": "12345",
  "callbackId": "cb_20240101120000_abc123",
  "data": "{具体业务数据的JSON字符串}",
  "requestId": "req_20240101120000_xyz789",
  "taskCreateTimestamp": 1704067000000
}

通用字段说明

字段类型必填说明
timestampString回调时间戳(毫秒)
callbackTypeString回调类型标识,详见业务回调规范
appIdString应用 ID
callbackIdString回调唯一标识,用于幂等判断
dataString业务数据 JSON 字符串,具体结构见各业务回调规范
requestIdString请求追踪 ID
taskCreateTimestampString回调任务创建时间戳(毫秒),此时间在任务创建时确定,重试过程中不会变化

通用响应协议

返回以下格式的响应:

json
{
  "code": 0,
  "message": "处理成功",
  "data": null,
  "logId": "log_20240101120000_001"
}
字段类型必填说明
codeInteger响应码,0 表示成功,非 0 表示失败
messageString响应消息
dataObject响应数据,可为 null
logIdString日志 ID,用于问题排查

成功判定条件

  • HTTP 状态码为 2xx
  • 响应体中 code 字段值为 0

重试机制

项目说明
重试触发当回调失败时(HTTP 非 2xx 状态码或响应 code 非 0)自动触发重试
重试次数最大重试 13 次
重试策略采用指数退避策略,跨越 7 天周期
重试间隔1, 2, 4, 8, 16, 32, 60, 120, 240, 480, 1440, 2880, 4320 分钟
重试停止达到最大重试次数后停止重试

业务回调规范

企业注册审核结果回调

触发场景:当企业入驻申请审核完成后(无论审核通过还是失败),系统将通过回调通知服务商审核结果。

callbackTypeCUSTOMER_APPLY_AUDIT

data 字段业务数据结构

字段类型必填说明
nameString企业名称
creditCodeString社会信用代码
statusString审核状态,详见审核状态枚举
failReasonString审核失败原因,仅当 status 为 FAIL 时有值

审核状态枚举

说明
SUCCESS审核通过
FAIL审核失败

回调示例

json
{
  "timestamp": 1704067200000,
  "callbackType": "CUSTOMER_APPLY_AUDIT",
  "appId": "12345",
  "callbackId": "cb_20240101120000_audit001",
  "data": "{\"name\":\"XX科技有限公司\",\"creditCode\":\"91110000000000000X\",\"status\":\"SUCCESS\",\"failReason\":null}",
  "requestId": "req_20240101120000_audit001",
  "taskCreateTimestamp": 1704067000000
}

成功响应示例

json
{
  "code": 0,
  "message": "审核结果处理成功",
  "data": null,
  "logId": "log_20240101120000_001"
}

失败响应示例

json
{
  "code": 1001,
  "message": "企业信息不存在",
  "data": null,
  "logId": "log_20240101120000_002"
}

订单状态变更回调

触发场景:当订单的支付状态或发票状态发生变化时触发此回调。

callbackTypeORDER_STATUS_CHANGE

data 字段业务数据结构

字段类型必填说明
orderNoString内部订单编号
externalOrderNoString外部订单编号(服务商侧订单号)
payStatusLong订单支付状态,详见支付状态枚举
payMessageString支付错误信息,成功时为 null
invoiceStatusLong开票状态,详见发票状态枚举
invoiceMessageString开票错误信息,成功时为 null
canceledBoolean订单是否取消,true 表示已取消,false 表示未取消

支付状态枚举

状态码状态名称说明
0待支付订单创建,等待支付
1已支付支付成功
3支付失败支付失败
4支付中正在支付处理中
5待收款方确认等待收款方确认支付

发票状态枚举

状态码状态名称说明
0待开票等待开具发票
1开票中正在开具发票
2已开票发票开具成功
3开票失败发票开具失败
4红冲中正在进行红冲处理
5已红冲红冲处理完成
6红冲失败红冲处理失败

回调示例

json
{
  "timestamp": 1704067200000,
  "callbackType": "ORDER_STATUS_CHANGE",
  "appId": "12345",
  "callbackId": "cb_20240101120000_abc123",
  "data": "{\"orderNo\":\"PO2024010112345\",\"externalOrderNo\":\"EXT20240101001\",\"payStatus\":1,\"payMessage\":null,\"invoiceStatus\":2,\"invoiceMessage\":null,\"canceled\":false}",
  "requestId": "req_20240101120000_xyz789"
}

成功响应示例

json
{
  "code": 0,
  "message": "订单状态更新成功",
  "data": null,
  "logId": "log_20240101120000_001"
}

失败响应示例

json
{
  "code": 1001,
  "message": "订单不存在",
  "data": null,
  "logId": "log_20240101120000_002"
}

事中风控事件回调

触发场景:当服务商绑定的企业触发事中风控策略命中时,推送事中风控事件信息给服务商。仅向已绑定该企业的服务商推送。

callbackTypeCURRENT_EVENT_RISK

data 字段业务数据结构

字段类型必填说明
riskEventNoString风控事件编号
customerNameString采购商名称
customerCreditCodeString社会统一信用代码(税号)
supplierNameString农户姓名
supplierPhoneString手机号
transactionProductNameString交易商品名称
transactionAmountNumber交易金额
decisionTypeEnum处理方式,详见处理方式枚举
strategyNameString触发风险(风险指标名称)
occurrenceTimeString风控时间

处理方式枚举

说明
REMIND提醒
WARN预警
BLOCK阻断

回调示例

json
{
  "timestamp": 1709618400000,
  "callbackType": "CURRENT_EVENT_RISK",
  "appId": "12345",
  "callbackId": "cb_20260305143025_abc123",
  "data": "{\"riskEventNo\":\"R20260305143025123456789\",\"customerName\":\"XX农业公司\",\"customerCreditCode\":\"91110000XXXXXXXXXX\",\"supplierName\":\"张三\",\"supplierPhone\":\"13800138000\",\"transactionProductName\":\"玉米\",\"transactionAmount\":5000.00,\"decisionType\":\"WARN\",\"strategyName\":\"单笔交易金额异常\",\"occurrenceTime\":\"2026-03-05 14:30:25\"}",
  "requestId": "req_20260305143025_xyz789"
}

成功响应示例

json
{
  "code": 0,
  "message": "风控事件处理成功",
  "data": null,
  "logId": "log_20260305143025_001"
}

失败响应示例

json
{
  "code": 1001,
  "message": "风控事件处理失败",
  "data": null,
  "logId": "log_20260305143025_002"
}

事后风控事件回调

触发场景:当服务商绑定的企业触发事后风控策略命中时,推送事后风控事件信息给服务商。仅向已绑定该企业的服务商推送。

callbackTypeAFTER_EVENT_RISK

data 字段业务数据结构

字段类型必填说明
riskEventNoString风控事件编号
purchaseOrderNoString采购订单号(异常采购商没有则为空)
customerNameString采购商名称
customerCreditCodeString社会统一信用代码(税号)
orderAmountNumber订单金额(异常采购商没有则为空)
riskLevelEnum风险等级,详见风险等级枚举
processStatusEnum处理状态(工单状态),详见处理状态枚举
strategyNameString触发风险(风险指标名称)
riskTimeString风控时间

风险等级枚举

说明
HIGH高风险
MIDDLE中风险
LOW低风险

处理状态枚举

说明
TO_DO待处理
DOING处理中
DONE已完成

回调示例

json
{
  "timestamp": 1709618400000,
  "callbackType": "AFTER_EVENT_RISK",
  "appId": "12345",
  "callbackId": "cb_20260305150000_def456",
  "data": "{\"riskEventNo\":\"123456789\",\"purchaseOrderNo\":\"PO2026030500001\",\"customerName\":\"XX农业公司\",\"customerCreditCode\":\"91110000XXXXXXXXXX\",\"orderAmount\":5000.00,\"riskLevel\":\"HIGH\",\"processStatus\":\"TO_DO\",\"strategyName\":\"采购金额异常\",\"riskTime\":\"2026-03-05 15:00:00\"}",
  "requestId": "req_20260305150000_abc789"
}

成功响应示例

json
{
  "code": 0,
  "message": "风控事件处理成功",
  "data": null,
  "logId": "log_20260305150000_001"
}

失败响应示例

json
{
  "code": 1001,
  "message": "风控事件处理失败",
  "data": null,
  "logId": "log_20260305150000_002"
}