第一步:设置微信支付宝支付!
第二步:上代支付代码:
/* 参数判断完毕后点击支付,发起支付 */
getbuygood() {
let that = this
let data = {
buynum: 1, //传入后台的参数
goods_id: that.coinList.goods_id, //传入后台的参数
phone:that.form.phone,传入后台的参数
pay_type: that.curre //支付方式 传入后台的参数
}
uni.getProvider({
service: 'payment', //获取服务供应商
success: (res) => {
console.log(res.service) //服务类型:payment
console.log(res.provider) //不同服务类型下可能的取值:["alipay","wxpay"]
/*调用后台的接口!得到返回的数据*/
this.$http.buygood(data).then(function(ress){
console.log(ress)
/*后台返回的数据 里面要确定是 wxpay alipay 微信还是支付宝*/
let provider = ress.data.pay_type == 20 ? 'wxpay' : 'alipay'
let orderInfo = ress.data.payment
console.log(provider)
/*如果是支付宝支付 则直接传入后台的数据 进行支付
*如果是微信支付。就需要进行二次签名验证
*/
if (provider == "wxpay") {
orderInfo = that.getPayInfo(ress.data.payment)
}
console.log(provider)
uni.requestPayment({
provider: provider, //wxpay微信 alipay支付宝
orderInfo: orderInfo, //订单数据 后台返回的数据
success: function(resss) {
console.log('success:' + JSON.stringify(resss));
uni.showToast({
title: '支付成功'
})
},
// 参数有问题则抛出错误
fail: function(err) {
console.log(err)
console.log('fail:' + JSON.stringify(err));
uni.showToast({
title: '支付失败'
})
},
})
}, error => {
console.log(error)
})
}
})
},
getPayInfo(orderInfo) {
let res = orderInfo, // 后台返回的统一下单数据
key = "此处为加密的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(/&$/, "");
},
第三步:测试如果提示,签名不一致、或者包名不一致。
- 检查自己的基座、是否用的自定义的基座、因为只有之定义的基座,用的 appid 和 密钥 是你自己的密钥 运行–运行到手机模拟器 – 基座选择
打包签名的时候一定要跟公众平台的匹配! 尽量的用 java jdk 1.8_201 生成证书 给版本里面的 md5内容 去掉:和大写改小写进行公众平台的签名
配套MD5.js 一定要引入在支付里面去因为微信需要进行二次签名 mport md5 from ‘…/…/utils/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) + (lsw >> 16)
return (msw << 16) | (lsw & 0xffff)
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function bitRotateLeft (num, cnt) {