第三方应用模板小程序如何申请开通支付功能?
结论
第三方应用具备模板开发权限,并不代表它已经具备支付权限。模板小程序调用支付能力,通常还要满足以下条件:
- 第三方应用已经申请支付相关接口的代调用权限。
- 商家完成模板实例化后,对应的小程序已经开通“小程序支付”等所需产品。
- 商家已经把相关接口权限授权给第三方应用。
- 服务端以第三方应用身份发起请求,并携带该商家的
app_auth_token。 - 创建交易时关联实际运行的商家小程序,且收款主体与签约主体一致。
模板开发文档中没有单独的“模板支付开通入口”,不代表模板小程序无法支付。支付有独立的产品签约和应用授权流程,仅凭模板权限不能直接调用。
为什么会提示“isv权限不足”
服务端代商家调用支付接口时,可能会遇到“isv权限不足”。常见原因有:
- 第三方应用没有取得目标支付接口的调用或代调用权限。
- 商家尚未签约相应的支付产品。
- 商家授权时没有包含支付相关权限,或者授权发生在新增支付权限之前。
- 请求没有携带
app_auth_token,或者令牌属于其他商家。 - 模板应用、小程序实例或普通应用的
app_id使用错误。 - 创建交易时没有正确关联当前商家实例化的小程序。
- 支付产品、收款主体、商家账号或应用主体之间不符合准入要求。
排查时需要查看接口响应中的 code、sub_code 和 sub_msg。页面显示的“isv权限不足”只是概括性提示,具体缺少哪一层权限,要根据服务端的原始响应判断。
开通流程
1. 在第三方应用中申请接口权限
登录支付宝开放平台,进入用于模板开发的第三方应用,在能力或接口权限管理页面中查找实际需要调用的支付产品,例如“小程序支付”及其相关 OpenAPI。
除了前端使用的 my.tradePay,还要确认服务端创建和管理交易所需的接口,例如:
alipay.trade.create
alipay.trade.query
alipay.trade.refund
alipay.trade.close
开放平台控制台的菜单名称可能会调整,请以当前控制台显示的内容为准。如果找不到目标接口的申请入口,可能是应用类型、主体资质或业务场景不符合准入条件。此时需要通过开放平台工单确认,该第三方应用是否支持申请对应产品的代调用权限。
2. 让商家开通支付产品
模板实例化后得到的是商家自己的小程序。商家作为实际收款方,需要在自己的支付宝商家账号下完成支付产品签约,并满足主体认证、经营类目和资质等要求。
一般不应将模板所属的第三方应用直接作为所有商家的统一收款主体。如果业务模式是平台统一收款,再向商家结算,就涉及平台收付、分账或结算方案,需要申请相应产品,不能只使用普通的小程序支付接口。
3. 让商家重新授权第三方应用
商家完成签约后,还需要授权第三方应用代其调用相关接口。
如果第三方应用在商家首次授权后新增了支付权限,原有授权通常不会自动包含这些权限。商家需要重新进入授权流程。授权成功后,服务端应保存新取得的:
app_auth_code
app_auth_token
app_refresh_token
app_auth_code 是一次性授权码,服务端应及时用它换取令牌。后续代调用支付接口时使用 app_auth_token,令牌过期后通过 app_refresh_token 刷新。
4. 服务端代商家创建交易
支付订单应由服务端创建。调用接口时,需要使用第三方应用的应用身份、私钥和支付宝公钥,并携带当前商家的 app_auth_token。
下面是简化后的 Java 示例。具体的 SDK 类名和参数,请以项目所用的支付宝 SDK 版本及对应接口文档为准:
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
isvAppId,
isvPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "99.00",
"subject": "商品订单",
"buyer_id": "2088xxxxxxxxxxxx"
}
""");
// 当前商家授权给第三方应用后取得的令牌
request.putOtherTextParam("app_auth_token", merchantAppAuthToken);
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
"创建交易失败,code=" + response.getCode()
+ ", sub_code=" + response.getSubCode()
+ ", sub_msg=" + response.getSubMsg()
);
}
String tradeNo = response.getTradeNo();
如果模板场景需要传入商家实例化小程序的应用标识,应按照当前支付接口文档设置对应的业务应用参数。例如,文档明确要求时传入 op_app_id。不要在没有接口依据的情况下混用模板 ID、第三方应用 AppID 和商家小程序 AppID。
服务端还应校验以下对应关系:
merchantId -> app_auth_token
merchantId -> 商家小程序 AppID
merchantId -> 支付签约主体
out_trade_no -> merchantId
这些校验可以防止把甲商家的令牌或订单误用于乙商家的小程序。
5. 小程序端唤起支付
服务端创建交易并返回支付宝交易号后,小程序端再调用 my.tradePay:
my.tradePay({
tradeNO: result.tradeNo,
success: (res) => {
console.log('支付结果', res);
},
fail: (err) => {
console.error('支付调用失败', err);
}
});
不能只根据前端回调判断订单支付成功。最终支付结果应由服务端查询订单状态,或者通过支付宝异步通知确认。
排查清单
遇到“isv权限不足”时,可以依次检查:
- 确认报错来自
my.tradePay,还是服务端的alipay.trade.create等接口。 - 记录完整的
code、sub_code、sub_msg和请求 ID。 - 确认请求使用的是第三方应用 AppID,而不是模板 ID。
- 确认请求携带了当前商家的有效
app_auth_token。 - 确认该商家已经签约相应的支付产品。
- 确认第三方应用已经取得该接口的代调用权限。
- 如果相关权限是在商家授权后新增的,让商家重新授权。
- 确认实际运行的小程序 AppID、授权商家和收款主体处于同一业务关系中。
- 确认沙箱与正式环境的 AppID、密钥、网关和令牌没有混用。
如果已经在控制台完成签约和授权,但接口仍然返回权限不足,可以携带第三方应用 AppID、商家小程序 AppID、接口名、sub_code、请求时间和请求 ID,向支付宝开放平台提交工单。工单和日志中不要公开私钥、完整的 app_auth_token 或用户敏感信息。
备注:内容仅供参考。
