npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ape-node-wechatpay-v3

v1.0.31

Published

微信支付 V3-node 版SDK

Downloads

36

Readme

ape-node-wechatpay-v3

目录

安装

用法介绍

内置方法介绍

版本介绍

安装

npm

npm i ape-node-wechatpay-v3 --save

weChatPay 用法介绍

创建 weChatPay 实例

创建实例

const apeWeChatPay = require("ape-node-wechatpay-v3");
const fs = require("fs");

const weChatPay = new apeWeChatPay({
  appid: "xxxxxxxxxx",
  mchid: "xxxxxxxxxx",
  serial_no: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  authType: "WECHATPAY2-SHA256-RSA2048",
  apiclientCert: fs.readFileSync("xxx/certificate/apiclient_cert.pem"),
  apiclientkey: fs.readFileSync("xxx/certificate/apiclient_key.pem"),
  certPath: "xxx/certificate",
  APIv3: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
});

参数说明

| 参数名称 | 参数介绍 | 是否必须 | | :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------- | :------- | | appid | 公众号(移动应用 / 小程序)的 appid | 否 | | mchid | 商户号 | 是 | | serial_no | 证书序列号 | 是 | | authType | 请求头签名认证类型,不传则默认为 WECHATPAY2-SHA256-RSA2048 | 否 | | apiclientCert | 公钥 | 是 | | apiclientkey | 密钥 | 是 | | certPath | 微信支付平台证书下载路径(需要回调解密以及验证签名则必填)【包含 wechatpay.pem 和 wechatpaySerial.txt 俩个文件】,建议与公钥密钥在一个文件夹内 | 否 | | APIv3 | 商户后台配置的 APIv3 密钥(需要回调解密以及验证签名则必填) | 否 | | userAgent | 微信支付平台证书下载接口请求头 user-agent(默认为 node Serve) | 否 |

注意:serial_no 是证书序列号,请在商户后台查看。

获取签名值

示例代码

let signature = weChatPay.getSignature(method, url, timestamp, nonce_str, body);

参数说明

| 参数名称 | 参数介绍 | 是否必须 | | :---------- | :--------------------------------------------- | :------- | | method | 支付接口方法 | 是 | | url | 支付接口地址 | 是 | | timestamp | 时间戳 | 是 | | nonce_str | 请求随机串 | 是 | | body | 请求体(接口需要传则给,反之给空字符串,如"") | 否 |

获取 HTTP Authorization 头

示例代码

let authorization = weChatPay.getAuthorization(nonce_str, timestamp, signature);

参数说明

| 参数名称 | 参数介绍 | 是否必须 | | :---------- | :----------------------------------- | :------- | | nonce_str | 请求随机串(需要与获取签名值的一致) | 是 | | timestamp | 时间戳 | 是 | | signature | 签名值 | 是 |

获取 jsapi 客户端签名值

示例代码

let paySign = this.getJsapiSignature(appid, timeStamp, nonceStr, package);

参数说明

| 参数名称 | 参数介绍 | 是否必须 | | :---------- | :----------------- | :------- | | appid | 应用 ID | 是 | | timeStamp | 时间戳 | 是 | | nonceStr | 随机字符串 | 是 | | package | 订单详情扩展字符串 | 是 |

下载微信支付平台证书

会生成 wechatpay.pem 和 wechatpaySerial.txt 俩个文件,每次更新会覆盖旧的。

微信官方建议在十二小时内更新,可以写定时任务

示例代码

let result = {};
try {
  result = await weChatPay.getWeChatPayCert();
} catch (error) {
  console.log(error);
}
console.log(result);
// { code: 200, msg: '下载证书成功' }

!!!使用此方法必须在构造实体类时传递 certPath 、 APIv3 这俩个参数 !!!

文件说明

| 文件名称 | 说明 | | :------------------ | :----------------------------------------------- | | wechatpay.pem | 下载平台证书接口解密出来公钥(回调签名验证需要) | | wechatpaySerial.txt | 下载平台证书接口的公钥序列号(回调签名验证需要) |

返回说明(为了方便开发者做对应的处理)

| code | data | msg | | :---------------------------- | :--------------------------------- | :------- | | 200 | 下载成功 | 解释说明 | | 500 / 其他(在 catch 里返回) | 下载失败(错误信息),详细请看 msg | 解释说明 |

支付回调签名验证

示例代码

