最近做了一个答题应用,甲方要求,用户进入应用先答题,最后点微信支付的时候,再授权,支付。

我的实现思路是点击微信支付按钮时,跳转到某个地址获取授权

redirect_uri 需要先在微信公众号后台支付授权目录里设置,需要跳转的路由,前台也应该存在
xxx/pay。由于支付目录不允许hash地址,vue路由模式需要设置为history模式

handlePayMoney() {
      if (isWXBrowser) {
        window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXXXXX&redirect_uri=http:www.beibei0.com/pay&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"
      }
    }

参数	必填	说明
appid	是	公众号唯一标识
redirect_uri	是	授权后的回调链接地址
response_type	是	返回类型,code
scope	是	授权方式
state	否	重定向参数
connect_redirect	否	动态参数,=1 发一次请求
#wechat_redirect	是	重定向必带参数
// 判断是否微信环境
export const isWXBrowser = (() => {
  const ua = window.navigator.userAgent.toLowerCase()

  return /(micromessenger|webbrowser)/g.test(ua)
})()

点击按钮跳转后,路径上就拿到code值了。使用$route.query.code获取路径上的code值
然后拿到code值和订单信息,请求后台支付接口,后台会把支付信息返回来

const params = {
          test_id: answer.test_id,
          Code: this.code
        }
        if (this.code) {
          handlePay(params).then(res => {
            const data = res.data.data
            wx.config({
              debug: false,					//开启调试模式
              appId: data.appid,			//公众号的唯一标识
              timestamp: data.timestamp,	//生成签名的时间戳
              nonceStr: data.nonceStr,		//生成签名的随机串
              signature: data.signature,	//签名
              jsApiList: ['chooseWXPay']		//需要使用的JS接口列表
              //openTagList : ['wx-open-launch-weapp']
            });

            wx.ready(function () {
              wx.chooseWXPay({
                timestamp: data.timeStamp,	// 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                nonceStr: data.nonceStr,	// 支付签名随机串,不长于 32 位
                package: data.prepay_id,	// 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
                signType: data.signType,	// 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                paySign: data.paySign,		// 支付签名
                success: function (response) {
                  // res.errMsg === 'chooseWXPay:ok'方式判断前端返回,微信团队郑重提示:
                  // res.errMsg将在用户支付成功后返回ok,但并不保证它绝对可靠, 切记。
                  if (response.errMsg == 'chooseWXPay:ok') {
                    window.localStorage.setItem("order_no",res.data.data.order_no)
                    window.location.href = `http:www.beibei0.com/resultPage`
                  }
                },
                // 支付取消回调函数
                cancel: function () {
                  Toast('用户取消支付')
                  window.location.href = `http:www.beibei0.com/pay`
                },
                // 支付失败回调函数
                fail: function () {
                  Toast('支付失败')
                  window.location.href = `http:www.beibei0.com/pay`
                }

              });

            })

          })

遗憾的地方:
1、前台点按钮跳转redirect_uri,配置的是线上地址,需要打包上传服务器后测试(在支付目录增加配置本地地址应该可以)
2、wx.chooseWXPay 调起微信支付,需要在真机上测试
3、不知道什么原因,wx.chooseWXPay支付成功和失败,使用路由跳转页面,始终不成功,最后无奈选择window.location.href进行跳转
后续继续完善