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 相关文章推荐
PHP生成便于打印的网页
Oct 09 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
Apr 29 PHP
php生成随机密码的几种方法
Jan 17 PHP
php强制下载类型的实现代码
Apr 21 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
php实现的CSS更新类实例
Sep 22 PHP
php动态添加url查询参数的方法
Apr 14 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
浅析php如何实现App常用的秒发功能
Aug 03 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
Python实现Kmeans聚类算法
2020/06/10 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Django实现文件上传下载
2019/10/06 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
pandas 数据类型转换的实现
2020/12/29 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
给物业的表扬信
2014/01/21 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
任命书怎么写
2014/06/04 职场文书
校庆标语集锦
2014/06/25 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
民主生活会剖析材料
2014/09/30 职场文书
2015年大学生工作总结
2015/04/21 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server