微信企业号发送监控消息【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;
        }
    }
}

 

posted @ 2017-06-21 16:38  hongxinerke  阅读(2964)  评论(0编辑  收藏  举报