H5 微信支付、支付宝支付简介
目前,国内的移动支付具有快速、简便、使用人数众多的特点。作为前端开发者,我们也会遇到一些对接移动支付的需求。最近刚好接手一个移动支付的需求,在 H5 页面内需要接入微信支付以及支付宝支付,因此将其支付流程整理如下。
场景
本次总结的使用场景是用户通过移动端扫码/输入链接进入 H5 页面后,选择相应的订单,发出订单信息后,调起微信支付模块或者支付宝支付模块。
在支付方式中,分别对应微信的公众号支付、H5支付,以及支付宝的手机网站支付。
微信支付
微信支付开发者文档中,根据场景将微信支付分为以下几类:
- 公众号支付
- APP 支付
- 扫码支付
- 刷卡支付
- H5 支付
- 小程序支付
本次介绍的只要是公众号支付和 H5 支付。他们都属于移动端访问 H5 页面发起的支付,主要区别在于:公众号支付对应的 H5 页面必须通过微信浏览器打开,而 H5 支付则面向用户在微信浏览器以外的移动端浏览器访问 H5 页面的场景。
公众号支付
公众号支付是在微信内访问 H5 页面的支付流程,可以直接唤起支付弹窗。具体的逻辑流程如下:
- 前端项目中引入微信 JS-SDK
1
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
- 用户在微信内进入 H5 页面,进行相应操作后,提交订单信息
- 前端将订单信息发送给服务端,服务端与微信支付系统通信,生成预付单
- 服务端将预付单信息发送给前端
- 检测微信 JS API 对象是否已被初始化,如果没有初始化,则尝试初始化。微信 JS API 封装在
WeixinJSBridge
这个对象中,进入 H5 页面时,并不能保证该对象已经初始化完毕,因此需要对它进行初始化检验,没有被初始化时通过事件的方式进行初始化。1
2
3
4
5
6
7
8
9
10
11
12
13
14// 函数 regWeixin 为支付逻辑,具体代码在后续的步骤中进行介绍
// data 参数为服务端传过来的预支付订单信息
callWeixin(data) {
if (window.WeixinJSBridge === undefined) {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', () => { this.regWeixin(data); }, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', () => { this.regWeixin(data); });
document.attachEvent('onWeixinJSBridgeReady', () => { this.regWeixin(data); });
}
} else {
this.regWeixin(data);
}
} - JS-API 被初始化后,调用微信支付 API
getBrandWCPayRequest
,唤起支付的窗口,此时需要将之前服务端传过来的部分预订单信息通过参数传入该 API 中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19regWeixin(opts) {
window.WeixinJSBridge.invoke('getBrandWCPayRequest', {
// 以下为支付 API 所需要的参数,必传,缺一不可
appId: opts.appId, // 公众号名称,由商户传入
timeStamp: opts.timeStamp.toString(), // 时间戳,自1970年以来的秒数
nonceStr: opts.nonceStr, // 随机串
package: opts.package,
signType: opts.signType, // 微信签名方式:
paySign: opts.paySign // 微信签名
}, (res) => {
// 支付成功
if (res.err_msg === 'get_brand_wcpay_request:ok') {
this.doms.jsAppContent.html(this.getTemplate('finish'));
} else {
// 支付失败
DYToast.toast('支付失败');
}
});
} - 此时支付逻辑大体执行完毕,由于微信支付后台可能存在订单延时的情况,如果需要提高精确性,可以在支付成功后加入一项验证逻辑,与服务端通信验证是否已收到微信支付成功的回调通知。
微信官方提供的支付逻辑时序图如下:
H5 支付
H5 支付是通过微信以外的的手机浏览器访问 H5 页面发起的微信支付请求,该支付方式的逻辑流程相对于公众号支付来说较为简单,微信后台会返回一个重定向链接,H5 页面重定向到该链接即可。具体的逻辑如下:
- 用户在微信以外的浏览器进入 H5 页面,进行相应操作后,提交订单信息
- 前端将订单信息发送给服务端
- 服务端处理相应的订单参数,调用微信指定的 API 链接,传入指定的参数即可
- 微信后台返回一个重定向链接给服务端,服务端再将该链接传给前端
- 前端打开该链接地址,该地址即为微信支付提供的支付地址,后续的支付逻辑由微信处理
- 支付完毕后跳转回原地址,前端与服务端进行通信,检验订单的状态,是否支付成功,然后给出相应的提示。
微信官方提供的支付逻辑时序图如下:
支付宝支付
微信支付开发者文档中,根据场景将微信支付分为以下几类:
- 当面付
- APP 支付
- 手机网站支付
- 电脑网站支付
本次介绍的只要是手机网站支付。与微信支付不同,他不需要判断是否是通过支付宝内访问 H5 页面而执行不同的支付逻辑。
手机网站支付
支付宝支付相对微信支付来说,支付 SDK 封装的更好,接入方需要执行的逻辑操作较少。其执行逻辑与微信 H5 支付类似:前端只需要将订单信息传给服务端,服务端调用支付宝指定 API,支付宝生成重定向链接,再用服务端将该链接返回给前端,前端打开该链接即可。