PAYATHON 2026

支付宝沙箱 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 浏览器中打开生成的支付页面后:

  1. 不要选择下载新的支付宝客户端。
  2. 继续停留在浏览器收银台。
  3. 查找“继续浏览器付款”或“账号密码登录”等入口。
  4. 使用开放平台沙箱账号页面中的“买家账号”和“登录密码”登录。
  5. 输入该买家账号对应的支付密码,完成付款。

收银台的按钮名称和页面布局可能随版本变化。测试时应选择网页内的账号密码支付流程,不要进入正式支付宝客户端。

4. 使用正确的沙箱账号

沙箱通常提供买家和卖家两类账号:

  • 买家账号:用于登录收银台和付款。
  • 卖家账号:用于收款、查询账务等测试。

进行 H5 付款时必须使用买家账号。登录密码和支付密码用途不同,需要分别使用控制台中展示或设置的对应密码。

如果无法登录,请先排查是否误用了以下账号或密码:

  • 沙箱卖家账号;
  • 正式支付宝账号;
  • 商户开放平台登录账号;
  • 用支付密码代替了登录密码;
  • 其他沙箱应用或其他环境中的测试账号。

Android 沙箱钱包的作用

Android 沙箱钱包主要用于测试需要客户端参与的沙箱能力。它与正式支付宝客户端不同,也不能使用真实手机号账号代替沙箱账号。

确实需要测试沙箱钱包时,应从支付宝开放平台的沙箱工具或沙箱账号页面获取对应安装包,并按照页面说明使用沙箱买家账号登录。不要用 H5 收银台跳转后推荐下载的客户端代替沙箱钱包。

对于 alipay.trade.wap.pay,主要测试以下流程:

业务页面
  → 服务端调用 alipay.trade.wap.pay
  → 浏览器打开沙箱收银台
  → 沙箱买家账号支付
  → 服务端接收异步通知
  → 服务端查询并确认订单状态

App 能否成功唤起,会受到沙箱钱包能力、浏览器策略和页面跳转方式的影响,不能作为判断 H5 支付是否成功的唯一依据。

支付完成后的校验

浏览器跳回 return_url,只能说明用户回到了商户页面,不能单独证明支付已经成功。服务端还需要:

  1. 验证支付宝异步通知的签名。
  2. 核对 app_id、out_trade_no、total_amount 和收款方信息。
  3. 确认 trade_status 符合业务要求。
  4. 必要时调用 alipay.trade.query 主动查询订单。
  5. 通过幂等逻辑更新本地订单,避免重复通知造成重复处理。

异步通知地址必须能由支付宝沙箱服务器通过公网访问。localhost、127.0.0.1 或只能从局域网访问的地址,无法直接接收通知。

注意事项

  • 不要通过手机号登录正式支付宝客户端来验证沙箱账号。
  • 不要在正式环境中使用沙箱买家账号,也不要用真实支付宝账号支付沙箱订单。
  • 不要手动拼接 alipays:// 等协议来强制唤起客户端,否则会增加浏览器兼容问题,也可能进入错误的环境。
  • 支付链接和表单通常包含订单及签名上下文,不适合长期缓存或反复复用。
  • 每次测试都应生成唯一的 out_trade_no。
  • 如果手机浏览器中没有网页账号支付入口,可以更换系统浏览器,或清除旧页面缓存后重试。如果仍然找不到入口,需要结合开放平台当前的沙箱说明,确认该收银台版本支持的测试方式。
  • 上线前还需使用正式应用配置在正式环境中重新验证。沙箱测试成功,并不代表正式环境中的客户端唤起行为会完全一致。

备注:内容仅供参考。