Callback 通知
订单有结果时,ST Pay 会向该订单建单时传入的 callback_url 发送 POST 请求。
发送时机
| 事件 | status | 是否发送 |
|---|---|---|
| 代收成功 | success | 发送 |
| 代收被拒绝(ST Pay 人工拒绝,或 30 分钟到期被系统拒绝) | rejected | 发送 |
| 代收超时入账 | late_credited | 不发送,请通过查单确认,见订单状态 |
| 代付已出款 | paid | 发送 |
| 代付被拒绝 | rejected | 发送 |
Callback 地址
- 每次建单(代收、代付)时通过
callback_url传入,无需事先提供给 ST Pay。每笔订单可以不同,例如测试与生产环境各用自己的地址。 - 建单后不能更改。自动发送与 ST Pay 手动重发都发往该订单建单时的地址。若您之后更换地址,旧订单的通知仍发往旧地址;旧地址收不到时,请通过查单确认旧订单的结果。
- 最多 500 个字符,按原样保存,不做任何转换。
http与https都可以,建议用https:http会以明文传送订单号与金额。不论哪一种,都务必验证sign,才能防止伪造或篡改的通知。- 使用
https时,网站的 HTTPS 证书(SSL/TLS 证书)必须由公开的证书颁发机构签发、在有效期内、名称与网址中的主机名相符,并且服务器要发送完整的证书链(含中间证书)。自签名证书、过期、名称不符或缺少中间证书都视为送达失败,不会重试。 - 不能包含账号密码(
user:pass@)、#、空白或非 ASCII 字符;中文域名请转换为 punycode(以xn--开头)。可以带 path 与 query。 - 主机名只能包含字母、数字、
.、-(不能有下划线_),或以[ ]包住的 IPv6;写了端口号时须为 1 至 65535(不能只写:)。 - path 与 query 中不能直接出现
|、{、}、^、"、<、>、\、反引号,%后面必须是两位十六进制数字;这些字符请先做 URL 编码(例如%写成%25)。 - 未传、空字符串或全是空白返回
missing_parameter。 - 不能是本机或内网地址,测试与生产环境都一样:
localhost,以及以.localhost、.local、.localdomain、.internal、.intranet、.lan、.corp、.home.arpa、.private结尾的域名,或不含「.」的主机名。- 私有、回环、链路本地、CGNAT、保留与文档用途、组播的 IP,例如
10.x.x.x、172.16.x.x–172.31.x.x、192.168.x.x、127.x.x.x、169.254.x.x、100.64.x.x;IPv6 只接受全球单播地址(2000::/3),其中 Teredo2001::/32、文档用途2001:db8::/32、6to42002::/16也不接受。 - 纯数字、十六进制、八进制或省略段数的 IP 写法,例如
2130706433、0x7f.0.0.1、0177.0.0.1、127.1。 - 公网 IP 可以直接填写。
- 不符合以上规则时,建单返回
invalid_callback_url(格式错误、超过 500 个字符则返回invalid_parameter),不会建单。 - ST Pay 每次发送前(包括手动重发)都会重新解析域名;解析失败,或解析出的任何一个地址不是公网地址,本次就不发送,视为送达失败。请确认域名可从公网解析,并且只指向公网 IP。
请求格式
- 方法为
POST,Content-Type: application/json,请求体为 JSON 对象,所有值都是字符串。 - 包含
sign,签名规则与 API 请求相同,使用您的 API 验证密钥(见更换密钥)。Callback 不包含api_identity与timestamp。 - ST Pay 建立连接最多等待 5 秒、等待响应最多 10 秒,且不跟随重定向(3xx):收到 3xx 视为送达失败。请直接填写最终地址,例如
http跳转https、缺少末尾的/都可能导致重定向。 - Callback 内容不包含
callback_url。 - 请求头固定带
User-Agent: QPay-Callback/1.0与Accept: */*。Callback 地址在 Cloudflare、WAF 或其他防火墙后面时,请放行这个 User-Agent 与POST请求,否则可能被拦截为 403 而送达失败。
您需要返回的响应
返回 HTTP 2xx,且响应体为纯文本 ok(首尾空白字符会被忽略)。其他任何响应,包括超时、非 2xx、响应体不是 ok,都视为送达失败。
HTTP/1.1 200 OK
Content-Type: text/plain
ok
Callback 不会自动重试
每笔订单只会自动发送一次。送达失败时,只有 ST Pay 工作人员能手动重发,重发时一律发往该订单建单时传入的 callback_url。因此:
- 请不要只依赖 Callback。对于长时间没有结果的订单,请定期查单确认。
- 同一笔订单可能收到多次 Callback(手动重发),请以
order_no加status做幂等处理,已处理过的通知直接返回ok。 - Callback 送达失败不影响交易结果,订单状态与余额不会因此回滚。
字段
| 字段 | 代收成功 | 代收拒绝 | 代付已出款 | 代付拒绝 | 说明 |
|---|---|---|---|---|---|
order_no | ✓ | ✓ | ✓ | ✓ | ST Pay 订单号 |
merchant_order_no | ✓ | ✓ | ✓ | ✓ | 商户单号 |
status | success | rejected | paid | rejected | 订单状态 |
received_amount | ✓ | 实收金额 | |||
fee | ✓ | ✓ | 手续费 | ||
settlement_amount | ✓ | 结算金额 | |||
payable_amount | ✓ | 订单金额(含尾数) | |||
amount | ✓ | ✓ | 代付金额 | ||
finished_at | ✓ | ✓ | ✓ | ✓ | 完成时间 |
sign | ✓ | ✓ | ✓ | ✓ | 签名 |
Callback 不包含拒绝原因,如有需要请通过查单获取。
代收与代付若传入同一个 callback_url,两者的 status 都可能是 rejected,而且代收单与代付单的商户单号可以相同。请以建单时获取的 order_no 匹配订单;如果要用商户单号匹配,请让代收与代付使用不会重复的单号,例如添加不同的前缀。
处理建议
- 解析 JSON,用收到的全部字段(
sign除外)重新计算签名并比对。不要只挑选本文档列出的字段,日后可能会新增字段。 - 签名不一致则丢弃,不要更新订单。
- 以
order_no找到您的订单;已处理过相同结果时直接返回ok。 - 更新订单后返回
ok。耗时的后续处理(发货、通知会员等)请放到后台异步执行,避免超过 10 秒。 - 代收成功请以
received_amount(实收金额,或扣除手续费后的settlement_amount)入账,不要用建单时的金额。实收金额与您预期的金额不同时,请转人工确认,不要自动入账。 - 订单已是终态(
success、paid、rejected)后,又收到较晚到达、状态不同的通知时,不要回退订单状态;请记录下来转人工,有疑义以查单结果为准。
示例
以下签名均是用示例密钥计算的实际值。
代收成功
{
"order_no": "C202610131000051230000",
"merchant_order_no": "MO20261013-0001",
"status": "success",
"received_amount": "1000.37",
"fee": "25.00",
"settlement_amount": "975.37",
"finished_at": "2026-10-13 10:12:30",
"sign": "49d9d35c3b3a97a55fe60976a331d36913b0d3cd9b82e840e0315c445653d207"
}
代收拒绝
{
"order_no": "C202610131001178820000",
"merchant_order_no": "MO20261013-0002",
"status": "rejected",
"payable_amount": "2000.58",
"finished_at": "2026-10-13 10:31:17",
"sign": "cd85bf732776bb2897f6e767dda873ce580330f979be3f812c390ec09af0d2f4"
}
代付已出款
{
"order_no": "P202610131005224410000",
"merchant_order_no": "PO20261013-0001",
"status": "paid",
"amount": "500.00",
"fee": "7.50",
"finished_at": "2026-10-13 10:20:41",
"sign": "64e3b813fb086b98c1a4e68c2689423ff347336219f182293e5344a3f6853562"
}
代付拒绝
{
"order_no": "P202610131006403520000",
"merchant_order_no": "PO20261013-0002",
"status": "rejected",
"amount": "3000.00",
"finished_at": "2026-10-13 10:25:09",
"sign": "bdf0a8031ac0beff801a4b2591793ea6d6edbfd27dbdadce24ab871602f99094"
}
代收成功示例的待签名字符串:
fee=25.00&finished_at=2026-10-13 10:12:30&merchant_order_no=MO20261013-0001&order_no=C202610131000051230000&received_amount=1000.37&settlement_amount=975.37&status=success