【从零开始搭建uniapp开发框架】(十一)—— 微信支付封装

框架开源地址:https://gitee.com/yunhaotian/uniapp_mobileFrame

开发移动端(微信小程序、H5、App)电商平台需要用到微信支付,下面封装一个微信小程序和H5的支付封装类

在common文件夹下新建 sju.pay.js 文件

 

 

 

 

 

 

 

sju.pay.js源码:

import ajax from '@/common/sju.ajax.js';
import nav from '@/common/sju.nav.js';
import jsAlert from '@/common/sju.alert.js'

let pay = {
	/**
	 * @description 微信H5调起微信支付
	 * @param {object} wxJsApiParam 微信支付验证参数(后台接口调用微信商家支付平台回调)
	 * @param {string} orderCodePay 订单编号
	 */
	payWeixinH5: function(wxJsApiParam, orderCodePay) {
		console.info(wxJsApiParam);
		//内部函数
		function jsApiCall(jsStr, orderCodePay){
			WeixinJSBridge.invoke(
				'getBrandWCPayRequest', {
					"appId": jsStr.appId,
					"nonceStr": jsStr.nonceStr,
					"package": jsStr.package,
					"paySign": jsStr.paySign,
					"signType": jsStr.signType,
					"timeStamp": jsStr.timeStamp
				},
				function(res) {
					if (res.err_msg == "get_brand_wcpay_request:ok") {
						//微信回调支付成功后,调用后台接口修改订单状态
						ajax.post('/api/xxx/xxx', {
							orderCodePay: orderCodePay
						}, (data) => {
							// nav.navigateTo("/my/order")  //支付成功跳转页面
							nav.navigateBack(1)				//支付成功返回上一页
						})
					} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
						alert("已取消支付");
					} else {
						alert("支付失败,请重试");
						console.info(res);
					}
				}
			);
		}
		//方法内代码 --- 开始
		if (typeof WeixinJSBridge == "undefined") {
			if (document.addEventListener) {
				document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
			} else if (document.attachEvent) {
				document.attachEvent('WeixinJSBridgeReady', jsApiCall);
				document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
			}
		} else {
			jsApiCall(wxJsApiParam, orderCodePay);
			return false;
		}
	},
	/**
	 * @description 微信小程序支付
	 * @param {string} orderCodePay 订单编号
	 */
	payWeiXinApp: function(orderCodePay, success, fail) {
		//根据运行环境获取支付的提供程序
		uni.getProvider({
			service: "payment",
			success: (res) => {
				//获取到提供程序
				var provider = res.provider;
				//小程序登录,获取临时code
				uni.login({
					provider: provider,
					success: (data) => {
						var code = data.code;
						//利用临时code获取用户的openID
						//后台接口调用微信接口回调:
						//provider:服务提供商
						//orderInfo:订单数据
						//timeStamp:时间戳从1970年1月1日至今的秒数,即当前的时间
						//nonceStr:随机字符串,长度为32个字符以下
						//package:统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=xx
						//signType:签名算法,暂支持 MD5
						//paySign: 签名 参考网址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3
						ajax.post('/api/xxx/xxx', {
							code: code
						}, (data) => {
							//利用openID和订单编号请求后台下单接口
							var openID = data.openID;
							ajax.post('/api/xxx/weixinPay', {
								openID: openID,
								orderCodePay: orderCodePay
							}, (data) => {
								var order = JSON.parse(data.orderInfo);
								uni.requestPayment({
									provider: provider,
									orderInfo: data.orderInfo,
									timeStamp: order.timeStamp,
									nonceStr: order.nonceStr,
									package: order.package,
									signType: order.signType,
									paySign: order.paySign,
									success: (res) => {
										//微信小程序支付成功回调,调用后台接口通知后台支付成功修改数据库订单支付状态
										ajax.post('/api/xxx/weixinPaySuccess', {
											orderCode: orderCode
										}, (data) => {
											// 支付成功后进行的操作
											success();
										})
									},
									fail: (res) => {
										// 支付失败
										fail();
									}
								});
							});
						});
					}
				})
			}
		})
	}
}

export default pay;

 

main.js引入封装类代码:

import sjuPay from './common/sju.pay.js'

Vue.prototype.sjuPay = sjuPay;

 

 

 

H5调用微信支付封装方法:

//请求后台的微信支付方法获取支付参数
this.sjuAjax.post('/api/xxx/weixinPay', {
	openID: openID,//微信openID
	orderCodePay: orderCodePay,//订单编号
	userCode: this.jsLogin.getValue('userCode') //用户编号
}, data => {
	console.log(data)
	//获取成功后,前端调起微信支付
	var orderInfo = JSON.parse(data.orderInfo);
	console.info(orderInfo);
	this.sjuPay.payWeixinH5(orderInfo, orderCodePay);
}, true);

 

微信小程序调用微信支付封装方法:

//请求后台的微信支付方法获取支付参数
this.sjuAjax.post('/api/xxx/weixinPay', {
	openID: openID,//微信openID
	orderCodePay: orderCodePay,//订单编号
	userCode: this.jsLogin.getValue('userCode') //用户编号
}, data => {
	console.log(data)
	//获取成功后,前端调起微信支付
	this.sjuPay.payWeiXinApp(orderCodePay);
}, true);

 

posted @ 2022-02-16 09:05  编程民工  阅读(501)  评论(0)    收藏  举报