支付宝小程序调用jsapi支付报“ISV权限不足”如何处理?
结论
将 JSAPI 支付产品绑定到小程序 appId,不等于当前应用已经取得 alipay.trade.create 的调用权限。
遇到“ISV权限不足”时,先进入支付宝开放平台的配置检测工具,选择实际调用接口的应用和 alipay.trade.create,再按照检测结果补齐产品开通、应用绑定或第三方授权等配置。配置生效后,重新发起支付请求。
常见原因
该错误通常出现在支付下单阶段,与小程序前端调用 my.tradePay 是两个环节。常见原因有:
- 自研应用未开通
alipay.trade.create所属产品,或者产品尚未绑定到当前应用。 - 第三方应用代商家调用接口时,商家的授权范围不包含对应产品。
- 请求使用的
app_id与控制台中已完成产品配置的小程序appId不一致。 - 第三方代调用时遗漏或错误使用
app_auth_token,或者令牌已经失效。 - 产品或应用仍在审核中,签约、授权等流程尚未完成。
- 混用了沙箱环境与正式环境的应用、网关、密钥或授权信息。
所以,“JSAPI 产品已绑定小程序”只能说明部分配置已经完成,不能据此判断服务端应用拥有 alipay.trade.create 的调用资格。
处理步骤
1. 使用配置检测工具定位缺失项
登录支付宝开放平台,进入报错应用对应的控制台,打开配置检测工具。
检测时确认以下事项:
- 所选应用与请求参数
app_id对应的是同一个应用。 - 检测接口为
alipay.trade.create。 - 按页面提示处理产品开通、应用绑定、签约或授权问题。
- 所有必需配置通过检测后,再次调用接口。
开放平台控制台可能会调整入口名称,请以当前页面显示的内容为准。
2. 自研应用检查产品权限
如果小程序和支付能力都由自己的支付宝开放平台账号管理,请进入:
控制台 -> 对应应用 -> 可调用产品
检查 alipay.trade.create 对应的产品是否满足以下条件:
- 已开通;
- 已完成签约或审核;
- 已绑定当前小程序应用;
- 当前应用确实拥有该接口的调用权限。
如果在“可调用产品”中找不到对应产品,通常需要先开通产品,或者确认当前应用类型是否支持该产品。
3. 第三方应用检查商家授权范围
如果由第三方应用代商家开发或调用接口,请进入:
控制台 -> 第三方应用 -> 应用授权
重点核对:
- 授权产品范围中是否可以选择
alipay.trade.create对应的产品; - 商家是否已经开通并授权该产品;
- 当前授权是否有效;
- 请求中的
app_auth_token是否属于本次实际付款的商家; - 授权应用、商家账号与支付主体是否匹配。
修改第三方应用的授权产品范围后,已经授权的商家不一定会自动取得新增权限。是否需要商家重新授权,请以控制台和配置检测工具的提示为准。
4. 核对实际请求使用的应用信息
服务端调用接口时,确认以下信息与控制台配置一致:
app_id
method = alipay.trade.create
支付宝网关
应用私钥
支付宝公钥或支付宝公钥证书
app_auth_token(仅第三方代调用场景)
特别注意以下情况:
- A 应用开通了产品,代码使用的却是 B 应用的
app_id; - 正式应用使用了沙箱网关或沙箱密钥;
- 第三方应用将一个商家的
app_auth_token用于另一个商家的订单; - 授权更新后,服务端仍从缓存中读取旧令牌。
调用示例
下面以支付宝 Java SDK 的常见调用方式为例。不同 SDK 版本的类名和初始化方式可能有所区别,请以项目实际使用的版本为准。
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202609080001",
"total_amount": "0.01",
"subject": "测试订单",
"buyer_id": "支付宝用户ID"
}
""");
// 第三方应用代商家调用时设置。
// 自研应用直接调用时通常不需要设置。
request.putOtherTextParam("app_auth_token", merchantAppAuthToken);
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
String tradeNo = response.getTradeNo();
System.out.println("创建交易成功:" + tradeNo);
} else {
System.out.println("code=" + response.getCode());
System.out.println("subCode=" + response.getSubCode());
System.out.println("subMsg=" + response.getSubMsg());
}
服务端创建交易并取得 trade_no 后,小程序前端再调用支付 JSAPI:
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
console.log('支付调用结果', result);
},
fail: (error) => {
console.error('支付调用失败', error);
}
});
buyer_id、支付产品参数和其他业务字段需要按照当前支付产品及接口文档传入,不能直接在生产环境中使用示例值。
注意事项
- 遇到“ISV权限不足”时,应优先检查产品权限和应用授权,不要反复修改订单参数来碰运气。
- 产品绑定、商家签约、接口权限与第三方授权属于不同层级,需要逐项确认。
- 第三方代调用时,不要混用应用访问令牌、用户授权令牌和
app_auth_token。 - 修改产品或授权配置后,如果立即重试仍然报错,可以再次使用配置检测工具,确认状态是否已经更新。
- 排查时应保留接口返回的
code、sub_code、sub_msg和支付宝响应中的请求标识,但不要在日志或工单中泄露应用私钥、商家令牌等敏感信息。 - 如果配置检测已全部通过,但接口仍返回相同错误,请携带应用
app_id、接口名、报错时间和请求标识,联系支付宝开放平台技术支持进一步核查。
备注:内容仅供参考。
