KukoPay API 错误格式、错误大类、完整错误码与重试建议。
所有接口共用一套错误结构。
{
"code": 400,
"error": "invalid_request",
"type": "invalid_request_error",
"message": "订单金额必须是以最小货币单位表示的正整数",
"param": "amount",
"doc_url": "https://kukopay.com/docs/api/errors",
"request_id": "req_9f2c1a7b4e8d0356c1ab77de90f4b215"
}| 字段 | 说明 |
|---|---|
code | 与 HTTP 状态码一致 |
error | 稳定的机器可读标识,请基于它做程序分支 |
type | 错误大类。新增 error 时不变,适合做粗粒度判断 |
message | 给人看的描述,文案可能调整,不要用于逻辑分支 |
param | 出错的请求字段名;与字段无关的错误为 null |
doc_url | 指向本页对应错误码的说明 |
request_id | 本次请求的唯一标识 |
每一个响应——无论成功还是失败——都会在响应体的 request_id 字段和 X-Request-Id 响应头中返回同一个值,它与平台侧日志一一对应。
请在你的 HTTP 客户端里统一把 request_id 记进访问日志。反馈问题时附上它,平台可以直接定位到那一次请求;没有它只能靠订单号和时间范围人工翻查。你也可以自己用 API 日志 查。
request_id 始终由平台签发,不接受请求方传入,所以两次不同的调用一定拿到不同的值。
| type | 含义 | 能否重试 |
|---|---|---|
authentication_error | 密钥缺失或无效,请求没有被识别为任何商户 | 修正后 |
permission_error | 身份成立,但当前商户无权执行该操作 | 否 |
invalid_request_error | 请求本身不合法:参数错误、对象不存在、状态冲突 | 修正后 |
idempotency_error | 同一个幂等键被用于了不同的请求内容 | 修正后 |
rate_limit_error | 触发调用频率限制 | 退避后可以 |
api_connection_error | 上游渠道异常,本地资金未被修改 | 可以 |
api_error | 平台内部错误 | 可以 |
| HTTP | error | 含义 | 建议 |
|---|---|---|---|
| 401 | missing_api_key | 缺少认证头 | 检查 X-Api-Key 拼写与是否被代理层剥离 |
| 401 | invalid_api_key | 密钥错误或已重置 | 更新服务端配置 |
| 403 | merchant_not_approved | 正式能力未开通 | 先用沙箱联调并完成审核 |
| 403 | ip_not_allowed | 来源不在 IP 白名单 | 核对固定出口与白名单 |
| 403 | forbidden | 该对象不属于当前商户 | 核对单号与密钥归属 |
| 400 | invalid_request | 请求字段不合法 | 按 param 与 message 修正 |
| 400 | idempotency_error | 同一个 Idempotency-Key 用于了不同请求体 | 重试请原样重发;新请求换 Key |
| 409 | idempotency_in_progress | 该 Key 的首次请求仍在处理中 | 稍后用相同的 Key 重试 |
| 404 | order_not_found | 订单不存在或环境不匹配 | 核对订单号与密钥环境 |
| 404 | refund_not_found | 退款不存在或环境不匹配 | 核对退款号与密钥环境 |
| 404 | dispute_not_found | 拒付记录不存在或环境不匹配 | 核对 dispute_no 与密钥环境 |
| 404 | event_not_found | 事件不存在或环境不匹配 | 核对事件 id 与密钥环境 |
| 404 | payment_link_not_found | 收款链接不存在或环境不匹配 | 核对 link_id 与密钥环境 |
| 404 | endpoint_not_found | Webhook 端点不存在 | 核对 endpoint_id 与密钥归属 |
| 409 | conflict | 对象状态已变化,或订单存在未结案拒付 | 查询最新状态与拒付情况后再处理 |
| 400 | refund_window_expired | 订单的支付方式有退款期限且已超过 | 查看订单的 refundable_until;超期退款请与买家线下处理 |
| 429 | rate_limited | 超出商户调用配额 | 按 Retry-After 退避 |
| 502 | processor_error | 上游通道异常,本地资金未被修改 | 使用相同幂等键安全重试 |
| 500 | internal_error | 平台内部错误 | 带相同幂等键重试;持续出现请附 request_id 联系我们 |
429、502 和 500:保留相同幂等键,指数退避后重试。400、401、403:先修复参数、凭据或权限,不要原样循环重试。404:确认资源标识与测试/正式环境是否一致。409:重新查询订单、退款或拒付的最新状态,再决定下一步。请求超时后不要直接判定订单不存在并重新生成订单号。正确做法是用原 out_trade_no 重试,或调用订单查询确认真实状态。
商户 API 按商户维度限流,窗口为一分钟:
| 类别 | 配额 | 覆盖接口 |
|---|---|---|
| 写 | 120 次 / 分钟 | 下单、退款、创建链接与端点等会触达上游的操作 |
| 读 | 600 次 / 分钟 | 各类查询与列表 |
| 导出 | 10 次 / 分钟 | 列表接口的 format=csv |
超出后返回 429 rate_limited,响应头 Retry-After 给出距离窗口重置的秒数。按这个秒数退避即可,不必自己猜。
这个额度是给异常流量兜底的,不是计费口径。正常业务量需要更高配额时联系平台运营调整即可。