Skip to content

代收接口文档

本文档只说明代收商户开放接口。所有平台接口均使用 POST 请求,请求体为 application/json,字符编码为 UTF-8

1. 接口基础信息

项目内容
请求方式POST
Content-Typeapplication/json
字符编码UTF-8

如果请求使用 application/x-www-form-urlencodedmultipart/form-data 或其它格式,平台会按参数校验失败处理。

2. 通用参数

2.1 通用请求参数

字段类型是否必填说明
mchNostring商户号,由平台分配
reqTimeint6413 位毫秒时间戳,请求时间允许前后 5 分钟误差
signstringMD5 大写签名,见签名算法

2.2 通用响应结构

字段类型说明
codeint32响应码,只有 0 表示接口成功,其它均表示失败
msgstring响应说明,成功时为 SUCCESS
signstring响应签名;仅成功响应返回
dataobject业务数据;失败响应不返回

平台以 code 判断接口是否调用成功:只有 code=0 表示成功,其它 code 均表示接口失败。对于代收下单接口,code0 时表示订单创建失败,商户不得按该响应继续展示支付页面链接或更新为成功订单。

成功响应示例:

json
{
  "code": 0,
  "msg": "SUCCESS",
  "sign": "MD5_UPPER_SIGN",
  "data": {}
}

失败响应示例:

json
{
  "code": 200026,
  "msg": "签名验证失败"
}

3. 代收下单

商户创建代收订单。平台受理成功后返回平台代收订单号、订单状态和支付页面链接。

重要提示:发起代收下单时,可能因产品配置的匹配浮动范围影响,出现未匹配到当前下单金额支付页面链接的情况。平台可能提供其它金额的支付页面链接供用户付款,因此最终付款金额、查单结果或异步通知金额可能与商户下单金额不一致,商户给用户展示的付款金额及后续入账金额请以平台返回的 payableAmount 和异步通知金额为准!

3.1 接口地址

项目内容
URL/api/v1/collection/order
请求方式POST
Content-Typeapplication/json

3.2 请求参数

字段类型是否必填说明
mchNostring商户号
mchOrderNostring商户代收订单号,建议商户侧全局唯一
userIdstring商户侧用户 ID,字符串,例如 user-001;参与请求签名
channelCodestring代收产品编码,商户后台-API管理-代收通道页面查询获取
amountstring期望金额,金额字符串,例如 100.00
clientIpstring终端用户 IPv4 地址
notifyUrlstring异步通知地址,必须是公网可访问的 httphttps 地址
returnUrlstring商户跳转地址预留字段;如传入,会参与请求签名
extParamstring商户扩展参数,查单时原样返回
reqTimeint6413 位毫秒时间戳
signstringMD5 大写签名

3.3 请求示例

json
{
  "mchNo": "10001",
  "mchOrderNo": "COL202609110001",
  "userId": "user-001",
  "channelCode": "BANK_CARD",
  "amount": "100.00",
  "clientIp": "203.0.113.10",
  "notifyUrl": "https://merchant.example.com/notify/collection",
  "returnUrl": "https://merchant.example.com/payment/result",
  "extParam": "vip10001",
  "reqTime": 1789051200000,
  "sign": "5493647C63D2C9950566ED7E40538F64"
}

3.4 成功响应

json
{
  "code": 0,
  "msg": "SUCCESS",
  "sign": "MD5_UPPER_SIGN",
  "data": {
    "payOrderId": "CO20260911000001",
    "mchOrderNo": "COL202609110001",
    "amount": "100.00",
    "payableAmount": "99.40",
    "adjustmentAmount": "-0.60",
    "payDataType": "payUrl",
    "payData": "https://pay.example.com/collection/pay?mchOrderNo=COL202609110001",
    "orderState": 3,
    "createdAt": 1789051200000
  }
}

3.5 data 字段

