PAYATHON 2026

调用 alipay.trade.create 返回 ACQ.AUTH_TOKEN_IS_NOT_EXIST

支付老李

结论

ACQ.AUTH_TOKEN_IS_NOT_EXIST 表示支付宝在当前支付请求中没有找到可用的授权凭证。这个错误通常与余额或订单金额无关,更可能是用户身份、应用授权或接口调用链中的 token 使用有误。

建议先检查以下三项:

  1. 是否直接把小程序获取的 auth_code 当成了 buyer_id、app_auth_token 或其他 token。
  2. 服务端是否先通过 alipay.system.oauth.token 将 auth_code 换成用户的 user_id,再将该 user_id 作为 alipay.trade.create 的 buyer_id。
  3. 日志中的响应节点是 trade_pay_response,但 alipay.trade.create 的正常响应节点应为 alipay_trade_create_response。请确认实际调用的接口是不是 alipay.trade.create。

正确的调用链

小程序支付通常按照以下顺序调用:

小程序 my.getAuthCode
        ↓
获得一次性 auth_code
        ↓
服务端调用 alipay.system.oauth.token
        ↓
获得 user_id
        ↓
服务端调用 alipay.trade.create,buyer_id = user_id
        ↓
获得 trade_no
        ↓
小程序调用 my.tradePay,tradeNO = trade_no

这些凭证的用途不同,不能混用:

参数或凭证用途
auth_code小程序端获取的一次性用户授权码
user_id支付宝用户标识,应传入 buyer_id
trade_noalipay.trade.create 创建成功后返回的支付宝交易号
app_auth_token服务商代商户调用接口时使用的应用授权令牌
access_token用户授权接口可能返回的访问令牌,不等同于 user_id

排查步骤

1. 确认实际调用的 API

题目中的返回内容以:

trade_pay_response

开头。如果这是 SDK 解析后的原始响应,实际请求的接口可能是 alipay.trade.pay,而不是 alipay.trade.create。

调用 alipay.trade.create 时,原始响应通常应包含:

{
  "alipay_trade_create_response": {
    "code": "10000",
    "msg": "Success",
    "trade_no": "..."
  }
}

可以在日志中记录以下信息,但不要记录私钥、完整 token 或用户敏感信息:

method
app_id
out_trade_no
buyer_id(脱敏)
是否传入 app_auth_token
响应 code
响应 sub_code
响应 sub_msg

2. 检查 buyer_id 的来源

buyer_id 应该是通过用户授权流程取得的支付宝 user_id,不能直接使用小程序端返回的 auth_code。

小程序端获取授权码:

my.getAuthCode({
  scopes: ['auth_base'],
  success: (res) => {
    // 将 res.authCode 发送到自己的服务端。
    // 不要直接把它作为 buyer_id。
    console.log(res.authCode);
  },
  fail: (err) => {
    console.error(err);
  }
});

服务端收到 auth_code 后,应立即调用 alipay.system.oauth.token 换取用户信息。示意代码如下,具体类名可能因支付宝 SDK 版本而不同:

AlipaySystemOauthTokenRequest request =
        new AlipaySystemOauthTokenRequest();

request.setGrantType("authorization_code");
request.setCode(authCode);

AlipaySystemOauthTokenResponse response = alipayClient.execute(request);

if (!response.isSuccess()) {
    throw new IllegalStateException(
        response.getCode() + "/" +
        response.getSubCode() + ": " +
        response.getSubMsg()
    );
}

String buyerId = response.getUserId();

取得 buyerId 后,将其传入交易创建请求:

AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();

AlipayTradeCreateModel model = new AlipayTradeCreateModel();
model.setOutTradeNo(outTradeNo);
model.setTotalAmount("0.01");
model.setSubject("测试订单");
model.setBuyerId(buyerId);

request.setBizModel(model);

AlipayTradeCreateResponse response = alipayClient.execute(request);

if (!response.isSuccess()) {
    throw new IllegalStateException(
        response.getCode() + "/" +
        response.getSubCode() + ": " +
        response.getSubMsg()
    );
}

String tradeNo = response.getTradeNo();

最后,把 trade_no 返回给小程序,由小程序拉起支付:

my.tradePay({
  tradeNO: tradeNo,
  success: (res) => {
    console.log(res);
  },
  fail: (err) => {
    console.error(err);
  }
});

3. 检查 auth_code 是否被重复使用或已经失效

auth_code 的有效期较短,而且只能使用一次。常见问题包括:

  • 前端缓存并重复提交同一个 auth_code。
  • 获取授权码后,过了较长时间才提交给服务端。
  • 服务端失败重试时继续使用原来的 auth_code。
  • 多个并发请求同时兑换同一个 auth_code。

兑换失败后,应让小程序重新执行 my.getAuthCode,不要反复重试旧的授权码。

4. 检查应用环境是否一致

获取授权码、兑换用户身份、创建交易以及小程序拉起支付,都应使用同一套应用和环境。需要核对:

  • 小程序绑定的 app_id。
  • 服务端 SDK 配置的 app_id。
  • 是否混用了沙箱环境和正式环境。
  • 网关地址、应用私钥和支付宝公钥是否属于同一应用。
  • 获取 user_id 和创建交易时使用的应用身份是否一致。

例如,前端通过正式小程序获取 auth_code,服务端却请求沙箱网关,相关凭证通常无法正确匹配。

5. 检查 app_auth_token

如果商户直接使用自己的应用身份调用接口,通常不需要额外传入 app_auth_token。

如果由服务商代商户调用,则需要检查:

  • app_auth_token 是否存在且仍然有效。
  • 授权是否已被取消。
  • token 是否属于当前 app_id 和当前商户。
  • 请求使用的商户身份、签约产品和授权关系是否匹配。
  • 是否错误地把用户 auth_code、access_token 或其他字符串填入了 app_auth_token。

商户直接调用的示例:

AlipayTradeCreateResponse response = alipayClient.execute(request);

服务商代商户调用时,形式通常类似:

AlipayTradeCreateResponse response =
        alipayClient.execute(request, null, appAuthToken);

只有在服务商代调用的场景中,才应使用第二种形式。

6. 检查订单号和交易状态

虽然这个错误指向授权凭证,排查时仍应确认 out_trade_no 没有在不同请求中重复使用。可以通过 alipay.trade.query 查询订单是否已经创建,以免重试逻辑导致调用链混乱。

同一个 out_trade_no 不应对应不同用户、不同金额或不同商户的交易。

容易混淆的错误写法

下面的写法有误,因为 auth_code 不是 buyer_id:

model.setBuyerId(authCode);

下面的写法也有误,因为用户授权码不是应用授权令牌:

alipayClient.execute(request, null, authCode);

正确做法是先兑换用户身份:

String buyerId = oauthTokenResponse.getUserId();
model.setBuyerId(buyerId);

仍然无法解决时需要保留的信息

如果已经确认调用链和参数无误,但仍然收到该错误,应保存以下信息,并通过支付宝开放平台的技术支持渠道核查:

  • app_id
  • 接口名称
  • 请求时间
  • out_trade_no
  • 支付宝返回的请求标识或 trace 信息
  • 完整的 code、sub_code 和 sub_msg
  • 是否由服务商代调用
  • 是否传入 app_auth_token
  • 使用的是沙箱环境还是真实环境

不要提交应用私钥、完整的用户授权码或完整的 app_auth_token。

排查时可以先确认实际调用的是 alipay.trade.create,然后使用新的 auth_code 调用 alipay.system.oauth.token。取得 user_id 后,将其作为 buyer_id,同时检查是否误传了无效或不匹配的 app_auth_token。

备注:内容仅供参考。