企业微信消息推送实战:Docker部署 + 提供API接口

 文章摘要本文主要介绍了企业微信API对接的详细过程,包括获取token、安装docker环境、打包启动应用、企业微信二维码验证以及调用企业微信的三个主要接口(获取所有用户、发送消息给单人、发送消息给多人)等步骤,旨在帮助企业通过程序发送消息给微信客户,实现消息提醒和客户管理的功能【所有功能,亲测有效!】。

目录

企业微信API对接文档

1.背景

2.获取微信第三方token

3.安装docker环境

4.打包与启动

4.1打包镜像

4.2启动容器(启动应用)

5.企业微信二维码验证

5.1 获取初始二维码

5.2 第1次二维码验证

5.3 第2次二维码验证

6.企业微信三个接口

6.1 获取所有用户

6.2 发送消息给单人

6.3发送消息给多人

7.部分源码展示

7.1 Dockerfile伪代码

7.2 index.tx伪代码

7.3 获取所有用户(分页)

7.4 给单人发消息

7.5 按标签群发消息

8.结束程序/切换账号登录


企业微信API对接文档

1.背景

想通过程序发送制定的消息给微信客户,客户需要接收到消息提醒并且可以直接打开微信查看(前提条件用户用加了门店企业微信好友),针对上面问题,提供两个接口:

1、一个是获取企业微信的用户的列表

2、一个是直接发送用户消息

2.获取微信第三方token

获取第三方token,申请地址:Token 自助服务系统

目前已经获取到的token是(注意大家获取到token,试用期仅有7天,如想续期请自行续费):

puppet_workpro_867******41e7908d3ee3b44f5421

3.安装docker环境

请先使用一个安装好docker 的服务器。请自行百度,在服务器如何安装docker。   

方式一(推荐):阿里云安装docker,根据服务器类型选择安装,操作文档如下:

安装Docker并使用_云服务器 ECS(ECS)-阿里云帮助中心

方式二:执行下面的命令。

4.打包与启动

4.1打包镜像

  • 将源码包的文件,复制到服务器某个路径下:(如图)

  • 进入服务器,到指定目录下:(如图)

  • 输入命令:docker build -t wechat_data_con .  (如图,回车键执行,安装依赖以及所需环境)

server.js 伪代码参考

// server.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = 9898;

app.use(bodyParser.json());
app.use(express.static('public'));

let verifyCode = ''; // 用于存储用户提交的验证码

app.post('/submit-verify-code', (req, res) => {
    const { verifyCode: userVerifyCode } = req.body;
    verifyCode = userVerifyCode;
    res.json({ message: '验证码已接收', verifyCode: userVerifyCode });
});

app.listen(port, () => {
    console.log(`服务器运行在 http://localhost:${port}`);
});

package.json伪代码参考

{
  "name": "workpro-getting-started",
  "version": "1.0.0",
  "description": "basic example on workpro service",
  "main": "index.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "ts-node index.ts"
  },
  "repository": {
    "type": "git",
    "url": "https://gitee.com/laibin113/enterprise-wechat-messaging.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://gitee.com/laibin113/enterprise-wechat-messaging.git"
  },
  "homepage": "https://gitee.com/laibin113/enterprise-wechat-messaging.git",
  "dependencies": {
    "@juzi/wechaty": "^1.0.66",
    "@juzi/wechaty-puppet": "^1.0.66",
    "qrcode-terminal": "^0.12.0",
    "express": "^4.17.1",
    "body-parser": "^1.20.0",
    "@grpc/grpc-js": "1.8.12",
    "node-fetch": "^2.6.1",
    "node-cache": "^5.1.2"
  },
  "devDependencies": {
    "@types/qrcode-terminal": "^0.12.0",
    "@types/express": "^4.17.6"
  }
}

4.2启动容器(启动应用)

  • 依赖安装完成后,输入命令:docker run -p 9898:9898 --restart on-failure wechat_data_con  (如图,端口自行控制)

5.企业微信二维码验证

5.1 获取初始二维码

(1)发送接口请求获取初始二维码,docker日志查看如果不会请自行百度;

(2)开启程序post方法请求:http:127.0.0.1:9898/goStart

(3)上面的接口127.0.0.1根据实际服务换成自己的IP,或者绑定对应的域名。

  • 发送请求,启动获取二维码接口。(如图)

