最佳实践

幂等与重试、对账与补偿、安全建议,以及联调和上线检查清单。

本页是接入金融类 API 的通用做法。其中涉及 Stabo 行为的内容,以通用约定、Webhook和各产品指南为准。

幂等与重试

  • 每个 POST 请求都带 Idempotency-Key。
  • 网络超时或没收到响应时,用同一个 Idempotency-Key 重试同一笔请求。Payment 转账接口例外:重复的 Key 会被拒绝,要改用 referenceNo 查询结果,见 Payment 幂等性。
  • 不同业务请求用不同的 Idempotency-Key。可以用订单号派生,或用 UUID。
  • 重试用指数退避。每次重试的间隔加倍,再加一点随机抖动,并设最大重试次数。
  • 超出重试次数后,不要继续盲目重试。用查询接口确认结果,再决定是否人工处理。
  • 收到 401 时,重新获取 Token 再重试。
  • 收到 400 时,请求本身有问题。先按响应中的 message 修正,不要原样重试。

对账与补偿

Webhook 是接收结果的主链路。查询接口是补偿和对账的手段。

  • 以查询接口返回的状态为最终状态。Webhook 与查询结果不一致时,以查询结果为准。
  • Webhook 可能重复,也可能乱序。按 Webhook-Event-Id 去重。判断订单状态时看 data.object.status,不要只看事件类型。
  • 对长时间停留在非终态的订单,定时调用查询接口补查。
  • 每日对账。按日期范围分页拉取列表,与本地订单逐笔比对 status 和金额,把差异记录下来处理。
  • 金额用字符串或 Decimal 保存和比较,不要用浮点数。比较时按币种精度处理。
  • 记录每次请求的 traceId。对账出现差异、联系技术支持时,提供 traceId。

安全建议

  • client_secret、Access Token 和 Webhook 密钥只保存在服务端。放在环境变量或密钥管理服务中,不要写进代码、前端、移动端或代码仓库。
  • 定期轮换密钥:在控制台新增一个密钥,切换到新密钥后删除旧密钥。怀疑泄露时,立即按同样方式更换,并删除旧密钥。
  • Webhook 必须验签。用原始请求体计算,常数时间比较,并校验时间戳以防重放。详见 Webhook。
  • Webhook 回调地址必须是 HTTPS。
  • 在控制台为每个密钥配置 IP 白名单,只填写实际调用 Stabo 的服务器出口 IP。留空表示不限制来源 IP。出口 IP 变更时,同步更新白名单。
  • 日志里不记录 client_secret、Access Token、Webhook 密钥和完整的账户信息。需要排查时只记录 traceId、订单号等标识。
  • 同一个 Token 在应用内缓存复用,不要每次请求都重新获取。

联调与上线检查清单

在测试环境联调

使用测试环境 Base URL https://api.test.stabofx.com 和测试环境凭证。

获取 Access Token,确认能拿到 access_token。

调用业务接口。以 Checkout 为例,创建 Payment Intent,拿到 checkoutUrl。

确认 Webhook 地址能收到通知,并用固定样本确认验签代码正确。

用查询接口查询订单,确认状态与 Webhook 一致。

上线前检查

  • 生产环境的 Base URL、client_id、client_secret 和 tenant_id 已替换,且只保存在服务端。
  • 生产服务器出口 IP 已加入白名单。
  • Webhook URL 是公网可访问的 HTTPS 地址。
  • Webhook 处理先返回 2xx,再异步处理业务,并在 30 秒内响应。
  • Webhook 已验签:原始请求体、常数时间比较、时间戳容差。
  • Webhook 按 Webhook-Event-Id 去重,业务处理幂等。
  • 所有 POST 请求都带 Idempotency-Key,重试时复用同一个 Key。Payment 转账超时后改用 referenceNo 查询结果,不重新提交。
  • 金额用字符串或 Decimal,没有使用浮点数。
  • 请求超时设为 30 秒,并实现指数退避重试。
  • Token 已缓存,收到 401 时会重新获取。
  • 已有定时补查任务和每日对账任务。
  • 日志已脱敏,并记录了 traceId。

本页目录