PAYATHON 2026

一个 APP 能否使用多个商户号接入支付宝支付?

支付老李

结论

一个客户端 APP 可以让不同业务模块使用不同的支付宝商户号收款,但不能只靠客户端切换商户号。商户路由、订单创建、签名和授权令牌管理都应放在服务端。

常见的实现方式有两种:

  • 每个商户号使用各自的支付宝开放平台应用配置,服务端根据业务模块选择对应的 app_id 和签名证书或密钥。
  • 采用服务商(第三方应用)模式,由多个商户授权同一个第三方应用。服务端调用支付接口时,携带目标商户的 app_auth_token。

采用第三方应用授权后,支付页面不必改成 H5。原生 APP 仍可调用 alipay.trade.app.pay,再通过支付宝 APP SDK 发起支付。H5 支付是另一种产品和接口,与是否采用第三方应用授权没有必然联系。

为什么可以使用多个商户号

支付宝处理每笔订单时,会识别对应的开放平台应用、签约产品、授权关系和收款主体,而不是判断手机中安装了几个客户端 APP。

同一个客户端可以根据业务场景向服务端提交不同的业务标识,例如:

module_a -> 商户 A
module_b -> 商户 B
module_c -> 商户 C

服务端收到业务标识后,选择正确的支付配置,再调用支付宝接口生成支付参数。

这里所说的“一个 APP 支持多个商户号”是一种业务架构能力,不代表一套固定配置可以无条件替所有商户收款。每个商户仍需完成相应的支付宝商家签约、应用授权和权限配置。

推荐方案:第三方应用授权

如果收款账号分属多个独立商户,又需要统一接入和维护,第三方应用授权模式通常更合适。

基本流程如下:

  1. 服务商在支付宝开放平台创建第三方应用。
  2. 为第三方应用申请并配置 APP 支付等所需能力。
  3. 各商户完成应用授权。
  4. 服务端保存授权后取得的 app_auth_token,并建立业务模块与商户之间的映射。
  5. 创建订单时,服务端根据模块找到目标商户及其 app_auth_token。
  6. 服务端调用 alipay.trade.app.pay 生成订单字符串。
  7. 客户端将订单字符串交给支付宝 APP SDK。
  8. 服务端通过异步通知确认最终支付结果。

授权令牌必须保存在服务端,不能下发给客户端。

服务端调用示例

下面用 Java SDK 展示核心逻辑。SDK 的具体构造方式可能因版本以及普通公钥、证书模式的不同而有所区别,但调用时都要为当前商户设置正确的 app_auth_token。

import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;

public String createAppPayOrder(
        AlipayClient alipayClient,
        String appAuthToken,
        String outTradeNo,
        String totalAmount,
        String subject) throws Exception {

    AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    model.setOutTradeNo(outTradeNo);
    model.setTotalAmount(totalAmount);
    model.setSubject(subject);
    model.setProductCode("QUICK_MSECURITY_PAY");

    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
    request.setBizModel(model);
    request.setNotifyUrl("https://pay.example.com/alipay/notify");

    // 第三方应用代商户调用时,设置当前商户的授权令牌
    request.putOtherTextParam("app_auth_token", appAuthToken);

    AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
    if (!response.isSuccess()) {
        throw new IllegalStateException(
                "创建支付宝订单失败: " +
                response.getCode() + " " +
                response.getSubCode() + " " +
                response.getSubMsg()
        );
    }

    // 返回给客户端,客户端再交给支付宝 APP SDK
    return response.getBody();
}

服务端也可以根据业务模块选择商户:

public MerchantConfig resolveMerchant(String moduleCode) {
    switch (moduleCode) {
        case "COURSE":
            return merchantConfigRepository.findByMerchantCode("MERCHANT_A");
        case "SHOP":
            return merchantConfigRepository.findByMerchantCode("MERCHANT_B");
        default:
            throw new IllegalArgumentException("不支持的业务模块");
    }
}

实际项目中,不能只信任客户端传入的 moduleCode。服务端还应结合商品、订单类型和合同关系等信息,重新校验对应的收款商户。

客户端是否需要改成 H5

不需要。

如果购买流程在原生 APP 中进行,可以继续使用 APP 支付:

客户端请求服务端创建订单
        ↓
服务端携带对应 app_auth_token 调用 alipay.trade.app.pay
        ↓
服务端返回已签名订单字符串
        ↓
客户端调用支付宝 APP SDK
        ↓
支付宝返回同步结果,并向服务端发送异步通知

第三方应用授权只决定服务端以什么身份、代表哪个商户调用接口,不会强制把支付页面改成 H5。

只有当业务运行在浏览器、WebView 或移动网页中,并选择支付宝手机网站支付产品时,才需要使用相应的 H5 支付接口。不要在普通 WebView 中自行模拟或拼装支付宝收银台。

不使用第三方授权时的处理方式

如果几个商户号都由同一团队管理,也可以为每个商户分别维护配置:

alipay:
  merchants:
    merchant-a:
      app-id: "..."
      private-key: "..."
      alipay-public-key: "..."
    merchant-b:
      app-id: "..."
      private-key: "..."
      alipay-public-key: "..."

创建订单时,再动态选择对应的 AlipayClient:

MerchantConfig config = resolveMerchant(moduleCode);
AlipayClient client = alipayClientFactory.getClient(config.getMerchantCode());
String orderString = createOrder(client, order);

这种方式比较直观,但随着商户数量增加,密钥轮换、证书管理、接口权限和签约状态的维护成本也会明显上升。某个应用配置能否用于特定商户收款,还要看开放平台应用的实际归属、产品签约关系和支付宝开放平台当时的规则,不能仅靠修改 seller_id 实现。

必须注意的事项

不要在客户端保存商户密钥

应用私钥、商户证书和 app_auth_token 都是敏感凭据,应存放在服务端或密钥管理系统中。客户端只接收当前订单已签名的支付字符串。

不要让客户端决定收款方

客户端传入的商户号、seller_id 或模块编号都可能被篡改。服务端必须根据真实订单确定收款主体,并校验商品与商户之间的归属关系。

每个商户都要具备有效权限

第三方应用开通了 APP 支付,不代表所有授权商户都能立即收款。商户是否可以收款,仍取决于其是否满足签约、授权、风控和产品准入条件。

正确处理授权令牌

app_auth_token 与授权商户一一对应。服务端需要记录授权主体和令牌状态,并处理令牌失效或商户取消授权等情况。A 商户的授权令牌不能用于 B 商户的订单。

以异步通知为最终依据

客户端返回的支付结果只能用于交互提示,不能直接作为发货或记账的依据。服务端应验签异步通知,并至少核对:

  • app_id
  • out_trade_no
  • trade_status
  • total_amount
  • 实际收款主体
  • 订单是否已经处理

回调接口还应做好幂等处理,防止重复发货或重复记账。

订单号要能区分商户

多个商户共用支付系统时,建议让订单号全局唯一,或者在内部使用“商户编号 + 订单号”作为联合唯一键,以免不同商户生成相同的 out_trade_no 后发生混淆。

原生 APP、多商户收款和第三方应用授权可以同时使用。较稳妥的做法是保留一套客户端支付入口,由服务端负责商户路由,并在调用 alipay.trade.app.pay 时使用目标商户对应的授权信息。

备注:内容仅供参考。