最近开发的项目涉及到支付,所以来做个总结。(大家一定要看我的代码注释,很详细的解释)
微信小程序支付就要调用这个api,这些参数是必传的,所以我们要填写这些参数的value
// 仅作为示例,非真实参数信息。
uni.requestPayment({
provider: 'wxpay',//服务提供商,通过 uni.getProvider 获取。
timeStamp: String(Date.now()),//时间戳(10位数字)
nonceStr: 'A1B2C3D4E5',//随机生成的字符串
package: 'prepay_id=wx20180101abcdefg',//预付id通过接口返回(点击支付时调用)
signType: 'RSA',//这里的签名算法我用的RSA(微信官方默认RSA)
paySign: '',//生成的签名
success: function (res) {
console.log('success:' + JSON.stringify(res));
},
fail: function (err) {
console.log('fail:' + JSON.stringify(err));
}
});
一、服务提供商:通过uni.getProvider获取
uni.getProvider({
service: 'payment',
success:res=>{
res.provider[0]//获取的服务商
}
})
二、时间戳
//获取的十位时间戳
let timeStamp = Math.round(new Date().getTime()/1000)
三、随机字符串,长度为32个字符以下。
let len = 30;
let pwd =""
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var maxPos = alphabet.length;
for (let i = 0; i < len; i++) {
pwd += alphabet.charAt(Math.floor(Math.random() * maxPos));
}
四、生成签名(使用jsrsasign)
//封装的js工具
//下载cnpm i jsrsasign --save
var rs = require("jsrsasign");
// 获取签名
const getSHA256withRSA = (content) => {
//config.privateKeyString 这个获取我的加密算法,因为我是把它保存到一个js文件暴露出来
const key = rs.KEYUTIL.getKey(config.privateKeyString);
// 创建 Signature 对象,设置签名编码算法
const signature = new rs.KJUR.crypto.Signature({
alg: "SHA256withRSA"
});
// 初始化
signature.init(key);
signature.updateString(content);
// 生成密文
const originSign = signature.sign();
return rs.hextob64(originSign);
}
//支付签名
const signature = (nonceStr, packageStr, timeStamp) => {
//这里的拼接规则可以看下下方截图或者看下微信支付官方文档
let paySignStr = `${config.APPID}\n${timeStamp}\n${nonceStr}\n${packageStr}\n`
//然后调用加密
return getSHA256withRSA(paySignStr)
}