ホームページ  >  記事  >  php教程  >  微信开发代码

微信开发代码

PHP中文网
PHP中文网オリジナル
2016-05-23 17:09:342009ブラウズ

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 までご連絡ください。