我们在企业微信的使用中肯定会用到自建应用,自建应用使用最多的功能就是消息的推送,使用的场景也有很多,例如:在公司内网的程序,可以监控员工在什么时候进行了敏感操作,比如某管理员删除了帐号或者其他内容,可以在进行操作时候推送一条消息到自建应用上。自建应用的消息推送支持发送到指定部门的全部成员或者指定一个或多个成员等。今天我们主要是探究通过PHP实现自建应用的消息收发。

具体的技术文档以及加解密的实现原理可查看企业微信官网文档企业微信-接收消息与事件、企业微信-加解密方案说明。官方的技术文档中提供了PHP等语言的加解密的库,自己去下载即可。下载地址

打开企业微信自建应用详情页,找到第二个接收消息,然后点击设置API接收,即可到下一个界面。

打开API接收消息界面之后,会看到有三个参数需要我们填写,第一个填写你的接口地址,后面两个可以自己填写,也可以随机生成。这两个参数在第一次验证URL有效性以及后面的加解密会用到。

第一步:验证URL有效性

当点击“保存”提交以上信息时,企业微信会发送一条验证消息到填写的URL,发送方法为GET。企业的接收消息服务器接收到验证请求后,需要作出正确的响应才能通过URL验证。

假设你的api设置的地址为https://api.3dept.com,那么企业微信会提交如下请求:http://api.3dept.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS&timestamp=13500001234&nonce=123412323&echostr=ENCRYPT_STR

参数 必须 说明
msg_signature 企业微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
timestamp 时间戳
nonce 随机数
echostr 加密的字符串。需要解密得到消息内容明文,解密后有random、msg_len、msg、CorpID四个字段,其中msg即为消息内容明文

我们首先通过$_GET方式接收这四个参数。

include_once "WXBizMsgCrypt.php";
$encodingAesKey = "你设置的encodingAesKey";
$token = "你设置的token";
$corpId = "企业微信ID";$sReqMsgSig = $_GET['msg_signature'];
$sReqTimeStamp = $_GET['timestamp'];
$sReqNonce = $_GET['nonce'];
$sVerifyEchoStr = $_GET['echostr'];

接收到参数之后我们需要对msg_signature进行效验,然后解析echostr。企业微信官方已经为我们写好了加解密的方法,我们无需深度了解其实现原理,直接调用即可。

