错误码

所有错误响应结构一致:HTTP 状态码 + 机器可读的 code + 可读的 error + request_id。

错误响应格式

{
  "ok": false,
  "error": "余额不足:还差 $1.00",
  "code": "INSUFFICIENT_MERCHANT_BALANCE",
  "request_id": "req_9f8e7d6c5b4a3210",
  "details": { "available_cents": 900 }
}

排查问题时请提供 request_id:它同时出现在服务端访问日志中,可以定位到具体请求。

鉴权与权限

HTTPcode说明与处理
401INVALID_API_KEY缺少密钥、格式错误、Secret 不匹配或已吊销。检查 Authorization 头,确认密钥未被吊销
401UNAUTHENTICATED结账接口需要付款人登录;先完成登录再重试
403MERCHANT_INACTIVE商户未通过审核或已被暂停。联系运营,或检查商户后台状态
403CUSTOMER_MISMATCH支付单指定了其他付款人
403PIN_INCORRECT付款人支付 PIN 错误
423PIN_LOCKEDPIN 连续错误被锁定,等待锁定时间结束

请求与参数

HTTPcode说明与处理
400AMOUNT_REQUIRED未传 amount
400AMOUNT_INVALID金额不是合法十进制数,如 "12.3.4"
400AMOUNT_PRECISION金额超过 2 位小数
400AMOUNT_ZERO金额必须大于 0
400AMOUNT_NEGATIVE金额为负数
400AMOUNT_TOO_LARGE金额超过上限($10,000,000.00)
400FIELD_REQUIRED / FIELD_INVALID / FIELD_TOO_LONG字段缺失、格式或长度不符合要求,details.field 指明字段
400METADATA_INVALIDmetadata 必须是对象
400METADATA_TOO_LARGEmetadata 序列化后超过 2KB
400BAD_JSON请求体不是合法 JSON
413PAYLOAD_TOO_LARGE请求体超过 100KB

支付与退款

HTTPcode说明与处理
404PAYMENT_NOT_FOUND支付单不存在或不属于当前商户
409REFERENCE_CONFLICT同一订单号已用于金额不同的支付;换一个 reference
409PAYMENT_NOT_PAYABLE支付单已支付、已取消或状态不可支付
409PAYMENT_EXPIRED支付单超过 30 分钟有效期
409PAYMENT_NOT_CANCELABLE支付单当前状态不能取消
400PAYMENT_NOT_REFUNDABLE只有成功支付可以退款
400REFUND_EXCEEDS_REMAINING退款超过可退金额,details.refundable_cents 给出上限
400INSUFFICIENT_MERCHANT_BALANCE商户可结算余额不足,details.available_cents 给出当前值
409CONCURRENT_MODIFICATION并发修改冲突,刷新后重试

幂等与限流

HTTPcode说明与处理
400IDEMPOTENCY_KEY_INVALID键格式不正确:8–255 位字母、数字或 - _ : .
422IDEMPOTENCY_KEY_REUSED同一个键用于参数不同的请求;为新操作生成新键
409IDEMPOTENCY_IN_PROGRESS相同请求正在处理中,稍后用同一个键重试
429RATE_LIMITED超过每个 Key 每分钟的请求上限;退避后重试

服务端

HTTPcode说明与处理
500INTERNAL未预期的服务端错误,响应包含 request_id;可安全重试(写请求带同一个幂等键)
502/503/504—网关或上游不可用;按指数退避重试,写请求带同一个幂等键

什么时候可以重试

情况建议
4xx(除 409 IDEMPOTENCY_IN_PROGRESS、429)不要重试,修正请求参数
409 IDEMPOTENCY_IN_PROGRESS等待 1–2 秒后用同一个幂等键重试
429指数退避后重试
5xx / 网络超时指数退避重试;写请求必须带同一个 Idempotency-Key
✓失败的资金请求不会产生资金变动(服务端在事务内回滚),可以放心用同一个幂等键重试。