一、背景
作为一个支付平台,在对接了多个第三方支付渠道后,面临的一个问题是用户在具体某业务下,应该使用哪个支付渠道的哪个商户。
你可以开发一个收银台,让用户主动选择使用哪个三方支付。也可以由支付系统来切换至某个渠道。
本文主要讲述一个支付平台,从实现层面,怎么支持多业务多渠道多商户的灵活切换。目前市面上的支付方式,夸张地说,除了微信支付就是支付宝支付。这是对于用户来说的。但是具体是哪个渠道,又可能是微信官方,也可能是农行等银行方,这是对用户透明的。
在实际对接的时候,我们还会遇到某个商户被封禁的情况,所以要求我们必须快速切换到备用的商户下。
简单梳理下,这里有三层关系。
用户 --》 支付方(微信/支付宝)【第一层】--》渠道(官方/银行)【第二层】--》商户【第三层】
用户看到的就是使用微信Or支付宝这种支付方式, 然而作为支付平台,是要知晓整个的三层关系。
二、数模设计
2.1、ChannelType渠道类型
定义第三方支付,这里的记录数决定于你对接了多少第三方支付。
- code:渠道编号
- name:渠道名称
- sort:排序序号
- status:状态,默认启用:0停用,1启用
- 第三方支付的域名
- 支付成功的回调地址
- 退款成功的回调地址

2.2、ChannelAccount账户表(商户表)
不同的支付渠道,商户配置的字段不一样,且那些字段不会用于查询,所以我们建议你把那些配置的字段作为一个json字符串统一存储。
- 账户:自定义的一个编号,保证全局唯一
- 账户名称:账户的一个别名
- 渠道类型:见ChannelType
- 商户ID:由第三方支付提供
- 配置详情json字符串:由第三方支付提供


2.3、ChannelBiz渠道路由
业务使用的支付方式和商户的映射关系。
- biz_id 业务ID
- biz_name 业务名称
- channel_code 支付方式
- account 账户
- sort 排序
- status 状态:启用Or禁用
支付方式,比如微信的产品就包括:WX_NATIVE、WX_JSAPI等。
再比如杭州银行的产品又包括:HzBank_QR、HzBank_JSAPI等。
2.4、Channel
ChannelType和Channel是一对多的关系。

三、支付请求接口
请求地址:@PostMapping("/api/v1/trade/create")
请求入参示例:
{
// 支付金额
"amt":1,
// 业务编码
"bizType":111,
// 渠道编码(渠道类型_支付产品)
"channelCode":"HzBank_JSAPI",
// 币种,不同的支付方,可能对币种的编码不一样,需要进行一个转换。
"currency":1,
// 订阅回调的url
"notifyUrl":"http://xxx.xx.com/api/v1/order/agencyNotify",
// 当是jsapi支付方式时,必须传openId
"openId":"oPXZV5dFgfQxUk1vGyH7Qk712xwk",
// 小程序或公众号的应用ID
"appId":"wxa682fba97fb9b12x",
// 先创建订单,再请求支付
"orderNo":"013CS607C",
// 用户ID和名称
"userId":109784,
"userName":"用户名称"
}
网友评论