热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wxbizmsgcrypt+php7,GitHubfuchengjx/WXBizMsgCrypt:企业微信TS(JS)加解密库

WXBizMsgCrypt企业微信TS(JS)加解密库这是自己封装的一个企业微信加解密库。WXBizMsgCrypt使用import{WXBizMsgCrypt}from.WXB

WXBizMsgCrypt

企业微信TS(JS)加解密库

这是自己封装的一个企业微信加解密库。

WXBizMsgCrypt使用

import { WXBizMsgCrypt } from "./WXBizMsgCrypt"; // 导入封装的企业微信加解密算法

const EncodingAESKey = "XXXX填写自己的机器人的EncodingAESKey XXXX"; // EncodingAESKey 用于消息体的加密,是AES密钥的Base64编码。 长度为43位的英文或数字。

const token = "chengfu"; // 可由开发者任意填写,用于生成签名。长度为3~32之间的英文或数字.

const wxbizmsgcrypt = new WXBizMsgCrypt(token, EncodingAESKey);

企业微信机器人开发经验

先随便在群里新建一个机器人。配置里会得到一个webhook地址,可用来推送消息,直接通过post请求就可以对群里进行推送消息。

推送,如果只是为了通过企业微信机器人给群内推送消息,可以通过webhook。这个比较容易,但是只能实现机器人对用户的消息交流。不能实现用户对机器人的通讯。如果要实现用户对机器人的通讯,必须要用回调了。

这里是关于回调的开发经验

回调必须先填写URL, 填写的URL需要正确响应企业微信URL的请求。填写完Token,EncodingAESKey可以随机获取。

URL是群机器人接收企业微信群推送请求的访问协议和地址,支持http或https协议。

Token可由开发者任意填写,用于生成签名。长度为3~32之间的英文或数字.

EncodingAESKey用于消息体的加密,是AES密钥的Base64编码。 长度为43位的英文或数字

d7848952dd8f1ebb83f52b8ea9325716.png

点击保存,企业微信服务器会发送一条加密的信息到填写的URL,发送方法为GET。 你需要自己的URL服务器将这个加密信息按照特定的算法解密出来 出正确的响应才能通过URL验证。

企业微信在推送消息给企业时,会对消息内容做AES加密,以XML格式POST到企业应用的URL上。

企业在被动响应时,也需要对数据加密,以XML格式返回给企业微信。

这个加解密相当的麻烦,为此企业微信官方提供了对应的加解密库,但是目前已有c++/python/php/java/c#等语言版本),所以很遗憾不支持js与ts。所以只能自己写了。我这边有写好一个ts版本的解密库,可以直接调用。感谢 http://mk.oa.com/q/51573 这里提供的方法。

如果想详细了解加解密算法原理的可以参考群机器人的消息回调文档 加解密方案说明

假设接收消息地址设置为:http://api.3dept.com/,企业微信将向该地址发送如下验证请求:

请求方式:GET

请求地址:http://api.3dept.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS×tamp=13500001234&nonce=123412323&echostr=ENCRYPT_STR

以下代码采用koa框架编写。其它node框架都可以。

import { WXBizMsgCrypt } from "./WXBizMsgCrypt"; // 导入封装的企业微信加解密算法

const EncodingAESKey = "XXXX填写自己的机器人的EncodingAESKey XXXX"; // EncodingAESKey 用于消息体的加密,是AES密钥的Base64编码。 长度为43位的英文或数字。

const token = "chengfu"; // 可由开发者任意填写,用于生成签名。长度为3~32之间的英文或数字.

// GET /getInfo

router.get("info")

.use(async (ctx) => {

const requestQuery = ctx.query;

const signature = requestQuery.msg_signature;

const { timestamp, nonce, echostr } = requestQuery; // 获取get请求信息

const wxbizmsgcrypt = new WXBizMsgCrypt(token, EncodingAESKey);

const getSignature = wxbizmsgcrypt.getSignature(timestamp, nonce, echostr);

if (signature === getSignature) {

logger.debug("signature验证成功:");

// 解密

const decrypt = wxbizmsgcrypt.decrypt(echostr);

ctx.body = decrypt;

}

});

URl验证成功后,就可以处理回调消息了。

