PAYATHON 2026

支付宝商家、服务商与应用之间的关系及接口调用问题

支付阿杰

结论

  1. 服务商和商家是两种不同的业务角色。
    服务商通常也是经过企业认证的支付宝开放平台主体,并且可能经营自己的业务,所以同一主体可以同时是服务商和商家。但在代商家开发、运营或调用接口时,它承担的是服务商角色。

  2. 应用必须归属于某个支付宝开放平台账号或认证主体。
    小程序、生活号、网页应用和移动应用都要有明确的创建者、管理者和责任主体,不能以”无主体”的形式独立存在。应用所属的主体不一定是具体门店,也不一定已经开通所有商家产品。

  3. 一个商家通常可以与多个服务商合作。
    商家可以授权不同的服务商分别管理不同应用或业务。多个服务商能否同时操作同一产品、门店或账号资源,要看具体产品的签约规则、授权范围和平台限制。

  4. 接口不必重复传入服务商资料,因为应用凭证和授权凭证中已经包含调用身份。
    支付宝通过 app_id 识别调用方应用,通过 app_auth_token 识别被代调用的商家及授权范围,所以一般不需要另外传递服务商名称或编号。

如何理解商家、服务商和应用

三者分别对应业务主体、协作角色和技术载体:

  • 商家:实际使用支付宝产品开展经营活动的主体,例如收款、经营门店或提供服务。
  • 服务商:为商家提供开发、代运营和系统接入等服务的主体。
  • 应用:调用支付宝开放接口的技术身份,以 app_id 标识。

同一家企业可能一边经营自己的业务,一边为其他商家提供技术服务。它既可以是商家,也可以是服务商,但这两种角色对应的业务关系、签约产品和授权权限并不相同。

因此,“服务商也是商家”只在特定情况下成立。更准确地说,服务商通常也是经过认证的平台主体,但服务商角色并不等于商家角色。

应用为什么必须有归属主体

支付宝需要明确应用由谁创建、维护并承担责任,所以应用必须归属于某个开放平台账号或认证主体。应用的密钥、证书、产品签约、审核信息和权限配置也以这一归属关系为基础进行管理。

需要区分应用归属和商家授权:

  • 应用归属:应用属于哪个开放平台主体。
  • 商家授权:哪个商家允许该应用代其处理业务。

商家自行开发时,应用归商家所有。服务商代商家接入时,应用可以归属于服务商,再由商家完成授权。具体采用哪种模式,取决于应用类型和产品接入方案。

应用不能脱离主体单独存在,但也不能笼统地说”所有应用都必须依托某个商家”。准确的表述是:应用必须有明确的账号和认证主体;在具体业务中,这个主体可以是商家、服务商,也可以是其他符合平台要求的开发主体。

一个商家能否签约多个服务商

通常可以。比如,商家可以让一个服务商负责收银系统,另一个负责小程序,再由其他服务商负责会员运营。

不过,“签约”和”授权”并不是同一个概念:

  • 签约通常是指商家开通某项支付宝产品,或与相关方建立业务合作关系。
  • 授权是指商家允许某个服务商应用访问指定接口和资源。
  • 不同服务商可以获得不同的权限。
  • 商家一般可以查看和撤销已经作出的应用授权。

多个服务商能否同时操作同一项资源,要以相应产品的规则为准。部分产品可能有唯一绑定关系、渠道限制、门店归属限制或互斥签约条件,不能只根据开放平台的一般授权机制判断。

接口调用为什么没有服务商参数

服务商身份不是通过普通业务参数声明的,而是由调用凭证确定。

服务商代商家调用接口时,通常会用到两个参数:

  • app_id:标识调用接口的应用,也能间接确定应用所属的主体。
  • app_auth_token:标识商家对该应用作出的授权。

支付宝收到请求后,可以在平台内部解析出以下关系:

app_id
  └─ 应用归属主体(服务商)
       └─ app_auth_token
            └─ 授权商家
                 └─ 授权接口及权限范围

如果接口支持服务商代调用,支付宝会结合 app_id 和 app_auth_token 检查:

  1. 应用是否存在,状态是否正常;
  2. 应用是否已经开通对应产品;
  3. 商家是否授权了该应用;
  4. 授权范围是否包含当前接口所需的权限;
  5. 商家自身是否符合产品签约和业务条件。

请求中通常不必再传服务商名称、账号或企业信息。即使手动传入,这些字段没有经过签名身份体系确认,也不能作为可信的身份依据。

典型调用方式

下面使用 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 的方法签名为准。

排查代调用问题的步骤

服务商调用接口时,如果出现”无权限”、“应用未签约”或”商家未授权”等错误,可以按以下顺序检查:

  1. 当前使用的是否为服务商应用的 app_id。
  2. 请求签名使用的是否为该应用对应的私钥或证书。
  3. 商家是否已经完成应用授权。
  4. app_auth_token 是否属于当前商家和当前应用,有没有混用其他环境的数据。
  5. 授权范围是否包含目标接口或对应产品。
  6. 服务商应用和商家主体是否都符合该产品的签约条件。
  7. 接口本身是否支持第三方应用代调用。
  8. 授权是否已被撤销、已经失效或发生权限变更。
  9. app_id、密钥、证书和授权令牌是否混用了沙箱与生产环境的数据。

注意事项

  • app_auth_token 不是商家的登录凭证,不应保存在前端或直接暴露给用户。
  • 不能用业务参数中的商家名称、手机号或账号代替平台授权。
  • 一个服务商管理多个商家时,需要建立可靠的映射关系,避免把甲商家的 app_auth_token 用于乙商家的请求。
  • 并非所有接口都支持服务商代调用。部分接口只允许商家自有应用调用,是否支持要查看具体接口的授权说明。
  • 支付、结算和门店等接口还可能要求传入 seller_id、门店编号或其他业务字段。这些字段用于指定交易或资源对象,并不是服务商身份参数。
  • 支付宝各产品线的主体要求、签约方式和授权模型可能不同。接入时,应以目标接口及对应产品当前公布的规则为准。

备注:内容仅供参考。