NodeJS 基于API v3 实现微信小程序的支付

前提

实现过程

安装 wxpay-v3

npm i wxpay-v3 --save

# 如已安装旧版, 重新安装最新版
npm i wxpay-v3@latest

创建 WxPayUtils.js

const RSA = require(./wx_rsa);
class WxPayUtils {
    constructor(privateKey,appId) {
        this.privateKey =privateKey;
        this.appId = appId;
    }
    signLong  (data) {
        // let privateKey =private_key
        let sign_rsa = new RSA.RSAKey();
        sign_rsa = RSA.KEYUTIL.getKey(this.privateKey);
        let hashAlg = sha256;//sha256//此处换成腾讯要求的方式
        let Sig = sign_rsa.signString(data, hashAlg);
        Sig = RSA.hex2b64(Sig); // hex 转 b64
        return Sig;
    }

    paysign(options){//发起支付签的字段准备
        let timeStamp=this.createTimeStamp(),//时间戳
            nonceStr=this.randomString(),//32位随机数
            Ppackage= `prepay_id=${options}`,//prepay_id
            signType= RSA;//加签方式
        //appId、timeStamp、nonceStr、package
        let PpaySign=`${this.appId}
${timeStamp}
${nonceStr}
${Ppackage}
`;//需要加签的字段拼接
        let cryptStr=this.signLong(PpaySign);//生成签名
        let paySign=cryptStr;
        return {timeStamp,nonceStr,Ppackage,signType,paySign};
    }

    createTimeStamp(){
        return parseInt(new Date().getTime() / 1000) + 
    }

    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;
    }
}
module.exports = WxPayUtils;

创建wx_rsa.js

到github上下载 在utils包

或者去这里复制

小程序端

testPay(){
		wxpay({openid:xxx,amount:1}).then(res=>{
			let options = res.data
			wx.requestPayment
			(
				{
					package:options.Ppackage,...options,
					"success":function(res){
						console.log(res)
					},
					"fail":function(res){
						console.log(res)
					}
				}
			)
		})

	}

即可实现

经验分享 程序员 微信小程序 职场和发展