支付宝沙箱点击支付后出现 502 Bad Gateway 是什么原因?
明确结论
502 Bad Gateway 表示当前网关或反向代理没有从上游服务收到有效响应。它通常不是支付宝返回的支付业务错误,而是支付宝沙箱网关、商户服务器、Nginx、内网穿透服务或其他代理节点发生了连接异常。
排查时,首先要确认 502 页面对应的 URL 属于支付宝还是自己的系统。
先确认故障发生在哪里
点击支付后,查看浏览器地址栏,并在开发者工具的 Network 面板中找到失败的请求。
- URL 是
openapi.alipaydev.com时,可能是请求方式、网关链路有问题,也可能是支付宝沙箱服务暂时异常。 - URL 是自己的域名时,应重点检查商户服务器、Nginx 和应用进程。
- URL 是内网穿透域名时,通常需要确认隧道是否在线,以及映射的本地端口是否正确。
- 支付完成后才出现 502,应重点检查
return_url。 - 页面支付正常,但没有收到异步通知,应检查
notify_url。异步通知失败通常不会直接导致用户浏览器显示 502。
还可以查看错误页面底部的服务器标识,如 nginx、CDN 服务商或隧道服务名称,以判断 502 是由哪一层返回的。
常见原因
1. 商户应用没有正常运行
Nginx 收到了浏览器请求,却无法连接后端应用。常见情况包括 Java 服务未启动、进程崩溃或监听端口配置错误。
可以先直接访问应用端口:
curl -v http://127.0.0.1:8080/
如果直接访问也失败,应先修复应用本身,不必继续调整支付宝参数。
2. Nginx 转发地址配置错误
例如,应用实际监听 8080,Nginx 却转发到了 8081。配置可以参考:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_connect_timeout 10s;
proxy_read_timeout 60s;
}
修改后检查配置并重新加载:
nginx -t
nginx -s reload
同时查看 Nginx 错误日志。常见提示包括:
connect() failed (111: Connection refused) while connecting to upstream
upstream timed out
upstream prematurely closed connection
它们分别表示端口无法连接、后端响应超时和应用提前断开连接。
3. 使用了错误的支付宝网关
沙箱环境应使用沙箱网关:
https://openapi.alipaydev.com/gateway.do
正式环境通常使用:
https://openapi.alipay.com/gateway.do
应用 ID、应用私钥、支付宝公钥和网关地址必须来自同一套环境。混用沙箱和正式环境的配置会导致调用失败。不过,参数或签名有误时,支付宝通常会返回明确的错误信息,不能把所有 502 都简单归因于签名问题。
4. 支付表单生成或提交方式不正确
电脑网站支付调用 alipay.trade.page.pay 时,通常由服务端生成 HTML 表单,再交给浏览器提交到支付宝网关。
以下是 Java SDK 的典型流程:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipaydev.com/gateway.do",
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("https://example.com/alipay/return");
request.setNotifyUrl("https://example.com/alipay/notify");
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "0.01",
"subject": "沙箱测试订单",
"product_code": "FAST_INSTANT_TRADE_PAY"
}
""");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
String form = response.getBody();
控制器应把生成的表单作为 HTML 返回:
@GetMapping(value = "/pay", produces = "text/html;charset=UTF-8")
@ResponseBody
public String pay() throws AlipayApiException {
return createAlipayForm();
}
如果支付表单被转义、截断或包装成 JSON,浏览器可能无法正确提交。例如,下面的响应不适合直接作为支付跳转页面:
{
"code": 200,
"data": "<form>...</form>"
}
检查实际响应是否包含完整的 <form> 标签、支付宝网关地址和自动提交脚本。
5. return_url 对应的服务异常
支付完成后,支付宝会将用户浏览器跳转到 return_url。如果该地址经过 Nginx,而对应的后端接口没有启动,页面就会显示 502。
回跳接口应能正常处理支付宝附带的查询参数,例如:
@GetMapping("/alipay/return")
public String alipayReturn(HttpServletRequest request) {
// 实际业务中应先验签,再查询订单状态
return "支付结果处理中";
}
不要只根据 return_url 中的参数将订单标记为已支付。应先验签,再通过异步通知或主动查询接口确认交易状态。
6. notify_url 无法被公网访问
notify_url 由支付宝服务器主动请求,因此不能使用支付宝服务器无法访问的地址,例如:
http://localhost:8080/alipay/notify
http://127.0.0.1:8080/alipay/notify
开发环境可以使用可靠的内网穿透服务,但需要确认:
- 隧道仍然在线;
- 公网域名没有过期;
- 映射端口与应用监听端口一致;
- HTTPS 证书有效;
- 防火墙没有拦截请求;
- 通知接口不要求登录,也未被 CSRF 校验阻止。
浏览器访问 return_url 时,本机地址有时能够打开,但支付宝服务器无法通过 localhost 访问开发者电脑。不要混淆这两种情况。
7. 沙箱服务或网络链路临时异常
如果失败地址确定属于支付宝沙箱,并且相同代码此前运行正常,可以尝试:
- 使用无痕窗口重新登录沙箱买家账号;
- 清除支付宝沙箱相关的 Cookie;
- 重新生成订单,避免重复使用
out_trade_no; - 更换网络环境测试;
- 等一段时间后重试;
- 查看支付宝开放平台是否发布了服务公告。
确认商户请求日志、服务器状态和参数配置都没有异常后,再考虑是否为沙箱环境的临时故障。
推荐的排查顺序
- 记录出现 502 时浏览器地址栏中的完整域名和路径,并对敏感参数脱敏。
- 在 Network 面板中找到状态码为
502的请求,确认它发生在支付前、支付中还是支付后。 - 如果请求指向自己的域名,检查应用进程、监听端口、Nginx 日志和应用日志。
- 如果请求指向内网穿透域名,检查隧道状态,并直接访问公网回调地址。
- 确认沙箱使用
https://openapi.alipaydev.com/gateway.do,密钥和app_id也来自同一个沙箱应用。 - 检查支付接口返回的 HTML 表单是否完整,以及浏览器是否实际向支付宝网关发起了请求。
- 分别验证
return_url和notify_url,不要混淆页面回跳与异步通知。 - 如果 502 来自支付宝域名,使用新的订单号重试,并结合开放平台公告判断是否为临时故障。
注意事项
- 不要公开应用私钥、支付宝公钥原文、签名值或完整支付请求。
out_trade_no必须保持唯一。重复测试时,建议生成新的商户订单号。- 502 属于 HTTP 网关层错误;
INVALID_SIGNATURE、ACQ.INVALID_PARAMETER等才是可以直接识别的支付宝业务或参数错误。 - 回调接口必须验签,还要将金额、商户订单号、应用 ID 和交易状态与本地订单核对。
- 异步通知处理成功后,应按照所用支付宝接口的规范返回成功响应,以免支付宝重复通知。
- 只有错误页面截图,无法准确判断故障位置。至少还需提供失败 URL 的域名、Network 请求状态、商户服务日志和反向代理错误日志。
备注:内容仅供参考。