字段类型说明
payOrderIdstring平台代收订单号;正式单返回
mchOrderNostring商户代收订单号
amountstring期望金额,金额字符串,例如 100.00
payableAmountstring实际应付金额,金额字符串,例如 99.40
adjustmentAmountstring实际应付金额与期望金额的差额,金额字符串,例如 -0.60
payDataTypestring支付页面链接类型,当前为 payUrl
payDatastring支付页面链接;商户将该链接展示或跳转给付款用户
orderStateint32订单状态,见下方订单状态说明
createdAtint64创建时间,13 位毫秒时间戳

payData 是字符串字段。商户需要先按普通字符串验签;当 payDataType=payUrl 时,payData 即为完整支付页面链接,请原样展示或跳转,不要重新拼接、截断或转义后再使用。

3.6 未获得支付页面链接的响应

代收下单未获得支付页面链接时,也可能返回成功响应,业务状态为失败终态:

json
{
  "code": 0,
  "msg": "SUCCESS",
  "sign": "MD5_UPPER_SIGN",
  "data": {
    "payOrderId": "CO20260911000003",
    "mchOrderNo": "COL202609110003",
    "amount": "100.00",
    "payDataType": "",
    "payData": "",
    "orderState": 7,
    "createdAt": 1789051200000
  }
}

商户应根据 orderState 判断订单结果;orderState=7 表示本次订单已失败。

3.7 订单状态

订单状态只在接口 code=0 且返回 data 时有业务意义。

状态值说明是否终态
1待匹配
2匹配中
3匹配成功待上传凭证
4已上传凭证待审核
5审核成功/出款中
6已成功
7已失败
8已取消

商户应以查单接口返回的 state 或下单接口返回的 orderState 作为订单状态依据。终态订单需要幂等处理,避免重复入账或重复更新。

3.8 幂等规则

同一商户使用同一个 mchOrderNo 重复请求时:

场景平台处理
请求核心字段与原订单一致返回原订单结果
请求金额、通道编码、通知地址等核心字段发生变化返回业务冲突错误
订单号已被其它商户占用返回 200088

4. 代收查单

商户仅使用商户代收订单号 mchOrderNo 查询订单状态。payOrderId 仅作为平台返回的结果字段用于记录和对账,不作为查单请求参数。建议商户主动查单做结果补偿,不完全依赖异步通知。

4.1 接口地址

项目内容
URL/api/v1/collection/query
请求方式POST
Content-Typeapplication/json

4.2 请求参数

字段类型是否必填说明
mchNostring商户号
mchOrderNostring商户代收订单号
reqTimeint6413 位毫秒时间戳
signstringMD5 大写签名

4.3 请求示例

json
{
  "mchNo": "10001",
  "mchOrderNo": "COL202609110001",
  "reqTime": 1789051260000,
  "sign": "MD5_UPPER_SIGN"
}

4.4 成功响应

json
{
  "code": 0,
  "msg": "SUCCESS",
  "sign": "MD5_UPPER_SIGN",
  "data": {
    "payOrderId": "CO20260911000001",
    "mchOrderNo": "COL202609110001",
    "amount": "100.00",
    "channelCode": "BANK_CARD",
    "state": 6,
    "clientIp": "203.0.113.10",
    "payableAmount": "99.40",
    "adjustmentAmount": "-0.60",
    "payDataType": "payUrl",
    "payData": "https://pay.example.com/collection/pay?mchOrderNo=COL202609110001",
    "actualReceivedAmount": "99.40",
    "fee": "0.99",
    "netAmount": "98.41",
    "createdAt": 1789051200000,
    "successTime": 1789051500000,
    "extParam": "vip10001"
  }
}

4.5 data 字段

字段类型说明
payOrderIdstring平台代收订单号
mchOrderNostring商户代收订单号
amountstring期望金额,金额字符串,例如 100.00
channelCodestring代收产品编码,商户后台-API管理-代收通道页面查询获取
stateint32订单状态,见代收下单的订单状态说明
clientIpstring终端用户 IP
payableAmountstring实际应付金额,金额字符串,例如 99.40
adjustmentAmountstring实际应付金额与期望金额的差额,金额字符串,例如 -0.60
payDataTypestring支付页面链接类型,当前为 payUrl
payDatastring支付页面链接;商户将该链接展示或跳转给付款用户
actualReceivedAmountstring实际到账金额,金额字符串,例如 99.40
feestring手续费,金额字符串,例如 0.99
netAmountstring净额,金额字符串,例如 98.41
createdAtint64创建时间,13 位毫秒时间戳
successTimeint64成功时间,13 位毫秒时间戳
extParamstring商户扩展参数

