Z Zise Developers

错误契约

统一信封。code 分支,不要按 message 分支 —— Accept-Language

会改变 message,不会改变 code


{
  "type": "invalid_request_error",
  "code": "insufficient_balance",
  "message": "The member's available balance is not enough.",
  "request_id": "01J8X4K9…"
}

每个响应都带 X-Request-Id,错误体里也带一份。工单第一句话就是它。

type → HTTP → 你该怎么办

typeHTTP语义处置
invalid_request_error400入参不合法或业务前置条件不满足改正后重发,换新幂等键
authentication_error401令牌无效 / 过期 / 签名不符重新换令牌;连续失败查签名串拼法
permission_error403scope 不足 / IP 不在白名单 / 商户被停用后台改配置,不要重试
not_found404对象不存在或不属于本商户不要重试
idempotency_error409同键异体 / 首次仍在处理见「幂等」
rate_limit_error429超配额指数退避 + 随机 jitter
api_error500我方内部错误同键重试;持续则报工单带 request_id
upstream_error502上游不可用同键重试
upstream_timeout504结果不明(可能已执行)同键重试,或查单确认。绝不换新键

常见 code

code含义
member_not_found会员不存在不属于本商户已停用 —— 三种情况同一响应
member_context_required会员作用域端点缺 x-on-behalf-of
kyc_required该业务要求的 KYC 层级未达到。响应体不带层级 —— 各业务的门槛是一张表,去 GET /v1/kyc/requirements 取(它按 business 列出 required_level),别按错误响应推断
insufficient_balance会员可用余额不足
merchant_insufficient_funds你的资金账户余额不足 —— 去商户后台充值
product_not_available产品未对本商户授权、已停售或不满足条件
limit_exceededlimit_type(single/daily/monthly)与 limit_scope(member/merchant)
request_rejected风控拒绝的唯一对外码。 不带原因、不带规则名、不带评分
step_up_required需强认证,附 hosted_urlchallenge_id
order_not_cancellable订单已进入不可撤销阶段
asset_not_allowed该资产不在你的白名单内
environment_mismatch沙盒凭据打了 live 域(或反过来)

两件我方刻意不告诉你的事

风控判据永不出境。 命中原因、规则名、阈值、评分一律不下发。被风控拒绝

时你只会看到 request_rejected。人工申诉走商户后台工单。

跨商户信息不经由错误码泄露。 「该邮箱已注册」「该证件号已用于开卡」

这类响应会暴露另一个商户的会员存在性 —— 一律收敛成同一个不区分的响应。

所以你用一个已属于别处的邮箱建户时,拿到的不是 409。