测试与上线

35pay 的测试模式由 API Key 驱动 —— sk_test_ 自动走 mock provider, 不产生真实交易。流程 OK 后换成 sk_live_ 即可正式收款。

测试模式做了什么

  • 所有 POST /api/v1/checkout 请求会标记 mode: 'test',session 走独立的命名空间
  • 不调用真实的微信 / Stripe / Creem,由内置 mock provider 模拟整个生命周期
  • Hosted 收银台会显示一个"模拟支付"按钮,点击即可在 1 秒内完成"支付成功"或"支付失败"
  • 测试模式会触发真实的 webhook(事件 payload 中 mode: 'test'),让你联调端到端
  • 不会发"收款成功"邮件、不会写入交易报表的对外口径
测试模式 不需要 在控制台配置任何真实 provider。注册账号 → 创建 sk_test_ Key → 立刻就能调通整个流程。

快速跑一遍测试支付

# 1. 创建测试 session
curl https://pay.35team.com/api/v1/checkout \
  -H "Authorization: Bearer sk_test_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 100, "currency": "CNY", "description": "测试" }'

# 响应里拿到 url,浏览器打开
# 在收银台点 "模拟支付成功" → 触发 payment.paid webhook
# 在 dashboard → 交易 看到一笔 mode=test 的记录

上线 Checklist

把测试模式跑通后,按下面 checklist 切到 live 模式:

1. 配置真实支付渠道

  • 进入 支付渠道,至少配置一个:微信支付 / Stripe / Creem
  • 填的凭据是商户自己的(mchid、secret、证书等),35pay 不持有任何资金
  • 每个 provider 的 webhook 回调地址也要在对方平台配好(dashboard 里有提示 URL)

2. 替换 API Key

  • 新建一个 sk_live_ Key,用环境变量管理(如 PAY_SECRET_KEY_LIVE
  • 生产环境只读 live key,不要让 test/live 在同一个进程里混用
  • 把测试时用的 sk_test_ Key 留着 ——CI / staging / 本地开发还要用

3. 配置生产 webhook

  • Webhooks 添加生产域名的 endpoint URL
  • 必须 HTTPS,必须能从公网访问(不能是内网地址)
  • Signing Secret 也走环境变量,生产 / staging 用各自独立的 secret
  • 用"测试发送"按钮触发一次 test.ping,确认能收到

4. 幂等与对账

  • webhook handler 必须幂等(详见 幂等
  • 订单表用 metadata.orderId 关联 session,加 UNIQUE 约束
  • 对账以 webhook 的 amount + providerRef 为准,不要从订单系统反查

5. 监控与对账

  • 留意 dashboard 投递记录,关注重试 6 次仍失败的事件(worker 已自动重试,不用手动触发)
  • 账户设置 勾选"收款成功邮件通知"——第一笔真实支付能即时知道(仅 live 模式发邮件,test 不打扰)
  • 定期在 交易 页"导出 CSV"对账(含订单 ID、金额、退款额、provider、metadata 等列)
  • 建议设置告警:webhook 5xx 占比 / 待支付 session 异常增多

出问题怎么回滚

  • 把生产环境的 PAY_SECRET_KEY 暂时换回 sk_test_,停止真实收款(用户在收银台会看到测试模式提示)
  • 在 dashboard 撤销有问题的 Key、停用问题 Webhook endpoint
  • 具体交易问题:找到 session ID → 控制台搜 → 联系商务介入
测试模式和生产模式的 session ID 不互通。sk_test_ 创建的 session 不能用 sk_live_ 查询,反之亦然。这是为了避免你不小心拿测试 ID 给真实订单做对账。