商户微信支付能力梳理

最近在学习微信支付的业务, 简单梳理下当前商户微信支付的能力及相关接口. (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 参数
    • 收到支付通知必须验证, 防止伪造攻击
    • 功能上, 支付通知 和 查询订单 是等同的
    • 支付通知可能收到多次, 要求开发时保证可重入
  • 推荐官网上的最佳实践, 包括了

其余更多细节信息, 可以查询官方文档.