沙箱中调用会员卡模板创建接口提示“无效的应用授权令牌”
结论
app_auth_code 不能直接当作 app_auth_token 调用 alipay.marketing.card.template.create。
授权页面返回的是一次性授权码。你需要先调用 alipay.open.auth.token.app,用 app_auth_code 换取 app_auth_token,再拿这个令牌调用会员卡模板创建接口。
这类报错通常不是因为令牌刚生成就过期,而是传入了错误类型的凭证,或者混用了沙箱与正式环境。
正确的授权流程
完整流程如下:
- 访问沙箱应用授权地址,由商户确认授权。
- 支付宝通过
redirect_uri返回app_auth_code。 - 调用
alipay.open.auth.token.app,用授权码换取app_auth_token。 - 调用
alipay.marketing.card.template.create时传入app_auth_token。 - 令牌过期后,使用
app_refresh_token刷新,不要再次使用旧的app_auth_code。
这几个参数需要分清:
app_auth_code:一次性授权码,只用于换取令牌。app_auth_token:应用授权令牌,用于代表授权商户调用开放平台接口。app_refresh_token:用于刷新app_auth_token。auth_token:通常指用户信息授权令牌,不能替代app_auth_token。
第一步:获取授权码
授权地址应使用沙箱域名,并正确编码 redirect_uri:
https://openauth.alipaydev.com/oauth2/appToAppAuth.htm?app_id=my_app_id&redirect_uri=http%3A%2F%2Fwww.baidu.com
原地址中的写法是:
redirect_uri= http://www.baidu.com
等号后多了一个空格,应将其删除,并对整个回调地址进行 URL 编码。实际项目中应填写自己能够接收回调的地址,不要使用公共网站。
授权完成后,回调地址中会出现类似参数:
http://your-callback.example.com?app_auth_code=xxxxxxxx
这里得到的仍然是 app_auth_code,不是 app_auth_token。
第二步:用授权码换取令牌
通过支付宝开放平台 SDK 调用 alipay.open.auth.token.app:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipaydev.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayOpenAuthTokenAppRequest request =
new AlipayOpenAuthTokenAppRequest();
AlipayOpenAuthTokenAppModel model =
new AlipayOpenAuthTokenAppModel();
model.setGrantType("authorization_code");
model.setCode(appAuthCode);
request.setBizModel(model);
AlipayOpenAuthTokenAppResponse response =
alipayClient.execute(request);
if (response.isSuccess()) {
String appAuthToken = response.getAppAuthToken();
String appRefreshToken = response.getAppRefreshToken();
System.out.println("app_auth_token: " + appAuthToken);
System.out.println("app_refresh_token: " + appRefreshToken);
} else {
System.out.println("code: " + response.getCode());
System.out.println("sub_code: " + response.getSubCode());
System.out.println("sub_msg: " + response.getSubMsg());
}
只有 response.getAppAuthToken() 返回的值,才能作为后续接口需要的 app_auth_token。
第三步:创建会员卡模板
调用会员卡模板创建接口时,把换取到的令牌作为 SDK execute 方法的 appAuthToken 参数传入:
AlipayMarketingCardTemplateCreateRequest request =
new AlipayMarketingCardTemplateCreateRequest();
AlipayMarketingCardTemplateCreateModel model =
new AlipayMarketingCardTemplateCreateModel();
// 按接口文档设置模板参数
// model.setRequestId(...);
// model.setCardType(...);
// model.setBizNoPrefix(...);
// model.setBizNoSuffixLen(...);
request.setBizModel(model);
AlipayMarketingCardTemplateCreateResponse response =
alipayClient.execute(request, appAuthToken);
if (response.isSuccess()) {
System.out.println("创建成功");
System.out.println(response.getBody());
} else {
System.out.println("code: " + response.getCode());
System.out.println("sub_code: " + response.getSubCode());
System.out.println("sub_msg: " + response.getSubMsg());
}
这里不能传 app_auth_code,也不要把令牌放进会员卡模板的业务 JSON。app_auth_token 是开放平台的公共请求参数,使用 SDK 时通常通过 execute(request, appAuthToken) 传递。
令牌过期后的刷新方式
app_auth_token 过期后,可以使用之前保存的 app_refresh_token 获取新令牌:
AlipayOpenAuthTokenAppRequest request =
new AlipayOpenAuthTokenAppRequest();
AlipayOpenAuthTokenAppModel model =
new AlipayOpenAuthTokenAppModel();
model.setGrantType("refresh_token");
model.setRefreshToken(appRefreshToken);
request.setBizModel(model);
AlipayOpenAuthTokenAppResponse response =
alipayClient.execute(request);
刷新成功后,需要保存接口返回的新 app_auth_token。如果响应中还返回了新的 app_refresh_token,也要同步更新保存值。
仍然报错时的检查项
1. 是否混用了沙箱与正式环境
沙箱授权码和令牌只能在沙箱环境中使用:
授权地址:https://openauth.alipaydev.com/...
网关地址:https://openapi.alipaydev.com/gateway.do
不要使用沙箱授权码访问正式网关:
https://openapi.alipay.com/gateway.do
正式环境的授权码和令牌也不能用于沙箱环境。
2. 换取令牌和调用业务接口的 app_id 是否一致
发起授权、换取令牌和创建会员卡模板时,应使用同一个应用身份。如果换取令牌后改用了另一个 app_id,支付宝将无法建立正确的授权关系。
3. 是否重复使用了 app_auth_code
app_auth_code 是短时有效的一次性凭证。成功换取令牌后,不能再次使用同一个授权码。即使只间隔几秒,重复兑换也可能失败。
4. 参数位置是否正确
使用 Java SDK 时,调用形式应为:
alipayClient.execute(request, appAuthToken);
不能写成:
alipayClient.execute(request, appAuthCode);
也不能传入用户授权流程获得的 auth_token。
5. 授权是否仍然有效
如果商户取消了应用授权,原有的 app_auth_token 可能无法继续使用,此时需要重新完成应用授权流程。
排查具体原因时,应结合响应中的 code、sub_code 和 sub_msg,不能只看表层的 “无效的应用授权令牌” 提示。
这个问题通常不是令牌 “刚生成就过期”,而是混淆了 app_auth_code 和 app_auth_token。先通过 alipay.open.auth.token.app 完成兑换,并确认整个流程使用同一个应用和同一套沙箱环境,就能解决大多数此类报错。
备注:内容仅供参考。