公司這邊有做監控異常並將消息發送到企業公眾號的功能。大概如下:
1 定時任務檢測異常消息 2 將消息存入redis隊列 3 定時處理隊列異常消息 4 發送到微信企業號對應的部門組
這里我們來看一下微信發送過程,其他不做討論。
簡單的來說,只需要兩個步驟即可:
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; } } }