接入
接口约定
接口地址、响应格式、金额、幂等、重试与频率限制。
接口地址
text
/open/v1沙箱与生产共用同一域名,环境由签名所用的 API Key 决定;一把 Key 只能看到本环境的订单(其他环境返回 ORDER_NOT_FOUND),out_order_no 在各环境内分别唯一。
响应格式
响应使用真实的 HTTP 状态码和统一结构:
json
{
"trace_id": "6c1f0b9a3e2d4f5a",
"status_code": 200,
"message": "success",
"data": { "id": "…", "status": "CREATED" }
}json
{
"trace_id": "6c1f0b9a3e2d4f5a",
"status_code": 422,
"message": "The amount exceeds the app's payment limit.",
"error_code": "LIMIT_EXCEEDED"
}- 用
error_code判断分支,不要用message(英文,可能变化)。 - 记录
trace_id,联系客服时提供。 INVALID_REQUEST的message会说明哪个字段不合法,便于开发调试。
数据格式
| 类型 | 格式 |
|---|---|
| 金额 | 字符串,USDT,正数,输入最多 2 位小数("5"、"5.5"、"5.50"),输出固定 2 位。不要用浮点数。 |
| 币种 | 只支持 "USDT"(否则 CURRENCY_NOT_SUPPORTED) |
| 时间 | RFC 3339 UTC,如 2026-11-07T09:30:00Z |
| ID | HTP 订单 id 为 UUID。你的 out_order_no / out_refund_no:1–64 位 [A-Za-z0-9_-] |
| 用户 | OIDC sub 字符串(最长 128) |
幂等
创建类接口(POST /payments、POST /payments/{id}/refunds、POST /payouts)必须带 Idempotency-Key。
- 相同 Key + 相同请求体 → 重放首次成功的响应,不会重复创建。
- 相同 Key + 不同请求体 →
409 IDEMPOTENCY_KEY_REUSED。 - 首个请求仍在处理时用同一 Key →
409 IDEMPOTENCY_IN_PROGRESS,稍后重试。 - 失败的请求不会占用该 Key,重试会重新执行。
每个业务操作生成一次 Key(例如与订单一起保存),每次重试都复用它。每次重试仍需新的 X-Nonce、X-Timestamp 和签名。
out_order_no 是第二道保障:换了 Idempotency-Key 但 out_order_no 已使用,返回 ORDER_ALREADY_EXISTS。
重试与超时
| 情况 | 处理 |
|---|---|
| 创建请求网络错误或超时 | 用相同 Idempotency-Key 重试,或查询 GET /open/v1/orders?out_order_no=… |
5xx、REPLAY_PROTECTION_UNAVAILABLE、IDEMPOTENCY_IN_PROGRESS |
指数退避重试 |
429 TOO_MANY_REQUESTS |
等待 Retry-After 秒 |
其他 4xx |
不要原样重试 —— 先修正请求 |
频率限制
签名请求按 App 限流(默认每分钟 600 次)。超限返回 429,带 Retry-After: 60。
请求体大小
请求体最大 64 KB。