PAYATHON 2026

支付宝 App 支付报 62009 支付订单参数异常

支付阿杰

结论

这组订单参数里,最明显的问题是 notify_url 填了示例占位文字:

notify_url=商户外网可以访问的异步地址

URL 编码无法把这段文字转换成有效地址。支付宝解码后得到的仍是中文说明,而不是合法的 HTTP 或 HTTPS URL,因此可能返回 62009“支付订单参数异常”。

请将 notify_url 改为真实且可从公网访问的异步通知地址。如果暂时不需要接收异步通知,也可以不传这个参数。参数修改后,必须重新生成签名,不能直接替换已经签名的订单串字段。

正确处理方式

有效的通知地址应类似:

https://pay.example.com/alipay/notify

Java SDK 示例:

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是生成二维码测试数据");
model.setSubject("App支付测试Java");
model.setOutTradeNo("202211031003100001");
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");

request.setBizModel(model);
request.setNotifyUrl("https://pay.example.com/alipay/notify");

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

if (response.isSuccess()) {
    String orderInfo = response.getBody();
    // 将 orderInfo 原样交给客户端支付 SDK
} else {
    // 记录错误码、错误信息及支付宝返回的诊断信息
    System.out.println(response.getCode());
    System.out.println(response.getMsg());
    System.out.println(response.getSubCode());
    System.out.println(response.getSubMsg());
}

如果不需要异步通知,可以暂时删除:

request.setNotifyUrl("https://pay.example.com/alipay/notify");

不要将示例说明、空字符串或内网地址作为 notify_url 传入。

建议的排查顺序

1. 检查 notify_url

确认该地址符合以下条件:

  • 是完整的 HTTP 或 HTTPS URL。
  • 包含协议和域名,例如 https://pay.example.com/alipay/notify。
  • 不是中文占位文字。
  • 不是 localhost、127.0.0.1,也不是只能从内网访问的地址。
  • 不含空格、换行或未经处理的特殊字符。
  • 支付宝服务器可以从公网访问。

异步通知接口通常不能依赖登录状态,也不能要求先经过页面跳转才能访问。

2. 修改后重新签名

订单串里的 notify_url、biz_content、timestamp 等字段都会参与签名。只要其中任何字段发生变化,就必须通过服务端 SDK 重新生成完整的订单串。

错误做法:

先生成签名,再手工替换 notify_url

正确做法:

设置全部参数 → SDK 组装并签名 → 将完整订单串交给 App

3. 确认 App 使用的是 SDK 返回的订单串

对于 alipay.trade.app.pay,服务端应调用:

alipayClient.sdkExecute(request)

客户端使用:

response.getBody()

将得到的订单串原样传给支付宝客户端 SDK。不要再将它封装成 JSON,也不要自行拆分、重新排序或重复进行 URL 编码。

例如,订单串中的签名已经编码为:

sign=abc%2Fdef%2Bghi%3D%3D

如果再次对整个订单串编码,可能变成:

sign%3Dabc%252Fdef%252Bghi%253D%253D

这样会破坏参数解析或签名校验。

4. 检查订单号和时间参数

示例中的:

out_trade_no=1

从格式上看不一定非法,但实际接入时,应使用商户系统中唯一且不会重复的订单号,例如:

202211031003100001

如果重复使用已经创建或支付过的 out_trade_no,可能引发订单重复、金额不一致等其他错误。

题目中的 timestamp 是:

2022-11-03 10:03:10

如果现在还在复用这条完整订单串,它已经失效。每次发起支付时,都应由服务端实时生成订单参数和签名,不能保存旧订单串反复调用。

5. 检查签名与证书配置

如果修正 notify_url 后仍然报错,再逐项核对:

  • app_id 是否属于当前商户应用。
  • 应用私钥是否与支付宝开放平台配置的应用公钥匹配。
  • sign_type 是否为 RSA2。
  • 沙箱应用、沙箱网关和沙箱支付宝客户端是否配套。
  • 正式环境的应用、证书和网关是否配套。
  • 使用证书模式时,应用证书、支付宝公钥证书和支付宝根证书是否来自同一套配置。
  • 服务端生成订单串后,客户端是否截断内容或进行了二次编码。

注意事项

notify_url 是服务端接收异步通知的地址,不是支付完成后的客户端跳转页面。支付宝向该地址发送通知后,服务端还需要验签,核对 app_id、订单号、金额和交易状态,并按接口要求返回成功响应。

不要只根据客户端返回的支付结果更新订单状态。客户端结果可能被伪造,也可能因网络中断而丢失。最终支付状态应结合支付宝异步通知或主动查询接口确认。

针对题目给出的参数,应该先修正或删除无效的 notify_url,然后重新调用 sdkExecute 生成订单串,并将 response.getBody() 原样传给支付宝客户端 SDK。

备注:内容仅供参考。