nodejs微信支付安全证书下载,亲测有效

微信支付是目前非常流行的支付方式之一,很多开发者在集成微信支付时需要下载并使用微信支付的安全证书。本文将详细介绍如何在Node.js环境中下载微信支付安全证书,并提供一个亲测有效的示例代码。

前置条件

在开始之前,请确保你已经具备以下条件:

  1. 已注册微信支付商户,并获得商户号和API密钥。
  2. 已安装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工具推荐,戳此入👉AI写作

posted @ 2024-07-13 17:04  自足  阅读(57)  评论(0编辑  收藏  举报