支付宝商家、服务商与应用之间的关系及接口调用问题
结论
-
服务商和商家是两种不同的业务角色。
服务商通常也是经过企业认证的支付宝开放平台主体,并且可能经营自己的业务,所以同一主体可以同时是服务商和商家。但在代商家开发、运营或调用接口时,它承担的是服务商角色。 -
应用必须归属于某个支付宝开放平台账号或认证主体。
小程序、生活号、网页应用和移动应用都要有明确的创建者、管理者和责任主体,不能以”无主体”的形式独立存在。应用所属的主体不一定是具体门店,也不一定已经开通所有商家产品。 -
一个商家通常可以与多个服务商合作。
商家可以授权不同的服务商分别管理不同应用或业务。多个服务商能否同时操作同一产品、门店或账号资源,要看具体产品的签约规则、授权范围和平台限制。 -
接口不必重复传入服务商资料,因为应用凭证和授权凭证中已经包含调用身份。
支付宝通过app_id识别调用方应用,通过app_auth_token识别被代调用的商家及授权范围,所以一般不需要另外传递服务商名称或编号。
如何理解商家、服务商和应用
三者分别对应业务主体、协作角色和技术载体:
- 商家:实际使用支付宝产品开展经营活动的主体,例如收款、经营门店或提供服务。
- 服务商:为商家提供开发、代运营和系统接入等服务的主体。
- 应用:调用支付宝开放接口的技术身份,以
app_id标识。
同一家企业可能一边经营自己的业务,一边为其他商家提供技术服务。它既可以是商家,也可以是服务商,但这两种角色对应的业务关系、签约产品和授权权限并不相同。
因此,“服务商也是商家”只在特定情况下成立。更准确地说,服务商通常也是经过认证的平台主体,但服务商角色并不等于商家角色。
应用为什么必须有归属主体
支付宝需要明确应用由谁创建、维护并承担责任,所以应用必须归属于某个开放平台账号或认证主体。应用的密钥、证书、产品签约、审核信息和权限配置也以这一归属关系为基础进行管理。
需要区分应用归属和商家授权:
- 应用归属:应用属于哪个开放平台主体。
- 商家授权:哪个商家允许该应用代其处理业务。
商家自行开发时,应用归商家所有。服务商代商家接入时,应用可以归属于服务商,再由商家完成授权。具体采用哪种模式,取决于应用类型和产品接入方案。
应用不能脱离主体单独存在,但也不能笼统地说”所有应用都必须依托某个商家”。准确的表述是:应用必须有明确的账号和认证主体;在具体业务中,这个主体可以是商家、服务商,也可以是其他符合平台要求的开发主体。
一个商家能否签约多个服务商
通常可以。比如,商家可以让一个服务商负责收银系统,另一个负责小程序,再由其他服务商负责会员运营。
不过,“签约”和”授权”并不是同一个概念:
- 签约通常是指商家开通某项支付宝产品,或与相关方建立业务合作关系。
- 授权是指商家允许某个服务商应用访问指定接口和资源。
- 不同服务商可以获得不同的权限。
- 商家一般可以查看和撤销已经作出的应用授权。
多个服务商能否同时操作同一项资源,要以相应产品的规则为准。部分产品可能有唯一绑定关系、渠道限制、门店归属限制或互斥签约条件,不能只根据开放平台的一般授权机制判断。
接口调用为什么没有服务商参数
服务商身份不是通过普通业务参数声明的,而是由调用凭证确定。
服务商代商家调用接口时,通常会用到两个参数:
app_id:标识调用接口的应用,也能间接确定应用所属的主体。app_auth_token:标识商家对该应用作出的授权。
支付宝收到请求后,可以在平台内部解析出以下关系:
app_id
└─ 应用归属主体(服务商)
└─ app_auth_token
└─ 授权商家
└─ 授权接口及权限范围
如果接口支持服务商代调用,支付宝会结合 app_id 和 app_auth_token 检查:
- 应用是否存在,状态是否正常;
- 应用是否已经开通对应产品;
- 商家是否授权了该应用;
- 授权范围是否包含当前接口所需的权限;
- 商家自身是否符合产品签约和业务条件。
请求中通常不必再传服务商名称、账号或企业信息。即使手动传入,这些字段没有经过签名身份体系确认,也不能作为可信的身份依据。
典型调用方式
下面使用 Java SDK 的通用形式说明。不同 SDK 版本的类名和方法可能不同,请以所用版本的官方接口文档为准。
商家调用自己的应用
商家使用自有应用调用接口时,一般只需配置应用身份,不需要设置 app_auth_token:
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090001"
}
""");
AlipayTradeQueryResponse response = alipayClient.execute(request);
支付宝会根据 appId、请求签名和应用配置识别调用方。
服务商代商家调用
服务商应用代商家调用支持第三方授权的接口时,需要携带商家授权后生成的 app_auth_token:
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
serviceProviderAppId,
serviceProviderPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090001"
}
""");
AlipayTradeQueryResponse response =
alipayClient.execute(request, merchantAppAuthToken);
其中:
serviceProviderAppId = 服务商应用的 app_id
merchantAppAuthToken = 商家授权后取得的 app_auth_token
部分 SDK 可能通过公共参数或其他方法设置 app_auth_token,具体用法以相应 SDK 的方法签名为准。
排查代调用问题的步骤
服务商调用接口时,如果出现”无权限”、“应用未签约”或”商家未授权”等错误,可以按以下顺序检查:
- 当前使用的是否为服务商应用的
app_id。 - 请求签名使用的是否为该应用对应的私钥或证书。
- 商家是否已经完成应用授权。
app_auth_token是否属于当前商家和当前应用,有没有混用其他环境的数据。- 授权范围是否包含目标接口或对应产品。
- 服务商应用和商家主体是否都符合该产品的签约条件。
- 接口本身是否支持第三方应用代调用。
- 授权是否已被撤销、已经失效或发生权限变更。
app_id、密钥、证书和授权令牌是否混用了沙箱与生产环境的数据。
注意事项
app_auth_token不是商家的登录凭证,不应保存在前端或直接暴露给用户。- 不能用业务参数中的商家名称、手机号或账号代替平台授权。
- 一个服务商管理多个商家时,需要建立可靠的映射关系,避免把甲商家的
app_auth_token用于乙商家的请求。 - 并非所有接口都支持服务商代调用。部分接口只允许商家自有应用调用,是否支持要查看具体接口的授权说明。
- 支付、结算和门店等接口还可能要求传入
seller_id、门店编号或其他业务字段。这些字段用于指定交易或资源对象,并不是服务商身份参数。 - 支付宝各产品线的主体要求、签约方式和授权模型可能不同。接入时,应以目标接口及对应产品当前公布的规则为准。
备注:内容仅供参考。
