uni-app h5调用微信支付方法

uni-app h5调用微信支付方法

首先微信支付的形式要好多种如需可查看https://pay.weixin.qq.com/wiki/doc/api/index.html,这里主要用的是JSAPI的支付形式。
想要公众号、h5页面直接调起微信支付窗口实现支付形式,首先必须是微信浏览器或微信环境下才可以直接调起。也就是我们的链接要是https的,下面是我支付的整个流程:
思路:
1.首先我们要先获取openid,如何获取openid,可通过从url中获取code,再返回给后台处理来获取openid
2.获取openid后,点击支付调用自己的支付接口回调后调起微信支付API(一般我们在开发环境下都是点击按钮后跳转到订单页面之类的(如http:localhost:8080/order/inder),但是如果想要开发时调用微信支付必须跳转的页面为https的也就是说是部署后的地址(https://www.xxx.com/orser/index)),这样才可以去支付
3.成功调起微信支付窗口然后支付–支付成功
代码如下:

car.vue页面

<button @click="gopay">去购买<button>

goPay() {
				var local = 'https://www.xxx.com/order/index';   //你自己的需要跳转到的页面
				var APPID = 'xxxxxxxxx';
				window.location.href =
					'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' +
					APPID +
					'&redirect_uri=' +
					encodeURIComponent(local) +
					'&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect'
			}

order.vue 页面

onload(){  
//先获取code 来获取openid (其实有的可以不用回去openid 看你的支付方式 JSAPI是需要openid的),如果不是uni-app,可写在初始化方法里面按自己需求来
var code = this.getCode(); //先获取code 判断一下code不为空才能获取openid
			if (this.code != null && this.code != "" ) {
			  this.onBridgeReady(this.code); //把code传给后台获取用户信息
			 }
 }

**先获取code (我是从url上截取的)**
     getCode() {
		    var context = '';
		    var name = 'code';
	    	var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
		   var r = window.location.search.substr(1).match(reg); //获取url中"?"符后的字符串并正则匹配
		   if (r != null) context = r[2];
	             	return context;
	       },
	
** 根据返回的code 来获取openid**
	   onBridgeReady(code) {
		    var _this = this;
		    let token
		    getAppToken(code)    //自己后台写的接口
			     .then(res => {
			       	if ('999999' == res.code) {
				     	alert(res.errMsg);
					    return;
				  } else {
					if (res.data != null) {
						uni.setStorageSync('openId', res.data);
						uni.setStorageSync('NoPush', false)
						token = res.data;
					} else {
						token = uni.getStorageSync('openId');
					}
					**this.prepay(this, token);  //去支付**
				}
			})
			.then(res => {
				var code = res.code;
				alert('openid', '失败')
				if ('999999' == res.code) {
					alert(res.errMsg);
				}
			});
	},

**去支付 调用自己的接口 获取相应参数**	
        prepay(_this, openid) {
		//var _this = this;
		let form = {
			amount: _this.totalPrice * 100,    //金额
			distId: _this.addressList.id,
			tradeType: 'JSAPI',
			items: _this.list,     //这里的参数是后面调微信支付api需要入的参数信息 如签名,随机字符串,appid等
			openid: openid
		};
		_this.addressList.id;
		prepay(form).then(payRes => {  //自己的接口
			if ('999999' == payRes.code) {
				alert(payRes.errMsg);
				return;
			} else {
				**_this.wxPayInvoke(_this, payRes, openid);**
			}
		});
	},
	
 ** 调起微信支付API**
	  wxPayInvoke(self, payRes, openid) {
	        	var url = window.location.href;
		        let that = this
		      //获取js签名
		        getSignature({
			          address: url
		         }).then(res => {
			       wx.config({
				       debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
				      appId: payRes.data.appid, // 必填,公众号的唯一标识
				      timestamp: payRes.data.timestamp, // 必填,生成签名的时间戳
				      nonceStr: payRes.data.nonceStr, // 必填,生成签名的随机串
				     signature: payRes.data.signature, // 必填,签名
				     jsApiList: ['chooseWXPay'], // 必填,需要使用的JS接口列表
				    openId: openid
		    	});
			    //发起微信支付
			      wx.ready(function() {
				      wx.chooseWXPay({
				          	appId: payRes.data.appid,
					        timestamp: payRes.data.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
					        nonceStr: payRes.data.noncestr, // 支付签名随机串,不长于 32
					        package: 'prepay_id=' + payRes.data.prepayid, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
					        signType: 'HMAC-SHA256', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
					        paySign: payRes.data.sign, // 支付签名
					     success: function(res) {
					           	uni.showToast({
						       	icon: 'none',
						    	title: '支付成功'
					    	})
						   setTimeout(() => {
						      window.history.go(-1) //跳转到上一页
						   }, 1000)

				    	},
					 cancel: function(res) {
						//提示引用的是mint-UI里toast
						
						setTimeout(() => {
							uni.showToast({
								icon: 'none',
								title: '已取消支付'
							})
							
						}, 2000)
						 window.history.go(-1) //跳转到上一页
					},
					fail: function(res) {						
					 window.history.go(-1) //跳转到上一页
						setTimeout(() => {
							uni.showToast({
								icon: 'none',
								title: '支付失败,请重试'
							})
						}, 2000)
					}
				});
			});
		});
	}

效果图
在这里插入图片描述

  • 7
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Uni-app是一种跨平台的开发框架,可以方便地开发出适用于多个终端的应用程序,包括Web、iOS、Android等。在开发过程中,我们可以使用uni-app提供的API实现多种功能,比如调用微信支付。 首先,我们需要在应用程序内引入微信支付所需的SDK,在Uni-app中可以使用插件机制,自己开发一个插件或者使用已有的插件,如uni-wxpay等。然后,在APP调用微信支付的流程如下: 1.在创建支付订单时,需要将订单信息传递给服务端,由服务端生成订单号、调用微信支付API生成预支付订单,并返回给APP。 2.APP拿到预支付订单后,调用微信SDK内置的API进行支付,主要包括支付参数的配置和支付的发起。 3.支付完成后,微信会回调我们在服务端注册的回调地址,服务端通过请求微信的API对支付结果进行核对,确认支付是否成功,并作出相应的处理。 需要注意的是,在调用微信支付API时需要在微信开放平台申请开发者账号,并完成相应的配置,包括设置支付回调地址、支付授权目录等等。 总之,通过调用微信支付API,我们可以为APP添加支付功能,实现线上商品购买、捐赠赞赏等功能。而在Uni-app中,使用插件机制可以更加方便快捷地完成这个流程。 ### 回答2: uni-app 是一个可以跨平台开发的框架,它支持开发微信小程序、支付宝小程序、H5 等多个平台。在 uni-app 中内调用微信支付可以实现用户在应用内进行支付,下面我将具体介绍 uni-app 中如何进行内调用微信支付。 1. 首先需要在应用中安装微信支付插件,打开 HBuilderX,选择菜单栏中的“插件市场”,搜索“微信支付”,选择安装。 2. 在应用中使用微信支付的页面中引入微信支付插件: ```javascript import $payment from "@/uni_modules/yk-payment/js_sdk/uni-payment.js"; // 引入插件 ``` 3. 在需要支付的位置,调用微信支付方法: ```javascript uni.showLoading({ title: '加载中' }); $payment.weixinPay({ timeStamp: '1603388794', nonceStr: '5pnskrq5060pt2lljndzpta9hzqmxrsq', package: 'prepay_id=wx30163954528026d7bf482abf2becd37124', signType: 'MD5', paySign: '3ACA84580DD8C32D8478B4BBF3688A1D', success: function (res) { console.log('success:' + JSON.stringify(res)); }, fail: function (err) { console.log('fail:' + JSON.stringify(err)); }, complete: function (res) { uni.hideLoading(); } }); ``` 其中,微信支付需要提供以下参数: - timeStamp:时间戳,单位为秒 - nonceStr:随机字符串,不长于 32 位 - package:统一下单接口返回的 prepay_id,参考[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)中获取订单号 - signType:签名算法,目前支持 MD5 和 HMAC-SHA256 - paySign:签名,具体签名方式详见[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) 微信支付成功后会回调 success 回调函数,失败则回调 fail 回调函数。 4. 在微信支付的后端接口中,需要根据微信支付返回的结果进行签名校验,确保订单的真实性。 综上所述,使用 uni-app调用微信支付步骤相对简单,只需安装微信支付插件,调用支付方法即可,但支付过程中需要注意时间戳、随机字符串、签名等参数的正确性,同时在后端接口中校验微信支付的签名以确保支付的真实性。 ### 回答3: Uni-app是一个跨平台开发框架,它可以让开发者一次编写代码,同时在多个平台上运行。微信支付是一个广为人知的移动支付平台,它可以提供便捷的支付服务。在实践中,我们可以使用Uni-app中的支付插件来在应用程序中调用微信支付。下面是如何实现Uni-app应用程序内调用微信支付: 1. 首先,安装支付插件在Uni-app开发环境中,可以通过npm安装。 2. 在支付插件内部,我们需要引用微信支付的API,以便在我们的应用程序中调用这些API来实现支付。这些API包括支付API、查询订单API、退款API等等。 3. 接下来,我们需要在我们的代码中调用支付API,这个API用于请求加载微信支付。当用户点击订单支付按钮时,我们可以在后台发送一个请求,请求加载微信支付页面和所需的支付参数。 4. 在向微信支付发送请求后,我们需要接收来自微信支付的响应,然后将结果传递给我们的应用程序。通常,微信支付会将支付结果返回给我们的后台服务器,然后我们可以将结果传递给我们的应用程序。我们可以使用Uni-app的API来轮询服务器以获取结果。 5. 最后,我们需要在我们的应用程序中向用户显示支付结果。如果支付成功,我们可以向用户显示订单确认信息。如果支付失败,我们可以向用户显示错误信息。 总之,Uni-app应用程序的开发者可以使用插件实现在应用程序中调用微信支付。开发者需要在插件内部引用微信支付API,然后在代码中调用它们来实现支付。最后,我们需要接收来自微信支付的响应,并在我们的应用程序中向用户显示支付结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值