搜尋
首頁php教程PHP源码微信开发代码

微信开发代码

May 23, 2016 pm 05:09 PM

php代码

<?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[&#39;echostr&#39;];//随机的字符串
                return $echostr;
            }
            else
            {
                return "Error";
            }
        }
 
        //检查签名
        private function checkSignature()
        {
            //一、接收微信服务器GET方式提交过来的4个参数数据
 
            $signature = $_GET[&#39;signature&#39;];//微信加密签名
 
            $timestamp = $_GET[&#39;timestamp&#39;];//时间戳
 
            $nonce = $_GET[&#39;nonce&#39;];//随机数
 
            //二、加密/校验过程
            // 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[&#39;HTTP_RAW_POST_DATA&#39;];
 
            //处理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 &#39;text&#39;:
                    //获取文本消息的关键字
                    $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 &#39;image&#39;:
                    return $this->receiveImage($xmlObj);
                    break;
                //接收事件推送
                case &#39;event&#39;:
                    return $this->receiveEvent($xmlObj);
                    break;
            }           
        }
 
        //接收事件推送
        public function receiveEvent($obj)
        {
            //接收事件类型
            $event = $obj->Event;
            switch ($event)
            {
                //关注事件
                case &#39;subscribe&#39;:
                    //下发欢迎消息
                    $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 &#39;unsubscribe&#39;:
                    //账号的解绑操作等等
                    break;
                //自定义菜单推送CLICK事件
                case &#39;CLICK&#39;:
                    $eventKey = $obj->EventKey;//获取事件KEY值,与自定义菜单接口中KEY值对应
                    switch ($eventKey) 
                    {
                        case &#39;old&#39;:
     
                            $weixinArr = $this->history("da675ebc6a0d72920dca3f676122a693");
                            $weixinArr = array_slice($weixinArr, 0,5);
                            $newsArr = array();
 
                            foreach ($weixinArr as $item) 
                            {
                                $newsArr = array(array(
                                                    "Title" => $item[&#39;Description&#39;],
                                                    "Description" => $item[&#39;Title&#39;],
                                                    "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[&#39;Title&#39;],$item[&#39;Description&#39;],$item[&#39;PicUrl&#39;],$item[&#39;Url&#39;]);
            }
            $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)
        {
            //1、初始化curl
            $ch = curl_init();
 
            //2、设置传输选项
            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提交的内容
            }
 
            //3、执行请求并处理结果
            $outopt = curl_exec($ch);
 
            //把json数据转化成数组
            $outoptArr = json_decode($outopt,TRUE);
 
            //4、关闭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[&#39;error_code&#39;] == 0)
            {
                return $result[&#39;result&#39;][&#39;data&#39;];
            }
            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[&#39;result&#39;][&#39;data&#39;];
            // $content = $resultArr[0][&#39;content&#39;];
            // return $this->replyText($xmlObj,$content);
             
            $newsArr = array();
            //判断笑话接口是否获取数据
            if($jokeArr[&#39;error_code&#39;] == 0)
            {
                foreach($resultArr as $item)
                {
                    $newsArr[] = array(
                                "Title"=>$item[&#39;content&#39;],
                                "Description"=>$item[&#39;updatetime&#39;],
                                "PicUrl"=>$item[&#39;url&#39;],
                                "Url"=>$item[&#39;url&#39;]
                            );
                }               
            }
            return $newsArr;
        }
 
 
        //聚合数据-获取历史上的今天
             
        public function history($key)
        {
            $m = idate(&#39;m&#39;);
            $d = idate(&#39;d&#39;);
            $day = "{$m}/{$d}";
         
            $url = "http://v.juhe.cn/todayOnhistory/queryEvent.php?key={$key}&date={$day}";
            $historyArr = $this->https_request($url);
            $resultArr = $historyArr[&#39;result&#39;];
            // $content = $resultArr[&#39;title&#39;];
            // return $this->replyText($xmlObj,$content);
             
            $newsArr = array();
            //判断接口是否获取数据
            if($jokeArr[&#39;error_code&#39;] == 0)
            {
                foreach($resultArr as $item)
                {
                    $newsArr[] = array(
                                "Title"=>$item[&#39;title&#39;],
                                "Description"=>$item[&#39;date&#39;],
                                "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[&#39;result&#39;];
            // $content = $resultArr[&#39;title&#39;];
            // return $this->replyText($xmlObj,$content);
             
            $newsArr = array();
            //判断接口是否获取数据
            if($jokeArr[&#39;error_code&#39;] == 0)
            {
                foreach($resultArr as $item)
                {
                    $newsArr[] = array(
                                "Title"=>$item[&#39;day&#39;],
                                "Description"=>$item[&#39;title&#39;],
                                "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[&#39;errcode&#39;]))
                {
                    //memcache缓存access_token
                    $this->_memcache_set("access_token",$outoptArr[&#39;access_token&#39;],7000);
                    return $outoptArr[&#39;access_token&#39;];
                }
            }   
            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);
        }
    }
?>
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境