第三方支付统一接入方案
方案背景及目的
目前大部分商户平台均已接入微信,支付宝等第三放支付平台作为支付渠道,每个商户平台开发者都需要自己去接入支付API或SDK,本方案旨在提供一种相对统一的方式,为各商户平台接入支付渠道,减少部分重复接入劳动
支付渠道
微信,支付宝,浦发银行
支付方式
H5页面支付
方案描述
图例说明:
支付配置:商户平台在统一支付平台申请配置各自的唯一标识(payid),默认页面回跳地址,默认通知地址
客户:指购买商品,发起交易的用户,这里限定使用工具为浏览器
商户:商品提供方;需要接入统一支付的平台,负责处理支付前及支付后的业务逻辑
统一接入:对微信,支付宝,浦发银行等支付渠道的调用封装,即本次开发任务
第三方支付:微信,支付宝,浦发银行等
步骤说明:
1.用户在商户平台发起商品购买
2.商户预生成订单信息,将配置的h5payid,订单信息提交至统一接入平台,如果不使用默认的回跳和通知地址,则在参数中指定,同时可在参数中指定是否只支持某种支付方式
3.统一接入平台根据输入的payid,订单等参数信息,持久化至数据库,并构建支付页面地址返回给商户
4.商户将用户浏览器重定向到上述步骤的支付页面地址
5.客户在支付页面上选择需要的支付方式,发起支付申请
6.调用第三方支付
7 微信:需要安装微信客户端,微信jsapi调用客户端支付
支付宝:统一支付向支付宝发起支付申请,支付宝返回token,统一平台构建授权URL,重定向至用户浏览器(第8步)
浦发银行:用户在支付页面上选择浦发支付,直接跳转至浦发支付页面
9 用户输入账号授权支付
10 支付完成后,微信,支付宝跳转至指定的商户页面(未指定,则使用默认配置)
11.商户系统处理回调页面对应的业务逻辑
12.商户系统接受支付渠道的异步通知做相应处理
需要商户系统做的事情:
1.申请支付渠道相关账号,证书等文件
2.在统一支付平台申请配置h5payid,配置默认回跳页面(return_url),及默认通知地址
3.编写回跳及通知处理逻辑,并提供接口,接口需要实现幂等,同时建议在接口入口处记录通知日志,便于问题回溯定位,建议商户通知处理系统为保持稳定可单独部署或双机配置
4.建议实现补偿定时程序或其他策略,调用统一接入平台提供的单笔业务查询接口,用于订单补偿
需要第三方接入做的事情:
1.实现商户系统接入管理,即管理接入的商户的后h5payid,默认回跳,通知地址等
2.提供商户订单提交接口,用于商户提交订单等信息
3.接入支付渠道
4.提供各支付渠道的单笔业务查询接口
统一接入平台相关数据库及接口设计:
数据库:
商户表(一个商户可申请多个h5payid,但需要由商户系统作业务区分)
字段 |
类型 |
约束 |
描述 |
H5payid |
Varchar(12) |
pk |
商户在接入平台的全局唯一标识 |
name |
Varchar(64) |
Not null |
商户系统名称 |
H5paysecret |
Varchar(12) |
Not null |
接入密码 |
appId |
Varchar(64) |
|
商户在微信,支付宝的appid |
appsecret |
Varchar(64) |
|
商户在微信,支付宝的secret |
return_url |
Varchar(128) |
Not null |
默认回跳地址 |
Notify_url |
Varchar(128) |
Not null |
默认通知地址 |
Create_time |
datetime |
|
申请时间 |
Modify_time |
datetime |
|
修改时间 |
注:商户系统的银行相关配置可以配置在属性文件中
统一订单表(该订单表不承担为商户系统长期保留订单职责,可以定期清理已结束订单)
字段 |
类型 |
约束 |
描述 |
Id |
long |
pk |
|
serialno |
Varchar(64) |
Not null unique index |
本系统流水号,全局唯一 |
H5payid |
Varchar(12) |
Not null |
商户在接入平台的全局唯一标识 |
trade_no |
Varchar(64) |
Not null |
订单在商户系统的唯一编号 |
price |
double |
Not null |
价格 |
goodname |
Varchar(128) |
Not null |
商品名称 |
gooddesc |
Varchar(128) |
|
商品描述 |
ip |
Varchar(21) |
Not null |
订单提交IP(非商户系统IP,由商户传过来的订单提交到商户时候的IP) |
Return_url |
Varchar(128) |
|
本次订单指定回跳页面地址 |
Notify_url |
Varchar(128) |
|
本次订单指定通知地址 |
referer |
Varcha(128) |
|
商户系统地址 |
Create_time |
datetime |
|
申请时间 |
Modify_time |
datetime |
|
修改时间 |
统一接入平台接口:
接口通信方式可自定义
1.订单提交接口:
参数:h5payid,h5paysecret,price(价格),goodname(商品名称),return_url(非必填),notify_url(非必填),ip(订单ip),show_url(商品展示页面地址)
逻辑:保存至数据库
返回:支付页面地址,如http://ip:port/unifiedpay/serialno,商户系统重定向到该地址
2.支付页面接口
参数:serialno
逻辑:根据serialno对应的订单信息,及相应的支付规则,构造支付页面返回给浏览器
返回:浏览器页面或微信客户端
3.单笔查询接口
参数:商户系统订单号,支付渠道(wx/alipay/bank,参数可自定义)
逻辑:根据订单号及支付渠道,以及相应的支付账号调用第三方支付的业务查询接口,并判断成功或是失败
返回:成功则返回成功代码,否则返回失败代码及失败原型 代码自定义
可行性待确认:
支付渠道对支付来源页面可能会进行校验,需要确认微信,支付宝的支付授权校验规则
ps:可能需要在微信等支付平台配置授权域名或目录为统一支付平台的地址