日志台会出现一个二维码!

5.2 第1次二维码验证

  • 使用手机企业微信,扫描二维码,扫描完了之后,手机企业微信,会弹出一个 6位数的验证码,配合上图的qrcodeKey,请求接口:(如图)

验证成功后,日志台输出:(如图),表示登录成功

5.3 第2次二维码验证

  • 特别注意,因企业微信官方的原因,当前账号,首次这样扫码登录的情况下,在30分钟内,会在企业微信要求,再次验证。如下图:

这个时候,日志台,会重新打印二维码,点击 确定是本人使用,然后扫描二维码,即可。

6.企业微信三个接口

6.1 获取所有用户

(1)post方法请求:http:127.0.0.1:9898/get-all-user

(2)body传参方式,参数说明:

        pageSize:需要发送的企业微信消息内容

        id:上面获取到用户信息的用户id

(3)备注:上面的接口127.0.0.1根据实际服务换成自己的IP,或者绑定对应的域名。

(4)9898对应服务器安全组需要放行该端口,如果启动防火墙也要放开该端口号。

  •  请求接口,获取所有用户:(如图)

datas为用户数据列表, hasNextPage为是否有下一页。

各个字段都十分容易理解,自行翻译吧,下面是参数:

_events 和 _eventsCount:事件相关的计数器。

id:标识符,通常用于唯一标识一个对象或记录。

payload:负载,指传输的数据内容。

address:地址,指用户的居住地址或联系地址。

alias:别名,用户使用的另一个名字或昵称。

avatar:头像,是指用户的照片或代表图像的链接。

city:城市,用户所在的城市。

corporation:公司,用户所在的公司或组织。

coworker:同事,可能表示用户是否是联系人的同事。

description:描述,可能是指对用户的一些描述性信息。

friend:朋友,可能表示用户是否是联系人的朋友。

gender:性别,1通常表示男性,0代表女性

handle:处理

name:名字,用户的姓名。

phone:电话,用户的联系电话。

province:省份,用户所在的省份。

signature:签名,用户的签名或个人格言。

star:星标,可能表示用户是否被标记为重要联系人。

title:标题,可能是指用户的职位或头衔。

type:类型,1可能表示用户类型或状态

weixin:微信,用户的微信账号或标识。

additionalInfo:额外信息,包含一些用于识别或分类用户的附加数据。

corpld 和 sCorpld:与公司或组织相关的某种标识符。

status:状态,5表示用户的状态码。

tags:标签,用于标记用户或分类的关键词列表,这里是一个数组。

realName:真实姓名,用户的正式姓名。

aka:也被称为,表示用户的其他已知名称或别名。

hasNextPage:有下一页,这通常用于分页显示,表示数据还有更多的部分。

6.2 发送消息给单人

