uniapp H5如何唤起微信公众号支付

5 篇文章 0 订阅
4 篇文章 0 订阅

1.前言

微信公众号支付,官方的名称是 JSAPI。在做微信支付对接前,应熟读官方的介绍文档,包括开发前准备,开发指引、API列表,熟悉相关的概念,很多疑问基本可以在官方找到答案。参见https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter1_1_1.shtml。 在微信官方网上可以看到到 Java后台端的参考代码,但前端部分并没提供
官方参考代码
,下面介绍的是在 uniapp h5 客户端端 如何唤起微信公众号支付的。

2.疑问:uniapp H5如何唤起微信公众号支付

接入流程图
在流程图2~6步都是在商户后台端完成的, 那么 uniapp h5端 在第7步要怎么做才能唤起微信支付窗口呢? 答案就是 使用了js的事件侦听来处理。
微信支付窗口

uniapp h5 发出后台支付请求后,唤起微信支付的关键代码段如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.参考代码

3.1 uniApp端

<template>
	<view class="container">

		<total-layout btnText='确认支付' :isShowPrice="false" :btnBackFunc="goBack" :btnWantToFunc="confirmPay"
			:price="totalPrice">
			<template v-slot:page>

				<view class="list" :style="{height: windowHeight + 'px'}">
					<view class="price-area">
						<view class="price-title">应付金额:</view>
						<view class="shop-price">
							<text>¥</text>
							<text class="shop-price-text">{{ integerPriceStr }}</text>
							<text>{{ decimalPriceStr }}</text>
						</view>
					</view>

					<uni-section style="margin-top: 8px;" title="请选择支付方式" type="line">
						<view class="uni-list">
							<radio-group @change="payModeChange">
								<label class="uni-list-cell uni-list-cell-pd" v-for="(item, index) in payModes" :key="item.value">
									<view>
										<radio :value="item.value" :checked="index === currPayModeIndex" />
									</view>
									<image class="payImg" :src="item.imgUrl" mode="aspectFill"></image>
									<view>{{item.text}}</view>
								</label>
							</radio-group>
						</view>

					</uni-section>
				</view>
			</template>
		</total-layout>

	</view>
</template>
<script>
	export default {
		data() {
			return {
				windowHeight: 0,

				orderName: "", //订单名称
				orderNo: "", //订单号
				orderType: 0, //订单类型, 0-未知,10-商城订单
				totalPrice: 0, //订单合计
				totalNum: 0, //订单商品总数量

				integerPriceStr: "0",
				decimalPriceStr: ".00",

				goods: [],

				payModes: [],

				currPayModeIndex: 0,

				payCodeImgUrl: "",

				loginPageUrl: "",
				
				orderPayInfo : {
						payAppId:	"",			//公众号ID,
						payTimeStamp: "", //时间戳,自1970年以来的秒数    
						payNonceStr: "", //随机串    
						payPackage: "",
						paySignType: "", //微信签名方式:    
						paySign:"", //微信签名									
				}
			};
		},

		confirmPay(e) {
			console.info("点击确认支付", e);
			//微信JSAPI支付
			if (!isWeChatEnv()) {
				uni.showToast({
					title: '请在微信环境中操作',
					icon: 'error',
					duration: 2000
				});						
				return;
			}				
			let user = uni.getStorageSync('user');
			this.confirmPayForMall(this.orderNo, user);
			
		},	

		confirmPayForMall(orderNo, user) {
			let that = this

			let orderData = {}

			orderData.memberId = user.id;
			orderData.memberName = user.name;
			orderData.orderNo = orderNo; //订单号
			orderData.payMode = that.payModes[that.currPayModeIndex].value; //支付方式

			//向后台正式请求支付信息
			request({
				url: '/mallOrder/requestPay',
				data: orderData,
				method: 'POST'
			}).then((res) => {
				if (res.code === '0') {
					let orderPayInfo = res.data;
					that.orderPayInfo = orderPayInfo;
					console.log('商城订单请求支付成功.订单号=' + orderPayInfo.orderNo);


					if (orderPayInfo.payMode === 22) {
						//公众号支付
						if (orderPayInfo.payStatus === 10) {
							//10-未支付, 唤起支付窗口。
							console.info('公众号支付');
							
							
							function onBridgeReady(payInfo) {
								WeixinJSBridge.invoke('getBrandWCPayRequest', {
										"appId": payInfo.payAppId, //公众号ID,由商户传入    
										"timeStamp": payInfo.payTimeStamp, //时间戳,自1970年以来的秒数    
										"nonceStr": payInfo.payNonceStr, //随机串    
										"package": payInfo.payPackage,
										"signType": payInfo.paySignType, //微信签名方式:    
										"paySign": payInfo.paySign, //微信签名
									},
									function(payRet) {
										if (payRet.err_msg == "get_brand_wcpay_request:ok") {
											// 使用以上方式判断前端返回,微信团队郑重提示:
											//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
											that.finishPay();
										} else if (payRet.err_msg == 'get_brand_wcpay_request:cancel') {
											uni.showToast({
												title: '取消支付!',
												icon: 'error',
												duration: 2000
											});
										} else {
											uni.showToast({
												title: '支付失败!' + payRet.err_msg,
												icon: 'error',
												duration: 2000
											});
										}
									});
							}
					
							if (typeof WeixinJSBridge == "undefined") {
								if (document.addEventListener) {
									document.addEventListener('WeixinJSBridgeReady', onBridgeReady(orderPayInfo), false);
								} else if (document.attachEvent) {
									document.attachEvent('WeixinJSBridgeReady', onBridgeReady(orderPayInfo));
									document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(orderPayInfo));
								}
							} else {
								onBridgeReady(orderPayInfo);
							}	

							
						} else {
							uni.showToast({
								title: '支付失败!' + res.msg,
								icon: 'error',
								duration: 2000
							});
						}

				} else {
					uni.showToast({
						title: '提交商城订单支付失败.' + res.msg,
						icon: 'error',
						duration: 2000
					});

				}
			});

		},

	}		