5. 代收余额查询

商户查询当前代收账户的可用余额和冻结余额。

5.1 接口地址

项目内容
URL/api/v1/collection/balance
请求方式POST
Content-Typeapplication/json

5.2 请求参数

字段类型是否必填说明
mchNostring商户号
reqTimeint6413 位毫秒时间戳
signstringMD5 大写签名

5.3 请求示例

json
{
  "mchNo": "10001",
  "reqTime": 1789051500000,
  "sign": "MD5_UPPER_SIGN"
}

5.4 成功响应

json
{
  "code": 0,
  "msg": "SUCCESS",
  "sign": "MD5_UPPER_SIGN",
  "data": {
    "mchNo": "10001",
    "mchName": "测试商户",
    "balance": "100.00",
    "frozenBalance": "0.00"
  }
}

5.5 data 字段

字段类型说明
mchNostring商户号
mchNamestring商户名称
balancestring可用余额
frozenBalancestring冻结余额

余额查询成功时 code=0,商户应验签后读取 datacode0 时表示请求失败,无需处理余额数据。

6. 异步通知

订单进入终态后,平台会向下单时提交的 notifyUrl 发送异步通知。商户收到通知后应验签、核对订单号和金额,并做好幂等处理。

重要提示:受产品配置的匹配浮动范围影响,异步通知中的金额可能与商户下单金额不一致。商户完成回调处理、入账或上分时,请以平台异步通知金额及订单最终状态为准!

6.1 通知请求

项目内容
请求方式POST
Content-Typeapplication/json
通知地址下单时传入的 notifyUrl
超时时间8 秒
尝试次数最多 3 次

6.2 通知参数

字段类型是否必返说明
payOrderIdstring平台代收订单号
mchOrderNostring商户代收订单号
amountstring商户下单期望金额,金额字符串,例如 100.00
stateint32订单状态,见代收下单的订单状态说明;成功为 6,失败为 7,取消为 8
notifyTypestring通知类型:collection_successcollection_failedcollection_cancel
notifyStatestring通知状态:SUCCESSFAILEDCANCELLED
payableAmountstring实际应付金额,金额字符串,例如 99.40
adjustmentAmountstring实际应付金额与期望金额的差额,金额字符串,例如 -0.60
actualReceivedAmountstring实际到账金额,金额字符串,例如 99.40;成功通知返回
feestring手续费,金额字符串,例如 0.99;成功通知返回
netAmountstring净额,金额字符串,例如 98.41;成功通知返回
successTimeint64成功时间,13 位毫秒时间戳;成功通知返回
failTimeint64失败时间,13 位毫秒时间戳;失败通知返回
cancelTimeint64取消时间,13 位毫秒时间戳;取消通知返回
reasonstring失败或取消原因
extParamstring商户扩展参数,下单传入时原样返回
signstring通知签名

成功通知示例:

json
{
  "payOrderId": "CO20260911000001",
  "mchOrderNo": "COL202609110001",
  "amount": "100.00",
  "state": 6,
  "notifyType": "collection_success",
  "notifyState": "SUCCESS",
  "payableAmount": "99.40",
  "adjustmentAmount": "-0.60",
  "actualReceivedAmount": "99.40",
  "fee": "0.99",
  "netAmount": "98.41",
  "successTime": 1789051500000,
  "extParam": "vip10001",
  "sign": "MD5_UPPER_SIGN"
}

失败通知示例:

