自己闲来无事想试试node.js如何写后端开发,就测试了一下这个微信支付功能,首先,我们想要实现微信支付要有appid,mchid商户号,这些提前需要准备的必要参数我就不多说了,看文档就可APP下单 - App支付 | 微信支付商户文档中心 (qq.com)
下面直接上代码
//我们前端通过调用buy这个接口,告诉后端去发起下单请求
router.post('/buy', (req, res) => {
let total = 1
let out_trade_no = buildShortUUID() //生成随机字符串方法
//这是我们需要必传的参数,使用自己的就可
let requestbody = {
"appid": appid,
"mchid": mchid,
"out_trade_no": out_trade_no,
"description": "商品",
"amount": {
"total": total,
},
"notify_url": "http://10.70.23.35/static/index.html",
"payer": {
"openid": req.body.openid
}
}
let nonce_str = buildShortUUID() //生成第二个随机字符串
let data = Math.round(new Date().getTime() / 1000) //!!!重点 获取时间戳 js获取时间戳是以毫秒为单位所以这里要特别注意!!!这里的时间戳使用变量记录下来,因为后面还会用
const jsrsasign = require('jsrsasign'); // npm 下载 jsrsasign 加密插件
let rsa = new jsrsasign.RSAKey()
// 私钥 !!!注意 这里的私钥是你微信商户平台中 证书里的私钥,每个人是不一样的
如何获取 可查看文档 如何下载微信支付证书(API证书)_微信支付证书一般放在哪个文件夹-CSDN博客
下载完后我们可直接查看apiclient_key.pem文件,这里就是我们自己的私钥!!!
let priK = "-----BEGIN PRIVATE KEY-----\n" +
"xxxxxxxxxxxxxxxxxx\n" +
"xxxxxxxxxxxxxxxxxxx\n" +
"-----END PRIVATE KEY-----";
// 将私钥 转成16进制
rsa = jsrsasign.KEYUTIL.getKey(priK);
// 采用SHA256withRSA进行加密
const sig = new jsrsasign.KJUR.crypto.Signature({
alg: 'SHA256withRSA'
})
// 算法初始化
sig.init(rsa)
str为微信规定的签名方式注意,微信文档中只是个例子,你想用下单接口就需要根据我下面的写,
请求方式为 post,
请求地址为v3/pay/transactions/jsapi
请求时间戳 是上面记录的时间戳data
随机字符串是上面记录的nonce_str
最后将 参数body使用JSON.stringify()方法传入
let str = `POST\n/v3/pay/transactions/jsapi\n${data}\n${nonce_str}\n${JSON.stringify(requestbody)}\n`
// 对str进行加密
sig.updateString(str)
// 加密后的16进制转成base64,这就是签名了
const sign = jsrsasign.hextob64(sig.sign())
//到了这步才是发起下单请求,之前全是准备工作
request({
url: 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi',
method: "POST",
json: true,
headers: {
"Accept": "application/json",
"User-Agent": "Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/63.0.3239.132 Safari/537.36",
"Authorization": `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",serial_no="${serial_no}",nonce_str="${nonce_str}",timestamp="${data}",signature="${sign}"`,
"Content-Type": "application/json",
},
body: requestbody
}, function (error, response, body) {
//成功打印body中的prepay_id就代表下单成功了,可以进行下一步的发起支付了 就没有难点了
console.log(body)
});
})
下面是完整代码:
let total = 1
let out_trade_no = buildShortUUID()
let requestbody = {
"appid": appid,
"mchid": mchid,
"out_trade_no": out_trade_no,
"description": "商品",
"amount": {
"total": total,
},
"notify_url": "http://10.70.23.35/static/index.html",
"payer": {
"openid": req.body.openid
}
}
let nonce_str = buildShortUUID()
let data = Math.round(new Date().getTime() / 1000)
const jsrsasign = require('jsrsasign');
// 私钥
let rsa = new jsrsasign.RSAKey()
let priK = "-----BEGIN PRIVATE KEY-----\n" +
"56xdvb7rN2fR/49CUSZ1f/I=\n" +
"-----END PRIVATE KEY-----";
// 将私钥 转成16进制
rsa = jsrsasign.KEYUTIL.getKey(priK);
// 采用SHA256withRSA进行加密
const sig = new jsrsasign.KJUR.crypto.Signature({
alg: 'SHA256withRSA'
})
// 算法初始化
sig.init(rsa)
let str = `POST\n/v3/pay/transactions/jsapi\n${data}\n${nonce_str}\n${JSON.stringify(requestbody)}\n`
// 对123456进行加密
sig.updateString(str)
// 加密后的16进制转成base64,这就是签名了
const sign = jsrsasign.hextob64(sig.sign())
request({
url: 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi',
method: "POST",
json: true,
headers: {
"Accept": "application/json",
"User-Agent": "Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/63.0.3239.132 Safari/537.36",
"Authorization": `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",serial_no="${serial_no}",nonce_str="${nonce_str}",timestamp="${data}",signature="${sign}"`,
"Content-Type": "application/json",
},
body: requestbody
}, function (error, response, body) {
console.log(body)
});