</script>

3.2 后台端

暂空.

4.参考文章

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
//微信充值 //支付接口测试 function balance(url, data) { uni.request({ url: cfg.originUrl + '/wx/mp/js_sig.do', data: { route: url }, method: 'GET', success: (res) => { jweixin.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来 appId: res.data.appId, // 必填,公众号的唯一标识 timestamp: res.data.timestamp, // 必填,生成签名的时间戳 nonceStr: res.data.nonceStr, // 必填,生成签名的随机串 signature: res.data.signature, // 必填,签名 jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表 }); jweixin.ready(function() { uni.request({ url: cfg.originUrl + '/wx/recharge/pay.do', method: 'POST', header: { 'Content-type': "application/x-www-form-urlencoded", }, data: JSON.stringify(data), success: function(res) { alert("下单成功"); alert(JSON.stringify(res)); alert(res.data.order_id); all.globalData.orderId = res.data.order_id; uni.setStorageSync('orderId', res.data.order_id); jweixin.chooseWXPay({ timestamp: res.data.payParams.timeStamp, // 支付签名时间戳 nonceStr: res.data.payParams.nonceStr, // 支付签名随机串 package: res.data.payParams.package, // 接口返回的prepay_id参数 signType: res.data.payParams.signType, // 签名方式 paySign: res.data.payParams.paySign, // 支付签名 success: function(e) { alert("支付成功"); alert(JSON.stringify(e)); // 支付成功后的回调函数 } }); } }) }); jweixin.error(function(res) { // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 console.log("验证失败!") }); } }) }
要在uniapp中开发H5登录微信公众号并进行联调,有以下几个步骤: 1. 获取微信开发者账号和相关配置信息:首先需要在微信开放平台注册并创建一个开发者账号,然后创建一个微信公众号,并获取相应的AppID和AppSecret等配置信息。 2. 在uniapp项目中配置相关插件:在uniapp项目的manifest.json文件中,添加对应的插件配置,如"@dcloudio/uni-mp-weixin"插件。然后在项目的App.vue中通过uni.login方法获取登录凭证code,并调用uni.request方法发送请求到服务器获取用户的openid和session_key。 3. 前端与后端的联调:根据服务器返回的用户openid和session_key,在前端进行相关的业务逻辑处理,如展示用户信息、跳转到其他页面等。其中,服务器端需要处理用户的登录请求,并返回openid和session_key等信息给前端。 4. 微信公众号授权设置:在微信公众号后台设置中,配置网页授权域名和回调地址,并将uniapp项目的H5链接添加到公众号菜单中。 5. 测试和调试:完成以上步骤后,进行测试和调试,确保登录功能在H5中正常使用。可以通过调试工具、日志打印等方式进行定位和解决问题。 总结:在uniapp开发H5登录微信公众号的联调过程中,需要进行微信开发者账号和相关配置的准备,配置相关插件和设置,前端与后端的联调,以及进行测试和调试。通过这些步骤,可以实现在uniapp项目中登录微信公众号并进行H5联调。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码递夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值