Skip to content

zengyishou/node-easywechat

 
 

Repository files navigation

EasyWeChat for Node.js

Build 3.x npm License

注:3.x分支针对 EasyWeChat 的 6.x版本。

若您需要 EasyWeChat 的 5.x版本,请切换到 2.x 分支。

EasyWeChat 是一个由 安正超 大神用 PHP 开发的开源的微信非官方 SDK。其功能强大,使用方便,个人一直很喜欢,所以将其在 Node.js 上实现。本项目基本还原其配置项以及接口的调用方式,但毕竟语言环境不同,会有些许差别,还请各位开发者理解。

注:虽然也使用了 EasyWeChat 这个名称,但是 安正超 大神并未参与本项目的开发,请各位开发者不要因使用本包产生的疑惑而去打扰大神,如有疑问请在本项目中提 issue,谢谢~

安装

npm install -S node-easywechat

注:3.x 版本需要 Node.js 15.6.0 及以上版本

使用说明

绝大部分API都可以根据 EasyWeChat 的文档 来使用。小部分(如获取请求相关数据、返回响应数据、支付证书等)的操作,由于语言环境的不同,会有不同处理。具体可以查看 node-easywechat-demo 以及下方的自定义模块说明 。如果仍有疑问,请提issue,谢谢~

3.x 起 SDK 中不再内置具体业务的接口,仅封装底层基础部分,如认证、授权和 API 客户端。至于为什么不再封装业务接口,可以查看 EasyWeChat 给出说明

// 公众号
const { OfficialAccount } = require('node-easywechat');
// 实例化应用
let app = new OfficialAccount({
  // 配置项
});

// 小程序
const { MiniApp } = require('node-easywechat');
// 实例化应用
let app = new MiniApp({
  // 配置项
});

// 微信支付
const { Pay } = require('node-easywechat');
// 实例化应用
let app = new Pay({
  // 配置项
});

// 开放平台
const { OpenPlatform } = require('node-easywechat');
// 实例化应用
let app = new OpenPlatform({
  // 配置项
});

// 企业微信
const { Work } = require('node-easywechat');
// 实例化应用
let app = new Work({
  // 配置项
});

// 企业微信开放平台
const { OpenWork } = require('node-easywechat');
// 实例化应用
let app = new OpenWork({
  // 配置项
});

// ----- 以下为通用的 api 调用方法 -----

// 获取 api 调用客户端
let client = app.getClient();

// 请求 api
// 注意,这里返回的是 HttpClientResponse 对象
let response = await client.post('/cgi-bin/user/info/updateremark', {
  openid: 'xxxx',
  remark: 'xxxx',
});
// 获取具体数据
let data = response.toObject();
// 另外还有以下方法:
// toJson() 转json字符串
// toString() 转字符串
// saveAs(filename) 保存为文件
// toDataUrl() 转base64字符串

配置项示例

// 通用配置,即所有模块都可以设置
{
  // axios 请求参数
  // 详见:https://github.com/axios/axios#request-config
  http: {
    // 请求失败时,自动重试。默认不重试
    // 详见:https://github.com/softonic/axios-retry#options
    retry: {}
  },

  // 缓存以文件(默认设置)存储时,需要的配置项
  file_cache: {
    path: './cache/', // 文件存储目录(请确保该目录有读写权限)
    fileMode: 0o666,  // 文件权限
    ext: '.cache'     // 文件扩展名
  }
}
// 公众号配置
{
  // 公众号的 app key
  app_id: '',
  // 公众号的 app secret
  secret: '',
  // 公众号的 token
  token: '',
  // EncodingAESKey
  aes_key: '',

  // 网页授权认证
  oauth: {
    // 网页授权类型
    scope: 'snsapi_userinfo',
    // 网页授权回调地址,完整的URL
    redirect: 'http://node-easywechat.hpyer.cn/wxlogin/callback'
  }
}
// 小程序配置
{
  // 小程序的 app key
  app_id: '',
  // 小程序的 app secret
  secret: '',
  // 小程序的 token
  token: '',
  // EncodingAESKey
  aes_key: ''
}
// 微信支付配置
{
  // 商户号
  mch_id: '',
  // 商户证书路径
  certificate: '',
  // 商户证书私钥路径
  private_key: '',
  // 平台证书(v3接口需要)
  // 持路径列表或者PublicKey对象列表或者,以serial_no为key,证书内容或PublicKey对象为value的对象
  // 下载工具:https://github.com/wechatpay-apiv3/CertificateDownloader
  platform_certs: '',
  // v3 API密钥
  secret_key: '',
  // v2 API密钥
  v2_secret_key: '',
}
// 开放平台配置
{
  // 开放平台的 app key
  app_id: '',
  // 开放平台的 app secret
  secret: '',
  // 开放平台的 token
  token: '',
  // EncodingAESKey
  aes_key: '',
}
// 企业微信配置
{
  // 企业微信的 corp id
  corp_id: '',
  // 企业微信的 secret
  secret: '',
  // 企业微信的 token
  token: '',
  // EncodingAESKey
  aes_key: '',
}
// 企业微信开放平台配置
{
  // 企业微信的 corp id
  corp_id: '',
  // 企业微信的 secret
  provider_secret: '',
  // 第三方应用的 corp id
  suite_id: '',
  // 第三方应用的 secret
  suite_secret: '',
  // 企业微信服务端接口验证 token
  token: '',
  // 企业微信服务端消息加解密密钥
  aes_key: '',
}

