支付宝沙箱 H5 支付无法唤起 Android 沙箱版 App
结论
在支付宝沙箱中测试 H5 支付时,应在浏览器收银台使用“买家沙箱账号”完成付款,无需把“唤起支付宝 App”列为必测链路。
页面提示下载的通常是正式环境使用的支付宝客户端,并非用于沙箱联调的 Android 沙箱钱包。正式客户端使用手机号账号体系,无法通过沙箱提供的用户名和密码登录。即使安装成功,也不能用它支付沙箱订单。
出现这种情况的原因
沙箱环境和正式环境是两套彼此隔离的系统:
- 沙箱账号由开发者平台生成,通常使用用户名和密码登录。
- 正式支付宝账号一般使用手机号等方式登录。
- 沙箱订单只能由沙箱买家账号支付。
- 正式支付宝客户端无法识别或支付沙箱订单。
- H5 收银台唤起 App、跳转应用商店,以及浏览器处理 URL Scheme 时,仍可能进入正式客户端链路。
所以,点击“打开支付宝 App”后出现下载提示,并不意味着需要重新注册账号,也不需要给沙箱账号绑定手机号。下载后的客户端要求使用手机号登录,恰好说明当前进入了正式账号体系。
即使设备中已经安装 Android 沙箱钱包,H5 页面也未必能正确识别并唤起它。浏览器还可能拦截 URL Scheme、自定义协议或应用跳转,因此不能根据客户端是否被唤起来判断支付接口是否调用成功。
正确的测试方法
1. 确认使用沙箱网关和沙箱应用配置
请求需要发送到支付宝开放平台当前提供的沙箱网关,并使用对应沙箱应用的配置:
- 沙箱
app_id - 应用私钥
- 沙箱支付宝公钥或支付宝公钥证书
- 与签名方式匹配的密钥或证书
- 沙箱环境中配置的异步通知地址
不要混用正式环境的 app_id、网关、密钥或证书。沙箱网关地址可能因接入方式而调整,请以开放平台控制台当前显示的地址为准。
2. 使用 alipay.trade.wap.pay 创建 H5 支付
手机网站支付需要调用 alipay.trade.wap.pay,并把 product_code 设置为 QUICK_WAP_WAY。
以下是 Java SDK 的基本示例,网关、应用编号和密钥均为占位符:
AlipayClient alipayClient = new DefaultAlipayClient(
"SANDBOX_GATEWAY",
"SANDBOX_APP_ID",
"APP_PRIVATE_KEY",
"json",
"UTF-8",
"ALIPAY_PUBLIC_KEY",
"RSA2"
);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://example.com/pay/return");
request.setNotifyUrl("https://example.com/pay/notify");
request.setBizContent("""
{
"out_trade_no": "TEST202609090001",
"total_amount": "0.01",
"subject": "沙箱 H5 支付测试",
"product_code": "QUICK_WAP_WAY",
"quit_url": "https://example.com/pay/cancel"
}
""");
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String formHtml = response.getBody();
// 将 formHtml 原样返回给浏览器
} else {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
服务端应将 pageExecute() 返回的完整 HTML 表单直接响应给浏览器。不要自行拼接 App Scheme,也不要把支付表单作为普通 JSON 返回。
例如,可以在 Servlet 中这样输出:
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(formHtml);
response.getWriter().flush();
3. 在浏览器收银台完成付款
在 Android 浏览器中打开生成的支付页面后:
- 不要选择下载新的支付宝客户端。
- 继续停留在浏览器收银台。
- 查找“继续浏览器付款”或“账号密码登录”等入口。
- 使用开放平台沙箱账号页面中的“买家账号”和“登录密码”登录。
- 输入该买家账号对应的支付密码,完成付款。
收银台的按钮名称和页面布局可能随版本变化。测试时应选择网页内的账号密码支付流程,不要进入正式支付宝客户端。
4. 使用正确的沙箱账号
沙箱通常提供买家和卖家两类账号:
- 买家账号:用于登录收银台和付款。
- 卖家账号:用于收款、查询账务等测试。
进行 H5 付款时必须使用买家账号。登录密码和支付密码用途不同,需要分别使用控制台中展示或设置的对应密码。
如果无法登录,请先排查是否误用了以下账号或密码:
- 沙箱卖家账号;
- 正式支付宝账号;
- 商户开放平台登录账号;
- 用支付密码代替了登录密码;
- 其他沙箱应用或其他环境中的测试账号。
Android 沙箱钱包的作用
Android 沙箱钱包主要用于测试需要客户端参与的沙箱能力。它与正式支付宝客户端不同,也不能使用真实手机号账号代替沙箱账号。
确实需要测试沙箱钱包时,应从支付宝开放平台的沙箱工具或沙箱账号页面获取对应安装包,并按照页面说明使用沙箱买家账号登录。不要用 H5 收银台跳转后推荐下载的客户端代替沙箱钱包。
对于 alipay.trade.wap.pay,主要测试以下流程:
业务页面
→ 服务端调用 alipay.trade.wap.pay
→ 浏览器打开沙箱收银台
→ 沙箱买家账号支付
→ 服务端接收异步通知
→ 服务端查询并确认订单状态
App 能否成功唤起,会受到沙箱钱包能力、浏览器策略和页面跳转方式的影响,不能作为判断 H5 支付是否成功的唯一依据。
支付完成后的校验
浏览器跳回 return_url,只能说明用户回到了商户页面,不能单独证明支付已经成功。服务端还需要:
- 验证支付宝异步通知的签名。
- 核对
app_id、out_trade_no、total_amount和收款方信息。 - 确认
trade_status符合业务要求。 - 必要时调用
alipay.trade.query主动查询订单。 - 通过幂等逻辑更新本地订单,避免重复通知造成重复处理。
异步通知地址必须能由支付宝沙箱服务器通过公网访问。localhost、127.0.0.1 或只能从局域网访问的地址,无法直接接收通知。
注意事项
- 不要通过手机号登录正式支付宝客户端来验证沙箱账号。
- 不要在正式环境中使用沙箱买家账号,也不要用真实支付宝账号支付沙箱订单。
- 不要手动拼接
alipays://等协议来强制唤起客户端,否则会增加浏览器兼容问题,也可能进入错误的环境。 - 支付链接和表单通常包含订单及签名上下文,不适合长期缓存或反复复用。
- 每次测试都应生成唯一的
out_trade_no。 - 如果手机浏览器中没有网页账号支付入口,可以更换系统浏览器,或清除旧页面缓存后重试。如果仍然找不到入口,需要结合开放平台当前的沙箱说明,确认该收银台版本支持的测试方式。
- 上线前还需使用正式应用配置在正式环境中重新验证。沙箱测试成功,并不代表正式环境中的客户端唤起行为会完全一致。
备注:内容仅供参考。
