H5支付介绍
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。
说明: 要求商户已有H5商城网站,并且已经过ICP备案。
前端问题
本文只讨论前端在h5支付的问题,具体实现那些需要后端实现的地方我这边就不多介绍
应用内嵌webview实现h5微信支付(官方建议直接使用app支付,不要使用h5支付)
原理:window.location.href = '跳转微信链接' ,总的来说就是向后端发起请求,后端处理好微信h5请求后返回给我们一个链接,前端直接唤醒这个链接打开微信支付。
商家存在未配置的参数
可能原因:1、微信公众号未配置h5支付域名 2、唤起微信支付的网站域名跟配置的不对
这一步需要后端处理,前端一般只需要处理唤醒这一步。
配置跳转路径
配置redirect_url路径,需要在唤醒的链接拼接 'redirect_url='+ encodeURIComponent('同一支付域名下的路径?参数1&参数2')即可在支付后返回链接,注意也要与支付域名一致。
安卓和ios的差异
实测在安卓机型中跳转完取消或者完成能够正常回到redirect_url所拼接的路径,苹果存在许多问题
ios苹果微信h5支付返回safari浏览器。 这个问题一直存在,在网上目前有两种解决方式,一是留在微信将redirect_url拼接的域名中协议给取消比如你拼接了 'https:// 域名',将 https:// 去掉,这样将在支付取消或完成后留在微信。二是配置scheme地址跳转回app,需要将Referer设置成scheme格式。
ios苹果留在微信后,原app内页面白屏。这是我遇到的另一个问题,window.location.href跳转后原app页面白屏了,几经折腾下来没办法换方案(有解决了的大佬评论区留个言),在原app单独写一个页面,用作自动跳转app,让苹果跳转到safari后在这个单独页再次拉起scheme到应用,相当于上面的第二种方法的简略版,不用设置Referer了,知道app的scheme就行,在空白页的js中作处理判断,如果是原app内就直接使用this.$route.push跳转回主页,参数在路径中都能拿得到。
微信内置jsapi支付
这种方式相对友好很多,直接在微信的内置浏览器使用,WeixinJSBridge在微信浏览器中内置,可以根据WeixinJSBridge有无值直接使用,对于的参数也是需要后端传递,注意使用前需要openid,而且支付者openid要与下单者对应。这样我们写的h5网页即可在外部使用h5支付,在微信内使用jsapi支付
WeixinJSBridge.invoke( //js直接调用
'getBrandWCPayRequest',
{
appId: data.appId,
timeStamp: data.timeStamp,
nonceStr: data.nonceStr,
package: data.package,
signType: data.signType,
paySign: data.paySign
},
function (res) {
if (res.err_msg == 'get_brand_wcpay_request:ok') {
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
}
)