基础信息
前置条件
开始接入前,请确认你已经:- 注册 StablePay 商户账号并完成资质审核
- 在商户后台创建店铺,渠道类型选择 API,等待审核通过
- 在店铺的「密钥管理」菜单中生成并获取:
- API Key:用于
Authorization请求头,标识调用方身份 - Secret Key:用于生成请求签名,请妥善保管,切勿提交到公开代码仓库或分享给他人
- API Key:用于
创建 API 店铺
如果你的团队准备通过 StablePay API 接入,请先前往 店铺和开发者 页面。第一步:创建 API 店铺
- 打开 店铺和开发者 页面。
- 点击【创建店铺】。
- 渠道类型选择 API。
- 按实际业务信息填写店铺名称和域名。
- 提交创建申请,并等待 StablePay 运营团队审核。
API 凭证和 Webhook 设置都是按店铺维度创建和管理的。请先确认你创建的是正确的店铺,再等待店铺审核通过并启用。
第二步:等待店铺启用
审核完成后,店铺状态会显示为【已启用】。只有在店铺启用后,才可以在该店铺的操作菜单中进入【密钥】和【Webhook】配置。创建 API Key 和 Secret Key
当店铺状态显示为【已启用】后:- 返回 店铺和开发者 页面。
- 打开对应店铺的操作菜单。
- 点击【密钥】。
- 创建 API Key 和 Secret Key。
- 如果有效期设置为
0天,表示该密钥长期有效。
认证与签名
请求头清单
所有 API 请求都必须携带以下请求头:签名串拼接规则
{requestBody}:POST / PUT 请求为原始 JSON 字符串(不要再次序列化、不要格式化)- GET / DELETE 等没有请求体的方法:
{requestBody}取空字符串 - 签名算法:
HMAC-SHA256(sign_payload, secret_key)→ 小写 hex 字符串
示例代码
每个接口所需的请求头
POST /api/v1/subscriptions/create还必须额外携带Idempotency-Key请求头。使用相同键重试时,服务端会返回首次创建的订阅对象。
幂等性
以下接口支持幂等,商户自定义 ID 作为幂等键:
使用相同幂等键重复提交时,服务端返回首次创建的资源,不会产生重复数据。
Webhook 通知
StablePay 通过 Webhook 将关键事件异步推送到你在商户后台配置的回调 URL。如果你需要查看事件样例、风控冻结状态说明,以及payment.failed中status = "frozen"的处理建议,请参考 Webhook 通知。
事件类型
Webhook 请求头
签名校验步骤
-
从请求头取出
X-StablePay-Signature、X-StablePay-Timestamp、X-StablePay-Nonce; - 校验时间戳与当前时间相差不超过 5 分钟(防重放)
- 校验 Nonce 长度为 16~64 字符
-
取原始请求体字节(不要解析后再序列化),按下列格式拼接:
- 使用商户 Secret Key 做 HMAC-SHA256,得到小写 hex 字符串
-
使用恒定时间比较(如
hmac.compare_digest)与请求头中的签名对比
响应要求与重试策略
- 商户服务需在 30 秒内返回 HTTP
2xx - 返回
429或5xx会进入重试队列,其他4xx不重试 - 最多重试 10 次,采用指数退避间隔(分钟):
2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
幂等消费
请使用X-StablePay-Event-ID(或请求体中的 id 字段)作为幂等键,处理前检查事件是否已被处理过,避免重复下发带来的副作用。
错误响应
错误统一使用 HTTP 状态码 + JSON 响应体返回。error 字段可能是字符串或结构化对象:
安全建议
- Secret Key 只在服务端使用,不得出现在前端代码、APK、小程序包、日志中
- 建议在 CI/CD 中用密钥管理服务(KMS/Vault/SSM)注入 Secret Key
- Webhook 回调 URL 必须使用 HTTPS
- 对每个收到的 Webhook 做签名校验 + 幂等去重 + 业务状态校验(例如订单必须为「已支付」才允许退款)
- 定期在商户后台轮换 API Key 与 Secret Key