$sEchoStr = "";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$errCode = $wxcpt->VerifyURL($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {echo $sEchoStr;//原样返回明文消息内容
} else {print("ERR: " . $errCode . "\n\n");
}

这样写好之后,直接点击保存即可验证成功。

第二步:接收消息

当我们验证完URL之后,我们就能直接发送消息到企业微信了。当我们发送一条消息到企业微信时,验证通过的URL会收到如下的回调消息:

POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915debcba66cb864d751f3e6&timestamp=1409659813&nonce=1372623149 HTTP/1.1
Host: qy.weixin.qq.com
Content-Length: 613
<xml>
<ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt>
<AgentID><![CDATA[218]]></AgentID>
</xml>

同样包括了3个通过GET方式传递的参数,消息体签名(msg_signature),时间戳(timestamp)以及随机数字串(nonce),还有一个POST请求的数据,需要进行xml解析,并将<Encrypt>标签的内容进行解密。

$sReqData = file_get_contents("php://input");
$sMsg = "";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$errCode = $wxcpt->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $sMsg);
if ($errCode == 0) {try {$test = new SimpleXMLElement($sMsg);$Content = strval($test->Content);//解析出的明文内容$FromUserName = strval($test->FromUserName);//发送消息的人$CreateTime = strval($test->CreateTime);$MsgId = strval($test->MsgId);} catch (Exception $e) {$Content = "错误!";}
} else {print("ERR: " . $errCode . "\n\n");
}

使用SimpleXMLElement方法来解析返回的XML。$Content就是返回的消息体中解析出来的内容。

第三步:发送消息

我们发送的消息同样也需要使用XML格式发送给企业微信的服务器。

<xml>
<ToUserName><![CDATA[{$FromUserName}]]></ToUserName>//发送给谁,可以直接使用接收消息步骤中发送消息的人
<FromUserName><![CDATA[{$corpId}]]></FromUserName>//填写企业微信ID
<CreateTime>{$CreateTime}</CreateTime>//时间戳,可以直接填写接收消息中的同内容
<MsgType><![CDATA[text]]></MsgType>//消息类型,默认填写text
<Content><![CDATA[{$sendText}]]></Content>//需要发送的内容
<MsgId>{$MsgId}</MsgId>//消息ID,填写接收的消息一样的内容即可
<AgentID>{$agentid}</AgentID>//应用ID
</xml>

发送消息比较简单,直接用写好的方法将消息加密然后发送即可。

$sRespData = "<xml><ToUserName><![CDATA[{$FromUserName}]]></ToUserName><FromUserName><![CDATA[{$corpId}]]></FromUserName><CreateTime>{$CreateTime}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{$sendText}]]></Content><MsgId>{$MsgId}</MsgId><AgentID>{$agentid}</AgentID></xml>";
$sEncryptMsg = ""; //xml格式的密文
$errCode = $wxcpt->EncryptMsg($sRespData, $sReqTimeStamp, $sReqNonce, $sEncryptMsg);
if ($errCode == 0) {// var_dump($sEncryptMsg);echo $sEncryptMsg;
} else {print("ERR: " . $errCode . "\n\n");
}

执行EncryptMsg方法就能成功将消息发送给指定的人。

企业微信自建应用通过PHP进行收发消息相关推荐

  1. 企业微信自建应用获取用户信息

    记录一下企业微信自建应用获取用户信息开发过程: 1.第一步,获取授权code,这个在原来首页开发不太合适,在进入首页前新建页面进行授权,点击页面按钮进行授权.需要拼接的授权url.其中corpid是企 ...

  2. 企业微信自建应用审批接口开发

    再说一次,企业微信开发文档很坑,特别坑,坑成鬼了. 有时候浪费很长时间改bug,查来查去,都没有发现到底哪里错了,查资料,搜资料,询问大神,都没有发现bug.改到最后都抑郁了,才发现用浏览器访问根本就 ...

  3. 企业微信-自建应用一:介绍与创建

    什么是自建应用? 一句话概括就是企业内部自用的应用 创建自建应用 登录企业微信桌面版,点击"开发者中心" 进入到开发者中心,点击"立即创建" 登录企业微信管理后 ...

  4. 企业微信自建应用开发初探

    企业微信是腾讯推出的一个新的办公协作平台,通过与微信一致的沟通体验,为企业员工提供最基础和最实用的办公服务.同时企业微信作为一个开发平台,企业可以根据需要开发定制自己的企业应用集成到企业微信上.ABC ...

  5. 通过企业微信内建应用,python搭建重置域账户密码

    企业微信重置域账户密码 1.打开企业微信应用,发送用户名,等待几秒,后台重置完密码,自动返回新密码 2.工作原理: 1.企业微信自建应用程序 2.设置应用api信息 3.防火墙映射服务端IP地址,后端 ...

  6. 企业微信自建应用(JS-SDK):聊天工具栏分享消息到会话

    目录 一.目的 一.核心代码 二.可能遇到 1.不起眼的小字 2.不起眼的小字(版本限制) 3.不起眼的小字(jsApiList) 4.不起眼的小字(判断入口环境) 5.不起眼的小字(后台配置) 6. ...

  7. 企业微信 自建服务器,企业微信单点登录自建系统过程记录

    项目上接到一个需求,为方便员工登录各种内部系统,统一以企业微信为入口,在企业微信面板中增加系统跳转链接实现单点登录. 整体思路比较简单,大致如下: 1.由于自建系统和企业微信的用户ID不同,所以需要建 ...

  8. 企业微信自建引用接口调用报错[ErrorCode:301002]not allow operate another agent with this accesstoken

    1. 首先,在构建构造网页授权链接时,其中的参数agentid需要和你的自建应用id一致. 使用管理员账号登录网页版企业微信,查看AgentId 2. 使用accessToken对比agentid是否 ...

  9. 企业微信自建应用授权登录demo

    <?php /*** Created by PhpStorm.* User: liubao* Date: 2018/8/29 更新时间v1:2018-9-29 v1.1:2020-08-10* ...

最新文章

  1. TensorFlow神经网络集成方案
  2. 算法提高 c++_ch04_02_修正版
  3. python游戏编程快速上手第四版dragon_《Python游戏编程快速上手》——导读
  4. Hadoop报错信息:Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 4.
  5. 《Effective STL》学习笔记(第三部分)
  6. CSS设置文本字体居中
  7. JDK 8的启发性Javadoc
  8. 【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得
  9. Mybatis学习笔记13 - 动态sql之set标签
  10. 出海,这可能会是国产浏览器产品的唯一出路
  11. 410. 分割数组的最大值
  12. C++函数内部实现的规则
  13. php鼠标 显示图片,鼠标放在图片上显示大图的JS代码
  14. laravel nginx_在nginx上用FastCGI解析PHP
  15. 拓端tecdat|python卷积神经网络人体图像识别
  16. TypeScript学习笔记(七):模块
  17. DEVCON.EXE管理USB
  18. ElasticSearch8.1.2 ik分词器
  19. 刷题:牛客-快速入门篇
  20. AI率先引领手机“视”界革命——旷视联合IDC最新出炉AI+手机行业白皮书!

热门文章

  1. Carbon 在 Laravel 中的简单使用
  2. 算法和数据结构(Java语言)
  3. cut final pro入门教程_Final Cut Pro X视频教程 fcpx入门到精通自学零基础剪辑教材
  4. 行人重识别论文(五)Beyond Part Models: Person Retrieval with Refined Part Pooling
  5. CEPH分布式存储介绍与原理架构概述
  6. 全球及中国电动汽车产业产销规模与十四五发展方向调研报告2022版
  7. 关于使用X/Y/Z的方式加载地图Tile瓦片的知识总结
  8. python中debug断点调试
  9. Lua脚本快速上手(附示例程序代码)
  10. Quartz之Trigger