PAYATHON 2026

支付宝沙箱点击支付后出现 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;
  • 更换网络环境测试;
  • 等一段时间后重试;
  • 查看支付宝开放平台是否发布了服务公告。

确认商户请求日志、服务器状态和参数配置都没有异常后,再考虑是否为沙箱环境的临时故障。

推荐的排查顺序

  1. 记录出现 502 时浏览器地址栏中的完整域名和路径,并对敏感参数脱敏。
  2. 在 Network 面板中找到状态码为 502 的请求,确认它发生在支付前、支付中还是支付后。
  3. 如果请求指向自己的域名,检查应用进程、监听端口、Nginx 日志和应用日志。
  4. 如果请求指向内网穿透域名,检查隧道状态,并直接访问公网回调地址。
  5. 确认沙箱使用 https://openapi.alipaydev.com/gateway.do,密钥和 app_id 也来自同一个沙箱应用。
  6. 检查支付接口返回的 HTML 表单是否完整,以及浏览器是否实际向支付宝网关发起了请求。
  7. 分别验证 return_url 和 notify_url,不要混淆页面回跳与异步通知。
  8. 如果 502 来自支付宝域名,使用新的订单号重试,并结合开放平台公告判断是否为临时故障。

注意事项

  • 不要公开应用私钥、支付宝公钥原文、签名值或完整支付请求。
  • out_trade_no 必须保持唯一。重复测试时,建议生成新的商户订单号。
  • 502 属于 HTTP 网关层错误;INVALID_SIGNATURE、ACQ.INVALID_PARAMETER 等才是可以直接识别的支付宝业务或参数错误。
  • 回调接口必须验签,还要将金额、商户订单号、应用 ID 和交易状态与本地订单核对。
  • 异步通知处理成功后,应按照所用支付宝接口的规范返回成功响应,以免支付宝重复通知。
  • 只有错误页面截图,无法准确判断故障位置。至少还需提供失败 URL 的域名、Network 请求状态、商户服务日志和反向代理错误日志。

备注:内容仅供参考。