前端的微信支付(JSSDK、JSAPI支付)

蝈蝈大侠
发布于 2023-04-13 21:31:40
39
0
0

H5支付是一种移动支付方式‌,具体指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起服务呼起微信客户端进行支付。

官方文档

微信支付

微信授权获取code

准备工作

  • 微信公众平台企业账号

  • 商户号

  • 开通jsapi支付权限

  • 页面授权域名,设置使用网站的域名地址

  • 基本接口权限,尤其是jssdk部分权限,保证都开通

1.1 装包(weixin-js-sdk),引入模块

npm i (weixin-js-sdk)

import wx from 'weixin-js-sdk'

或者:<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

1.2 示例代码

const WeChatPay = function() {
	// 2、引入js后、获取公众号校验信息
	let timestamp = '',
		nonceStr = '',
		signature = '';
	let v = {
		// 用于换取微信校验信息的参数:要求不可以包含 “#” 号
		url: location.split('#')[0]
	};

	// 3、通过config接口注入权限验证配置(需要同步进行,在获取到校验信息后方可注入config,否则校验失败!)
	wx.config({
		debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
		appId: '', // 必填,公众号的唯一标识
		timestamp: , // 必填,生成签名的时间戳
		nonceStr: '', // 必填,生成签名的随机串
		signature: '', // 必填,签名
		jsApiList: ["checkJsApi", "chooseWXPay", "updateAppMessageShareData", "updateTimelineShareData"] // 必填,需要使用的JS接口列表
	});

	axios.post('/wx/pay/orderPay_XXXX', data).then(res => {
		// 支付成功状态
		if (res.code == 200) {
			// 获取支付必备的参数
			let {
				nonceStr,
				package,
				signType,
				paySign
			} = res.data;
			// 4、通过ready接口处理成功验证
			wx.ready(function() {
				/* 微信支付 */
				wx.chooseWXPay({
					timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
					nonceStr: nonceStr, // 支付签名随机串,不长于 32 位
					package: package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
					signType: signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
					paySign: paySign, // 支付签名
					success: function(res) {
						// 前端判断返回方式,微信团队郑重提示:不保证绝对可靠,切记!
						if (res.errMsg == 'chooseWXPay:ok') {
							// 【支付成功】 
						} else if (res.errMsg == 'chooseWXPay:cancel') {
							// 【支付取消】:用户取消支付不会进入这个判断,而是进入complate和cancel函数
						} else {

						}
					},
					complete: function(res) {
						// 接口调用完成时执行的回调函数,无论成功或失败都会执行
						if (res.errMsg == 'chooseWXPay:ok') {
							// 【支付成功】:支付成功提示页面,点击完成按钮之后
							wx.closeWindow(); /* 关闭微信窗口,调用时需要在config中进行校验 */
						} else if (res.errMsg == 'chooseWXPay:cancel') {
							// 【支付取消】
						} else {

						}
						/**
						 * 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) {
						// 接口调用失败
					},
					cancel: function(err) {
						// 用户点击取消时的回调函数:用户取消支付后实际上进入cancel 和 complate函数
					}
				});
			});
		}
	}).catch(err => {
		console.log('支付失败:', err);
	});
}

接口说明:【不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回。】

  1. success:接口调用成功时执行的回调函数。     

  2. fail:接口调用失败时执行的回调函数。

  3. complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。

  4. cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。

  5. trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。

方式二:微信支付【 JSAPI 支付】(常用支付方式)

function onBridgeReady() {
	WeixinJSBridge.invoke(
		'getBrandWCPayRequest', {
			"appId": "wxXXXXXXXXX", //公众号名称,由商户传入     
			"timeStamp": "1234", //时间戳,自1970年以来的秒数     
			"nonceStr": "xx", //随机串     
			"package": "xx",
			"signType": "MD5", //微信签名方式:     
			"paySign": "xxx" //微信签名 
		},
		function(res) {
			// 支付成功
			if (res.err_msg == "get_brand_wcpay_request:ok") {
				// 使用以上方式判断前端返回,微信团队郑重提示:
				//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
			}
			// 支付过程中用户取消
			if (res.err_msg == "get_brand_wcpay_request:cancel") {

			}
			// 支付失败
			if (res.err_msg == "get_brand_wcpay_request:fail") {

			}
			/**
			 * 其它
			 * 1、请检查预支付会话标识prepay_id是否已失效
			 * 2、请求的appid与下单接口的appid是否一致
			 * */
			if (res.err_msg == "调用支付JSAPI缺少参数:total_fee") {

			}
		});
}
// 检测支付环境中的 WeixinJSBridge
if (typeof WeixinJSBridge == "undefined") {
	if (document.addEventListener) {
		document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
	} else if (document.attachEvent) {
		document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
		document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
	}
} else {
	onBridgeReady();
}

JSAPI调起支付注意事项:

在微信浏览器里打开H5网页中执行JS调起支付;

WeixinJSBridge是微信浏览器内置对象,在其他浏览器中无效;

调用支付传递的参数注意区分大小写

点赞0
喜欢:快去点个赞吧~
分享:
非特殊说明,本站 idealfrog.cn 上的文章均由本站作者原创,原作品版权归属原作者,转载请联系 @文章作者 授权。转载时请在文首注明, 来源 idealfrog.cn 及教程作者,并附本文链接。谢谢各位编辑同仁配合。
发表评论点击登录 ,秀出你的神评!
暂无更多评论咯,快留下你的真知灼见吧!去参与评论
热门评论
梦鱼
2020-11-10 10:25:36
#前端面试八股文,背下来你就是前端开发顶级天花板!!
一个让腾讯设计师都羡慕的产品改版流程,原来是这样做的!
Daenery
2020-11-10 10:25:36
[更新迭代 - 1] Nestjs 在24年底更新了啥?