# 错误码总表(平台标准项)。业务错误一律 HTTP 200 + 信封 {code, message, data}。 ERROR_CODES = [ {"code": "100000", "http": 200, "retryable": "depends", "meaning_zh": "通用业务失败 / 鉴权失败统一码", "meaning_en": "Generic business failure / unified auth-failure code", "note_zh": "订单未被受理时已实时置 failed,勿用同 out_order_no 重试;鉴权阶段统一为「认证失败」话术", "note_en": "When the order is not accepted, it is set to failed in real time — do not retry with the same out_order_no; during auth it is a unified authentication-failed message"}, {"code": "100001", "http": 200, "retryable": "no", "meaning_zh": "参数校验失败", "meaning_en": "Parameter validation failed", "note_zh": "message 为具体字段校验错误信息(英文,如 `\"amount\" must be a number`);amount 必须为 JSON 整数,字符串/小数均返回此码。修正参数后重发", "note_en": "message carries the specific field validation error (in English, e.g. `\"amount\" must be a number`); amount must be a JSON integer — strings/decimals return this code. Fix params and resend"}, {"code": "100101", "http": 200, "retryable": "yes", "meaning_zh": "请求过期", "meaning_en": "Request expired", "note_zh": "timestamp 超出 ±300 秒窗口;校准本地时间后重试", "note_en": "timestamp is outside the ±300s window; calibrate local time and retry"}, {"code": "100102", "http": 200, "retryable": "no", "meaning_zh": "IP 不在白名单(message 含商户号与请求 IP)", "meaning_en": "IP not in allowlist (message includes merchant_no and request IP)", "note_zh": "在商户后台把来源 IP 加入白名单后重试;正式密钥与测试密钥共用同一白名单", "note_en": "Add the source IP to the allowlist in the merchant console and retry; prod and test keys share the same allowlist"}, {"code": "100103", "http": 200, "retryable": "no", "meaning_zh": "重放 / 重复请求", "meaning_en": "Replay / duplicate request", "note_zh": "nonce 或签名指纹在 300 秒内重复;换新 nonce(或改参数)后重试", "note_en": "nonce or signature fingerprint repeated within 300s; use a new nonce (or change params) and retry"}, {"code": "100104", "http": 200, "retryable": "no", "meaning_zh": "签名错误", "meaning_en": "Invalid signature", "note_zh": "核对密钥与签名算法(pay 用 api_secret_pay、payout 用 api_secret_payout)", "note_en": "Check the secret and signing algorithm (pay uses api_secret_pay, payout uses api_secret_payout)"}, {"code": "100105", "http": 200, "retryable": "no", "meaning_zh": "IP 在黑名单", "meaning_en": "IP in blocklist", "note_zh": "从黑名单移除来源 IP 后重试", "note_en": "Remove the source IP from the blocklist and retry"}, {"code": "100106", "http": 200, "retryable": "yes", "meaning_zh": "鉴权失败次数过多(限流)", "meaning_en": "Too many auth failures (rate limited)", "note_zh": "同 merchant_no + 来源 IP 在 60 秒内鉴权失败达 60 次触发;等待约 60 秒再试", "note_en": "Triggered when the same merchant_no + source IP fails auth 60 times within 60s; wait ~60s and retry"}, {"code": "200002", "http": 200, "retryable": "no", "meaning_zh": "服务账户已禁用", "meaning_en": "Service account disabled", "note_zh": "联系服务商处理", "note_en": "Contact your service provider"}, {"code": "210002", "http": 200, "retryable": "no", "meaning_zh": "商户已禁用", "meaning_en": "Merchant disabled", "note_zh": "联系服务商处理", "note_en": "Contact your service provider"}, {"code": "300101", "http": 200, "retryable": "no", "meaning_zh": "商户订单号已存在", "meaning_en": "Merchant order number already exists", "note_zh": "同一商户 out_order_no 重复提交一律拒绝(无论参数是否相同,不返回原单);请先查单或更换新单号", "note_en": "Duplicate out_order_no is always rejected (regardless of params; original order is never returned). Query the order or use a new number."}, {"code": "300201", "http": 200, "retryable": "no", "meaning_zh": "商户代付单号已存在", "meaning_en": "Merchant payout number already exists", "note_zh": "同一商户 out_payout_no 重复提交一律拒绝(无论参数是否相同,不返回原单);请先查单或更换新单号", "note_en": "Duplicate out_payout_no is always rejected (regardless of params; original order is never returned). Query the order or use a new number."}, {"code": "300301", "http": 200, "retryable": "no", "meaning_zh": "订单不存在", "meaning_en": "Order not found", "note_zh": "核对订单号(order_no / out_order_no / payout_no / out_payout_no)", "note_en": "Check the order no. (order_no / out_order_no / payout_no / out_payout_no)"}, {"code": "300304", "http": 503, "retryable": "yes", "meaning_zh": "建单暂不可用(订单未创建,可用同一外部单号重试)", "meaning_en": "Order create temporarily unavailable (nothing persisted; retry with the same merchant order no.)", "note_zh": "insert-first 并发冲突重试耗尽或风控版本分片缺失,均在 INSERT 之前 fail-closed;HTTP 503。请用同一 out_order_no / out_payout_no 稍后重试,勿换单号以免双单", "note_en": "insert-first retry budget exhausted or risk-config version shard missing — fail-closed before INSERT; HTTP 503. Retry later with the same out_order_no / out_payout_no; do not change the number or you may create a duplicate"}, {"code": "300401", "http": 200, "retryable": "no", "meaning_zh": "支付方式不可用 / 不存在", "meaning_en": "Payment method unavailable / missing", "note_zh": "支付方式不可用或不存在", "note_en": "The payment method is unavailable or does not exist"}, {"code": "300402", "http": 200, "retryable": "yes", "meaning_zh": "支付方式配置不可用", "meaning_en": "Payment method configuration unavailable", "note_zh": "当前请求未匹配到有效配置;修改参数或稍后重试", "note_en": "No valid configuration matched the request; change parameters or retry later"}, {"code": "300403", "http": 200, "retryable": "no", "meaning_zh": "费率未配置", "meaning_en": "Fee rate not configured", "note_zh": "联系服务商配置费率后重试", "note_en": "Contact your service provider to configure the fee rate, then retry"}, {"code": "300404", "http": 200, "retryable": "yes", "meaning_zh": "当前条件下无可用支付方式", "meaning_en": "No payment method is available for the request", "note_zh": "country + currency + pay_method 未匹配到启用分组;核对参数或联系运营开通", "note_en": "country + currency + pay_method matched no enabled group; check the parameters or contact operations to enable one"}, {"code": "300405", "http": 200, "retryable": "no", "meaning_zh": "缺少必要附加信息(extra.customer)", "meaning_en": "Missing required extra info (extra.customer)", "note_zh": "请按 `data.missing_fields` 补齐 extra.customer 中的字段", "note_en": "Fill the fields listed in `data.missing_fields` under extra.customer"}, {"code": "300406", "http": 200, "retryable": "no", "meaning_zh": "缺少必要下单参数(如 bank_code)", "meaning_en": "Missing required order parameter (e.g. bank_code)", "note_zh": "补齐该路由必填字段后重试", "note_en": "Fill the required field for that route and retry"}, {"code": "300407", "http": 200, "retryable": "no", "meaning_zh": "银行编码非法", "meaning_en": "Invalid bank code", "note_zh": "用「查询可用银行」(payout/banks/query) 返回的 code", "note_en": "Use a code returned by Query Available Banks (payout/banks/query)"}, {"code": "300408", "http": 200, "retryable": "no", "meaning_zh": "当前支付方式不支持代付凭证查询", "meaning_en": "Payment method does not support payout proof query", "note_zh": "当前支付方式不支持凭证查询", "note_en": "The payment method does not support proof queries"}, {"code": "300409", "http": 200, "retryable": "yes", "meaning_zh": "代付凭证暂不可用", "meaning_en": "Payout proof temporarily unavailable", "note_zh": "订单未成功 / 凭证暂未生成 / 超出查询窗口;确认成功且在窗口内再试", "note_en": "Order is not successful / proof is not ready / outside the query window; confirm success and retry within the window"}, {"code": "300410", "http": 200, "retryable": "yes", "meaning_zh": "代付收据暂不可用(订单非 success)", "meaning_en": "Payout receipt temporarily unavailable (order not success)", "note_zh": "等订单出款成功后再试", "note_en": "Retry after the payout succeeds"}, {"code": "300411", "http": 200, "retryable": "yes", "meaning_zh": "收据生成失败", "meaning_en": "Receipt generation failed", "note_zh": "渲染异常;稍后重试", "note_en": "Rendering error; retry later"}, {"code": "300501", "http": 200, "retryable": "yes", "meaning_zh": "余额不足", "meaning_en": "Insufficient balance", "note_zh": "商户可用余额 < 冻结额(amount + fee);充值后重试", "note_en": "Available balance < frozen amount (amount + fee); top up and retry"}, ]