测试与上线
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 给真实订单做对账。