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

  本文实例讲述了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程序设计有所帮助。