引入JSSDK

npm install weixin-js-sdk

微信JSSDK支付

wxPay方法封装

import axios from 'axios';

import wx from "weixin-js-sdk";
import {GetPayOrder, PostPay} from "@/api/home";
import {message, Modal} from "ant-design-vue";




export default {
    // 获取微信支付SDK的签名
    getWxPaySign(params: any): Promise<void> {
        return new Promise<void>((resolve, reject) => {
            // 发起请求获取签名
            GetPayOrder(params).then((res: any) => {

                const {data,code} = res

                if (code === 200) {
                    // 配置微信JS SDK
                    wx.config({
                        debug: false,
                        appId: data.appId,
                        timestamp: data.timestamp,
                        nonceStr: data.nonceStr,
                        signature: data.signature,
                        jsApiList: [
                            'chooseWXPay'
                        ]
                    })
                    // 配置完成后返回一个resolve
                    wx.ready(() => {
                        resolve(data)
                    })

                    wx.error((res:any) => {

                        reject(new Error('微信支付初始化失败'))
                    })
                } else {
                    // 请求失败时返回一个reject
                    reject(new Error('获取微信支付SDK签名失败'))
                }
            }).catch((error: any) => {
                reject(error);
            });
        });
    },
    routerWxMiniPay(data:any){
        let object = encodeURIComponent(JSON.stringify(data))
        wx.miniProgram.navigateTo({
                url: `/pages/pay/pay?object=${object}`, // 小程序地址
                success () {
                    console.log('question success')
                },
                fail (error) {
                    console.log(error)
                }
            })
    },
    closeWXPay() {

        wx.closeWindow(); /* 关闭微信窗口,调用时需要在config中进行校验 */
    },


    // 发起微信支付
    wxPay(params: any): Promise<any> {
        return new Promise((resolve, reject) => {

            // 调用微信支付
            wx.chooseWXPay({
                timestamp: params.timestamp,
                nonceStr: params.nonceStr,
                package: params.package,
                signType: params.signType,
                paySign: params.paySign,
                success: function(res) {
                    // Modal.success({title:JSON.stringify(res)})
                    // 前端判断返回方式,微信团队郑重提示:不保证绝对可靠,切记!
                    if (res.errMsg == 'chooseWXPay:ok') {
                        // 【支付成功】

                    } else if (res.errMsg == 'chooseWXPay:cancel') {

                        // 【支付取消】:用户取消支付不会进入这个判断,而是进入complate和cancel函数
                    } else {

                    }
                },
                complete: function(res) {
                    // Modal.info({title:JSON.stringify(res)})
                    // 接口调用完成时执行的回调函数,无论成功或失败都会执行
                    if (res.errMsg == 'chooseWXPay:ok') {

                        // wx.closeWindow()
                        resolve(res)
                        // 【支付成功】:支付成功提示页面,点击完成按钮之后

                    } else if (res.errMsg == 'chooseWXPay:cancel') {
                        reject(res)
                        // 【支付取消】
                    } else {
                        reject(res)
                    }
                    /**
                     * iOS和Android支付成功点击“完成”后都会进入success和complete函数,都返回'chooseWXPay:ok'
                     * (也有人说Android支付成功不进入success函数,)
                     * 原因是【iOS和Android返回数据不同。支付成功后Android返回 {"errMsg":"getBrandWCPayRequest:ok"},iOS返回{"err_Info":"success","errMsg":"chooseWXPay:ok"},故Android找不到success方法,导致失败】
                     * */
                },
                fail: function(err) {
                    // Modal.error({title:JSON.stringify(err)})
                    reject(err)
                    // 接口调用失败
                },


            });
        });
    }
}

支付调用

import wxPay from "@/utils/wxPay";

const createOrder = (item: any) => {
  // 获取微信支付SDK的签名
  wxPay.getWxPaySign({
    order_no: item.order_no,
    url: encodeURIComponent(location.href.split('#')[0]),//支付需要将url encodeURIComponent
  }).then(res => {
    // 配置成功后发起微信支付

    goPay(res)
    payInfo.value = res

  }).catch(err => {
    // Modal.error({title: JSON.stringify(err)})
    console.error(err)
  })
}

微信JSSDK自定义分享

封装分享方法

import wx from "weixin-js-sdk";
import {GetShareSignature} from "@/api/home";
import {useLoginStore} from "@/store/login";


export default {
    // 获取微信支付SDK的签名
    initWechatShare() {
        return new Promise<void>((resolve, reject) => {
            // let urls = import.meta.env.VITE_WEB_BASE_URL + '/'
            const {getWxShareUrl} = useLoginStore()
         
//****重点:此地址为微信打开网页的地址,SPA项目进入后可能会重定向,但是用于签名的地址必须与微信打开入口地址保持一致
               let url = getWxShareUrl()
        
            GetShareSignature({
                url: url ,//***重点:分享接口不需要encodeURIComponent
            }).then((res: any) => {
                const {data, code} = res

                if (code !== 200) return
                wx.config({
                    debug: false,
                    appId: data.appId,
                    timestamp: data.timestamp,
                    nonceStr: data.nonceStr,
                    signature: data.signature,

                    jsApiList: ['updateAppMessageShareData',
                        'updateTimelineShareData']
                });
                wx.ready(() => {
                    resolve(data)
                })

                wx.error((res:any) => {

                    reject(new Error('微信分享初始化失败'))
                })
            })
        })
    },
    wxShare() {

        let metaDescription = document.querySelector('meta[name="description"]');
        let metaImg = document.querySelector('meta[name="imageUrl"]');
        let description = metaDescription ? metaDescription.getAttribute('content') : '';
        let img = metaImg ? metaImg.getAttribute('content') : 'xxx.png';
        let title = document.title;
        let imgUrl = img as string
        let desc = description as string;
        let myUrl = location.href.split('#')[0];//分享接口不需要encodeURIComponent
        //分享给朋友
        wx.updateAppMessageShareData({
            title: title, // 分享标题
            desc: desc, // 分享描述
            link: myUrl, // 分享链接
            imgUrl: imgUrl, // 分享图标

            success: function () {
                // 用户确认分享后执行的回调函数
            },

        });

        wx.updateTimelineShareData({
            title: title, // 分享标题
            link: myUrl, // 分享链接
            imgUrl: imgUrl, // 分享图标
            success: function () {
                // 用户确认分享后执行的回调函数
            }

        });
    }

}

获取入口地址用于签名

//App.vue
onMounted(async () => {
  let isWechat = ISINWECHAT()
  if(!isWechat) return
  let url = location.href.split('#')[0]
  //设置微信分享的入口签名地址
  setWxShareUrl(url) 
})

相关页面进行自定义分享

//需要进行自定义分享的页面
import wxShare from "@/utils/wxShare";

onMounted(async () => {
  loading.value =true
 await getMySong()
  let isWechat = ISINWECHAT()

  if(isWechat){
    //初始化微信分享
   await wxShare.initWechatShare()
    wxShare.wxShare()
  }
})

代码世界的构建师,现实生活的悠游者。