为什么 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 是条件返回字段,只有满足应用授权的相关条件时才会出现。
常见原因如下:
-
订单不包含应用授权业务
如果订单只涉及商户入驻、产品签约或其他业务,没有发起第三方应用授权,确认成功后不会生成
app_auth_token。 -
商户尚未完成授权
在部分场景中,订单确认只是整个业务流程的一步。商户可能还需要完成确认、签约或授权操作,因此当前响应不会立即返回令牌。
-
当前业务模式不直接返回令牌
如果接入方案采用标准的第三方应用授权流程,通常要先获取
app_auth_code,再调用alipay.open.auth.token.app换取app_auth_token,而不是等待alipay.open.agent.confirm返回令牌。 -
订单已确认,但没有建立新的授权关系
重复确认订单、授权关系已经存在,或者订单状态不符合新建授权关系的条件时,也可能出现确认成功但没有新令牌的情况。具体原因需要结合订单状态和当前支付宝开放平台的接口规则判断。
排查步骤
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 应用调用其数据,需要确认当前接入方案是否要求使用标准授权流程:
- 引导商户打开支付宝应用授权地址;
- 商户确认授权;
- 回调地址收到
app_auth_code; - 调用
alipay.open.auth.token.app; - 获取并保存
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、完整响应以及支付宝网关返回的请求标识,联系支付宝开放平台技术支持核查订单链路。
备注:内容仅供参考。