let Body = req.body; // 微信请求你的回调接口的实体类 body
let Headers = req.headers; // 微信请求你的回调接口的 headers
let result = null;
try {
  result = await weChatPay.verifySignature(
    Headers["wechatpay-signature"], // 应答签名
    Headers["wechatpay-serial"], // 平台证书序列号
    Headers["wechatpay-timestamp"], // 生成签名的时间戳
    Headers["wechatpay-nonce"], // 应答随机串
    req.body
  );
} catch (error) {
  console.log(error);
}
console.log(result);
// { code: 200, msg: '验签名串和签名验证通过' }

!!!使用此方法必须在构造实体类时传递 certPath 、 APIv3 这俩个参数 !!!

返回说明(为了方便开发者做对应的处理)

| code | data | msg | | :---------------------------- | :--------------------------------- | :------- | | 200 | 验证通过 | 解释说明 | | 500 / 其他(在 catch 里返回) | 验证失败(错误信息),详细请看 msg | 解释说明 |

回调解密

建议在签名验证成功后解密

示例代码

let Body = req.body; // 微信请求你的回调接口的实体类 body
let Headers = req.headers; // 微信请求你的回调接口的 headers
let data = null;
try {
  data = await weChatPay.decrypting(
    Body.resource.ciphertext, // 结果数据密文
    Body.resource.nonce, // 加密使用的随机串
    Body.resource.associated_data // 附加数据
  );
} catch (error) {
  console.log(error);
}
console.log(data);
// { code: 200, data: xxxx(解密的数据), msg: '解密成功' }

!!!使用此方法必须在构造实体类时传递 certPath 、 APIv3 这俩个参数 !!!

返回说明(为了方便开发者做对应的处理)

| code | data | msg | | :---------------------------- | :--------------------------------- | :------- | | 200 | 解密出来的数据 | 解释说明 | | 500 / 其他(在 catch 里返回) | 解密失败(错误信息),详细请看 msg | 解释说明 |

weChatPay 内置方法介绍

Jsapi 下单

示例代码

let data = {
  appid: "xxxxxx",
  mchid: "xxxxxx",
  description: "测试",
  out_trade_no: "xxxxxx",
  notify_url: "xxxxxx",
  amount: {
    total: 1,
  },
  payer: {
    openid: "xxxxxx",
  },
};
let result;
try {
  result = await weChatPay.jsapiPay(data);
} catch (error) {
  console.log(error);
}
console.log(result);
// 正常返回如下示例(data中包含jsapi支付客户端(小程序或者网页)所需要的全部参数)
// {
//   code: 200,
//   data: {
//     appid: 'xxxxxx',
//     timeStamp: 'xxxxxx',
//     nonceStr: 'xxxxxx',
//     package: 'prepay_id=xxxxxx',
//     signType: 'RSA',
//     paySign: 'xxxxxx'
//   },
//   msg: 'success'
// }

参数说明

| 参数名称 | 参数介绍 | 是否必须 | | :------- | :--------------------- | :------- | | data | jsapi 下单的 body 参数 | 是 |

详细请点击查看微信官方-jsapi-下单文档

Native 下单

示例代码

let data = {
  appid: "xxxxxx",
  mchid: "xxxxxx",
  description: "测试",
  out_trade_no: "xxxxxx",
  notify_url: "xxxxxx",
  amount: {
    total: 1,
  },
};
let result;
try {
  result = await weChatPay.nativePay(data);
} catch (error) {
  console.log(error);
}
console.log(result);
// 正常返回如下示例
// {
//     "code": 200,
//     "code_url": "xxxxxxxxxx"
// }

参数说明

| 参数名称 | 参数介绍 | 是否必须 | | :------- | :---------------------- | :------- | | data | native 下单的 body 参数 | 是 |

详细请点击查看微信官方-native-下单文档

版本介绍

| 版本号 | 版本介绍 | | :----- | :--------------------------------------------------------------------------------- | | 1.0.0 | 仅支持获取签名和获取头部参数 Authorization | | 1.0.1 | 在 1.0.0 的基础上增加了说明文档 | | 1.0.2 | 增加了 native 支付下单函数的封装 | | 1.0.21 | 增加了 jsapi 支付下单函数的封装 | | 1.0.3 | 增加了微信支付平台证书下载方法、支付回调签名验证的方法、 证书(回调)解密方法的封装 |