收款 Webhook
支付状态异步通知。
接口
POST/merchant-callback-url认证
Merchant Credential。详见 认证。
1. 通知接口背景
商户发起收款交易后,交易的最终结果可能无法在同步请求中确定。收款成功后,Adopay 通过 HTTP 异步回调将收款成功结果通知给商户;收款失败不发送回调通知。
商户应根据 platOrderNo 或 merchantOrderNo 对通知做幂等处理。同一订单可能因重试收到多次通知。
2. 回调地址和请求方式
Adopay 使用 POST 向商户提供的收款回调地址发送 JSON 通知,Content-Type 为 application/json。回调地址必须是完整的 HTTP 或 HTTPS 地址。验签与成功响应要求见 Webhook 规范。
3. 请求头字段
| 字段名 | 类型 | 字段长度 | 是否必传 | 说明 |
|---|---|---|---|---|
Content-Type | string | 16 | 是 | 固定为 application/json。 |
X-Merchant-Id | string | 64 | 是 | 接收通知的商户号。 |
X-Timestamp | string | 19 | 是 | Unix 秒级时间戳。 |
X-Nonce | string | 64 | 是 | 本次请求的随机串,用于防重放。 |
Digest | string | 52 | 是 | 原始请求体摘要,格式为 SHA-256=<Base64(SHA256(body_bytes))>。 |
Authorization | string | 不定长 | 是 | ES256 HTTP Signature 签名信息。 |
Digest 和 Authorization 均基于最终发送的原始 JSON 字节计算。商户验签时不能先对 JSON 重新序列化。
4. 请求体字段
业务状态判断:status 为整数;status = 200 表示业务正常,此时 msg = "sucesso"。非 200 表示业务错误,错误原因见 msg。
| 字段名 | 类型 | 字段长度 | 是否必返 | 说明 |
|---|---|---|---|---|
event | string | 64 | 是 | 见下属事件枚举。 |
attach | string | 128 | 是 | 原收款订单下单时商户传入的 attach 值;下单时已传入则原样返回,未传入则为空。 |
merchantOrderNo | string | 64 | 是 | 商户下单时传入的商户订单号。 |
platOrderNo | string | 64 | 是 | Adopay 代收平台订单号。 |
orderStatus | string | 16 | 是 | 订单结果,固定为 SUCCESS,表示收款成功。 |
amount | decimal | 25,2 | 是 | 商户订单金额,商户应校验该字段。 |
payAmount | decimal | 25,2 | 是 | 实际支付金额; |
fee | decimal | 25,2 | 是 | 手续费。 |
payTime | int | 19 | 是 | 付款完成时间,Unix 秒级时间戳;未取得时为 0。 |
e2eId | string | 64 | 是 | 银行 E2E 交易号/外部渠道支付流水号;未生成时可为空。 |
payerName | string | 128 | 否 | 付款方名称,通常在成功时返回。 |
payerTaxNo | string | 64 | 否 | 支付方税号(CPF/CNPJ),通常在成功时返回。 |
status | int | - | 是 | 响应码 |
msg | string | 128 | 是 | 与 status 对应 |
事件和状态对照
event | orderStatus | 含义 |
|---|---|---|
QR_CODE_COPY_AND_PASTE_PAID | SUCCESS | pix二维码代收/收单-收款成功。 |
5. 请求示例
http
POST /notify/adopay/cashin HTTP/1.1
Host: merchant.example.com
Content-Type: application/json
X-Merchant-Id: 92315566000120
X-Timestamp: 1786838400
X-Nonce: 8f6e17d07f8b4fe19318d9c4dd6fc001
Digest: SHA-256=<REQUEST_BODY_SHA256_BASE64>
Authorization: Signature keyId="v1",alg="ES256",headers="(request-target) x-timestamp x-nonce digest",signature="<ES256_SIGNATURE_BASE64>"
{
"status": 200,
"msg": "sucesso",
"event": "QR_CODE_COPY_AND_PASTE_PAID",
"attach": "order-source=checkout",
"merchantOrderNo": "CASHIN202608170001",
"platOrderNo": "BAS202608170000000001",
"orderStatus": "SUCCESS",
"amount": 100.25,
"payAmount": 100.25,
"fee": 1.25,
"payTime": 1786838400,
"e2eId": "E0000000020260817000000000000001",
"payerName": "JOAO DA SILVA",
"payerTaxNo": "12345678901"
}6. 商户响应要求
商户完成幂等处理后,应返回 HTTP 200—299,且响应体严格为纯文本 SUCCESS 或 OK:
http
HTTP/1.1 200 OK
Content-Type: text/plain
SUCCESS7. 通知场景与重试次数
仅在收款成功时,Adopay 向商户发送本回调通知。收款失败不回调;退款通知见 收款退款 Webhook。
每笔通知首次发送失败后,最多重试 9 次,合计最多发送 10 次。商户成功接收并返回规定的成功响应后,不再重试。
是否重试由 HTTP 状态码和响应体共同决定:
| HTTP 状态码 | 响应体 | 处理结果 |
|---|---|---|
200—299 | 去除首尾空白后严格等于 SUCCESS 或 OK | 通知成功,不再重试 |
200—299 | 空响应体、JSON、其他文本或非规定大小写 | 通知失败,继续重试 |
非 2xx | 任意内容 | 通知失败,继续重试 |
| 未收到 HTTP 响应 | 网络超时或连接失败 | 通知失败,继续重试 |
SUCCESS 和 OK 区分大小写。例如 success、Success 或 {"status":"SUCCESS"} 均不会被识别为成功响应。HTTP 204 虽属于 2xx,但因响应体为空,仍会继续重试。
8. 接入注意事项
- 应校验
event为QR_CODE_COPY_AND_PASTE_PAID,且orderStatus为SUCCESS。 - 收到成功通知时,应复核
amount。 payerName和payerTaxNo属于敏感信息,日志和审计系统中应脱敏存储。