微信支付是目前非常流行的支付方式之一,很多开发者在集成微信支付时需要下载并使用微信支付的安全证书。本文将详细介绍如何在Node.js环境中下载微信支付安全证书,并提供一个亲测有效的示例代码。
前置条件
在开始之前,请确保你已经具备以下条件:
- 已注册微信支付商户,并获得商户号和API密钥。
- 已安装Node.js环境。
步骤一:安装所需的Node.js模块
首先,我们需要安装一些必要的Node.js模块。打开终端并运行以下命令:
npm install axios
axios
:用于发送HTTP请求。
步骤二:编写下载证书的代码
接下来,我们编写一个Node.js脚本,用于下载微信支付的安全证书。创建一个名为downloadCert.js
的文件,并添加以下代码:
const axios = require("axios");
const fs = require("fs");
const https = require("https");
const path = require("path");
const crypto = require("crypto");
// 微信支付商户号
const mch_id = "";
// API证书路径
const certPath = path.resolve(__dirname, "certificate/apiclient_cert.pem");
const keyPath = path.resolve(__dirname, "certificate/apiclient_key.pem");
// 创建HTTPS Agent
const agent = new https.Agent({
cert: fs.readFileSync(certPath),
key: fs.readFileSync(keyPath),
});
// 下载证书的URL
const downloadUrl = "https://api.mch.weixin.qq.com/v3/certificates";
// 生成随机字符串
function generateNonceStr() {
return crypto.randomBytes(16).toString("hex");
}
// 获取当前时间戳
function getTimestamp() {
return Math.floor(Date.now() / 1000).toString();
}
// 拼接待签名字符串
function buildSignMessage(method, url, timestamp, nonceStr, body) {
return `${method}\n${url}\n${timestamp}\n${nonceStr}\n${body}\n`;
}
// 使用私钥进行签名
function signMessage(message, keyPath) {
const privateKey = fs.readFileSync(keyPath, "utf8");
const sign = crypto.createSign("RSA-SHA256");
sign.update(message);
sign.end();
return sign.sign(privateKey, "base64");
}
// 生成签名
const nonceStr = generateNonceStr();
const timestamp = getTimestamp();
const method = "GET";
const urlPath = "/v3/certificates";
const body = "";
const signMessageStr = buildSignMessage(
method,
urlPath,
timestamp,
nonceStr,
body
);
const signature = signMessage(signMessageStr, keyPath);
const serial_no = "";
// 打印调试信息
console.log("Nonce Str:", nonceStr);
console.log("Timestamp:", timestamp);
console.log("Sign Message String:", signMessageStr);
console.log("Signature:", signature);
// 发起请求下载证书
axios
.get(downloadUrl, {
httpsAgent: agent,
headers: {
Accept: "application/json",
Authorization: `WECHATPAY2-SHA256-RSA2048 mchid="${mch_id}",nonce_str="${nonceStr}",signature="${signature}",timestamp="${timestamp}",serial_no="${serial_no}"`,
},
})
.then((response) => {
// 处理响应数据
const certificates = response.data.data;
certificates.forEach((cert) => {
const certContent = cert.encrypt_certificate.ciphertext;
const certId = cert.serial_no;
const certFilePath = path.resolve(__dirname, `cert_${certId}.pem`);
// 解密证书内容(需要使用你的私钥解密)
// 这里假设你已经有解密函数 decryptCertificate
const decryptedCert = decryptCertificate(certContent);
// 保存证书到文件
fs.writeFileSync(certFilePath, decryptedCert);
console.log(`Certificate saved to ${certFilePath}`);
});
})
.catch((error) => {
console.error("Error downloading certificate:", error);
});
// 解密证书函数(示例)
function decryptCertificate(encryptedCert) {
// 这里需要实现解密逻辑,通常使用你的私钥进行解密
// 具体实现取决于加密算法和密钥管理方式
return encryptedCert; // 示例中直接返回原文,实际需要解密
}
步骤三:运行脚本
确保你已经将商户号和API密钥替换为你自己的信息,然后在终端中运行以下命令:
node downloadCert.js
如果一切正常,你应该会看到类似以下的输出:
Certificate saved to cert_38AE4BA2C1D2EE33F29C1BA2E31931A7485BDCAC.pem
结论
希望这篇文章能对你有所帮助,如果你在操作过程中遇到任何问题,欢迎留言讨论。
国内好用的AI工具推荐,戳此入
标签:const,证书,微信,nodejs,js,cert,timestamp,亲测 From: https://www.cnblogs.com/zhizu/p/18300361