赞
踩
微信支付是目前非常流行的支付方式之一,很多开发者在集成微信支付时需要下载并使用微信支付的安全证书。本文将详细介绍如何在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
希望这篇文章能对你有所帮助,如果你在操作过程中遇到任何问题,欢迎留言讨论。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。