微信企業號發送監控消息【php】


公司這邊有做監控異常並將消息發送到企業公眾號的功能。大概如下:

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;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM