当前位置:首页 > PHP教程 > php高级应用 > 列表

基于微信公众平台开发SDK(demo)扩展例子

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-22 10:36:22 浏览: 评论:0 

该扩展基于官方的微信公众平台SDK,这里只做了简单地封装,实现了一些基本的功能,如天气查询,翻译,自动聊天机器人,自定义菜单接口)仅供学习之用.代码如下:

  1. define("TOKEN", "xingans"); 
  2.  
  3. $wechatObj = new wechatCallbackapiTest(); 
  4.  
  5. $wechatObj->responseMsg(); 
  6.  
  7. class wechatCallbackapiTest 
  8. { 
  9.    //签名验证公共接口 
  10.    public function valid() 
  11.    { 
  12.        $echoStr = $_GET["echostr"]; 
  13.  
  14.        if($this->checkSignature()){ 
  15.            echo $echoStr; 
  16.            exit; 
  17.        } 
  18.    } 
  19.  
  20.    //主入口处理函数 
  21.    public function responseMsg() 
  22.    { 
  23.        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
  24.  
  25.        if (!emptyempty($postStr)){ 
  26.                    
  27.            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
  28.            
  29.            $msgType=trim($postObj->MsgType); 
  30.            
  31.            switch($msgType){ 
  32.                case 'text': 
  33.                    $resultStr=$this->handleText($postObj); 
  34.                    break; 
  35.                case 'event': 
  36.                    $resultStr=$this->handleEvent($postObj); 
  37.                    break; 
  38.                default: 
  39.                    $resultStr=$this->handleDefault($postObj); 
  40.                    break; 
  41.            } 
  42.            
  43.            echo $resultStr; 
  44.            
  45.        }else { 
  46.            echo "Error"; 
  47.            exit; 
  48.        } 
  49.    } 
  50.    
  51.    //处理文本消息 
  52.       private function handleText($obj){ 
  53.           
  54.           $keyword=trim($obj->Content); 
  55.           
  56.           if(preg_match('/天气/',$keyword)){ 
  57.               $contentStr=$this->handleWeather($obj); 
  58.           }elseif(preg_match('/翻译/',$keyword)){ 
  59.               $contentStr=$this->handleTranslation($obj); 
  60.           }else{ 
  61.               $contentStr=$this->handleChat($obj); 
  62.           } 
  63.           
  64.           return $this->handleStr($obj,$contentStr); 
  65.           
  66.       } 
  67.       
  68.       //处理天气 
  69.       private function handleWeather($obj){ 
  70.           $keyword=mb_substr($obj->Content,-2,2,'utf-8'); 
  71.           $zone=mb_substr($obj->Content,0,-2,'utf-8'); 
  72.           
  73.           if($keyword=='天气' && !emptyempty($zone)){ 
  74.           
  75.               $zoneArr=json_decode(file_get_contents('http://api.k780.com:88/?app=weather.city&format=json'),true); 
  76.               $zoneArr=$zoneArr['result']; 
  77.               
  78.               $cityId=''; 
  79.               
  80.               foreach($zoneArr as $value){ 
  81.                   if($zone==$value['citynm']){ 
  82.                       $cityId=$value['weaid']; 
  83.                       break; 
  84.                   } 
  85.               } 
  86.               
  87.               if(!emptyempty($cityId)){ 
  88.                   $data=file_get_contents("http://api.k780.com:88/?app=weather.today&weaid=$cityId&appkey=10638&sign=3736578f099375665f9f141a6326b757&format=json"); 
  89.  
  90.                   $data=json_decode($data); 
  91.                   
  92.                   $contentStr="今天是:".$data->result->days.",".$data->result-> week.",".$data->result->citynm."天气:".$data->result->weather."n温度:".$data->result->temperature.", 
  93.                   ".$data->result->wind_direction.",".$data->result->wind_power.", 最低温度:".$data->result->temp_low.",最高温度:".$data->result->temp_high; 
  94.               }else{ 
  95.                   $contentStr='找不到输入的城市!'; 
  96.               }    
  97.               
  98.           }else{ 
  99.               $contentStr='输入的查询格式不正确!'; 
  100.           } 
  101.           
  102.           return $contentStr; 
  103.       } 
  104.       
  105.       //处理翻译 
  106.       private function handleTranslation($obj){ 
  107.           $keyword=mb_substr($obj->Content,0,2,'utf-8'); 
  108.        $words=mb_substr($obj->Content,2,220,'utf-8'); 
  109.        
  110.        if($keyword=='翻译' && !emptyempty($words)){ 
  111.            $data=file_get_contents('http://fanyi.youdao.com/openapi.do?keyfrom=zfsblog&key=364295447&type=data&doctype=json&version=1.1&q='.urlencode($words));        
  112.            $data=json_decode($data,true); 
  113.            
  114.            switch($data['errorCode']){ 
  115.                case '0': 
  116.                    $contentStr=$data['translation'][0]; 
  117.                    break; 
  118.                case '20': 
  119.                    $contentStr='要翻译的文本过长'; 
  120.                    break; 
  121.                case '30': 
  122.                    $contentStr='无法进行有效的翻译'; 
  123.                    break; 
  124.                case '40': 
  125.                    $contentStr='不支持的语言类型'; 
  126.                    break; 
  127.                case '50': 
  128.                    $contentStr='无效的key'; 
  129.                    break; 
  130.                default: 
  131.                    $contentStr='Error'; 
  132.                    break; 
  133.            } 
  134.            
  135.        }else{ 
  136.            $contentStr='输入的翻译格式不正确!'; 
  137.        } 
  138.        
  139.        return $contentStr; 
  140.       } 
  141.       
  142.       //处理聊天信息 
  143.       private function handleChat($obj){ 
  144.           $keywords=$obj->Content; 
  145.           
  146.           $curlPost=array("chat"=>$keywords); 
  147.    
  148.        $ch = curl_init();//初始化curl 
  149.        curl_setopt($ch, CURLOPT_URL,'http://www.xiaojo.com/bot/chata.php');//抓取指定网页 
  150.        curl_setopt($ch, CURLOPT_HEADER, 0);//设置header 
  151.        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 
  152.        curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 
  153.        curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); 
  154.        $data = curl_exec($ch);//运行curl 
  155.        curl_close($ch); 
  156.        
  157.        if(!emptyempty($data)){ 
  158.            $contentStr=$data; 
  159.        }else{ 
  160.            $ran=rand(1,5); 
  161.            
  162.            switch($ran){ 
  163.                case 1: 
  164.                    $contentStr= "小九今天累了,明天再陪你聊天吧"; 
  165.                    break; 
  166.                case 2: 
  167.                    $contentStr= "小九睡觉喽~~"; 
  168.                    break; 
  169.                case 3: 
  170.                    $contentStr= "呼呼~~呼呼~~"; 
  171.                    break; 
  172.                case 4: 
  173.                    $contentStr= "你话好多啊,不跟你聊了"; 
  174.                    break; 
  175.                case 5: 
  176.                    $contentStr= "你话好多啊,不跟你聊了"; 
  177.                    break; 
  178.            } 
  179.        } 
  180.        
  181.        return $contentStr; 
  182.       } 
  183.       
  184.       //创建自定义菜单 
  185.       public function createMenu($data,$token){ 
  186.           $ch = curl_init(); 
  187.        
  188.         curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token); 
  189.         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
  190.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
  191.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
  192.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 
  193.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
  194.         curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 
  195.         curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
  196.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
  197.          
  198.         $result = curl_exec($ch);      
  199.          
  200.         curl_close($ch); 
  201.          
  202.         return $result; 
  203.       } 
  204.       
  205.       //查询自定义菜单 
  206.    function getMenu($token){ 
  207.           $url="https://api.weixin.qq.com/cgi-bin/menu/get?access_token=$token"; 
  208.           
  209.           $ch = curl_init($url); 
  210.           
  211.        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true) ; //获取数据返回 
  212.        curl_setopt($ch, CURLOPT_BINARYTRANSFER,true) ; //在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回    
  213.        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); 
  214.        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); 
  215.        
  216.        return $output = curl_exec($ch);        
  217.       } 
  218.       
  219.       //删除自定义菜单 
  220.       public function deleteMenu($token){ 
  221.           $url="https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$token; 
  222.    
  223.        $ch = curl_init(); 
  224.        
  225.        curl_setopt($ch, CURLOPT_URL, $url); 
  226.        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  227.        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
  228.        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
  229.  
  230.        $result = curl_exec($ch); 
  231.        
  232.        curl_close($ch); 
  233.        
  234.        return $result; 
  235.       } 
  236.  
  237.       
  238.       //处理事件消息 
  239.       private function handleEvent($obj){ 
  240.     
  241.           $content=''; 
  242.           
  243.           switch($obj->Event){ 
  244.               case 'subscribe': 
  245.                   $content.="welcome-欢迎关注该公众号号!"; 
  246.                   break; 
  247.               case 'unsubscribe': 
  248.                   $content.="感谢您一直以来对该公众号的关注,再见!"; 
  249.                   break; 
  250.               default: 
  251.                   $content.=""; 
  252.                   break; 
  253.           } 
  254.           
  255.           return $this->handleStr($obj,$content); 
  256.       } 
  257.       
  258.       //处理回复消息字符串 
  259.       private function handleStr($obj,$content='',$flag=0){ 
  260.        $textTpl = ""; 
  261.           
  262.           return sprintf($textTpl, $obj->FromUserName, $obj->ToUserName, time(), $content,$flag); 
  263.       } 
  264.    
  265.    //签名验证函数 
  266.    private function checkSignature() 
  267.    { 
  268.        $signature = $_GET["signature"]; 
  269.        $timestamp = $_GET["timestamp"]; 
  270.        $nonce = $_GET["nonce"];    
  271.         //开源代码phpfensi.com 
  272.        $token = TOKEN; 
  273.        $tmpArr = array($token, $timestamp, $nonce); 
  274.        sort($tmpArr, SORT_STRING); 
  275.        $tmpStr = implode( $tmpArr ); 
  276.        $tmpStr = sha1( $tmpStr ); 
  277.        
  278.        if( $tmpStr == $signature ){ 
  279.            return true; 
  280.        }else{ 
  281.            return false; 
  282.        } 
  283.    } 
  284. }

Tags: php微信公众平台 SDK扩展

分享到: