企业号微信对接自己服务器
1.本地服务器与微信服务器的信任
- 本地具有独立外网ip服务器获取微信服务器的ip段
#CropID、Secret微信企业号中“设置--功能--权限管理”可以找到
CropID='*******'
Secret='*******'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G "$GURL" | awk -F\" '{print $4}')
/usr/bin/curl "https://qyapi.weixin.qq.com/cgi-bin/getcallbackip?access_token=$Gtoken"
- 在iptables 加入如下例子:
#将取得的ip加入信任中(使其可以访问到这个服务器上的资源)
-A INPUT -s 101.226.103.0/24 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
2.本地部署微信加密文件
在本地服务器(具有外网ip)部署php+nginx,使其可以在公网访问
- 下载加解密库部署在自己服务器上,使其可以在网络上访问,本文以php为例
//filename:index.php
//回调验证
<?php
//添加腾讯提供的接口文件WXBizMsgCrypt.php由上文连接官方下载
include_once "inc/WXBizMsgCrypt.php";
//设置自己企业号的相关参数
$encodingAesKey="";//企业微信中应用中心开回调模式时自定义
$corpId="";//企业微信中设置找
$token="";//企业微信中应用中心开回调模式时自定义
//获取待验证的参数
$sVerifyMsgSig = $_GET["msg_signature"];
$sVerifyTimeStamp = $_GET["timestamp"];
$sVerifyNonce = $_GET["nonce"];
$sVerifyEchoStr = $_GET["echostr"];
//以企业号参数为参数生成解码对象
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
//进行地址解析
$errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {
//如果没有异常就返回加密的echostr的明文
echo $sEchoStr;
} else {
//出现异常就返回异常编码
echo $errCode;
}
?>
- 微信所需文件路径结构
├── inc
│ ├── errorCode.php
│ ├── pkcs7Encoder.php
│ ├── sha1.php
│ ├── WXBizMsgCrypt.php
│ └── xmlparse.php
├── index.php
3.开启回调模式
-
在自己创建的应用上开启回调模式填入URL
验证成功后将index.php改成如下可实现接收信息并做出反馈
<?php
include_once "inc/WXBizMsgCrypt.php";
//用户参数
$encodingAesKey = "";
$token = "";
$corpId = "";
//回调认证
$sVerifyMsgSig =$_GET["msg_signature"];
$sVerifyTimeStamp = $_GET["timestamp"];
$sVerifyNonce = $_GET["nonce"];
$sVerifyEchoStr =$_GET["echostr"];
$EchoStr = "";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$errCode = $wxcpt->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {
print $sEchoStr;
} else {
print($errCode . "\n\n");
}
//接收信息
$sReqData = file_get_contents("php://input");
$sMsg = ""; // 解析之后的明文
$errCode = $wxcpt->DecryptMsg($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sReqData, $sMsg);
if ($errCode == 0) {
file_put_contents('msg/'.$sVerifyTimeStamp.'.txt', $sMsg);//明文输出收到的xml
$xml = new DOMDocument();
$xml->loadXML($sMsg);
$content = $xml->getElementsByTagName('Content')->item(0)->nodeValue;//文字信息的内容
$FromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; //发送用户的id
$MsgType = $xml->getElementsByTagName('MsgType')->item(0)->nodeValue; //消息类型
$Event = $xml->getElementsByTagName('Event')->item(0)->nodeValue; //事件类型
$ScanResult = $xml->getElementsByTagName('ScanResult')->item(0)->nodeValue; //扫描结果
$PicUrl = $xml->getElementsByTagName('PicUrl')->item(0)->nodeValue;//图片链接
$Latitude = $xml->getElementsByTagName('Latitude')->item(0)->nodeValue; //经度
$Longitude = $xml->getElementsByTagName('Longitude')->item(0)->nodeValue;//纬度
$Precision = $xml->getElementsByTagName('Precision')->item(0)->nodeValue; //精度
$MediaId = $xml->getElementsByTagName('MediaId')->item(0)->nodeValue;//资源ID
} else {
print($errCode . "\n\n");
}
//根据接收信息做反馈-文字
if($MsgType == "text") {
switch($content){
case "1":
$mycontent="我收到了数字1";
$MsgType=text;
break;
case "2":
$mycontent="我收到了数字2";
$MsgType=text;
break;
case "3":
$mycontent="我收到了数字3";
$MsgType=text;
break;
default :
$mycontent="输入123试试";//默认回复
$MsgType=text;
break;
}
}
//返回文字信息
/*$sRespData =
"<xml>
<ToUserName><![CDATA[".$reqFromUserName."]]></ToUserName>
<FromUserName><![CDATA[".$corpId."]]></FromUserName>
<CreateTime>".sReqTimeStamp."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[".$mycontent."]]></Content>
</xml>";'*/
//返回图文新闻信息,更多方法参考官方接口文档,被动响应消息里边的代码更换XML文件
$sRespData =
"<xml>
<ToUserName><![CDATA[".$reqFromUserName."]]></ToUserName>
<FromUserName><![CDATA[".$corpId."]]></FromUserName>
<CreateTime>".sReqTimeStamp."</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[测试]]></Title>
<Description><![CDATA[详细内容]]></Description>
<PicUrl><![CDATA[http://www.baidu.com/images/logo.jpg]]></PicUrl>
<Url><![CDATA[http://www.baidu.com]]></Url>
</item>
</Articles>
</xml>";
$sEncryptMsg = ""; //xml格式的密文
$errCode = $wxcpt->EncryptMsg($sRespData, $sReqTimeStamp, $sReqNonce, $sEncryptMsg);
if ($errCode == 0) {
print($sEncryptMsg);
} else {
print($errCode . "\n\n");
}
?>
-
自己可以根据业务需求,接收到相应信息后,执行本地脚本并返回操作结果实现微信控制zabbix。