发送消息接口:(如图下图所示

(1)post方法请求:http:127.0.0.1:9898/send-message

(2)body传参方式,参数说明:

        message:需要发送的企业微信消息内容

        id:上面获取到用户信息的用户id

(3)备注:上面的接口127.0.0.1根据实际服务换成自己的IP,或者绑定对应的域名。

6.3发送消息给多人

(1)post方法请求:http:127.0.0.1:9898/send-message-all

(2)body传参方式,参数说明:

        message:需要发送的企业微信消息内容

        id:上面获取到用户信息的用户id

(3)备注:上面的接口127.0.0.1根据实际服务换成自己的IP,或者绑定对应的域名。

(4)上面获取到的用户信息的tag(标签),可在下图那里管理。

效果如图:

7.部分源码展示

7.1 Dockerfile伪代码

# Dockerfile
FROM node:lts

# 复制应用程序代码到容器中
COPY . /appWxWork
WORKDIR /appWxWork

ENV WECHATY_PUPPET_SERVICE_AUTHORITY=token-service-discovery-test.juzibot.com

RUN npm config set registry https://registry.npmmirror.com/
# 在容器中安装 ts-node 和应用程序所需的依赖
RUN npm install ts-node typescript


# 暴露端口 8088
EXPOSE 9898

# 运行应用程序
CMD ["npm", "start"]

7.2 index.tx伪代码

import {ScanStatus, WechatyBuilder} from '@juzi/wechaty'
import QrcodeTerminal from 'qrcode-terminal'

const NodeCache = require("node-cache");
const express = require('express');
const bodyParser = require('body-parser');
const myCache = new NodeCache({ stdTTL: 3660, checkperiod: 1200 });
const app = express();
const port = 9898;


app.use(bodyParser.json());
app.use(express.static('public'));

let verifyCode1 = ''; // 用于存储用户提交的验证码
const fetch = require('node-fetch');
let myUserName = '';
const token = 'puppet_workpro_******1241e7908d3ee3b44f5421';
const bot = WechatyBuilder.build({
  puppet: '@juzi/wechaty-puppet-service',
  //authority: 'token-service-discovery-test.juzibot.com',
  puppetOptions: {
    token,
    tls: {
      disable: true
      // currently we are not using TLS since most puppet-service versions does not support it. 
    }
  }
})

const store = {
  qrcodeKey: '',
}
......

下面给出 3 段可直接粘贴到 server.js 中的最小可运行代码片段,对应文档中「获取用户列表」「单发消息」「群发消息」三个核心接口。每段都附带逐行中文解释,方便二次开发。


7.3 获取所有用户(分页)

// POST /get-all-user
app.post('/get-all-user', async (req, res) => {
  const { pageSize = 50 } = req.body;          // 默认 50 条一页
  if (!bot.isLoggedIn) {                       // 没扫码登录直接返回
    return res.status(401).json({ msg: '未扫码登录' });
  }

  try {
    // bot.Contact.findAll 会自动拉取全部联系人
    const all = await bot.Contact.findAll();
    const list = all
      .filter(c => c.type() === bot.Contact.Type.Individual) // 只保留外部联系人
      .slice(0, pageSize)                                    // 前端分页
      .map(c => ({
        id: c.id,           // 发送消息时要用
        name: c.name(),
        alias: c.alias(),
        avatar: c.avatar(),
        gender: c.gender(), // 1 男 0 女
        tags: c.tags().map(t => t.name())
      }));

    res.json({ datas: list, hasNextPage: all.length > pageSize });
  } catch (e) {
    res.status(500).json({ msg: e.message });
  }
});

解释

  1. bot.Contact.findAll() 拿到完整联系人列表。

  2. 过滤掉群聊/公众号,只保留外部联系人。

  3. pageSize 切片返回,前端可继续传 pageSize+offset 做分页。


7.4 给单人发消息

// POST /send-message
app.post('/send-message', async (req, res) => {
  const { id, message } = req.body;
  if (!id || !message) {
    return res.status(400).json({ msg: '缺少 id 或 message' });
  }

  try {
    const contact = await bot.Contact.find({ id });
    if (!contact) return res.status(404).json({ msg: '用户不存在' });

    await contact.say(message);           // 真正发消息
    res.json({ msg: '已发送', id, message });
  } catch (e) {
    res.status(500).json({ msg: e.message });
  }
});

解释

  1. 根据前端传来的用户 id 反查联系人。

  2. contact.say() 是 Wechaty 统一发消息的 API,文本/图片/链接都能发。

  3. 返回 JSON 方便前端弹提示。


7.5 按标签群发消息

// POST /send-message-all
app.post('/send-message-all', async (req, res) => {
  const { tag, message } = req.body;   // tag 为空时给全部外部联系人发
  if (!message) return res.status(400).json({ msg: 'message 不能为空' });

  try {
    const all = await bot.Contact.findAll();
    const targets = all.filter(c => {
      if (c.type() !== bot.Contact.Type.Individual) return false;
      if (!tag) return true;           // tag 为空 -> 全员
      return c.tags().some(t => t.name() === tag);
    });

    const result = await Promise.allSettled(
      targets.map(c => c.say(message))
    );

    const success = result.filter(r => r.status === 'fulfilled').length;
    res.json({ total: targets.length, success, fail: result.length - success });
  } catch (e) {
    res.status(500).json({ msg: e.message });
  }
});

解释

  1. 如果前端传了 tag,就按标签过滤;否则群发。

  2. Promise.allSettled 保证即使某条发送失败也不会中断整体流程。

  3. 返回成功/失败数量,方便做批量重试逻辑。

把以上三段代码追加到 server.js 后,重新 docker build -t wechat_data_con . && docker run -p 9898:9898 wechat_data_con,即可通过三个 HTTP 接口完成「拉用户 → 发消息」的完整闭环。

8.结束程序/切换账号登录

(1)当想更换企业微信绑定者的时候,调用下面的接口进行结束,然后重新绑定。

(2)结束程序post方法请求:http:127.0.0.1:9898/goEnd

(3)备注:上面的接口127.0.0.1根据实际服务换成自己的IP,或者绑定对应的域名。

  • 结束程序/切换账号登录,(如图)

控制台日志 ,会重新打印二维码,请重新执行上面的步骤2~……

本文关键词解释

  1. 企业微信API :指企业微信提供的应用程序接口,允许企业开发自己的应用与企业微信进行集成,实现如发送消息、获取用户列表等功能,以便更好地管理和沟通微信客户。

  2. token :在企业微信API对接中,用于验证身份和授权访问的令牌。文中提到的“puppet_workpro_867******41e7908d3ee3b44f5421”就是获取到的token示例,开发者需使用有效的token来调用相关接口。

  3. docker :是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。在本文中,需要先在服务器上安装docker环境,以便后续打包和启动应用。

  4. 二维码验证 :在企业微信API对接过程中,用于登录和身份验证的关键步骤。通过发送接口请求获取初始二维码,使用手机企业微信扫描二维码后获取验证码,再配合qrcodeKey进行验证,以完成登录操作。

  5. 用户列表接口 :指用于获取企业微信所有用户信息的接口,通过post方法请求“http://127.0.0.1:9898/get -all-user”,并传入相应的参数,如pageSize和id,即可获取包含用户各种信息(如id、name、phone等)的用户数据列表以及是否有下一页的标识。

  6. 发送消息接口(单人) :用于向单个企业微信用户发送消息的接口,通过post方法请求“http://127.0.0.1:9898/send-message”,并在body中传入消息内容(message)和用户id(id),即可实现给指定用户发送消息的功能。

  7. 发送消息接口(多人) :用于向多个企业微信用户发送消息的接口,通过post方法请求“http://127.0.0.1:9898/send-message-all”,同样需要在body中传入消息内容(message)和用户id(id),可实现批量发送消息给多人,提高消息通知的效率。

  8. 分页参数(pageSize) :在获取用户列表接口中使用,用于指定每次请求获取的用户数量,便于对大量用户数据进行分页处理,避免一次性获取过多数据导致性能问题或请求超时等情况。

  9. 状态码(status) :在用户数据中包含的一个字段,用于表示用户的状态,例如文中提到的“5”表示用户的状态码,不同的状态码可能代表用户的不同状态,如正常、禁用等,开发者可以根据状态码对用户进行相应的管理和操作。

  10. 标签(tags) :也是用户数据中的一个字段,以数组形式呈现,用于对用户进行标记和分类,方便企业根据不同的业务需求对用户群体进行细分和精准营销,比如可以根据标签筛选出特定类型的客户发送针对性的消息。

说明:原文档是我同事 陈伟俊 编写,本人觉得比较有意义文章,稍微整理输出分享给大家学习,希望这篇博客能够为你在工作中提供一些启发和指导。如果你有任何问题或需要进一步的建议,欢迎在评论区留言交流。让我们一起探索IT世界的无限可能!


博主还写了人工智能一些文章,请各位大佬批评指正:

1、人工智能、机器学习、深度学习:技术革命的深度解析

2、GPT-5:人工智能的新篇章,未来已来

3、人工智能时代,程序员如何保持核心竞争力?

4、防范AI诈骗:技术、教育与法律的共同防线

5、详细的人工智能学习路线和资料推荐

6、利用AI提高内容生产效率的五个方案

7、目前国内AI大厂大模型列表优缺点、原理、使用、案例和注意事项

8、Stable Diffusion 本地部署教程

9、数据挖掘案例分析、经典案例、技术实现方案

10、讲解人工智能在现代科技中的应用和未来发展趋势

写在最后,感谢各位大佬阅读本文!
(1)关于文档:对接完整文档wx关注回复:企业微信,即可获取;
(2)关于源码:团队经7天攻坚完成企业微信消息系统(已实践过多个次项目确保可以使用),源码象征性收200米(附答疑群+永久升级)。完整文档已开源,动手能力强者可直接参考实现。需要代码请私信「底部wx公众号:联系作者-作者微信-扫一扫添加好友」,感谢对技术价值的尊重!💡 

评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在走向自律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值