PAYATHON 2026

为什么 alipay.open.agent.confirm 成功后未返回 app_auth_token?

支付小周

结论

code="10000" 表示 alipay.open.agent.confirm 的确认操作执行成功,但不等于接口一定会生成并返回 app_auth_token。

当前响应为:

{
  "code": "10000",
  "msg": "Success",
  "expires_in": 0,
  "order_no": "20220601034000100000074843708786",
  "re_expires_in": 0
}

响应中没有 app_auth_token,两个有效期字段也都是 0。这说明本次确认没有返回应用授权令牌。需要进一步检查该代办订单是否包含应用授权、商户是否已完成授权,以及当前业务模式是否支持通过此接口直接获取令牌。

为什么成功却没有令牌

alipay.open.agent.confirm 用于确认代商户业务订单。接口调用成功,只能说明订单确认流程已正常处理。app_auth_token 是条件返回字段,只有满足应用授权的相关条件时才会出现。

常见原因如下:

  1. 订单不包含应用授权业务

    如果订单只涉及商户入驻、产品签约或其他业务,没有发起第三方应用授权,确认成功后不会生成 app_auth_token。

  2. 商户尚未完成授权

    在部分场景中,订单确认只是整个业务流程的一步。商户可能还需要完成确认、签约或授权操作,因此当前响应不会立即返回令牌。

  3. 当前业务模式不直接返回令牌

    如果接入方案采用标准的第三方应用授权流程,通常要先获取 app_auth_code,再调用 alipay.open.auth.token.app 换取 app_auth_token,而不是等待 alipay.open.agent.confirm 返回令牌。

  4. 订单已确认,但没有建立新的授权关系

    重复确认订单、授权关系已经存在,或者订单状态不符合新建授权关系的条件时,也可能出现确认成功但没有新令牌的情况。具体原因需要结合订单状态和当前支付宝开放平台的接口规则判断。

排查步骤

1. 查询代办订单状态

调用 alipay.open.agent.order.query 查询对应的 order_no,重点检查:

  • 订单是否已经完成;
  • 订单具体办理了哪些业务;
  • 是否包含应用授权;
  • 商户侧是否还有未完成的操作;
  • 是否存在失败或待处理的子流程。

示例:

AlipayOpenAgentOrderQueryRequest request =
        new AlipayOpenAgentOrderQueryRequest();

request.setBizContent(
        "{\"order_no\":\"20220601034000100000074843708786\"}"
);

AlipayOpenAgentOrderQueryResponse response =
        alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println(response.getBody());
} else {
    System.out.println(response.getCode());
    System.out.println(response.getSubCode());
    System.out.println(response.getSubMsg());
}

不同版本的 SDK 可能使用不同的响应字段,请以实际使用的 SDK 类型定义和开放平台接口文档为准。

2. 检查创建订单时提交的业务内容

查看调用 alipay.open.agent.create 时提交的业务参数,确认订单中是否明确包含需要建立第三方应用授权关系的业务。

如果订单仅用于代签约或代入驻,不能因为 confirm 返回 10000,就认定系统一定会生成 app_auth_token。

3. 确认是否需要使用标准应用授权流程

如果目的是让商户授权 ISV 应用调用其数据,需要确认当前接入方案是否要求使用标准授权流程:

  1. 引导商户打开支付宝应用授权地址;
  2. 商户确认授权;
  3. 回调地址收到 app_auth_code;
  4. 调用 alipay.open.auth.token.app;
  5. 获取并保存 app_auth_token 和 app_refresh_token。

换取令牌的 Java 示例:

AlipayOpenAuthTokenAppRequest request =
        new AlipayOpenAuthTokenAppRequest();

request.setBizContent(
        "{"
        + "\"grant_type\":\"authorization_code\","
        + "\"code\":\"实际收到的app_auth_code\""
        + "}"
);

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());
}

这里的 code 必须是授权回调中收到的 app_auth_code,不能用代办订单号代替。

注意事项

  • 除了判断 code 是否为 10000,还要检查 app_auth_token 是否为空,并核对订单的实际状态。
  • 在没有 app_auth_token 的情况下,expires_in=0 和 re_expires_in=0 通常表示本次没有返回令牌信息,不能理解为返回了有效期为零的正常令牌。
  • app_auth_code、app_auth_token 和 app_refresh_token 是不同的参数,不能混用。
  • app_auth_code 通常只能用于换取令牌,并且具有时效性,不应重复使用。
  • 获取令牌后要安全保存,不要将其写入公开日志或返回给前端。
  • 如果订单确认已经完成,业务内容也明确包含应用授权,但接口仍未返回令牌,应携带 order_no、调用时间、应用 app_id、完整响应以及支付宝网关返回的请求标识,联系支付宝开放平台技术支持核查订单链路。

备注:内容仅供参考。