支付宝服务商如何通过接口为子商户开通JSAPI支付
结论
支付宝提供“服务商代商户签约/商家入驻”和“第三方应用授权”相关接口,但通常不能只凭子商户账号,就由服务商在后台静默开通小程序支付并完成全部签约。
通常可以按以下流程接入:
- 服务商先在支付宝开放平台申请服务商、商家入驻和支付产品等相关权限。
- 服务端调用代商户签约接口创建签约申请。
- 子商户的法定代表人或授权人员完成协议确认、实名认证等必要操作。
- 子商户授权服务商应用代为调用支付接口。
- 服务商取得授权凭证后,代表子商户创建支付宝小程序交易。
资料采集、签约申请和状态查询可以集成到自己的 SaaS 中。能否免登录、免确认,则取决于具体产品权限、商户类型和支付宝的风控要求,不能仅靠普通支付接口实现。
为什么找不到单独的“开通 JSAPI”接口
支付宝小程序支付并不是一项打开开关即可使用的独立能力,完整接入通常包括以下环节:
- 审核商户身份和经营信息
- 签约支付产品
- 配置小程序与收款主体的关系
- 子商户向服务商应用授权
- 服务商代为调用支付接口
- 确认结算、退款、对账和风控责任
“JSAPI 支付”主要是微信支付体系中的常用叫法。在支付宝小程序中,前端通常调用 my.tradePay,服务端则使用 alipay.trade.create 等交易接口创建订单。搜索相关资料时,可以使用这些关键词:
- 支付宝小程序支付
- 服务商代商户签约
- 商家入驻
- 第三方应用授权
- ISV 代调用
alipay.open.agent.createalipay.open.auth.token.appalipay.trade.create
推荐的接入流程
1. 确认服务商具备对应权限
登录支付宝开放平台,检查服务商应用是否已申请以下能力:
- 小程序支付、当面付等适用的支付产品
- 代商户签约、商家入驻或间连商户相关能力
- 第三方应用授权
- 代调用支付、退款和查询接口的权限
服务商所属行业、合作模式和准入等级不同,控制台中可见的产品也可能不同。如果找不到“代商户签约”或类似能力,即使知道接口名称也无法直接调用。此时需要联系支付宝服务商支持或业务渠道,确认具体准入条件。
2. 收集并校验子商户资料
SaaS 页面可以用于收集资料,但不能只让用户填写支付宝账号。实际审核还可能需要:
- 商户主体类型
- 企业名称或经营者姓名
- 统一社会信用代码
- 法定代表人或经营者信息
- 联系方式
- 经营类目
- 营业执照及其他资质
- 结算账户
- 门店或网站信息
具体字段应以开放平台当前产品的接口文档和控制台要求为准。主体类型、行业或签约产品不同,所需资料也可能不同。
3. 创建代商户签约申请
支付宝开放平台曾提供以 alipay.open.agent.create 为代表的代商户签约流程,并配有确认和查询等接口。常见流程如下:
创建代签约申请
↓
上传或补充商户资料
↓
提交确认
↓
商户确认、实名认证或审核
↓
查询签约结果
可能涉及以下接口:
alipay.open.agent.create
alipay.open.agent.confirm
alipay.open.agent.order.query
这些接口是否向当前应用开放、支持哪些产品,以及请求字段如何填写,都应以支付宝开放平台为该应用展示的最新文档为准。不要直接套用旧文档中的 product_code、类目编号或资质字段,因为产品编码和准入范围可能发生调整。
4. 完成商户授权
签约成功并不代表服务商已经取得代调用权限。如果使用第三方应用授权模式,通常还要引导子商户完成授权,取得 app_auth_code,再由服务端换取 app_auth_token。
换取授权令牌通常使用以下接口:
alipay.open.auth.token.app
示意代码如下:
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
serviceProviderAppId,
privateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayOpenAuthTokenAppRequest request =
new AlipayOpenAuthTokenAppRequest();
request.setBizContent("""
{
"grant_type": "authorization_code",
"code": "%s"
}
""".formatted(appAuthCode));
AlipayOpenAuthTokenAppResponse response =
alipayClient.execute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
String appAuthToken = response.getAppAuthToken();
appAuthCode 不能由服务商自行生成,必须通过支付宝规定的商户授权流程取得。授权令牌需要加密保存,同时处理失效、刷新和撤销。
5. 代表子商户创建交易
完成产品签约和应用授权后,服务商可以在服务端创建交易。以下代码只展示调用结构,业务参数仍需根据实际支付模式填写:
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setBizContent("""
{
"out_trade_no": "S202609130001",
"total_amount": "10.00",
"subject": "SaaS订单",
"buyer_id": "2088xxxxxxxxxxxx"
}
""");
AlipayTradeCreateResponse response =
alipayClient.execute(request, appAuthToken);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
String tradeNo = response.getTradeNo();
支付宝小程序端取得 tradeNo 后调用:
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
console.log(result);
},
fail: (error) => {
console.error(error);
}
});
前端回调只能用于页面展示,不能作为最终支付成功的依据。服务端应结合异步通知和 alipay.trade.query 的查询结果更新订单状态。
两种模式不要混用
正式接入前,需要先与支付宝确认使用哪种模式。
子商户作为独立支付宝商户
子商户拥有自己的支付宝商户身份和支付产品,并通过授权让服务商应用代为调用接口。在这种模式下,通常需要使用对应子商户的 app_auth_token,交易资金和账务归属也以子商户的签约关系为准。
服务商间连或特殊合作模式
部分服务商可以在特定合作方案下为间连商户进件,并使用服务商标识、子商户编号等参数发起交易。这类能力通常需要单独准入,并不会因为拥有普通的“服务商商户号”而自动开通。
不要自行将 seller_id、sys_service_provider_id 或其他扩展参数当作“子商户号”。参数含义及其适用范围必须与支付宝为当前应用开通的合作模式一致,否则可能导致收款主体错误、交易被拒绝或资金结算异常。
需要特别注意的事项
- 无法保证整个开通过程完全静默。涉及协议签署、实名验证、企业授权或高风险行业时,支付宝可能要求商户本人确认。
- 签约、授权和支付是三个不同的状态,需要分别保存和查询。资料提交成功不代表商户已经可以收款。
- 不要代替用户保管支付宝登录密码,也不要通过模拟登录或自动操作网页完成签约。
- 子商户资料、证照和授权令牌属于敏感数据,需要加密存储,并限制日志输出。
- 一个小程序能否对应多个收款主体,取决于支付宝批准的业务模式。普通自营小程序未必可以直接为任意第三方商户收款。
- 支付、退款、关闭、查询和账单下载应使用同一商户及授权上下文,以免订单归属不一致。
- 如果接口存在但调用时返回“无权限”,原因通常是产品尚未签约、应用类型不符,或服务商尚未取得对应准入,并不一定是代码问题。
如何获取准确文档
先进入支付宝开放平台中的实际服务商应用,从应用可用能力或产品签约页面查找“代商户签约”“商家入驻”“第三方应用授权”和“小程序支付”。开放平台会根据账号权限展示不同内容,因此通过公开搜索未必能找到完整入口。
如果应用后台没有相关产品,向支付宝服务商支持提交以下信息,有助于确认适用方案:
- 服务商
PID - 服务商应用
app_id - 支付宝小程序
app_id - 子商户主体类型
- 预计接入商户数量
- 资金希望直接结算给子商户,还是先进入服务商账户
- 是否要求子商户独立退款和对账
- 业务行业及经营类目
支付宝需要根据这些信息判断应采用独立商户授权模式、代商户签约模式,还是需要单独准入的间连商户方案。确定模式后,才能取得准确的产品编码、接口字段和联调文档。
备注:内容仅供参考。
