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面向对象分析设计的经验原则
Sep 20 PHP
php HtmlReplace输入过滤安全函数
Jul 03 PHP
PHP利用REFERER根居访问来地址进行页面跳转
Sep 28 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
基于PHP实现等比压缩图片大小
Mar 04 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP PDOStatement::execute讲解
Jan 31 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 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数组总结篇(一)
2008/09/30 PHP
浅析php数据类型转换
2014/01/09 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python中dir函数用法分析
2015/04/17 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python中类与对象之间的关系详解
2020/12/16 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
员工工作表现评语
2014/04/26 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
司法助理专业自荐书
2014/06/13 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
北京故宫的导游词
2015/01/31 职场文书
单身申明具结书
2015/02/26 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
MySQL 数据表操作
2022/05/04 MySQL
Nginx 匹配方式
2022/05/15 Servers