uni-app app平台微信支付

一、App平台支付流程

流程:支付平台功能申请 -> manifest.json 里配置支付参数 -> uni-app 里调用 API 进行支付

二、微信App支付功能申请

  1. 微信开放平台 申请移动应用并开通支付功能,申请应用后可以获取 AppIDAppSecret
  2. 应用接入 微信商户平台,选择 App 支付
  3. 开通支付功能后可获取支付业务服务器配置数据:PARTNER(财付通商户号)、PARTNER_KEY(财付通密钥)、PAYSIGNKEY(支付签名密钥)
  4. 需要将从微信开放平台申请的appid,填回到 manifest-App SDK配置-支付-微信支付 中。打包后生效
    在这里插入图片描述
    在这里插入图片描述
//微信支付
uni.getProvider({
   
    service: 'payment',		//获取服务供应商
    success: (res)=> {
   
        console.log(res.service)	//服务类型:payment
		console.log(res.provider)	//不同服务类型下可能的取值:["alipay","wxpay"]
		// if(res.provider.indexOf('wxpay')){
   
			//服务提供商(从服务供应商中获取,是否包含微信支付)
			//调取后台接口,获取微信支付的订单号
			this.$Z.post(this.$url+'/UserOrderNumber',{
   
				你要传给后台的参数(具体看后台要什么参数)
			},{
   }).then(res=>{
   
				console.log('获取微信支付的订单号',res)
				let orderData = res.data.orderNumber
				//调取后台接口,获取微信支付的订单数据
				this.$Z.post(this.$url+'/pay/aliPay',{
   
					//把订单号与支付方式传给后台(具体看后台要什么参数)
				},{
   }).then(res=>{
   
					let weixinOrderInfo = res.data.data;	从后台返回的微信订单数据
					let weixinorder = this.getPayInfo(weixinOrderInfo);
					//支付
					uni.requestPayment({
   
						provider: 'wxpay',	//服务提供商(微信)(服务提供商,通过uni.getProvider获取)
						orderInfo:weixinorder,
						success(res){
   
							console.log('success:' + JSON.stringify(res));
						},
						fail(err){
   
							console.log('fail:' + JSON.stringify(err));
						}
					});
				})
			})
		// }
    }
});



//二次签名
getPayInfo (orderInfo) {
   
	let res = orderInfo, // 后台返回的统一下单数据
		key = "", // 加密Key,微信支付填写的key(后台提供)
		payInfo = {
   
			appid: res.appid,
			noncestr:res.noncestr,
			package: res.package,
			partnerid: res.partnerid,
			prepayid: res.prepayid,
			timestamp: Number(res.timestamp),
	}
	// 键值对按照ASCII码从小到大排序生成类似:appid=xxx&body=xx&device_info=1000
	let keyValueStr = this.mapObjToKeyValue(payInfo, true);
	// 插入加密Key到最后
	let strSignTemp = `${
     keyValueStr}&key=${
     key}`;
	// 真正的二次加密(需要引入md5.js源码,小编文章最后会附)
	let sign = md5(strSignTemp).toUpperCase().substr(0, 32);	
	console.log(sign) // 可以去微信支付文档做校验
	payInfo.sign = sign;
	// 返回字符串给uniapp调起支付用
	return JSON.stringify(payInfo);
},
/*
 * 根据object生成key value字符串
 * @params obj: any 要map的对象
 * @params isSort: boolean 是否根据ASCII字典排序
 */
mapObjToKeyValue(obj, isSort = false) {
   
	let keys = Object.keys(obj);
	let str = "";
	
	if (isSort) keys.sort();
	keys.forEach(key => {
   
		if (obj.hasOwnProperty(key)) {
   
			str += `${
     key}=${
     obj[key]}&`;
		}
	});
	return str.replace(/&$/, "");
},

后台返回的微信订单参数:参照微信支付文档的统一下单参数进行对比

如在其过程中遇到:

uniapp APP端微信支付 签名错误,是因为uniapp调起微信支付需要进行第二次签名的,即根据后端统一下单返回数据再进行一次签名,签名方式要确保一致。详情请参照uniapp APP端微信支付 签名错误

附:md5.js源码
/*
 * JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

/* global define */

;(function ($) {
   
  'use strict'

  /*
  * Add integers, wrapping at 2^32. This uses 16-bit operations internally
  * to work around bugs in some JS interpreters.
  */
  function safeAdd (x, y) {
   
    var lsw = (x & 0xffff) + (y & 0xffff)
    var msw = (x >> 16) + (y >> 16) 
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值