记住用户名密码
公司这边有做监控异常并将消息发送到企业公众号的功能。
定时任务检测异常消息
将消息存入redis队列
定时处理队列异常消息
发送到微信企业号对应的部门组
这里我们来看一下微信发送过程,其他不做讨论。
简单的来说,只需要两个步骤即可:
1 获取AccessToken 2 发送消息到对应的项目部门组
一 获取AccessToken
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。
AccessToken需要用CorpID和Secret来换取,不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复获取返回相同结果。access_token至少保留512字节的存储空间。
请求说明
Https请求方式: GET https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
corpid 企业Id
corpsecret 管理组的凭证密钥
二 发送消息
企业可以主动发消息给成员
请求说明
Https请求方式: POST https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
消息型应用支持文本、图片、语音、视频、文件、图文等消息类型。主页型应用只支持文本消息类型,且文本长度不超过20个字。
参数
必须 | 说明 | |
---|---|---|
touser | 否 | 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送 |
toparty | 否 | 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
totag | 否 | 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
msgtype | 是 | 消息类型,此时固定为:text (支持消息型应用跟主页型应用) |
agentid | 是 | 企业应用的id,整型。可在应用的设置页面查看 |
content | 是 | 消息内容,最长不超过2048个字节,注意:主页型应用推送的文本消息在微信端最多只显示20个字(包含中英文) |
safe | 否 | 表示是否是保密消息,0表示否,1表示是,默认0 |
其实过程挺简单, 简单代码如下:
<?php /** * 微信公众号信息处理 */ class WeixinMessage { //corpid public $corpid = 'xxxxxx'; //sercret public $corpsecret = 'xxxxx'; //微信发消息api public $weixinSendApi = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='; /** * 请求微信Api,获取AccessToken */ public function getAccessToken() { error_reporting(E_ALL); //临时存放 并不安全 $filePath = ROOT.'cache/weixinToken.txt'; $tokenInfo = array(); if(is_file($filePath)){ $tokenInfo = json_decode(file_get_contents($filePath),TRUE); } if(!isset($tokenInfo['access_token']) || time()>$tokenInfo['expires_in']){ //更新access_token $getAccessTokenApi = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->corpid}&corpsecret={$this->corpsecret}"; $jsonString = $this->curlGet($getAccessTokenApi); $jsonInfo = json_decode($jsonString,true); if(isset($jsonInfo['access_token'])) { $jsonInfo['expires_in'] = time() + 7100; file_put_contents($filePath, json_encode($jsonInfo)); } $tokenInfo = $jsonInfo; } if(isset($tokenInfo['access_token']) && $tokenInfo['expires_in']>time()){ return $tokenInfo['access_token']; } else { return FALSE; } } /** * 发信息接口 * * @author wanghan * @param $content 发送内容 * @param $touser 接收的用户 @all全部 多个用 | 隔开 * @param $toparty 接收的群组 @all全部 多个用 | 隔开 * @param $totag 标签组 @all全部 多个用 | 隔开 * @param $agentid 应用id * @param $msgtype 信息类型 text=简单文本 */ public function send($content,$touser='@all',$toparty='',$totag='',$agentid=8,$msgtype='text') { $api = $this->weixinSendApi.$this->getAccessToken(); $postData = array( 'touser' => $touser, 'toparty' => $toparty, 'totag' => $totag, 'msgtype' => $msgtype, 'agentid' => $agentid, 'text' => array( 'content' => urlencode($content) ) ); $postString = urldecode(json_encode($postData)); $ret = $this->curlPost($api,$postString); $retArr = json_decode($ret,TRUE); if(isset($retArr['errcode']) && $retArr['errcode'] == 0) { return true; } else { return false; } } /** * Curl Post数据 * @param string $url 接收数据的api * @param string $vars 提交的数据 * @param int $second 要求程序必须在$second秒内完成,负责到$second秒后放到后台执行 * @return string or boolean 成功且对方有返回值则返回 */ function curlPost($url, $vars, $second=30) { $ch = curl_init(); curl_setopt($ch,CURLOPT_TIMEOUT,$second); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,$vars); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); // curl_setopt($ch, CURLOPT_HTTPHEADER, array( // 'Content-Type: application/json; charset=utf-8', // 'Content-Length: ' . strlen($vars)) // ); $data = curl_exec($ch); curl_close($ch); if($data) return $data; return false; } /** * CURL get方式提交数据 * 通过curl的get方式提交获取api数据 * @param string $url api地址 * @param int $second 超时时间,单位为秒 * @param string $log_path 日志存放路径,如果没有就不保存日志,还有存放路径要有读写权限 * @return true or false */ function curlGet($url,$second=30,$log_path='', $host='', $port='') { $ch = curl_init(); curl_setopt($ch,CURLOPT_TIMEOUT,$second); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); if(!empty($host)){ curl_setopt($ch,CURLOPT_HTTPHEADER,$host); } if(!empty($port)){ curl_setopt($ch,CURLOPT_PORT,$port); } $data = curl_exec($ch); $return_ch = curl_errno($ch); curl_close($ch); if($return_ch!=0) { if(!empty($log_path)) file_put_contents($log_path,curl_error($ch)."\n\r\n\r",FILE_APPEND); return false; } else { return $data; } } }
目前有 0 条留言 其中:访客:0 条, 博主:0 条