PAYATHON 2026

周期扣款失败:支付授权码应在哪里添加?

支付老李

结论

支付授权码需要通过 alipay.trade.pay 业务参数中的 auth_code 字段传入。该字段应放在 biz_content 内,不能添加到公共请求参数中。

在周期扣款场景中,auth_code 通常是用户签约成功后取得并保存的支付授权标识。具体对应签约结果中的哪个字段,应以当前周期扣款产品的接口文档为准。应用授权令牌 app_auth_token 不能作为支付授权码使用。

失败原因

返回结果中的关键信息如下:

{
  "code": "40004",
  "sub_code": "ACQ.INVALID_PARAMETER",
  "sub_msg": "支付授权码不能为空"
}

ACQ.INVALID_PARAMETER 表示业务请求参数不符合要求,支付授权码不能为空 则说明 auth_code 未传递、值为空,或者所在的参数层级不正确。

auth_code 是 alipay.trade.pay 的业务参数,需要序列化到 biz_content 中。如果只将它添加到 SDK 外层请求对象、HTTP 表单顶层或自定义扩展字段中,支付宝服务端可能无法识别。

请求示例

原始 JSON 请求的业务内容可以按以下结构组织:

{
  "out_trade_no": "1f4************525a",
  "product_code": "CYCLE_PAY_AUTH",
  "subject": "周期扣款",
  "total_amount": "10.00",
  "auth_code": "签约后取得的支付授权标识"
}

向支付宝网关发送请求时,上述内容应作为 biz_content 的值:

app_id=...
method=alipay.trade.pay
format=JSON
charset=utf-8
sign_type=RSA2
timestamp=...
version=1.0
biz_content={"out_trade_no":"1f4************525a","product_code":"CYCLE_PAY_AUTH","subject":"周期扣款","total_amount":"10.00","auth_code":"签约后取得的支付授权标识"}
sign=...

Java SDK 示例

使用 Java SDK 时,可以通过 AlipayTradePayModel#setAuthCode 设置授权码:

AlipayTradePayRequest request = new AlipayTradePayRequest();

AlipayTradePayModel model = new AlipayTradePayModel();
model.setOutTradeNo("1f4************525a");
model.setProductCode("CYCLE_PAY_AUTH");
model.setSubject("周期扣款");
model.setTotalAmount("10.00");
model.setAuthCode("签约后取得的支付授权标识");

request.setBizModel(model);

AlipayTradePayResponse response = alipayClient.execute(request);

如果没有使用模型类,也可以直接设置 biz_content:

AlipayTradePayRequest request = new AlipayTradePayRequest();
request.setBizContent("""
{
  "out_trade_no": "1f4************525a",
  "product_code": "CYCLE_PAY_AUTH",
  "subject": "周期扣款",
  "total_amount": "10.00",
  "auth_code": "签约后取得的支付授权标识"
}
""");

AlipayTradePayResponse response = alipayClient.execute(request);

排查步骤

  1. 检查实际调用的接口是否为 alipay.trade.pay。
  2. 确认请求中包含非空的 auth_code。
  3. 确认 auth_code 位于 biz_content 内。
  4. 检查签约成功后返回的授权标识是否已保存,并在扣款时正确取出。
  5. 确认该授权标识属于当前用户、当前商户和当前签约关系,并且尚未失效或解约。
  6. 输出签名前的 biz_content 进行核对,同时对日志中的授权标识进行脱敏。
  7. 添加参数后重新生成签名,不要继续使用修改请求前的 sign。

注意事项

auth_code、agreement_no 和 app_auth_token 的含义不同:

  • auth_code:alipay.trade.pay 中用于承载支付授权信息的业务参数。
  • agreement_no:部分签约或代扣产品返回的协议号。是否需要直接将其作为 auth_code 使用,取决于具体产品和接口约定。
  • app_auth_token:服务商代商户调用接口时使用的应用授权令牌,不能替代支付授权码。

需要修改的位置可以确定为 alipay.trade.pay 的 biz_content.auth_code。auth_code 的实际值应从周期扣款签约流程的成功结果中取得,并按照所接入产品的接口文档确认字段映射。不要自行生成,也不能用订单号代替。

备注:内容仅供参考。