vue3前端实现微信支付

要在Vue3前端实现微信支付,你需要按照以下步骤进行操作:

  1. 在微信支付官网上注册一个商户号,并下载微信支付SDK。
  2. 在你的Vue3项目中安装微信支付的npm包,例如:npm install weixin-js-sdk --save
  3. 在Vue3项目中创建一个js文件,在其中编写支付相关的代码,如下所示:
import wx from 'weixin-js-sdk'

export default {
  // 获取微信支付SDK的签名
  getWxPaySign (params) {
    return new Promise((resolve) => {
      // 发起请求获取签名
      axios.post('/api/pay/get-wx-pay-sign', params).then((data) => {
        if (data.code === 200) {
          // 配置微信JS SDK
          wx.config({
            debug: false,
            appId: '你的appId',
            timestamp: data.timestamp,
            nonceStr: data.nonceStr,
            signature: data.signature,
            jsApiList: [
              'chooseWXPay'
            ]
          })
          // 配置完成后返回一个resolve
          wx.ready(() => {
            resolve()
          })
        }
      })
    })
  },

  // 发起微信支付
  wxPay (params) {
    return new Promise((resolve, reject) => {
      // 调用微信支付
      wx.chooseWXPay({
        timestamp: params.timestamp,  
        nonceStr: params.nonceStr,  
        package: params.package,  
        signType: params.signType,  
        paySign: params.paySign,  
        success: (res) => {
          // 支付成功时返回resolve
          resolve(res)
        },
        fail: (err) => {
          // 支付失败时返回reject
          reject(err)
        }
      })
    })
  }
}

4.在Vue3项目中的支付页面中引入该js文件,并按照以下步骤进行操作:

(1) 在页面中定义支付金额、用户id等相关参数

(2) 在Vue3的mounted生命周期中,调用getWxPaySign方法获取微信支付SDK的签名

(3) 在resolve回调函数中调用wxPay方法发起微信支付

示例代码如下:

<template>
  <div class="pay-page">
    <div class="price">{{ price }}元</div>
    <button class="pay-btn" @click="goPay">去支付</button>
  </div>
</template>

<script>
import wxPay from './wxPay'

export default {
  data () {
    return {
      price: 0,
      userId: ''
    }
  },
  mounted () {
    // 获取微信支付SDK的签名
    wxPay.getWxPaySign({
      price: this.price,
      userId: this.userId
    }).then(() => {
      // 配置成功后发起微信支付
      this.goPay()
    })
  },
  methods: {
    // 去支付
    goPay () {
      wxPay.wxPay({
        timestamp: this.timestamp,  
        nonceStr: this.nonceStr,  
        package: this.package,  
        signType: this.signType,  
        paySign: this.paySign
      }).then((res) => {
        // 支付成功
        console.log(res)
      }).catch((err) => {
        // 支付失败
        console.log(err)
      })
    }
  }
}
</script>

<style>
.pay-page {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.price, .pay-btn {
  margin-bottom: 20px;
  font-size: 24px;
}

.pay-btn {
  width: 100px;
  height: 50px;
  background-color: #4caf50;
  border: none;
  border-radius: 5px;
  color: #fff;
}
</style>