支付宝小程序关联商户B的JSAPI支付后创建订单权限不足
支付小周
结论
只在后台关联商户 B 与小程序的 JSAPI 支付,并在 alipay.trade.create 请求中填写商户 B 的 seller_id,并不能获得代商户 B 创建订单的权限。
要由商户 B 收款,还需满足以下条件:
- 调用接口的
app_id已开通相应的支付产品,并具备alipay.trade.create接口权限。 - 商户 B 已通过支付宝开放平台支持的方式,与该应用建立收款关系。
- 如果应用属于商户 A,而订单属于商户 B,需要采用第三方应用代调用模式。商户 B 应先授权该应用,请求中还要传入商户 B 对应的
app_auth_token。 seller_id必须与实际授权并关联的收款商户一致。
seller_id 只能指定卖家,不能代替产品签约、应用权限或商户授权。
为什么会提示“接口调用权限不足”
支付宝会结合请求中的应用和授权信息判断调用身份,包括:
app_id:发起接口调用的应用;- 应用是否具备支付产品及接口权限;
app_auth_token:第三方应用当前代表哪个商户发起调用;seller_id:订单的实际收款方;- 小程序与收款商户是否已按平台要求完成关联。
如果请求中只有商户 A 名下的 app_id,却没有商户 B 的有效授权信息,即使将 seller_id 改为商户 B,支付宝仍可能将其识别为“商户 A 的应用试图为商户 B 创建订单”,并拒绝调用。
推荐配置方式
方案一:由商户 B 作为经营和收款主体
如果小程序实际由商户 B 经营,可以按以下方式配置:
- 使用商户 B 的支付宝开放平台账号创建或接收该小程序。
- 在商户 B 主体下开通小程序支付或相应的支付产品。
- 确认应用已获得
alipay.trade.create权限。 - 使用该应用的
app_id、私钥和支付宝公钥调用接口。 - 不传
seller_id,或者将其设置为商户 B 的支付宝用户 ID。
此时,应用主体、支付签约主体和收款主体一致,无需通过 app_auth_token 代商户调用。
如果平台支持小程序主体迁移,可以考虑将现有小程序迁移给商户 B。是否支持迁移以及具体条件,应以当前开放平台后台显示的信息为准。
方案二:由商户 A 的应用代商户 B 调用支付接口
如果小程序必须保留在商户 A 名下,则要按第三方应用或服务商模式配置:
- 确认应用类型支持第三方商户授权。
- 为应用申请并开通相应的支付产品及
alipay.trade.create权限。 - 由商户 B 完成支付产品签约。
- 商户 B 在支付宝开放平台授权该应用代其调用支付接口。
- 服务端通过授权流程取得商户 B 的
app_auth_token。 - 调用
alipay.trade.create时,同时使用应用的app_id和商户 B 的app_auth_token。 - 将
seller_id设置为商户 B 的支付宝用户 ID。接口规则允许时也可以不传,由授权商户身份确定收款方。
“小程序关联商户 B”和“商户 B 授权应用代调用开放接口”可能是两项独立配置。前者用于建立小程序支付场景中的商户关联,后者用于取得服务端接口调用权限,两者不能互相替代。
调用示例
下面只展示关键参数。不同语言 SDK 的方法名可能略有差异。
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
appId,
appPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
AlipayTradeCreateModel model = new AlipayTradeCreateModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("100.00");
model.setSubject("商品订单");
model.setBuyerId(buyerId);
// 如果需要明确指定卖家,应填写商户 B 的支付宝用户 ID。
// 不能填写登录账号、PID 以外的编号或应用 ID。
model.setSellerId(merchantBUserId);
request.setBizModel(model);
// 第三方应用代商户 B 调用时,必须使用商户 B 授权后取得的 token。
request.putOtherTextParam("app_auth_token", merchantBAppAuthToken);
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (!response.isSuccess()) {
System.out.println(response.getCode());
System.out.println(response.getSubCode());
System.out.println(response.getSubMsg());
}
如果使用商户 B 自有应用直接调用,通常不需要传入 app_auth_token:
AlipayTradeCreateModel model = new AlipayTradeCreateModel();
model.setOutTradeNo("ORDER_202609090002");
model.setTotalAmount("100.00");
model.setSubject("商品订单");
model.setBuyerId(buyerId);
// 应用、签约主体和收款主体均为商户 B 时,一般可不传 seller_id。
request.setBizModel(model);
服务端成功创建订单后,小程序再调用支付能力,并传入接口返回的交易号。服务端使用的 app_id、小程序运行时身份和支付关联配置,必须处于同一套有效链路中。
排查清单
遇到“接口调用权限不足”时,可以按以下顺序检查:
- 请求实际使用的
app_id属于商户 A 还是商户 B。 - 该应用是否已经上线,并开通了支付产品和
alipay.trade.create权限。 - 商户 B 是否完成了相应支付产品的签约,而不只是关联了小程序。
- 第三方代调用时,是否传入商户 B 的有效
app_auth_token。 - 授权是否包含支付接口所需权限,以及授权是否已经失效或被取消。
seller_id是否确实是商户 B 的支付宝用户 ID。seller_id、app_auth_token代表的商户和支付签约主体是否一致。- 是否混用了正式环境与沙箱环境的应用、密钥、网关或授权令牌。
- 检查返回结果中的
code、sub_code和sub_msg,不要只根据外层错误描述判断原因。
注意事项
- 不要通过动态修改
seller_id让任意商户收款。支付宝会校验应用、授权商户、签约主体和卖家身份。 app_auth_token应与商户 B 一一对应,不能使用商户 A 或其他商户的授权令牌。- 商户授权、支付产品签约和小程序支付关联的具体入口可能会随开放平台后台调整,请以当前应用控制台中可申请的能力为准。
- 如果当前应用类型不支持代商户调用支付接口,仅修改参数无法实现跨主体收款。此时应使用支付宝支持的服务商应用模式,或者由商户 B 使用自己的应用和支付签约。
- 交易创建成功后,异步通知验签仍需使用当前调用应用对应的支付宝公钥,并核对通知中的
app_id、seller_id、金额和商户订单号。
备注:内容仅供参考。