json
{
  "payOrderId": "CO20260911000002",
  "mchOrderNo": "COL202609110002",
  "amount": "100.00",
  "state": 7,
  "notifyType": "collection_failed",
  "notifyState": "FAILED",
  "failTime": 1789051500000,
  "reason": "未匹配到可用支付页面链接",
  "sign": "MD5_UPPER_SIGN"
}

取消通知示例:

json
{
  "payOrderId": "CO20260911000003",
  "mchOrderNo": "COL202609110003",
  "amount": "100.00",
  "state": 8,
  "notifyType": "collection_cancel",
  "notifyState": "CANCELLED",
  "cancelTime": 1789051500000,
  "reason": "商户主动取消代收订单",
  "sign": "MD5_UPPER_SIGN"
}

6.3 商户响应要求

推荐商户直接返回纯文本:

text
SUCCESS

平台也可识别 JSON 响应体中精确等于 SUCCESS 的字段值,例如:

json
{
  "code": 0,
  "msg": "SUCCESS"
}

以下响应会被视为失败:非 2xx HTTP 状态码、空响应、success 小写、SUCCESS OK、只包含 successful 等非精确值。

6.4 幂等处理建议

商户建议按以下顺序处理通知:

  1. 校验 sign
  2. 使用 mchOrderNo 查询本地订单;payOrderId 可作为平台单号保存用于对账。
  3. 核对订单号、订单状态和金额字段。成功通知入账或上分时,以 actualReceivedAmountfeenetAmount 等平台通知金额为准。
  4. 如果本地订单已经是终态,直接返回 SUCCESS
  5. 如果本地订单未处理,则更新状态并记录通知日志。
  6. 处理成功后返回 HTTP 2xx 和 SUCCESS

7. 接入流程

  1. 联系平台开通代收商户,获取 mchNo、商户密钥,并在商户后台-API管理-代收通道页面查询获取 channelCode
  2. 配置请求 IP 白名单,确保调用平台接口的出口 IP 在白名单内。
  3. 签名算法生成请求签名。
  4. 调用代收下单接口创建代收订单,向用户展示 payData 返回的支付页面链接。
  5. 使用查单接口和异步通知共同确认订单最终状态;如需查询账户余额,调用代收余额查询接口。

8. 常见问题

8.1 为什么接口返回参数校验失败?

请先检查请求是否为 POST application/json,以及 mchNoreqTimesign 和接口必填字段是否完整。平台接口不接收表单格式请求。

8.2 金额字段应该怎么传?

金额字段使用字符串类型,请按接口示例传入,例如 100.00。不要在签名前把金额转换成浮点数,避免精度或格式变化导致验签失败。

重要提示:代收订单可能因产品配置的匹配浮动范围影响产生金额调整,下单金额不一定等于实际应付金额。商户展示付款金额时,请以平台返回的 payableAmount 为准;回调入账或上分时,请以平台异步通知中的 actualReceivedAmount、fee、netAmount 等最终金额字段为准!

8.3 下单成功但没有支付页面链接怎么办?

以响应或查单中的 orderState/state 为准。若返回失败终态,表示本次没有可用支付页面链接;商户可使用新的商户订单号重新发起订单。

8.4 查单应该用哪个订单号?

查单只传 mchOrderNopayOrderId 可用于商户侧记录和对账,但不要作为查单请求参数传入。

8.5 回调接收不到怎么办?

请检查 notifyUrl 是否公网可访问、是否使用有效 HTTPS 证书、是否返回 HTTP 2xx 和精确 SUCCESS。建议同时通过查单接口做补偿。

8.6 Python 服务收到的是表单参数怎么办?

平台推荐通知接收端按 application/json 解析。如果历史 Python 服务拿到的是 application/x-www-form-urlencoded,请先转换成普通字典或 JSON 对象,再按本文字段验签和处理。金额字段验签前请统一为十进制文本,不要转成浮点数。

8.7 本地调试出现 HTTPS 证书警告怎么办?

不要在生产环境关闭证书校验。请为接口域名配置可信证书,并使用能够通过证书验证的 HTTPS 地址。

代收 Open API 文档