使用js-sdk有一个关键的环节,那就是通过config接口注入权限验证配置,而配置中有个signature参数是需要借助服务端获取的,这里就不过多探讨了,大家通过官方文档可以深入了解。
上篇文章,我推荐大家在vue中配置vue-router使用hash模式,那么hash模式和history模式到底有什么差别呢?我举个栗子,假设我们都通过http://domain.com
进入,然后跳转到路由为/jssdk
的页面需要用到jssdk,那么实际js-sdk进行签名校验时所获取的当前页面url在ios和andrioid是不同的,这里我通过表格展示出来:
由于我项目中需求是基本所有页面都需要能分享,所以在每个page组件中去获取签名是不实际的,所以我就想借助vue-router的after钩子去完成分享配置的操作,对于android则还需要重新进行签名。
// main.js ... import wx from 'weixin-js-sdk' import request from 'axios' ... router.afterEach((to, from) => { let _url = window.location.origin + to.fullPath // 非ios设备,切换路由时候进行重新签名 if (window.__wxjs_is_wkwebview !== true) { request.get('/api/jssdk?url=' + encodeURIComponent(_url)).then(function (_lists) { // 注入配置 wx.config({ ... }) }) } // 微信分享配置 wx.ready(function () { wx.onMenuShareTimeline({ ... }) wx.onMenuShareAppMessage({ ... }) }) }) ... // ios 设备进入页面则进行js-sdk签名 if (window.__wxjs_is_wkwebview === true) { let _url = window.location.href.split('#')[0] request.get('/api/jssdk?url=' + encodeURIComponent(_url)).then(function (res) { let _lists = res wx.config({ debug: false, appId: _lists.appId, timestamp: _lists.timestamp, nonceStr: _lists.nonceStr, signature: _lists.signature, jsApiList: ['chooseImage', 'uploadImage', 'previewImage', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareTimeline', 'chooseWXPay'] }) }) }
h5使用微信支付,细心的人会发现,微信是有两个方案的,我大致了解了一个,一个是js-sdk中开放的能力,一个是微信支付开放平台提供的接口
js-sdk版本:
如果你只需要在公众号中调用支付,两个方法都可以,笔者由于已经使用js-sdk接入了其他功能,所以这里就选择了chooseWXPay方式。
在其他功能都接入成功的前提下,接支付就很快很方便了,笔者把主要步骤列下:
微信公众平台中配置好js安全接口域名(例如www.imwty.com),这个是调用js-sdk的前提,公众号支付也是基于js-sdk;
微信支付平台中设置支付目录,参见微信支付开发文档,这里要说明的是,你需要进行支付的页面路由是什么,就要配置什么,而且需要在后边加上/(例如www.imwty.com/pay/)
调用js-sdk签名配置(wechat.config),上文已有提及。
在点击支付按钮的逻辑中,调用wechat.chooseWXPay()方法,该方法也涉及到支付签名,需要从服务端去获取签名信息
注意的点:访问支付页面务必不要遗漏/
,微信那边会严格比较调用第4步骤时你所在的页面路由和支付平台中设置的路由是否一致。
这里主要展示第4步骤中笔者的写法,仅供参考
... methods () { handlerPay () {**粗体文本** let self = this // 进行支付签名 apiUtil.get('/api/jssdk/pay', {amount: this.amount}).then(function (wxmsg) { self.$wechat.chooseWXPay({ // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 appId: wxmsg.appId, timestamp: wxmsg.timeStamp, nonceStr: wxmsg.nonceStr, // 支付签名随机串,不长于 32 位 package: wxmsg.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: wxmsg.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: wxmsg.paySign, // 支付签名 success: function (res) { // 支付成功的回调函数 }, cancel: function (res) { // 支付取消的回调函数 }, error: function (res) { // 支付失败的回调函数 } }).catch(function () { ... }) } }