热门标签 | 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

更多

更多详细文档可以参考



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 标题: ... [详细]
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社区 版权所有