群机器人回调消息有文本(text)、事件(event)和附件(attachment)三种类型。文本是群成员@机器人的时候会回调,事件是机器人被加入到群中或者从群里移除的时候回调 附件是用户点击markdown消息中的按钮的时候会回调。这里主要讨论文本。

假设机器人的接收消息的URL设置为http://api.3dept.com。

请求方式:POST

接收数据格式 XML

ps: 因为koa本身默认是不处理xml格式的数据。所以配置了 bodyParser,可以参考其它博客 koa搭配bodyParser处理xml数据。

import xml2json from "xml2json";

import xml2js from "xml2js"; // 使用 xml2js 可以方便地将XML格式字符串数据解析成Javascript中的对象数据。

// POST / 用户发送信息,通过post传递到服务器。

router.post("info")

.use(async (ctx) => {

// POST进行解密

const wxbizmsgcrypt = new WXBizMsgCrypt(token, EncodingAESKey); // 解密

const xmlDecryptString: any = ctx.request.body; // 收到的xml字符串

let Encrypt: any;

xml2js.parseString(xmlDecryptString, (err: any, result: any) => { // 将xml字符串转换成json对象

[Encrypt] = result.xml.Encrypt; // Encrypt = result.xml.Encrypt[0]

});

// 解密

const decrypt = wxbizmsgcrypt.decrypt(Encrypt);

// xml 2 json

const decryptJson = JSON.parse(xml2json.toJson(decrypt));

const { From, WebhookUrl, MsgType, ChatId, MsgId, ChatType } = decryptJson.xml;

// ChatType 类型group, single 判断是群内聊天还是单人聊天。

const { UserId, Name, Alias } = From; // 存取用户的别名 一般是英文名

// 这里尝试用WebHook进行主动推送

const baseUrl = WebhookUrl;

// 推送代码省略

ctx.status = 200; // 必须设置返回值为200,不然微信服务器会重复请求3次。

ctx.body = "";

}

ps: 当接收成功后,http头部返回200表示接收ok,其他错误码像302企业微信后台会一律当做失败并发起重试,重复请求3次。

文本消息 协议格式如下:

zhangsan

text

abcdabcdabcd

7017de9c9e7a3d57bb5f4900586b51d3.png

在响应本次请求的时候直接回复消息。回复的消息需要先按明文协议构造xml数据包,然后对明文消息进行加密,之后再回复最终的密文xml数据包。这个相当麻烦,建议通过webhook地址主动发送消息到群里。

提醒机器人的开发其实很简单,其实就是向这个webhook地址,按文档提供的格式发送请求,就可以实现消息推送了。最简单的示例,可以用 Node.js 的 axios 类库:

const axios = require('axios')

const baseUrl = WebhookUrl;

async function bookLunch() {

let result = await axios.post(baseUrl, {

msgtype: 'text',

text: {

content: '同学们好,我是企业微信机器人!',

mentioned_list: ['@all'] // 可以使用邮箱或者手机号码

}

})

return result.data

}

bookLunch.then((res) => {

console.log(res)

})

以上是最简单的例子。除了普通文本内容,还可以发送 markdown,图文等内容,可以自行去看文档。

如果只是做一种类似提醒机器人的服务,比如说每早提醒大家写计划,每周五傍晚提醒大家写周报,怎么可以让机器人在这些时间点出现提醒大家呢? 一般而言可能会写一个node服务,跑在服务器上。但是这样不太经济,有一种性价比更高的服务,使用云函数。 无服务器云函数地址: https://console.cloud.tencent.com/scf?rid=8

更多

更多详细文档可以参考



推荐阅读
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 本文介绍了实时流协议(RTSP)的基本概念、组成部分及其与RTCP的交互过程,详细解析了客户端请求格式、服务器响应格式、常用方法分类及协议流程,并提供了SDP格式的深入解析。 ... [详细]
  • 如题:2017年10月分析:还记得在没有智能手机的年代大概就是12年前吧,手机上都会有WAP浏览器。当时没接触网络原理,也不 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • MySQL Administrator: 监控与管理工具
    本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 网络安全实验:Telnet与SSH服务对比及抓包分析
    本实验旨在对比Telnet和SSH两种安全通信协议的服务差异,并通过搭建服务器和使用Wireshark抓包工具进行详细分析。 ... [详细]
author-avatar
手机用户2502910855
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有