微信支付直连模式和服务商模式的区分
以下是微信支付 服务商模式 与 直连模式 的核心区别对比及示意图,帮助开发者快速理解两者的设计逻辑和应用场景:
核心区别对比图
对比维度 | 服务商模式 | 直连模式 |
---|---|---|
适用场景 | 聚合服务商(如SaaS平台、支付代理商)为子商户提供支付能力 | 商户直接对接微信支付(如自营电商、品牌官网) |
商户关系 | 三方结构:微信支付 ↔ 服务商 ↔ 子商户 | 两方结构:微信支付 ↔ 商户 |
接口权限 | 服务商代子商户发起支付,需子商户授权 | 商户直接调用接口,无需中间角色 |
关键参数 | 必须传递 sp_appid (服务商APPID)、sub_mchid (子商户号) | 只需商户自身的 appid 和 mchid |
资金结算 | 资金先到服务商账户,再由服务商分账给子商户 | 资金直接结算到商户账户 |
费率控制 | 服务商可自定义子商户费率(需符合微信规则) | 费率由微信支付固定,商户直接签约 |
子商户管理 | 需通过API管理子商户入驻、配置权限 | 不涉及子商户,仅管理自身账户 |
接口路径 | 接口URL包含 /partner/ 标识(如 /v3/pay/partner/transactions/jsapi ) | 普通接口路径(如 /v3/pay/transactions/jsapi ) |
回调通知 | 回调通知中包含服务商和子商户信息 | 仅包含商户自身信息 |
分账能力 | 支持服务商发起分账到子商户或其他方 | 商户自主分账,无需通过服务商 |
架构示意图
服务商模式:
+----------------+ +---------------+ +---------------+
| 微信支付平台 | <---> | 服务商 | <---> | 子商户A/B/C |
+----------------+ +---------------+ +---------------+
^ |
| +-- 代发起支付、管理子商户
+---------------------------- 资金结算、分账
直连模式:
+----------------+ +---------------+
| 微信支付平台 | <---> | 商户自身 |
+----------------+ +---------------+
|
+------------------- 直接处理支付、结算
配置差异示例(yansongda/hyperf-pay)
服务商模式配置
// config/ysdPay.php
'wechat' => [
'default' => [
// 必填-商户号,服务商模式下为服务商商户号
'mch_id' => env('WX_PAYMENT_MCH_ID'),
...
'wechat_public_cert_path' => [
// '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__ . '/Cert/wechatPublicKey.crt',
],
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
'mode' => Pay::MODE_SERVICE
]
]
直连模式配置
'wechat' => [
'default' => [
// 必填-商户号,服务商模式下为服务商商户号
'mch_id' => env('WX_PAYMENT_MCH_ID'),
...
'wechat_public_cert_path' => [
// '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__ . '/Cert/wechatPublicKey.crt',
],
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
'mode' => Pay::MODE_NORMAL
]
]
接口调用参数差异
服务商模式请求体
{
"sp_appid": "wx8888888888888888",
"sp_mchid": "1230000109",
"sub_appid": "wx8888888888888888",
"sub_mchid": "1900000109",
"out_trade_no": "12177525012014070332333",
"amount": {
"total": 100,
"currency": "CNY"
},
"payer": {
"sp_openid": "o4GgauInz_R3dxxxxxx" // 用户在服务商APP的openid
}
}
直连模式请求体
{
"appid": "wx8888888888888888",
"mchid": "1230000109",
"out_trade_no": "12177525012014070332333",
"amount": {
"total": 100,
"currency": "CNY"
},
"payer": {
"openid": "o4GgauInz_R3dxxxxxx" // 用户在当前商户APP的openid
}
}
如何选择模式?
选服务商模式:
需为多个子商户提供支付聚合服务(如外卖平台、连锁门店管理系统)。选直连模式:
自有业务直接收款(如品牌官网、自营APP)。
常见错误规避
服务商模式下误用直连参数
避免在服务商接口中传递直连模式参数(如appid
代替sp_appid
)。OpenID 归属混淆
sp_openid
必须来自服务商自身的APP,不可使用子商户APP的openid。子商户未授权
调用接口前需确保子商户已完成入驻并通过sub_mchid
绑定到服务商。
通过明确区分两种模式的使用场景和参数规范,可大幅降低开发中的配置错误风险。