支付宝沙箱扫码支付提示“系统有点忙,请稍后再试”
结论
支付宝沙箱扫码支付提示“系统有点忙,请稍后再试”,通常不只是网络繁忙,也可能是沙箱环境、付款账号或接口配置不一致。
建议先检查:
- 请求是否发到了沙箱网关。
- 扫码时是否使用沙箱支持的客户端和沙箱买家账号。
app_id、应用私钥和支付宝公钥是否来自同一个沙箱应用。- 服务端调用
alipay.trade.precreate时是否返回了业务错误。 - 二维码是否根据接口成功响应中的
qr_code生成,订单是否已过期或被重复使用。
手机页面上的“系统有点忙”只是通用提示,无法直接说明故障原因。排查时应重点查看服务端接口响应中的 code、sub_code 和 sub_msg。
先确认沙箱环境是否配套
沙箱支付不能和正式环境混用。服务端网关、应用配置及付款账号都必须属于沙箱环境。
沙箱网关通常是:
https://openapi-sandbox.dl.alipaydev.com/gateway.do
正式环境网关是:
https://openapi.alipay.com/gateway.do
使用沙箱 app_id 请求正式网关,或者使用正式应用的密钥请求沙箱网关,都可能导致请求失败。
扫码付款时,还要使用支付宝开放平台沙箱提供的买家测试账号。普通支付宝账号通常无法直接完成沙箱交易。沙箱客户端的获取方式和支持平台可能发生调整,具体以开放平台控制台当前的沙箱说明为准。
检查服务端接口响应
扫码支付一般先调用 alipay.trade.precreate 生成二维码。只有接口明确返回成功后,才能把 qr_code 展示给用户。
建议完整记录这些字段:
code
msg
sub_code
sub_msg
trade_no
out_trade_no
qr_code
判断接口是否成功,不能只看 HTTP 状态码,还要检查支付宝的业务响应码。常见的成功码是 10000,实际判断时仍应优先使用 SDK 返回对象提供的成功判断方法。
Java 示例:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setTotalAmount("0.01");
model.setSubject("沙箱扫码支付测试");
request.setBizModel(model);
AlipayTradePrecreateResponse response = alipayClient.execute(request);
System.out.println("code=" + response.getCode());
System.out.println("msg=" + response.getMsg());
System.out.println("subCode=" + response.getSubCode());
System.out.println("subMsg=" + response.getSubMsg());
System.out.println("qrCode=" + response.getQrCode());
if (response.isSuccess()) {
String qrCode = response.getQrCode();
// 使用二维码组件将 qrCode 原样生成二维码
} else {
throw new IllegalStateException(
"支付宝预下单失败:" + response.getCode()
+ " / " + response.getSubCode()
+ " / " + response.getSubMsg()
);
}
如果 response.isSuccess() 为 false,就不要继续生成二维码。此时应先根据 sub_code 和 sub_msg 修正服务端配置或请求参数,手机端显示的提示并不能帮助定位具体问题。
核对密钥和签名配置
沙箱应用至少需要检查以下配置:
app_id是否来自当前沙箱应用。merchantPrivateKey是否为应用私钥,并且与上传到该应用的应用公钥配对。alipayPublicKey是否为开放平台给当前沙箱应用提供的支付宝公钥,而不是应用公钥。- 签名算法是否一致。例如配置为
RSA2时,请求也必须使用RSA2。 - 字符集通常使用
UTF-8。 - 修改或重新上传应用公钥后,本地配置是否已同步更新。
“应用公钥”和“支付宝公钥”很容易混淆,两者用途不同:
- 应用私钥由商户侧用来生成签名。
- 支付宝公钥由商户侧用来验证支付宝签名。
- 应用公钥需要上传到开放平台,供支付宝验证商户请求。
如果公钥填反,或者公私钥不配对,接口一般会返回验签或签名相关错误。
检查二维码和订单参数
接口返回成功后,应直接使用响应中的 qr_code 生成二维码。不要自行拼接支付地址,也不要重复对内容进行 URL 编码或解码。
同时检查订单参数:
{
"out_trade_no": "TEST_202609090001",
"total_amount": "0.01",
"subject": "沙箱扫码支付测试"
}
注意以下几点:
out_trade_no在商户侧必须唯一。total_amount应是合法的金额字符串,例如"0.01"。subject不能为空。- 不要重复使用已经关闭、已经支付或状态异常的订单号。
- 二维码必须来自本次成功的预下单响应。
- 如果设置了
timeout_express,需要确认二维码仍在有效期内。
排查时可以为每次测试生成新的 out_trade_no,避免旧订单状态影响结果。
确认扫码账号与环境一致
如果预下单成功,二维码内容也没有问题,但扫码后仍然提示“系统有点忙”,应重点检查扫码端:
- 当前登录的账号是否为开放平台提供的沙箱买家账号。
- 是否误用了普通支付宝客户端或正式支付宝账号。
- 沙箱买家账号能否正常登录,余额和账号状态是否满足测试条件。
- 是否把商户沙箱账号当成了买家账号。
- 客户端缓存的登录状态是否与当前测试账号一致。
可以先退出扫码端账号并清理登录状态,然后重新登录沙箱买家账号,再扫描新生成的二维码。沙箱客户端和账号的具体使用方式可能随开放平台调整,应以控制台当前显示的信息为准。
推荐的排查顺序
可以按以下顺序排查:
- 确认请求使用的是沙箱网关。
- 确认
app_id、应用私钥和支付宝公钥都来自同一个沙箱应用。 - 打印
alipay.trade.precreate的完整响应。 - 确认响应成功,并且包含非空的
qr_code。 - 使用新的
out_trade_no重新预下单。 - 根据
qr_code原样生成二维码。 - 使用沙箱买家账号扫码付款。
- 支付后调用
alipay.trade.query查询交易状态,不要只依赖页面跳转结果。
如果预下单接口已经成功,但所有沙箱买家账号扫码时都出现相同提示,可以保留请求时间、app_id、out_trade_no、接口响应和客户端截图,再通过支付宝开放平台的技术支持渠道确认沙箱服务状态。提交排查信息时,不要附带应用私钥、完整签名串或其他敏感凭据。
备注:内容仅供参考。
