一、App平台支付流程
流程:支付平台功能申请 -> manifest.json
里配置支付参数 -> uni-app
里调用 API
进行支付
二、微信App支付功能申请
- 到 微信开放平台 申请移动应用并开通支付功能,申请应用后可以获取
AppID
和AppSecret
值 - 应用接入 微信商户平台,选择 App 支付
- 开通支付功能后可获取支付业务服务器配置数据:PARTNER(财付通商户号)、PARTNER_KEY(财付通密钥)、PAYSIGNKEY(支付签名密钥)
- 需要将从微信开放平台申请的
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)