vue-cli公众号调用微信支付(坑)

vue微信支付及坑点:
调用微信支付首先要引入微信jssdk
在index.html文件引入

<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

也可以用npm进行安装,在main.js引入
我这里是在index.html文件引入
封装支付接口,以便于在各个组件调用
1.创建wx-js-sdk.js文件,封装调用微信支付的接口,并导出(根据项目需求封装)

import request from '../request/http'
import Vue from 'vue'
import {
  Toast
} from 'vant'
Vue.use(Toast)
import api from '../request/api'

export default {
  /* 微信支付 */
  creatWxPay: function (options, callback) {
    request({
      url: api.requestApi.video.rewardpay,
      data: {
        id: options.id,
        money: options.money
      }
    }).then((res) => {
      if (res.error === 0) {
        if (res.wechat.success) {
          if (typeof WeixinJSBridge == "undefined") {
            if (document.addEventListener) {
              document.addEventListener('WeixinJSBridgeReady', function () {
                onBridgeReady(res.wechat, callback)
              }, false);
            } else if (document.attachEvent) {
              document.attachEvent('WeixinJSBridgeReady', function () {
                onBridgeReady(res.wechat, callback)
              });
              document.attachEvent('onWeixinJSBridgeReady', function () {
                onBridgeReady(res.wechat, callback)
              });
            }
          } else {
            onBridgeReady(res.wechat, callback);
          }
        }
      }
    }).catch((err) => {
      Toast('系统异常!')
    });

  },

// 调用微信内置js对象 WeixinJSBridge 发起支付
function onBridgeReady(params, callback) {
  WeixinJSBridge.invoke(
    'getBrandWCPayRequest', {
      "appId": params.appId, //公众号名称,由商户传入     
      "timeStamp": params.timeStamp, //时间戳,自1970年以来的秒数     
      "nonceStr": params.nonceStr, //随机串     
      "package": params.package,
      "signType": params.signType, //微信签名方式:     
      "paySign": params.paySign //微信签名 
    },
    function (res) {
      if (res.err_msg == "get_brand_wcpay_request:ok") {
        // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
        // 添加支付成功回调,在组件调用之后根据需求修改js逻辑
        callback && callback()
      }else if (res.err_msg == 'get_brand_wcpay_request:cancel') {
        Toast('已取消支付')
      }
    }
  )
}

2.在main.js引入,并添加到Vue原型(方便调用)

import wxJSSDK from './common/wx-js-sdk'
const wxApi = {
    // wxShare: wxJSSDK.creatWxShare, // 微信分享
    wxPay: wxJSSDK.creatWxPay // 微信支付
}
Vue.prototype.wx = wxApi

3.在组件中调用

reward_pay(){ // 支付
// 调用刚封装好的支付api
 this.wx.wxPay({
          id: this.id,
          money: this.inputPrice ? this.inputPrice : this.rewardPrice
      }, ()=>{
      // 成功回调
          this.$toast.success('支付成功!')
          setTimeout(()=>{
              this.hide()
              this.callBack && this.callBack()
          }, 2000)
      })
  },

按照正常的微信支付调用,到这里就可以正常调用支付了,但是,vue-cli打包后访问路由的路径是http://xxx/dist/index.html#/xxxx?id=1(栗子)的形式,而正常的url是https://so.youkuaiyun.com/so/search/s.do?q=1(栗子)的形式,
所以会报URL未注册的错
在这里插入图片描述
看到url未注册,在支付参数配置都正确的情况下,首先考虑到公众号后台设置,支付授权目录
正常url配置:
比如完整路径:http://xxx.xxx.com/index/detail?id=1
则URL配置这样写:http://xxx.xxx.com/index/
vue-cli打包后的访问路径:http://xxx.xxx.com/dist/index.html#/detail?id=1
如果按照正常配置url:http://xxx.xxx.com/dist/
调用微信支付发现还是会报同样的错,那么问题就出在这里
通过调试,仔细观察发现,vue的每一个路由访问,路由路径都是index.html#/后面发生路由变化,所以index.html#/就相当于是路由的一级目录,当配置成http://xxx.xxx.com/dist/调用支付,它会认为这不是根目录,怎么解决这个问题?
配置url的时候,加上index.html#/:http://xxx.xxx.com/dist/index.html#/
这样就可以解决url未注册的问题了,支付也能正常调用
希望对你们有所帮助,如有疑问请留言

如果对你有帮助,点个赞再走吧~谢谢
关注我,不定时分享技术干货~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z.week

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值