微信支付 V3 没有沙箱,支付宝有沙箱,Stripe 是 test mode:四家支付测试环境对照
上线前联调,常见的预期是「每家都有沙箱,换个域名就能跑」。实际把四家接进来会发现,「测试环境」在每家那里是完全不同的东西:有的是独立域名加独立账号,有的只是换一个 key,有的干脆不存在。
前提:同一业务链路里接两家以上渠道,且上线前要验证下单 → 回调 → 查单 → 退款 → 对账。如果只接一家、或者只需要跑通成功链路,直接看该渠道文档即可,下面的对照意义不大。
一、微信支付:仿真系统只覆盖 V2 付款码支付,V3 没有沙箱
微信支付有一套「仿真测试系统」,属 V2 时代产物,切换方式是在正式 API 的 URL 上加一层 xdc/apiv2sandbox 路径。以付款码支付为例:
https://api.mch.weixin.qq.com/pay/micropay
https://api.mch.weixin.qq.com/xdc/apiv2sandbox/pay/micropay
覆盖范围很窄,目前只支持「付款码支付成功用例」和「付款码支付异常用例」两类。统一下单接口 https://api.mch.weixin.qq.com/pay/unifiedorder 等暂不支持。
异常用例通过 HTTP Header 触发,仿真系统据此返回对应异常报文:
Wechatpay-Negative-Test: {用例名}
仿真系统与生产环境完全独立,含存储层,全程无资金流:用户不真实扣款,商户不入账,代金券也是假的。
验签密钥要单独取,不能复用生产的:
POST https://api.mch.weixin.qq.com/xdc/apiv2getsignkey/sign/getsignkey
请求体带 mch_id,返回 sandbox_signkey(String(32))。
关键是 APIv3 那一整套——JSAPI / Native / H5 / App 下单、退款、对账单——没有沙箱可用,只能拿真实小额或测试商户号在生产链路里验证。
参考:微信支付 支付验收指引
二、支付宝:沙箱是一整套(环境 + 测试服务 + 沙箱钱包)
支付宝的沙箱是完整环境:无需商业资质,无需绑定和开通产品即可调用接口,不影响生产数据。网关与生产不同:
| 网关 | |
|---|---|
| 沙箱 | openapi.alipaydev.com |
| 生产 | openapi.alipay.com |
配套工具分散在几处,版本有下限要求:
- 沙箱控制台:沙箱应用、沙箱买家 / 卖家账号都在这里
- 沙箱支付宝钱包 App:10.3.70 以上
- 小程序 IDE 3.6.2 以上 + 沙箱环境切换插件 V2.0.5 以上,装完要重启 IDE
沙箱测试服务分两种模式:
- 单步测试:按单接口入参示例快速测,结果即用即消,步骤间流量互不影响
- 链路测试:按测试步骤拓扑顺序清洗流量,并给出校验结果
约束与特性:原则上不需要签约 / 订购插件,沙箱会自动 MOCK 这类数据;暂时不支持信用授权。
几个常踩的报错:
| 现象 | 原因与处理 |
|---|---|
| APP 支付沙箱调试提示「当前账号未入驻沙箱,暂不支持调试」 | 账号未入驻沙箱 |
| 支付提示「抱歉,无可用付款方式」 | 沙箱买家余额不足,去沙箱控制台充值 |
| 支付输密码提示系统异常 | 多为网络超时 / 系统抖动,重试 |
前端联调可以直接用沙箱钱包拉起,不一定需要切换插件。
三、Stripe:没有独立沙箱域名,就是 test mode + test key
Stripe 的「测试环境」不是另一个域名。用 test API key(sk_test_ / pk_test_)就是测试模式,和 live key 走同一个 api.stripe.com。
测试卡:4242 4242 4242 4242,任意未来日期(如 12/34),任意 3 位 CVC(Amex 是 4 位)。
写代码时官方建议用 PaymentMethod,例如 pm_card_visa,而不是直接硬编码卡号——硬编码卡号上线后可能不符合 PCI 要求。
沙箱里能模拟的场景:
| 场景 | 卡号 | 结果 |
|---|---|---|
| 通用拒付 | 4000 0000 0000 0002 | card_declined / generic_decline |
| 余额不足 | 4000 0000 0000 9995 | insufficient_funds |
| 始终被 Radar 拦截 | 4100 0000 0000 0019 | risk level highest |
| 争议 | 4000 0000 0000 0259 | 默认设置下会被以 fraudulent 争议 |
| 异步退款成功 | 4000 0000 0000 7726 | 先 pending 再 succeeded,发 refund.updated 事件 |
| 异步退款失败 | 4000 0000 0000 5126 | 先 succeeded 再 failed,发 refund.failed 事件 |
另外两点:按卡组织 / 国家的成功支付、Radar 风控、争议、3DS、异步退款都能在测试模式触发;测试环境里取消卡退款只能在 Dashboard 操作,模拟窗口是 30 分钟。不要用测试环境做压测,会撞 rate limit。
四、PayPal:sandbox 是独立环境和独立域名
PayPal 走独立域名:
| API 域名 | |
|---|---|
| 沙箱 | api-m.sandbox.paypal.com |
| 生产 | api-m.paypal.com |
注册 PayPal 开发者账号时会自动生成两个沙箱账号,一个 business(收款)、一个 personal(付款),命名形如 sb-xxxxx@business.example.com / sb-xxxxx@personal.example.com,自带测试 API 凭据。
沙箱站点 https://www.sandbox.paypal.com 可登录查看 mock 交易。
沙箱功能集与生产一致,但部分功能不适用:关闭账户、发月结单、保存物流偏好、PayPal Shops 支持。
取 access token:
curl -v -X POST "https://api-m.sandbox.paypal.com/v1/oauth2/token" \
-u "CLIENT_ID:CLIENT_SECRET" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials"
参考:PayPal sandbox testing guide、PayPal Sandbox accounts
五、对照表
| 渠道 | 测试环境形态 | 地址 / 切换方式 | 覆盖范围 | 备注 |
|---|---|---|---|---|
| 微信支付 V2 | 仿真测试系统 | 正式 URL 加 /xdc/apiv2sandbox | 仅付款码支付成功 / 异常用例;统一下单不支持 | 无资金流;验签密钥单独接口取 |
| 微信支付 V3 | 无沙箱 | — | 无(需真实小额 / 测试商户号) | JSAPI / Native / H5 / 退款 / 账单均无沙箱 |
| 支付宝 | 沙箱环境 + 沙箱测试服务 | openapi.alipaydev.com | 多数支付 / 资金接口,自动 MOCK 签约 | 沙箱钱包 10.3.70+;不支持信用授权 |
| Stripe | test mode | 同域名,换 test key | 卡 / 钱包 / 银行转账、拒付、风控、争议、退款 | 测试卡号 + PaymentMethod |
| PayPal | sandbox | api-m.sandbox.paypal.com | 与生产一致的 API 功能集 | 独立沙箱账号 sb-xxx@ |
六、无论哪家,上线前都要过的几条
- 0.01 元真实小额全链路:下单 → 回调 → 查单 → 退款 → 对账。没有沙箱的渠道必须做。
- 回调幂等与重复通知、回调丢失兜底。
- 拒付 / 风控拦截路径。Stripe 有现成卡号;国内渠道要在生产才可能真实触发,谨慎操作。
- 退款失败 / 异步退款路径。
- 沙箱与生产的域名、密钥、证书三套配置隔离。别把 test key 带上线,也别把 live key 提交进版本库。
七、未实测 / 待确认
- 微信仿真测试系统当前是否仍在维护、是否对新商户开放,以官方文档为准。
- 支付宝沙箱支持的产品范围会随平台调整,以「沙箱环境」文档为准。
- 各渠道测试环境的 rate limit 具体阈值未核实。
开放问题
没有沙箱的渠道(微信 V3)怎么在测试环境里覆盖异常路径?用真实小额只能测成功链路,异常路径(重复支付、退款失败、风控拦截)几乎只能靠 mock 号或者上线后灰度。这块各家都没有干净答案。