上传运单¶
PATCH {BASE_URL}/api/v1/open/charges/{orderIdentifier}/shipping
用于在订单支付后上传或更正物流。orderIdentifier 支持以下两种原单标识:
- 开放 API 建单返回的原单 UUID(
order.id); - 平台支付单号
order_no,格式如PAY-20260917-ABC123(大小写不敏感)。
支付单号只会在当前 API 密钥所属商户、开放 API 原单范围内解析。不能使用 merchant_order_id、charge_code、其他业务单号或 USDT 内部子单 ID。
可写订单¶
- 普通订单状态为
PAID、PARTIALLY_REFUNDED或REFUNDED。 - 转 USDT 成功时仍传原单 UUID 或原单支付单号;物流实际保存到唯一的已支付 USDT 子单,响应、后续查单和 Webhook 仍返回原单 UUID。
- 非开放 API 建单、跨商户订单、未支付订单或异常父子关系会被拒绝。
请求头¶
| 头 | 必填 | 说明 |
|---|---|---|
Authorization |
是 | Bearer + 完整 API 密钥 |
Content-Type |
是 | application/json |
请求体最大 16 KiB,且只接受以下字段:
| 字段 | 必填 | 最大长度 | 说明 |
|---|---|---|---|
shipping_carrier |
是 | 64 | 物流公司,去除首尾空白后不能为空 |
tracking_no |
是 | 128 | 追踪单号,去除空白并保留前导零;不能清空 |
shipping_note |
否 | 1000 | 省略则保留原备注;null 或空白字符串会清空备注 |
{
"shipping_carrier": "DHL",
"tracking_no": "00123456789",
"shipping_note": "请放前台"
}
成功响应 200¶
{
"success": true,
"changed": true,
"order": {
"id": "<规范原单 UUID;即使请求使用支付单号也返回 UUID>",
"shipping": {
"shipping_carrier": "DHL",
"tracking_no": "00123456789",
"shipping_note": "请放前台",
"shipped_at": "2026-09-17T02:00:00.000Z"
}
}
}
相同内容重试返回 changed=false,且保留首次 shipped_at。更正物流返回 changed=true,首次发货时间仍不改变。此接口不使用 Idempotency-Key;若先写 A、再更正为 B、随后重放旧请求 A,A 会再次覆盖 B,因此调用方应丢弃过期重试。
保存成功后,可按商户通知配置触发 SHIPPED 或 LOGISTICS_UPDATED Webhook、客户邮件及适用支付网关的物流同步。这些动作是提交后的尽力执行;接口成功只证明物流已保存,不承诺外部系统已经收到。
错误¶
写入失败响应为 { "error": "...", "code": "..." }。
| HTTP | code |
场景 |
|---|---|---|
400 |
invalid_request |
订单标识(UUID / PAY-...)、JSON、未知字段或字段内容无效 |
401 |
unauthorized |
缺少或无效 API 密钥 |
404 |
order_not_found / child_order_id |
UUID/支付单号对应订单不可见、非开放 API 原单,或传了内部子单 ID |
409 |
order_state_conflict / conversion_conflict / write_busy |
状态或父子关系冲突,或并发写入繁忙 |
413 |
payload_too_large |
请求体超过 16 KiB |
422 |
order_not_paid / shipping_conflict |
订单未支付,或物流与本商户其他客户冲突 |
429 |
rate_limited |
IP 或商户物流配额耗尽;响应含 Retry-After 秒数 |
500 |
internal_error |
内部错误 |
限流约为 IP 120 次/分钟、商户物流写入 60 次/分钟。当前计数保存在单个应用实例内,多实例之间不共享;客户端仍应遵守 Retry-After 并使用退避重试。