微信接口類

<?php
    //封裝成一個微信接口類
 
    class WeixinApi
    {
        private $appid;
        private $appsecret; 
 
        //構造方法 初始化賦值
        public function __construct($appid="",$appsecret="")
        {
            $this->appid = $appid;
            $this->appsecret = $appsecret;
        }
 
        //驗證服務器地址有效性
        public function valid()
        {
            if($this->checkSignature())
            {
                $echostr = $_GET['echostr'];//隨機的字符串
                return $echostr;
            }
            else
            {
                return "Error";
            }
        }
 
        //檢查簽名
        private function checkSignature()
        {
            //1、接收微信服務器GET方式提交過來的4個參數數據
 
            $signature = $_GET['signature'];//微信加密簽名
 
            $timestamp = $_GET['timestamp'];//時間戳
 
            $nonce = $_GET['nonce'];//隨機數
 
            //2、加密/校驗過程
            // 1. 將token、timestamp、nonce三個參數進行字典序排序;
            // bool sort  ( array &$array  [, int $sort_flags  = SORT_REGULAR  ] ) 對數組排序 
             
            $tmpArr = array(TOKEN,$timestamp,$nonce);//將上面三個參數放到一個數組裏面
            sort($tmpArr,SORT_STRING);
 
            // 2. 將三個參數字符串拼接成一個字符串進行sha1加密;
            $tmpStr = implode($tmpArr); //將數組轉化成字符串
 
            $signatureStr = sha1($tmpStr);
 
            // 3. 開發者得到加密後的字符串與signature對比。
            if($signatureStr == $signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
 
        //響應消息
        public function responseMsg()
        {
            //接收微信服務器發送POST請求到開發者服務器,攜帶的XML數據包
            $postData = $GLOBALS['HTTP_RAW_POST_DATA'];
 
            //處理xml數據包
            $xmlObj = simplexml_load_string($postData,"SimpleXMLElement",LIBXML_NOCDATA);
 
            if(!$xmlObj)
            {
                echo "";
                exit;
            }
 
            //獲取接收消息中的參數內容
            $toUserName = $xmlObj->ToUserName;//開發者微信號
            $fromUserName = $xmlObj->FromUserName;//發送方的微信號(openid)
            $msgType  = $xmlObj->MsgType;//消息類型
            switch ($msgType) {
                //接收文本消息
                case 'text':
                    //獲取文本消息的關鍵字
                    $keyword = $this->receiveText($xmlObj);  
                    //進行關鍵字回覆
                    switch($keyword)
                    {
                        case "w001":
                        case "W001":
                            return $this->replyText($xmlObj,"Hi~你好");
                            break;
                        case "w002":
                        case "W002":
                            return $this->replyText($xmlObj,"Hi~尷尬了");
                            break;
                        case "笑話":
                            $key = "dee9ebc68fd5a61f67286063932afe56";
                            return $this->replyNews($xmlObj,$this->joke_text($key));
                            break;
                        default:
                            $key = "dee9ebc68fd5a61f67286063932afe56";
                            return $this->replyNews($xmlObj,$this->joke_text($key));
                            break;
                    }       
                    break;
                //接收圖片消息
                case 'image':
                    return $this->receiveImage($xmlObj);
                    break;
                //接收事件推送
                case 'event':
                    return $this->receiveEvent($xmlObj);
                    break;
            }           
        }
 
        //接收事件推送
        public function receiveEvent($obj)
        {
            //接收事件類型
            $event = $obj->Event;
            switch ($event)
            {
                //關注事件
                case 'subscribe':
                    //下發歡迎消息
                    $newsArr = array(
                                    array(
                                        "Title"=>"作有價值的頭條資訊!",
                                        "Description"=>"把握價值頭條資訊,平常更加有談資呢!",
                                        "PicUrl"=>"http://jober.applinzi.com/news/img/news.png",
                                        "Url"=>"http://jober.applinzi.com/news/index.php"
                                    )                               
                                );
                    //回覆圖文消息
                    return $this->replyNews($obj,$newsArr);  
                    break;
                //取消關注事件
                case 'unsubscribe':
                    //帳號的解綁操做等等
                    break;
                //自定義菜單推送CLICK事件
                case 'CLICK':
                    $eventKey = $obj->EventKey;//獲取事件KEY值,與自定義菜單接口中KEY值對應
                    switch ($eventKey) 
                    {
                        case 'old':
     
                            $weixinArr = $this->history("da675ebc6a0d72920dca3f676122a693");
                            $weixinArr = array_slice($weixinArr, 0,5);
                            $newsArr = array();
 
                            foreach ($weixinArr as $item) 
                            {
                                $newsArr = array(array(
                                                    "Title" => $item['Description'],
                                                    "Description" => $item['Title'],
                                                    "PicUrl" => "http://1.jober.applinzi.com/news/img/2.jpg",
                                                    "Url" => "http://www.todayonhistory.com/"                                                   
                                                ));
                            }
                            return $this->replyNews($obj,$newsArr);
                            break;
                    }
                break;
            }
        }
 
        //接收文本消息
        public function receiveText($obj)
        {
            $content = trim($obj->Content);//文本消息的內容
            return $content;
        }
 
        //接收圖片消息
        public function receiveImage($obj)
        {
            $picUrl = $obj->PicUrl;//圖片的連接
            $mediaId = $obj->MediaId;//圖片消息媒體id
            return $this->replyImage($obj,$mediaId);
        }
 
        //回覆圖片消息
        public function replyImage($obj,$mediaId)
        {
            $replyXml = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[image]]></MsgType>
                            <Image>
                                <MediaId><![CDATA[%s]]></MediaId>
                            </Image>
                        </xml>";
            return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$mediaId);
                     
        }
 
        //回覆文本消息
        public function replyText($obj,$content)
        {
            $replyXml = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[text]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                        </xml>";
            return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$content);
        }
         
        //回覆圖文消息
        public function replyNews($obj,$newsArr)
        {
            //判斷是否爲數組類型
            if(!is_array($newsArr))
            {
                return;
            }
            // 判斷數組是否爲空數組
            if(!$newsArr)
            {
                return;
            }
            $itemStr = "";
            //定義item模板
            $itemXml = "<item>
                            <Title><![CDATA[%s]]></Title> 
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                        </item>";
            foreach($newsArr as $item)
            {
                $itemStr .= sprintf($itemXml,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
            }
            $replyXml = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[news]]></MsgType>
                            <ArticleCount>".count($newsArr)."</ArticleCount>
                            <Articles>".$itemStr."</Articles>
                        </xml>";  
            return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time());         
        }
 
        //封裝https請求(GET和POST)
     
        protected function https_request($url,$data=null)
        {
            //一、初始化curl
            $ch = curl_init();
 
            //二、設置傳輸選項
            curl_setopt($ch, CURLOPT_URL, $url);//請求的url地址
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//將請求的結果以文件流的形式返回
             
            if(!empty($data))
            {
                curl_setopt($ch,CURLOPT_POST,1);//請求POST方式
                curl_setopt($ch,CURLOPT_POSTFIELDS,$data);//POST提交的內容
            }
 
            //三、執行請求並處理結果
            $outopt = curl_exec($ch);
 
            //把json數據轉化成數組
            $outoptArr = json_decode($outopt,TRUE);
 
            //四、關閉curl
            curl_close($ch);
 
            //若是返回的結果$outopt是json數據,則須要判斷一下
            if(is_array($outoptArr))
            {   
                return $outoptArr;
            }
            else
            {
                return $outopt;
            }           
        }
 
        public function juhe_weixin($key,$type)
        {
            $url ="http://v.juhe.cn/toutiao/index?type={$type}&key={$key}";
            $result = $this->https_request($url);
            if($result['error_code'] == 0)
            {
                return $result['result']['data'];
            }
            else
            {
                return array();
            }
        }
 
        //聚合數據-獲取最新趣圖
        public function joke_text($key,$pagesize=10)
        {
            $url = "http://japi.juhe.cn/joke/img/text.from?key={$key}&pagesize={$pagesize}";
            $jokeArr = $this->https_request($url);
            $resultArr = $jokeArr['result']['data'];
            // $content = $resultArr[0]['content'];
            // return $this->replyText($xmlObj,$content);
             
            $newsArr = array();
            //判斷笑話接口是否獲取數據
            if($jokeArr['error_code'] == 0)
            {
                foreach($resultArr as $item)
                {
                    $newsArr[] = array(
                                "Title"=>$item['content'],
                                "Description"=>$item['updatetime'],
                                "PicUrl"=>$item['url'],
                                "Url"=>$item['url']
                            );
                }               
            }
            return $newsArr;
        }
 
 
        //聚合數據-獲取歷史上的今天
             
        public function history($key)
        {
            $m = idate('m');
            $d = idate('d');
            $day = "{$m}/{$d}";
         
            $url = "http://v.juhe.cn/todayOnhistory/queryEvent.php?key={$key}&date={$day}";
            $historyArr = $this->https_request($url);
            $resultArr = $historyArr['result'];
            // $content = $resultArr['title'];
            // return $this->replyText($xmlObj,$content);
             
            $newsArr = array();
            //判斷接口是否獲取數據
            if($jokeArr['error_code'] == 0)
            {
                foreach($resultArr as $item)
                {
                    $newsArr[] = array(
                                "Title"=>$item['title'],
                                "Description"=>$item['date'],
                                "PicUrl"=>"",
                                "Url"=>""
                            );
                }               
            }
            return $newsArr;
        }
 
        public function fund($key)
        {
 
            $url = "http://japi.juhe.cn/jingzhi/query.from?key={$key}";
            $fundArr = $this->https_request($url);
            $resultArr = $fundArr['result'];
            // $content = $resultArr['title'];
            // return $this->replyText($xmlObj,$content);
             
            $newsArr = array();
            //判斷接口是否獲取數據
            if($jokeArr['error_code'] == 0)
            {
                foreach($resultArr as $item)
                {
                    $newsArr[] = array(
                                "Title"=>$item['day'],
                                "Description"=>$item['title'],
                                "PicUrl"=>"",
                                "Url"=>"http://www.baidu.com"
                            );
                }               
            }
            return $newsArr;
        }
 
        /**
            *獲取基礎支持裏面的接口調用憑證access_token並緩存access_token
            *@return access_token string 接口憑證
        **/
        public function getAccessToken()
        {
            //獲取memcache緩存的access_token
            $access_token = $this->_memcache_get("access_token");
            //若是緩存的access_token失效
            if(!$access_token)
            {   
                //若是失效調用獲取接口憑證來獲取access_token
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}";
                $outoptArr = $this->https_request($url);
                if(!isset($outoptArr['errcode']))
                {
                    //memcache緩存access_token
                    $this->_memcache_set("access_token",$outoptArr['access_token'],7000);
                    return $outoptArr['access_token'];
                }
            }   
            return $access_token;
        }
 
        //初始化memcache
        private function _memcache_init()
        {
            $mmc = new Memcache;
            $ret = $mmc -> connect();
            if ($ret == false) 
            {
                return;
            } 
            return $mmc;
        }
 
        //設置memcache
        private function _memcache_set($key,$value,$time=0)
        {
            $mmc = $this->_memcache_init();
            $mmc -> set($key,$value,0,$time);
        }
 
        //獲取memcahce
        private function _memcache_get($key)
        {
            $mmc = $this->_memcache_init();  
            return $mmc -> get($key);    
        }
 
        //自定義菜單建立
 
        public function menu_create($data)
        {
            $access_token = $this->getAccessToken();
            //自定義菜單建立接口地址
            $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";
            return $this->https_request($url,$data);
        }
 
        //自定義菜單刪除
        public function menu_delete()
        {
            $access_token = $this->getAccessToken();
            $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={$access_token}";
            return $this->https_request($url);
        }
    }
?>
相關文章
相關標籤/搜索