微信公众号二次开发(2)

入口文件代码

valid();
//开启自动回复功能
$wechatObj->responseMsg();
//定义类文件
class wechatCallbackapiTest
{
    //实现VALID验证方法:实现对接微信公众平台
   public function valid()
    {
        //接收随机字符串
        $echoStr = $_GET["echostr"];

        //valid signature , option
        //进行用户数字签名验证
        if($this->checkSignature()){
            //如果成功,则返回接收到的随机字符串
           echo $echoStr;
            //退出
           exit;
        }
    }
   //定义自动回复功能
    public function responseMsg()
    {
      //get post data, May be due to the different environments
        //接收用户端发送过来的XML数据
      $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

       //extract post data
        //判断XML数据是否为空
      if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
            //通过simplexml进行XML解析
               $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //手机端
                $fromUsername = $postObj->FromUserName;
                //微信的公众平台
                $toUsername = $postObj->ToUserName;
                //接收用户发送的关键词
                $keyword = trim($postObj->Content);
                $msgType = $postObj->MsgType ;
                //定义$longitude 与 $latitude接收用户发送的经纬度信息
                $latitude = $postObj->Location_X;
                $longitude = $postObj->Location_Y;
                //时间戳
                $time = time();
                //文本发送模板
                $textTpl = "
                     
                     
                     %s
                     
                     
                     0
                     ";
             //音乐发送模板
               $musicTpl = "
                            
                            
                            %s
                            
                            
                            <![CDATA[%s]]>
                            
                            
                            
                            
                            ";
            //图文发送模板
            $newsTpl = "
                            
                            
                            %s
                            
                            %s
                           %s
                             ";
            if($msgType == 'text') {
                //判断用户发送关键词是否为空
                if(!empty( $keyword ))
            {
                   if($keyword == '文本'){
                       //回复类型,如果为text,代表文本类型
                       $msgType = "text";
                       //回复内容
                       $contentStr = "您发送的是文本消息";
                       //格式化字符串
                       $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                       //把XML数据返回给手机端
                       echo $resultStr;
               } elseif ($keyword == '?'|| $keyword == '?'){
                       //  定义回复类型
                       $msgType = 'text';
                       //  回复内容
                       $contentStr = "【1】特种服务号码\n【2】通讯服务号码\n【3】银行服务号码\n您可以通过输入【】方括号的编号获取内容哦!";
                       $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                       //返回数据到微信客户端
                       echo $resultStr;
                   } elseif ($keyword == '1'){
                       //  定义回复类型
                       $msgType = 'text';
                       //  回复内容
                       $contentStr = "常用特殊服务号码:\n匪警:110\n火警:119\n救护车:120";
                       $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                       //返回数据到微信客户端
                       echo $resultStr;
                   } elseif ($keyword == '2'){
                       //  定义回复类型
                       $msgType = 'text';
                       //  回复内容
                       $contentStr = "常用通讯服务号码:\n中国移动:10086\n中国电信:10000";
                       $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                       //返回数据到微信客户端
                       echo $resultStr;
                   } elseif ($keyword == '3'){
                       //  定义回复类型
                       $msgType = 'text';
                       //  回复内容
                       $contentStr = "常用银行服务号码:\n工商银行:95588\n建设银行:95533";
                       $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                       //返回数据到微信客户端
                       echo $resultStr;

                       //音乐回复接口
                   } elseif ($keyword == '音乐'){
                       //定义回复类型
                        $msgType = 'music';
                       //定义音乐标题
                        $title = '冰雪奇缘';
                       //定义音乐描述
                        $desc = '《冰雪奇缘》原声大碟。。。';
                       //定义音乐链接
                        $url = 'http://1404604487.applinzi.com/music.mp3';
                       //定义音乐高清链接
                        $hqurl = 'http://1404604487.applinzi.com/music.mp3';
                       //格式化字符串
                        $resultStr = sprintf($musicTpl,$fromUsername,$toUsername,$time,$msgType,$title,$desc,$url,$hqurl);
                       //返回XML数据到微信客户端
                        echo $resultStr;
                   } elseif ($keyword == '图文'){
                       //设置回复类型
                       $msgType = 'news';
                       //设置返回图文数量
                       $count = 4;
                       //设置要回复的图文数据
                       $str = "";
                       for($i=1;$i<=$count;$i++){
                           $str .="
                                        <![CDATA[微信二次开发{$i}]]>
                                        
                                        
                                        
                                        ";
                       }
                       $str .="";
                       //格式化字符串
                       $resultStr = sprintf($newsTpl,$fromUsername,$toUsername,$time,$msgType,$count,$str);
                       echo $resultStr;
                   }
                }else{
                echo "Input something...";
            }
            } elseif ($msgType == 'image'){
                //回复类型,如果为image,代表图片类型
                $msgType = "text";
                //回复内容
                $contentStr = "您发送的是图片消息";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //把XML数据返回给手机端
                echo $resultStr;
            } elseif ($msgType == 'voice'){
                //回复类型,如果为voice,代表语音类型
                $msgType = "text";
                //回复内容
                $contentStr = "您发送的是语音消息";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //把XML数据返回给手机端
                echo $resultStr;
            } elseif ($msgType == 'video'){
                //回复类型,如果为video,代表视屏类型
                $msgType = "text";
                //回复内容
                $contentStr = "您发送的是视屏消息";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //把XML数据返回给手机端
                echo $resultStr;
            } elseif ($msgType == 'location'){
                //回复类型,如果为location,代表位置类型
                $msgType = "text";
                //回复内容
                $contentStr = "您发送的是地理位置消息,您的位置:经度{$longitude},维度{$latitude}";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //把XML数据返回给手机端
                echo $resultStr;
            } elseif ($msgType == 'link'){
                //回复类型,如果为link,代表链接类型
                $msgType = "text";
                //回复内容
                $contentStr = "您发送的是链接消息";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //把XML数据返回给手机端
                echo $resultStr;
            }
        } else {
           echo "";
           exit;
        }
    }

    //定义 checkSignature
   private function checkSignature()
   {
        // you must define TOKEN by yourself
        //判断TOKEN秘钥是否定义
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        //接收微信加密签名
        $signature = $_GET["signature"];
        //接收时间戳
        $timestamp = $_GET["timestamp"];
        //接收随机数
        $nonce = $_GET["nonce"];

        //把TOKEN常量赋值给$token变量
      $token = TOKEN;
        //把相关参数组装为数组(秘钥、时间戳、随机数)
      $tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        //通过字典法进行排序
      sort($tmpArr, SORT_STRING);
        //把排序后的数组转化字符串
      $tmpStr = implode( $tmpArr );
        //通过哈希算法对字符串进行加密操作
      $tmpStr = sha1( $tmpStr );

        //与加密签名进行对比
      if( $tmpStr == $signature ){
         return true;
      }else{
         return false;
      }
   }
}

?>
个人主页

你可能感兴趣的:(PHP)