PAYATHON 2026

小程序基于模板上传版本接口的令牌传参问题

支付阿杰

结论

代理商户调用 alipay.open.mini.version.upload 时,需要把商户授权令牌传给 app_auth_token,不能传给 auth_token。

如果 SDK 使用三个参数的重载方法,调用方式如下:

alipayClient.execute(request, null, appAuthToken);

这三个参数依次是:

execute(request, accessToken, appAuthToken)
  • accessToken:对应网关公共参数 auth_token,用于用户级 OAuth 授权。当前接口通常不需要,可传 null。
  • appAuthToken:对应网关公共参数 app_auth_token,第三方应用以商户授权身份调用接口时使用。这里应传入商户授权后取得的 app_auth_token。

auth_token 和 app_auth_token 是两个不同的参数,不能混用。

为什么两参数调用会报错

错误日志显示,实际生成的请求参数是:

auth_token=202201BB...

这说明执行以下调用时:

alipayClient.execute(request, token);

SDK 把第二个参数识别为 authToken,并将其映射到网关参数 auth_token,请求中没有传入 app_auth_token。

支付宝网关因此没有进入对应商户小程序的应用授权上下文。处理模板上传请求时,网关无法找到目标应用信息,于是返回:

APP_INFO_NOT_EXIST
应用信息不存在

这个错误未必表示 template_id 不存在。结合请求日志来看,更直接的原因是令牌传错了参数位置。

正确调用示例

AlipayOpenMiniVersionUploadRequest request =
        new AlipayOpenMiniVersionUploadRequest();

AlipayOpenMiniVersionUploadModel model =
        new AlipayOpenMiniVersionUploadModel();

model.setAppVersion("0.0.1");
model.setTemplateId("2021002199698799");

request.setBizModel(model);

// 商户授权后取得的 app_auth_token
String appAuthToken = merchantAppAuthToken;

// 此接口不需要用户级 auth_token,因此 accessToken 传 null
AlipayOpenMiniVersionUploadResponse response =
        alipayClient.execute(request, null, appAuthToken);

if (response.isSuccess()) {
    // 上传成功
} else {
    String code = response.getCode();
    String msg = response.getMsg();
    String subCode = response.getSubCode();
    String subMsg = response.getSubMsg();

    // 记录并处理错误,但不要输出完整令牌
}

如果当前 SDK 提供了名称明确、专门用于传递 app_auth_token 的调用方式,也可以直接使用。无论采用哪种方式,都要确认最终请求中确实包含:

app_auth_token=商户授权令牌

不要只根据 Java 重载方法的参数数量判断令牌类型。不同版本的 SDK 可能有不同的重载形式,应查看当前版本的方法签名或调试日志。

accessToken 应传什么

这个场景不需要另行获取 accessToken,传 null 即可:

alipayClient.execute(request, null, appAuthToken);

这里的 accessToken 是用户授权访问令牌,对应 auth_token,通常用于需要支付宝用户授权的开放接口。它与第三方应用授权产生的 app_auth_token 分属两套授权机制。

只有接口明确要求用户授权时,才需要通过相应的支付宝 OAuth 授权流程获取用户访问令牌,并将其作为 accessToken 传入。不要把商户的 app_auth_token 同时传给这两个参数。

排查要点

调用前后可以逐项确认:

  1. 网关请求中包含 app_auth_token,商户授权令牌没有被传入 auth_token。
  2. app_auth_token 属于当前商户小程序,并且与服务商应用的授权关系一致。
  3. 商户授予的权限包含小程序版本管理所需权限。
  4. template_id 属于当前服务商,模板状态也满足上传条件。
  5. 支付宝网关环境、服务商应用、商户小程序和模板环境保持一致。
  6. 令牌没有过期或失效,也没有因商户取消授权而被撤销。

问题中展示的日志包含完整授权令牌。授权令牌是敏感凭证,不应出现在公开日志、工单或社区内容中。如果该令牌确实已经暴露,建议立即按照支付宝开放平台的授权机制重新获取或更新,并对日志中的令牌进行脱敏处理。

备注:内容仅供参考。