php实现基于微信公众平台开发SDK(demo)扩展的方法


Posted in PHP onDecember 22, 2014

本文实例讲述了php实现基于微信公众平台开发SDK(demo)扩展的方法。分享给大家供大家参考。具体分析如下:

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

define("TOKEN", "xingans"); 

$wechatObj = new wechatCallbackapiTest(); 

$wechatObj->responseMsg(); 

class wechatCallbackapiTest 

{ 

   //签名验证公共接口 

   public function valid() 

   { 

       $echoStr = $_GET["echostr"]; 

       if($this->checkSignature()){ 

           echo $echoStr; 

           exit; 

       } 

   } 

 

   //主入口处理函数 

   public function responseMsg() 

   { 

       $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 

       if (!emptyempty($postStr)){ 

           $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 

           $msgType=trim($postObj->MsgType); 

           

           switch($msgType){ 

               case 'text': 

                   $resultStr=$this->handleText($postObj); 

                   break; 

               case 'event': 

                   $resultStr=$this->handleEvent($postObj); 

                   break; 

               default: 

                   $resultStr=$this->handleDefault($postObj); 

                   break; 

           } 

           echo $resultStr; 

           

       }else { 

           echo "Error"; 

           exit; 

       } 

   } 

   

   //处理文本消息 

      private function handleText($obj){ 

          $keyword=trim($obj->Content); 

          if(preg_match('/天气/',$keyword)){ 

              $contentStr=$this->handleWeather($obj); 

          }elseif(preg_match('/翻译/',$keyword)){ 

              $contentStr=$this->handleTranslation($obj); 

          }else{ 

              $contentStr=$this->handleChat($obj); 

          } 

          return $this->handleStr($obj,$contentStr); 

      } 

      

      //处理天气 

      private function handleWeather($obj){ 

          $keyword=mb_substr($obj->Content,-2,2,'utf-8'); 

          $zone=mb_substr($obj->Content,0,-2,'utf-8'); 

          if($keyword=='天气' && !emptyempty($zone)){ 

              $zoneArr=json_decode(file_get_contents('http://api.k780.com:88/?app=weather.city&format=json'),true); 

              $zoneArr=$zoneArr['result']; 

              $cityId=''; 

              foreach($zoneArr as $value){ 

                  if($zone==$value['citynm']){ 

                      $cityId=$value['weaid']; 

                      break; 

                  } 

              } 

              

              if(!emptyempty($cityId)){ 

                  $data=file_get_contents("http://api.k780.com:88/?app=weather.today&weaid=$cityId&appkey=10638&sign=3736578f099375665f9f141a6326b757&format=json"); 

                  $data=json_decode($data); 

                  $contentStr="今天是:".$data->result->days.",".$data->result-> week.",".$data->result->citynm."天气:".$data->result->weather."n温度:".$data->result->temperature.", 

                  ".$data->result->wind_direction.",".$data->result->wind_power.", 最低温度:".$data->result->temp_low.",最高温度:".$data->result->temp_high; 

              }else{ 

                  $contentStr='找不到输入的城市!'; 

              }    

          }else{ 

              $contentStr='输入的查询格式不正确!'; 

          } 

          return $contentStr; 

      } 

      

      //处理翻译 

      private function handleTranslation($obj){ 

       $keyword=mb_substr($obj->Content,0,2,'utf-8'); 

       $words=mb_substr($obj->Content,2,220,'utf-8'); 

       if($keyword=='翻译' && !emptyempty($words)){ 

           $data=file_get_contents('http://fanyi.youdao.com/openapi.do?keyfrom=zfsblog&key=364295447&type=data&doctype=json&version=1.1&q='.urlencode($words));        

           $data=json_decode($data,true); 

           

           switch($data['errorCode']){ 

               case '0': 

                   $contentStr=$data['translation'][0]; 

                   break; 

               case '20': 

                   $contentStr='要翻译的文本过长'; 

                   break; 

               case '30': 

                   $contentStr='无法进行有效的翻译'; 

                   break; 

               case '40': 

                   $contentStr='不支持的语言类型'; 

                   break; 

               case '50': 

                   $contentStr='无效的key'; 

                   break; 

               default: 

                   $contentStr='Error'; 

                   break; 

           } 

       }else{ 

           $contentStr='输入的翻译格式不正确!'; 

       } 

       return $contentStr; 

      } 

      

      //处理聊天信息 

      private function handleChat($obj){ 

       $keywords=$obj->Content; 

       $curlPost=array("chat"=>$keywords); 

       $ch = curl_init();//初始化curl 

       curl_setopt($ch, CURLOPT_URL,'http://www.xiaojo.com/bot/chata.php');//抓取指定网页 

       curl_setopt($ch, CURLOPT_HEADER, 0);//设置header 

       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 

       curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 

       curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); 

