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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)