PAYATHON 2026

沙箱中调用会员卡模板创建接口提示“无效的应用授权令牌”

支付老李

结论

app_auth_code 不能直接当作 app_auth_token 调用 alipay.marketing.card.template.create。

授权页面返回的是一次性授权码。你需要先调用 alipay.open.auth.token.app,用 app_auth_code 换取 app_auth_token,再拿这个令牌调用会员卡模板创建接口。

这类报错通常不是因为令牌刚生成就过期,而是传入了错误类型的凭证,或者混用了沙箱与正式环境。

正确的授权流程

完整流程如下:

  1. 访问沙箱应用授权地址,由商户确认授权。
  2. 支付宝通过 redirect_uri 返回 app_auth_code。
  3. 调用 alipay.open.auth.token.app,用授权码换取 app_auth_token。
  4. 调用 alipay.marketing.card.template.create 时传入 app_auth_token。
  5. 令牌过期后,使用 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 完成兑换,并确认整个流程使用同一个应用和同一套沙箱环境,就能解决大多数此类报错。

备注:内容仅供参考。