后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载EasyWeChat 6.x 的企业微信EasyWeChat\Work服务端模块封装了企业微信向开发者服务器推送消息的完整处理链路从 URL 验证、消息加解密到通讯录变更事件、批量任务事件等第三方平台推送事件的分发再到智能机器人 JSON 消息的接收与回复。本文将以 企业微信服务端文档 为骨架结合 Work/Server 源码 与 服务端测试用例 展开帮你掌握$app-getServer()的完整用法并在生产环境中正确接入企业微信回调。服务端模块的获取与基本用法与公众号一致企业微信服务端模块通过Application工厂方法获取默认情况下它会替你处理服务端验证URL 校验逻辑use EasyWeChat\Work\Application; $config [ corp_id wx3cf0f39249eb0exx, secret f1c242f4f28f735d4687abb469072axx, token easywechat, aes_key 35d4687abb469072a29f1c242xxxxxx, // 记得配置suite_id不然suite_ticket不能自动存储 suite_id ww9f1388bf664xxxxx, suite_secret reuXvCX_5FhDVm_sOslJEHRVxxxxxxx, ]; $app new Application($config); $server $app-getServer();获取到$server后直接把serve()的返回值返回给框架即可完成回调接入$response $server-serve(); return $response;$response是一个Psr\Http\Message\ResponseInterface实现具体如何适配取决于你所使用的框架如果使用 ThinkPHP、Workerman 等框架需要先把框架请求转换成 Symfony 请求再通过$app-setRequestFromSymfonyRequest($symfonyRequest)替换请求对象。企业微信服务端推送的整体设计与公众号一致公众号侧的详细用法服务端验证、中间件模式、回复消息结构等可参考 公众号服务端本篇文章重点展开企业微信特有的部分第三方平台推送事件与内置消息处理器。serve() 的完整处理流程URL 验证、消息解密与响应在 src/Work/Server.php 中serve()按以下顺序处理请求URL 验证当请求查询参数中存在echostr时使用企业微信的Encryptor对echostr进行解密并直接返回明文完成企业微信管理后台的回调 URL 校验。解密需要msg_signature、nonce、timestamp三个查询参数对应代码 serve() 中的 echostr 分支。获取原始消息通过getRequestMessage()将请求体解析为EasyWeChat\Work\Message实例。前置解密中间件prepend($this-decryptRequestMessage())把消息解密作为最先执行的中间件注册进去——它会读取msg_signature、timestamp、nonce校验签名并解密出明文内容见 decryptRequestMessage()。执行开发者注册的中间件handle()依次调用所有中间件若没有注册任何中间件则返回默认的SUCCESS文本响应。回复转换如果中间件返回的不是ResponseInterface会根据messageType选择 XML 或 JSON 两种回复转换器XML 由 RespondXmlMessage trait 负责自动补齐ToUserName、FromUserName、CreateTime并做 AES 加密JSON 由 RespondJsonMessage trait 负责。对应地tests/Work/ServerTest.php 中有三个典型测试佐证了这一流程test_it_will_handle_validation_request带echostr的 GET 请求返回解密后的明文完成 URL 验证test_it_will_validate_message带Encrypt密文节点的 POST 请求在签名校验、解密后返回SUCCESStest_it_will_response_success_without_handlers未注册任何中间件时同样返回SUCCESS。企业微信消息体的签名校验与 AES 解密由Kernel\Traits\DecryptMessage提供签名校验将token、timestamp、nonce、密文四者排序后做 SHA1再通过hash_equals与msg_signature比对校验失败会抛出BadRequestException见 DecryptMessage trait。企业微信的Encryptor基于corpId、token、aesKey构造见 src/Work/Encryptor.php。第三方平台推送事件通讯录变更与批量任务企业微信数据推送的典型场景是通讯录变更change_contact与批量任务执行完成batch_job_result事件及子类型如下事件Event子类型ChangeType含义change_contactcreate_user新增成员change_contactupdate_user更新成员change_contactdelete_user删除成员change_contactcreate_party新增部门change_contactupdate_party更新部门change_contactdelete_party删除部门change_contactupdate_tag成员标签变更batch_job_result—批量任务执行完成SDK 将这些事件预置为一系列开箱即用的便捷处理器你无需手动判断Event与ChangeType字段直接注册对应回调即可。内置消息处理器通讯录变更与批量任务处理通讯录变更事件成员、部门、标签$server-handleContactChanged(function($message, \Closure $next) { // 通讯录发生任何变更时都会进入这里 return $next($message); });处理任务执行完成事件$server-handleBatchJobsFinished(function($message, \Closure $next) { // 批量任务执行完成 return $next($message); });这些便捷方法在源码中的实现本质上是条件中间件以 handleContactChanged() 为例它通过with()注册一个闭包仅当$message-Event change_contact时才调用你传入的回调否则直接$next($message)把消息交给下一个中间件。而Message对象则通过property声明暴露了Event、InfoType、MsgType、ChangeType等字段见 src/Work/Message.php。成员变更事件// 新增成员 $server-handleUserCreated(function($message, \Closure $next) { // ... return $next($message); }); // 更新成员 $server-handleUserUpdated(function($message, \Closure $next) { // ... return $next($message); }); // 删除成员 $server-handleUserDeleted(function($message, \Closure $next) { // ... return $next($message); });部门变更事件// 新增部门 $server-handlePartyCreated(function($message, \Closure $next) { // ... return $next($message); }); // 更新部门 $server-handlePartyUpdated(function($message, \Closure $next) { // ... return $next($message); }); // 删除部门 $server-handlePartyDeleted(function($message, \Closure $next) { // ... return $next($message); });成员标签变更事件$server-handleUserTagUpdated(function($message, \Closure $next) { // ... return $next($message); });从源码可以看出这些处理器共用同一套匹配模式Event change_contact且ChangeType等于对应值时才触发回调。例如 handleUserCreated() 匹配create_userhandlePartyCreated() 匹配create_partyhandleUserTagUpdated() 匹配update_tag。测试用例test_it_will_respond_from_event_handlers也验证了在收到Event change_contact的推送后通过addEventListener(change_contact, ...)可以正确收到回调并回复消息。智能机器人事件JSON 消息的接收与回复智能机器人推送的消息体是JSON 格式而非 XML因此在获取server对象时必须显式指定消息格式为json// 指定消息格式 JSON $server $app-getServer(messageType: json); // 获取解密后的机器人消息 $message $server-getDecryptedMessage(); // 回复消息 $server-with(function($message, \Closure $next) { return [ msgtype stream, stream [ id id00001, finish true, content 信息已收到, ], ]; });这里的messageType参数对应 Application::getServer() 的构造参数默认值为xml传入json后serve()内的回复转换会走 transformJsonToReply()并以application/json响应头输出。需要说明的是JSON 回复要求返回的数组必须包含msgtype字段见 normalizeJsonResponse()否则会抛出InvalidArgumentException。关于智能机器人消息的具体字段与流式stream回复格式请以企业微信官方「智能机器人」文档为准。其它事件处理自定义中间件上面的便捷处理器只覆盖了特定事件。对于其它任何推送状态都可以通过自定义中间件自行判断Event、ChangeType、MsgType等字段$server-with(function($message, \Closure $next) { // $message-Event 事件类型如 change_contact、batch_job_result 等 // $message-ChangeType 变更子类型如 create_user、update_party 等 return $next($message); });中间件由Kernel\Traits\InteractWithHandlers提供注册与调度能力你可以链式注册多个中间件按顺序执行如果在某个中间件内直接返回了回复内容字符串或数组后续中间件将不再执行因此需要全局执行的逻辑应优先注册。回复消息时省略ToUserName、FromUserName、CreateTime等字段SDK 会在 XML 转换时自动补齐并加密。自助处理推送消息原始消息与解密消息如果你不想走中间件也可以直接获取推送消息自行处理$message $server-getRequestMessage(); // 原始消息获取解密后的消息自 6.5.0 起支持$message $server-getDecryptedMessage();$message是一个EasyWeChat\Work\Message实例继承自Kernel\Message。getDecryptedMessage()的实现位于 src/Work/Server.php它先解析请求得到原始消息再读取msg_signature、timestamp、nonce三个查询参数调用DecryptMessage::decryptMessage()完成签名校验与 AES 解密并把解密后的明文字段 merge 回消息对象因此你拿到的$message可以直接读取事件字段。处理完业务逻辑后你需要自行构造响应返回不同框架的响应写法不同请按你的框架实现。完整接入示例下面是一个整合了 URL 验证、通讯录变更监听与智能机器人 JSON 回复的完整回调入口示例use EasyWeChat\Work\Application; $config [ corp_id wx3cf0f39249eb0exx, secret f1c242f4f28f735d4687abb469072axx, token easywechat, aes_key 35d4687abb469072a29f1c242xxxxxx, suite_id ww9f1388bf664xxxxx, suite_secret reuXvCX_5FhDVm_sOslJEHRVxxxxxxx, ]; $app new Application($config); $server $app-getServer(); // XML 消息格式 // 1. 通讯录成员变更 $server-handleUserCreated(function($message, \Closure $next) { // 新成员入通讯录例如同步到本地数据库 return $next($message); }); // 2. 部门变更 $server-handlePartyUpdated(function($message, \Closure $next) { // 部门信息更新 return $next($message); }); // 3. 其它事件兜底 $server-with(function($message, \Closure $next) { // 自定义逻辑 return $next($message); }); $response $server-serve(); return $response;需要注意不要在调用serve()前向客户端输出任何内容包括 PHP 报错、BOM、调试输出否则会导致企业微信回调验证失败。企业微信完整的配置项说明http超时、重试、base_uri覆盖等可参考 企业微信实例化与配置服务端验证、中间件模式、回复消息结构等通用能力可进一步阅读 公众号服务端。赞分享后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载相关推荐EasyWeChat 企业微信服务商OpenWork服务端第三方推送事件处理与消息中间件实战指南EasyWeChat 企业微信服务商OpenWork服务端第三方推送事件处理与消息中间件实战指南 本篇技术指南以 EasyWeChat 6.x 的 Ope后端即时通讯EasyWeChat 企业微信服务端接入指南消息解密、事件回调与响应处理4.xEasyWeChat 企业微信服务端接入指南消息解密、事件回调与响应处理4.x 企业微信Work WeChat应用开启“接收消息”后所有来自企业微信后端即时通讯EasyWeChat 4.x 服务端开发完全指南消息接收、事件处理与 XML 回复实战EasyWeChat 4.x 服务端开发完全指南消息接收、事件处理与 XML 回复实战 公众号开发的核心不在调用接口而在接收消息。微信服务器会把用户后端即时通讯上一篇输入法词库迁移终极自救指南深蓝词库转换如何免费搞定 50 种格式互通下一篇SketchUp STL插件完整教程从模型到3D打印这一篇就够了创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
智能体开发必看:8大MCP开发框架对比与TaoToken配置实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 15:16:43
QQ本地AI集成实战:NapCat+Docker+AstrBot零协议折腾方案 1. 这不是“又一个QQ机器人”,而是把AI真正装进你日常聊天窗口的实践路径“我终于把AI接进了自己的QQ,不用折腾协议,不用受限于平台”——这句话在技术圈刷屏时,我第一反应是:又一个用OneBot协议套壳的玩具?… · 2026/9/25 15:16:37
zvec-grep MCP接口详解:zvec_grep_search如何让Agent少调工具、少耗Token zvec-grep MCP接口详解:zvec_grep_search如何让Agent少调工具、少耗Token 【免费下载链接】zvec-grep Local-first search across your workspace, built for humans and AI agents. 项目地址: https://gitcode.com/gh_mirrors/zv/zvec-grep
zvec-grep 是一个… · 2026/9/25 15:16:37
开源可验证的AI代码评审新范式:LLM Agent驱动的行级评审实践 1. 项目概述:这不是一个工具,而是一套可落地的开源代码评审新范式“open-code-review”这个标题乍看像某个 GitHub 仓库名,但实际它指向的是一场正在 quietly 发生的工程实践变革——把传统依赖人工、高成本、低覆盖、难沉淀的代码评审&#… · 2026/9/25 15:46:08
Kintex-7 核心板怎么选:XC7K325T 接口、DDR 与应用场景 在通信、数据采集、工业视觉和高速接口验证项目中,Kintex-7 仍然是一类成熟且容易落地的 FPGA 平台。工程师选型时常见的误区,是只比较逻辑资源数量,却忽略 DDR 容量、高速收发器、用户 IO、供电和核心板连接器。结果可能是 FPGA 资源够用&am… · 2026/9/25 15:46:08
Atlas 300V 24G推理加速卡部署YOLO实战:从环境配置到性能调优 最近项目要从GPU迁移到国产加速卡上做目标检测,手头刚好拿到一张Atlas 300V 24G,公司群里同时有人在问“Atlas 300V 24G到底是不是运算加速卡”,以及“能不能用来部署YOLO”。这两个问题恰好也是我踩坑过程中反复确认过的,干脆抽个… · 2026/9/25 15:46:02
Git远程认证失败:SSH密钥与PAT配置全指南 1. 这个报错到底在说什么?——不是密码错了,是“门禁系统”根本没给你留密码口remote: Invalid username or token. Password authentication is not supported for Git operations这行报错,我第一次看到时也下意识去改密码、重输账号&#x… · 2026/9/25 15:45:18
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37