       $data = curl_exec($ch);//运行curl 

       curl_close($ch); 

       

       if(!emptyempty($data)){ 

           $contentStr=$data; 

       }else{ 

           $ran=rand(1,5); 

           

           switch($ran){ 

               case 1: 

                   $contentStr= "小九今天累了,明天再陪你聊天吧"; 

                   break; 

               case 2: 

                   $contentStr= "小九睡觉喽~~"; 

                   break; 

               case 3: 

                   $contentStr= "呼呼~~呼呼~~"; 

                   break; 

               case 4: 

                   $contentStr= "你话好多啊,不跟你聊了"; 

                   break; 

               case 5: 

                   $contentStr= "你话好多啊,不跟你聊了"; 

                   break; 

           } 

       } 

       return $contentStr; 

      } 

      

      //创建自定义菜单 

      public function createMenu($data,$token){ 

        $ch = curl_init(); 

        curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token); 

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 

        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

        curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 

        curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

        $result = curl_exec($ch);      

        curl_close($ch); 

        return $result; 

      } 

      

      //查询自定义菜单 

   function getMenu($token){ 

       $url="https://api.weixin.qq.com/cgi-bin/menu/get?access_token=$token"; 

       $ch = curl_init($url); 

       curl_setopt($ch, CURLOPT_RETURNTRANSFER,true) ; //获取数据返回 

       curl_setopt($ch, CURLOPT_BINARYTRANSFER,true) ; //在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回    

       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); 

       curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); 

       return $output = curl_exec($ch);        

      } 

      

      //删除自定义菜单 

      public function deleteMenu($token){ 

       $url="https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$token; 

       $ch = curl_init(); 

       curl_setopt($ch, CURLOPT_URL, $url); 

       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

       curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 

       $result = curl_exec($ch); 

       curl_close($ch); 

       return $result; 

      }
      //处理事件消息 

      private function handleEvent($obj){ 

          $content=''; 

          switch($obj->Event){ 

              case 'subscribe': 

                  $content.="welcome-欢迎关注该公众号号!"; 

                  break; 

              case 'unsubscribe': 

                  $content.="感谢您一直以来对该公众号的关注,再见!"; 

                  break; 

              default: 

                  $content.=""; 

                  break; 

          } 

          return $this->handleStr($obj,$content); 

      } 

      

      //处理回复消息字符串 

      private function handleStr($obj,$content='',$flag=0){ 

       $textTpl = ""; 

       return sprintf($textTpl, $obj->FromUserName, $obj->ToUserName, time(), $content,$flag); 

      } 

   

   //签名验证函数 

   private function checkSignature() 

   { 

       $signature = $_GET["signature"]; 

       $timestamp = $_GET["timestamp"]; 

       $nonce = $_GET["nonce"];    

       $token = TOKEN; 

       $tmpArr = array($token, $timestamp, $nonce); 

       sort($tmpArr, SORT_STRING); 

       $tmpStr = implode( $tmpArr ); 

       $tmpStr = sha1( $tmpStr ); 

       if( $tmpStr == $signature ){ 

           return true; 

       }else{ 

           return false; 

       } 

   } 

}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
打造计数器DIY三步曲(下)
Oct 09 PHP
php 分页函数multi() discuz
Jun 21 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php查看当前Session的ID实例
Mar 16 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
PHP文件上传处理案例分析
Oct 15 PHP
Docker配置PHP开发环境教程
Dec 21 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
Laravel 实现数据软删除功能
Aug 21 PHP
laravel 出现command not found问题的解决方案
Oct 23 PHP
php微信公众开发之获取周边酒店信息的方法
Dec 22 #PHP
php天翼开放平台短信发送接口实现方法
Dec 22 #PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 #PHP
WebQQ最新登陆协议的用法
Dec 22 #PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 #PHP
php有道翻译api调用方法实例
Dec 22 #PHP
php匹配字符中链接地址的方法
Dec 22 #PHP
You might like
php下过滤HTML代码的函数
2007/12/10 PHP
php Session无效分析资料整理
2016/11/29 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP 实现链式操作
2021/03/09 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
python使用多进程的实例详解
2018/09/19 Python
pytorch 共享参数的示例
2019/08/17 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
Python requests设置代理的方法步骤
2020/02/23 Python
Pandas的Apply函数具体使用
2020/07/21 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
社区工作者思想汇报
2014/01/13 职场文书
七年级政治教学反思
2014/02/03 职场文书
质量主管工作职责
2014/09/26 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
员工手册董事长致辞
2015/07/29 职场文书