商户微信支付能力梳理
最近在学习微信支付的业务, 简单梳理下当前商户微信支付的能力及相关接口. (PS: 注意是商户, B2C 或者 B2B, 个人发红包转账之类的 C 端不涵盖在内).
支付模式
微信支付 B 端提供了下面四种支付模式, 估计这些模式大家都用过:
简述 | 案例 | 特点 | |
---|---|---|---|
刷卡支付 | 类 pos 机, 商家扫客户二维码 | 7-eleven 便利店 | 免密, 速度快 |
公众号支付 | 公号内拉起支付 | "手机充值"公众号 | 公众号二次营销基础 |
扫码支付 | 客户扫商家二维码 | 友宝自动售货机 | 灵活, 印刷品即可 |
APP 支付 | APP 内拉起微信支付 | JD 商城 APP | 第三方 APP 体验好 |
支付工具
微信支付 B 端提供了下面几种支付工具:
类别 | 简述 | |
---|---|---|
代金券 | 营销类 | |
现金红包 | 营销类 | 包含普通红包和裂变红包两种, 裂变红包很容易通过社交分享来做营销 |
企业付款 | 工具类 | 例如企业直接退款到用户账户, 就可以使用这个支付工具 |
报关接口 | 工具类 | 用于商户提交海关需要的订单附件信息 |
服务对象
微信官方按境内/境外, 商户/服务商两个维度分成 4 类目标, 每类的支付接入能力有差.
境内/境外好理解, 商户和服务商的概念需要厘清一下:
- 商户是正儿八经的接入微信支付, 使用微信支付能力的企业或者商家, 例如京东, 例如你家隔壁便民小超市.
- 服务商是第三方开发者, 为没有能力开发的商户来接入微信支付, 帮他们实现交易, 当然资金还是直接到商户的.
- 关于服务商, 更详细的解答可以查看这里.
根据官方文档上的描述, 目前大概是这样的能力限制:
境内商户 | 境外商户 | 境内服务商 | 境外服务商 | |
---|---|---|---|---|
刷卡支付 | Y | Y | Y | Y |
公众号支付 | Y | Y | Y | Y |
扫码支付 | Y | Y | Y | Y |
APP 支付 | Y | Y | ||
代金券 | Y | |||
现金红包 | Y | Y | ||
企业付款 | Y | |||
报关接口 | Y |
其中, 服务商还可以分为普通服务商和银行服务商两种, 区别可以用下面的图例来表示.
普通商户模式, T+1 的商户, T 日的交易信息对应 T+1 日的资金信息.
服务商模式, 需要服务商开发支付接口的商户, 交易信息以服务商的证书和秘钥来验证, 责任清晰.
商户除了找服务商之外, 它的资金还需要和银行合作, 这就是银行服务商模式, 商户由银行自己审核. 而支付接口只涉及信息流, 所以银行服务商和普通服务商从接口开发上来说, 是一致的.
下面这张表说明了不同接入模式下的区别:
普通商户 | 普通服务商 | 银行服务商 | |
---|---|---|---|
商户是否需要已认证的服务号 | √ | ||
商户资料录入微信支付 | √ | √ | √ |
账户验证 | 商户平台 | 商户平台 | 不需要 |
支付功能开发 | 商户自己 | 服务商 | 服务商 |
结算到商家银行账户 | √ | √ | |
商家能否登陆商户平台 | √ | √ | |
接口退款权归属 | 商户自己 | 默认不能退款 | 银行服务商 |
商户平台退款权归属 | 商户自己 | 特约商户 | 银行服务商 |
支付后推荐的公众号 | 商户申请时的公众号 | 服务商配置 | 银行服务商配置 |
公众号支付 | 商户公众号支付 | 服务商或者商户公众号支付 | 服务商或者商户公众号支付 |
扫码支付 | 模式一 & 模式二 | 模式二 | 模式二 |
APP 支付 | 商户 APP 支付 | 商户 APP 支付 | 商户 APP 支付 |
刷卡支付 | √ | √ | √ |
支付接口
微信支付的不同模式和工具都是调用底层的支付接口来实现的, 支付接口按照设计可以大概分为几大类:
API 接口 | 类别 | APP 支付 | 公众号支付 | 扫码支付 | 刷卡支付 |
---|---|---|---|---|---|
统一下单 | 订单与支付类 | √ | √ | √ | 与发起支付一体 |
发起支付 | 订单与支付类 | sdk 拉起 | H5 js 拉起 | 回调或者直接拉起 | 直接支付 |
查询订单 | 订单与支付类 | √ | √ | √ | √ |
关闭订单 | 订单与支付类 | √ | √ | √ | |
支付通知 | 订单与支付类 | √ | √ | √ | |
撤销订单 | 订单与支付类 & 退款类 | √ | |||
申请退款 | 退款类 | √ | √ | √ | √ |
查询退款 | 退款类 | √ | √ | √ | √ |
下载对账单 | 工具类 | √ | √ | √ | √ |
交易保障上报 | 工具类 | √ | √ | √ | √ |
转换短链接 | 工具类 | √ | √ | ||
授权码查openid | 工具类 | √ |
关于一些接口的细节:
- 撤销订单接口中, 关闭与退款为一体, 未支付的订单进行关闭, 已支付的订单进行退款.
- 接口的重入问题
- 刷卡支付 API 重入会报错, 但不会重复扣款
- 统一下单 API 重入会返回新的 prepay_id
- 其余的接口重入会返回相同内容, 幂等
- 支付通知是回调, 回调下单接口的 notify_url 参数
- 收到支付通知必须验证, 防止伪造攻击
- 功能上, 支付通知 和 查询订单 是等同的
- 支付通知可能收到多次, 要求开发时保证可重入
- 推荐官网上的最佳实践, 包括了
其余更多细节信息, 可以查询官方文档.