最近在做微信支付,根據微信官方文檔上的要求 用RSA加簽去請求支付窗口的調起,下面詳細列舉支付開發過程;
當前項目的流程大概是,前端根據后端要求提交數據-------》拿到后台返回的prepay_ID,和order_ID,-----》前端RSA加簽------》調起微信的支付窗口----》支付。
myOderData(options){
const that=this;
let params={
datas:options,//提交訂單數據的參數
method:'POST'
}
let paycode,OrderNo;
api.addorderData(params).then(res=>{
if(res.data.Success==false){
utils.msgtips(res.data.Msg);
}else{
paycode=res.data.Data.prepay_id;//拿到后台返回的prepay_id
OrderNo=res.data.Data.OrderNo;//拿到后台返回的訂單號
// console.log(paycode);
let obj= utils.paysign(paycode); //RSA加簽,此處已封裝成paysign方法
utils.processPay(obj).then(res=>{//發起支付窗體的調起,已封裝成processPay方法
if(res.errMsg=="requestPayment:ok"){//支付成功時,要傳入訂單號到后台改變訂單狀態
that.updateorderData(OrderNo)
}else if(res.errMsg=="requestPayment:fail cancel"){//取消支付時的操作
utils.msgtips('您已取消支付');
wx.navigateTo({
url:'../mppaycancel/index'
})
}
})
}
}).catch(err=>{
console.log(err)
})
以上是整體使用的方法。
下面講解加簽:
根據騰訊官方文檔上的要求,如圖:

文檔原文地址: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
現在用的是v3 加簽,以前是v2 MD5
需要注意的是加密加簽的方式, 需要和后端保持一致。
1小程序ID獲取:
const accountInfo = wx.getAccountInfoSync(); let appId=accountInfo.miniProgram.appId;
2.時間戳:
function createTimeStamp(){
return parseInt(new Date().getTime() / 1000) + ''
}
3.32位隨機數:
function randomString(){
const chars='ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; //默認去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
const len=32;
const maxPos=chars.length;
let pwd='';
for(let i=0;i<len;i++){
pwd+=chars.charAt(Math.floor(Math.random()*maxPos));
}
return pwd;
}
4.訂單詳情擴展字符prepay_id:
即后端返回回來的prepay_id字段數據。
5.加簽方式:
signType= 'RSA'
6.簽名 paysign,這里要說明一下:
1).最好嚴格按照騰訊文檔要求的順序來。使用字段appId、timeStamp、nonceStr、package
2)要用‘\n’ 連接各字段,並且結尾也要用‘\n’ 不要用等於號。
官方文檔有說明:鏈接:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
如圖:

還有一個很重要的RSA加簽:
這個我搜到2個博主提供的:
1):
demo:https://blog.csdn.net/UFO00001/article/details/72822907
github:https://github.com/UFO0001/WX_RSA
2)
https://github.com/zhangzhaopds/WeixinApp_RSA_Signature
第二種需要用小程序npm構建,照着文檔操作就可以了,
npm構建文檔如下:
https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html
我用的是第一個,直接頁面引入了wx_rsa.js
如圖:

function signLong (data) {
let sign_rsa = new RSA.RSAKey();
sign_rsa = RSA.KEYUTIL.getKey(privateKey);
let hashAlg = 'sha256';//sha256//此處換成騰訊要求的方式
let Sig = sign_rsa.signString(data, hashAlg);
Sig = RSA.hex2b64(Sig); // hex 轉 b64
return Sig;
}
關於私鑰:
一定要下載證書:

下載后打開此文件復制私鑰粘貼到編輯器中,不能TXT 中復制,會改變編碼方式,導致加簽不成功。

騰訊官網有一個加簽解簽的驗證工具,這個只能檢測是否符合規范,不能檢測值是否正確。地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml

function paysign(options){//發起支付簽的字段准備
const accountInfo = wx.getAccountInfoSync();
let appId=accountInfo.miniProgram.appId,//小程序appid
timeStamp=createTimeStamp(),//時間戳
nonceStr=randomString(),//32位隨機數
Ppackage= `prepay_id=${options}`,//prepay_id
signType= 'RSA';//加簽方式
//appId、timeStamp、nonceStr、package
let PpaySign=`${appId}\n${timeStamp}\n${nonceStr}\n${Ppackage}\n`;//需要加簽的字段拼接
let cryptStr=Rsa.signLong(PpaySign);//生成簽名
let paySign=cryptStr;
return obj={timeStamp,nonceStr,Ppackage,signType,paySign};
}
//發起支付
function processPay(options){
// console.log(options)
let that=this;
return new Promise((resolve,reject)=>{
wx.requestPayment({
package:options.Ppackage,...options,
success: (res)=>{
resolve(res);
},
fail: (err)=>{
resolve(err);
}
});
})
}
以上就是完整的涉及到支付的一些方法和取值過程。
