调用 alipay.trade.create 返回 ACQ.AUTH_TOKEN_IS_NOT_EXIST
结论
ACQ.AUTH_TOKEN_IS_NOT_EXIST 表示支付宝在当前支付请求中没有找到可用的授权凭证。这个错误通常与余额或订单金额无关,更可能是用户身份、应用授权或接口调用链中的 token 使用有误。
建议先检查以下三项:
- 是否直接把小程序获取的
auth_code当成了buyer_id、app_auth_token或其他 token。 - 服务端是否先通过
alipay.system.oauth.token将auth_code换成用户的user_id,再将该user_id作为alipay.trade.create的buyer_id。 - 日志中的响应节点是
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_no | alipay.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。
备注:内容仅供参考。
