1、导包

npm install jweixin-module --save

2、在创建wxApi.js文件,将方法封装在js文件里

/*
    微信(公众号)支付方法
*/
const wx = require('jweixin-module');

// 微信支付
const wexinPay = (data, callback, errorCallback) => {
	let [appId, timestamp, nonceStr, signature, packages, sign] = [data.appid, data.timeStamp, data.nonceStr, data.app_sign,data.package, data.app_sign
	];
	
	wx.config({
		debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
		appId, // 必填,公众号的唯一标识
		timestamp, // 必填,生成签名的时间戳
		nonceStr, // 必填,生成签名的随机串
		signature, // 必填,签名,见附录1
		jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
	WeixinJSBridge.invoke(
		'getBrandWCPayRequest', {
			appId: appId, //公众号名称,由商户传入
			timeStamp: timestamp, //时间戳,自1970年以来的秒数
			nonceStr: nonceStr, //随机串
			package: packages,
			signType: 'MD5', //微信签名方式:
			paySign: sign //微信签名
		},
		function(res) {
			if (res.err_msg == 'get_brand_wcpay_request:ok') {
				// 使用以上方式判断前端返回,微信团队郑重提示:
				//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
				//支付成功回调
				callback(res)
			} else if (res.err_msg == 'get_brand_wcpay_request:cancel') {
				//支付失败回调
				errorCallback(res)
			}
		}
	)
}

// 微信分享
const wexinShare = (data, callback, errorCallback) => {
	let [appId, timestamp, nonceStr, signature, packages, sign,name,link,url] = [data.appId, data.timestamp, data.nonceStr, data.signature,data.package, data.app_sign,data.name,data.link,data.url	];
	wx.config({
		debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
		appId, // 必填,公众号的唯一标识
		timestamp, // 必填,生成签名的时间戳
		nonceStr, // 必填,生成签名的随机串
		signature, // 必填,签名,见附录1
		jsApiList: ["onMenuShareAppMessage"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
	
	
	wx.ready(function(){
	  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
	    
        // 设置分享内容
		wx.onMenuShareAppMessage({
		  title: '', // 分享标题
		  desc: name, // 分享描述
		  link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
			imgUrl:url,
		  type: '', // 分享类型,music、video或link,不填默认为link
		  dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
		  success: function (res) {
		  	console.log("分享成功",name,link,url);
		  	// 设置成功
		  	callback(res)
		  },
		  fail:function(err){
		  	errorCallback(err)
		  }
		});
	});
}


// 隐藏右上角胶囊
const wexinHide = (data, callback, errorCallback) => {
	let [appId, timestamp, nonceStr, signature] = [data.appId, data.timestamp, data.nonceStr, data.signature];
	wx.config({
		debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
		appId, // 必填,公众号的唯一标识
		timestamp, // 必填,生成签名的时间戳
		nonceStr, // 必填,生成签名的随机串
		signature, // 必填,签名,见附录1
		jsApiList: ["hideOptionMenu"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
	
	wx.ready(function(){
	  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
		wx.hideOptionMenu();

	});
	wx.error(function(res){
		console.log("信息验证失败",res);
	  // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
	});

}

// 导出这三个方法
export default {
	wexinPay,
	wexinShare,
	wexinHide,
}

3、将方法挂入全局main.js

//导入
import wxApi from './common/wxApi.js'
//挂载
Vue.prototype.$wxPay = wxApi.wexinPay
Vue.prototype.$wxShare = wxApi.wexinShare
Vue.prototype.$wxHide = wxApi.wexinHide

4、调用微信支付

//支付订单
			payorder() {
				const that = this;
                    // 调用后台接口 获取jsapy中wxpay 所需要的参数
                    // 接口根据自己的业务来写
				    that.$http.post("api/agent_goods/pay_order", {
						order_id: that.order_id, //
						pay_type: 4,
					})
					.then(res => {
						console.log("支付订单", res);
						if (res.status_code == 200) {
							console.log('微信公众号支付', res)
                            // 调用挂载在全局中的方法 将后端获取的数据传入方法中
                            // 千万注意 res.data获取的参数要与 上边封装方法中数据接口的参数名一致
							that.$wxPay(res.data, function(res) {
								/*成功的回调*/
								console.log('成功', res)
								uni.showToast({
									title: "支付成功",
								})
								setTimeout(() => {
									that.toPath('/pages/suppliers/orderList')
								}, 1000)
							}, function(e) {
								/**失败的回调*/
								that.$tool.toast('支付失败或取消支付')
								console.log("支付失败或取消支付", e)
							})
						}
					})
			},

5、调用微信分享

const that = this
// 调用后端接口 将当前分享页面的链接传给后端 后台通过域名进行授权
this.$http.get('api/user/signature',{url:'url'}).then(res=>{
				console.log("获取分享验证",res);
				let data1 = res.data; // 得到分享需要的参数 appId 公众号的唯一标识,timestamp 生成签名的时间戳,nonceStr 生成签名的随机串 ,signature 签名
				data1.name = that.goodsInfo.goods_name; // 分享描述
				data1.link = 'url'; // 分享链接
				data1.url = that.goodsInfo.image; // 分享图片路径
				if (res.status_code == 200) {

                // 调用封装好的分享方法
				that.$wxShare(data1, function (res) {
				 /*成功的回调*/
				console.log('成功',res)
				}, function (e) {
				/**失败的回调*/
				// that.$tool.toast('分享失败或取消分享')
					console.log("分享失败或取消分享",e)
				})

注意:

① 公众号分享只能通过右上角分享触发,默认分享的是当前页面

② 分享的页面链接必须在后台配置 js接口安全域名和网络授权域名

6、隐藏右上角胶囊

onLoad() {
			const that = this
				// 隐藏右上角按钮功能
				let url = that.$http.baseUrl2+window.location.pathname;
				console.log("当前页面完整路径",url);
				that.$http.get('api/user/signature',{url:url}).then(res=>{
					console.log("隐藏验证",res); 
					let data1 = res.data; // 得到分享需要的参数 appId 公众号的唯一标识,timestamp 生成签名的时间戳,nonceStr 生成签名的随机串 ,signature 签名
					if (res.status_code == 200) {
						that.$wxHide(data1)
					} else {
						that.$tool.toast(res.message)
					}
				})
		},