zoukankan      html  css  js  c++  java
  • 微信企业号发送监控消息【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)."
    
    
    ",FILE_APPEND);
                return false;
            }
            else
            {
                return $data;
            }
        }
    }
  • 相关阅读:
    java9新特性-9-语法改进:try语句
    10.04 FZSZ模拟Day1 总结
    10.03模拟总结
    HNOI2012 永无乡
    ZJOI2007 报表统计
    HNOI2004 宠物收养场
    HNOI2002 营业额统计
    Splay 区间反转
    Splay基本操作
    HEOI2016 树
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/7060258.html
Copyright © 2011-2022 走看看