自定义模块(模块替换)使用方法

日志模块

框架默认不记录任何日志。如果需要,可以通过 client 实例的 setLogger 方法设置日志处理回调方法。

// 以公众号为例
const { OfficialAccount } = require('node-easywechat');
// 实例化应用
let app = new OfficialAccount({
  // ...
});

// 获取 api 调用客户端
let client = app.getClient();

/**
 * 该回调方法会接收两种日志信息
 * 1、接口请求调用前的参数:
 *  string  固定值,'before'
 *  object  请求参数
 * 2、接口请求调用后的参数:
 *  string  固定值,'after'
 *  object  请求参数
 *  number  请求耗时(ms)
 *  Response  请求响应对象
 */
client.setLogger((...args) => {
  console.log(args)
});

缓存模块

框架默认使用文件缓存读取到的 access_token 等值,如需要改用其他缓存方式(如:redis),请实现接口 CacheInterface 并通过 app.setCacher 方法进行模块替换。

const { OfficialAccount, CacheInterface } = require('node-easywechat');
const Redis = require("ioredis");

class RedisCacher extends CacheInterface {
  constructor(redis) {
    this.redis = redis;
  }

  get(id)
  {
    return this.redis.get(id);
  }

  async has(id)
  {
    return (await this.redis.exists(id)) > 0;
  }

  async set(id, data = null, lifeTime = 0)
  {
    if (lifeTime > 0) {
      await this.redis.set(id, data, 'EX', lifeTime);
    }
    else {
      await this.redis.set(id, data);
    }
    return true;
  }

  async delete(id)
  {
    await this.redis.del(id);
    return true;
  }
}

// 实例化应用
let app = new OfficialAccount({
  // ...
});

// 替换缓存实例
app.setCacher(new RedisCacher(new Redis));

请求模块

通常,如果你的应用不需要处理服务端回调、支付回调等逻辑的话,是不需要传递请求对象的。

const { OfficialAccount, ServerRequest } = require('node-easywechat');

// 实例化应用
let app = new OfficialAccount({
  // ...
});

// 根据 IncomingMessage 实例(即 Node.js 原始请求对象)创建 ServerRequest 实例
//
// 由于 IncomingMessage 的 body 流的特殊性,某些框架(目前已知:fastify)
// 可能会自动读取后挂载到上下文中,从而导致 node-easywechat 去尝试读取时报错。
// 这时可以选择传入第二个参数,即 body 的内容
//
// 如果此方法 不能解决你的问题,可以选择继承 ServerRequest,重写相关方法
let request = ServerRequest.createFromIncomingMessage(req);

// 设置请求实例
app.setRequest(request);

模块支持情况

  • 公众号模块
  • 微信支付
  • 小程序
  • 开放平台
  • 企业微信
  • 企业微信开放平台
  • 自定义

About

EasyWeChat for Node.js

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 66.5%
  • JavaScript 33.5%