uni-app微信公众号H5支付页面

准备工作

初始化公众平台测试账号系统。

地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
登录后,会得到一个测试公众号的相关信息。appID,appsecret。
在这里插入图片描述

添加授权域名》外网可访问域名或ip

在这里插入图片描述

创建H5项目

H5 页面集成 JSSDK 集成文档推荐使用NPM,快捷、省心

基础逻辑代码,openId为上页面传值,不在采用静默方式获取,忽略getCode()方法

<template>
	<view class="payv">
		<button class="pay" type="default" @click="makePay()">唤起支付</button>
	</view>
</template>

<script>
	var jweixin = require('jweixin-module');

	export default {
		data() {
			return {
				orderId: '',
				rtData: {},
				openId: '',
			}
		},
		methods: {
			// 点击支付
			makePay: function() {
				let that = this;
				//从后台获取签名,此处根据自己的接口写
				uni.request({
					url: 'http://192.168.41.43:9077/v3/jsApiPay', //仅为示例,并非真实接口地址。
					method: 'POST',
					data: {
						openId: that.$data.openId,
						// orderId: '' // 订单编号
					},
					header: {
						'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
					},
					success: (res) => {
						this.rtData = res.data.data;
						// 调用支付
						this.payRequest();
					},
					fail: () => {
						uni.showToast({
							title: "服务器内部错误!,请稍后再试",
							duration: 2000,
							icon: "none"
						});
					},
				});
			},
			
			// 微信js支付接口
			payRequest: function() {
				//此为调取微信API接口
				var self = this;
				uni.showLoading({
					title: '加载中'
				});
				jweixin.config({
					debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
					appId: self.rtData.appId, // 必填,公众号的唯一标识
					timestamp: self.rtData.timeStamp, // 必填,生成签名的时间戳
					nonceStr: self.rtData.nonceStr, // 必填,生成签名的随机串
					signature: self.rtData.paySign, // 必填,签名,见附录1
					jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
				});
				jweixin.ready(function() {
					jweixin.checkJsApi({
						jsApiList: ['chooseWXPay'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
						success: function(res) {
							console.log('checkjsapi Success')
							console.log(res);
						},
						fail: function(res) {
							console.log('res')
							console.log(res);
						}
					});
					jweixin.chooseWXPay({
						timestamp: self.rtData.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
						nonceStr: self.rtData.nonceStr, // 支付签名随机串,不长于 32 位
						package: self.rtData.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
						signType: self.rtData.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
						paySign: self.rtData.paySign, // 支付签名
						success: function(res) {
							// 支付成功后的回调函数
							uni.hideLoading();
							console.log('paysuccess')
							console.log(res)
						},
						cancel: function(r) {
							uni.hideLoading();
						},
						fail: function(res) {
							uni.hideLoading();
							console.log('payfail')
							console.log(res)
						}
					});
				});

				jweixin.error(function(res) {
					console.log('error')
					console.log(res)
					uni.hideLoading();
					uni.showToast({
						icon: 'none',
						title: '支付失败了',
						duration: 4000
					});
					// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
					/*alert("config信息验证失败");*/
				});
			},
			// 初始页面,获取用户的openId
			onLoad: function(option) {
				console.log('添加默认openId')
				// this.getCode()
				this.$data.openId = 'oSGyC4sGl4b_k1xyuHAnbpCpQyCM'
			},

			// 静默方式获取jsCode
			getCode() {
				let user_appid = "wx8bcc446cbafebf08"; //个人开发者appid
				let local = window.location.href; //重定向地址
				console.log(local)
				let wx_code = this.getUrlParam("code"); // 截取路径中的code,如果没有就去微信授权,如果已经获取到了就直接传code给后台获取openId

				console.log("local:", local);
				//判断有没有code
				if (wx_code == null || wx_code === "") {
					console.log("没有code跳转");
					//获取code的地址。获取成功重定向后地址栏中将会带有code
					window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${user_appid}&redirect_uri=${encodeURIComponent(
			          local
			        )}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`;
				} else {
					console.log("有code开始调用接口:", wx_code);
					// this.getOpenId(wx_code); //把code传给后台获取用户信息
				}
			},
			//截取code
			//getUrlParam方法就是使用正则截取地址栏里的code,有兴趣可以研究一下,没兴趣直接拿来用
			getUrlParam: function(name) {
				var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
				var r = window.location.search.substr(1).match(reg);
				if (r != null) return unescape(r[2]);
				return null;
			},
		},
	}
</script>

<style>
	.payv {
		margin-top: 20%;
	}
</style>

准备就绪之后,开始下一步的操作–公众号配置菜单。

使用微信的接口调试工具设置的。地址:https://mp.weixin.qq.com/debug

  1. 第一步,获取access_tocken ,输入测试公众号页面的appID和appsecret,点击检查问题
    在这里插入图片描述
  2. 获取到access_token之后,使用这个access_token给测试公众号设置菜单。接口类型选择自定义菜单,填入刚刚获取到的access_token,以及菜单的json串。
    在这里插入图片描述
{
    "button":[
        {
            "type":"view",
            "name":"ME",
            "url":"http://txv6jy.natappfree.cc/#/pages/zhang/zhang"
        }
    ]
}

这个时候,在用微信测试公众号就会有菜单了。
在这里插入图片描述

测试页面微信支付

在这里插入图片描述

问题总结

  1. 内网穿透访问页面时提示:Invalid Host header
    解决方案:h5添加:“disableHostCheck”: true属性
    在这里插入图片描述
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
uni.app 中使用微信公众号 H5 支付,你可以按照以下步骤进行操作: 1. 首先,确保你已经配置好了微信公众号支付功能,并且已经获取到了支付的相关参数,例如订单号、支付金额等。 2. 在 uni-app 中,可以使用 `uni.request` 或其他网络请求库来发起支付请求。你需要向微信支付接口发送一个 POST 请求,包含支付相关的参数。 例如: ```javascript uni.request({ url: 'https://api.mch.weixin.qq.com/pay/unifiedorder', // 微信支付接口地址 method: 'POST', data: { // 支付参数,例如 appid、mch_id、nonce_str、body、out_trade_no、total_fee 等 }, success: (res) => { // 请求成功的回调函数 // 解析返回的数据,获取预支付交易会话标识 prepay_id const prepayId = res.data.prepay_id; // 调用 H5 支付接口进行支付 uni.requestPayment({ provider: 'wxpay', timeStamp: '', // 时间戳 nonceStr: '', // 随机字符串 package: '', // 统一下单接口返回的 prepay_id 参数值 signType: 'MD5', paySign: '', // 签名 success: (res) => { // 支付成功的回调函数 console.log(res); }, fail: (err) => { // 支付失败的回调函数 console.log(err); } }); }, fail: (err) => { // 请求失败的回调函数 console.log(err); } }); ``` 在上述代码中,你需要根据实际情况填写支付接口地址、支付参数、预支付交易会话标识 prepay_id 以及支付的回调函数。 3. 当用户点击支付按钮后,会触发支付请求,用户将会跳转到微信支付页面完成支付操作。 请注意,以上代码仅为示例,实际使用时需要根据 uni-app 中的具体语法和微信支付接口的要求进行相应的调整和处理。同时,确保在后端服务器中进行订单处理和验证,以确保支付的安全和准确性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值