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 相关文章推荐
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
PHP防注入安全代码
Apr 09 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
php常用的工具开发整理
Sep 26 PHP
php屏蔽错误及提示的方法
May 10 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
3款值得推荐的微信开发开源框架
2014/10/28 PHP
php实现无限级分类
2014/12/24 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
js一组验证函数
2008/12/20 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
python调用支付宝支付接口流程
2019/08/15 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
keras导入weights方式
2020/06/12 Python
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
法学函授自我鉴定
2014/02/06 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
一级电子管军用接收机测评
2022/04/05 无线电