PHP微信API接口类

5年以前  |  阅读数:868 次  |  编程语言:PHP 

本文实例为大家分享了PHP微信接口类,供大家参考,具体内容如下


    <?php
    /**
     * wechat php test
     */

    //define your token
    //定义TOKEN秘钥
    define("TOKEN", "weixin");

    //实例化微信对象
    $wechatObj = new wechatCallbackapiTest();
    //验证成功后注释valid方法
    //$wechatObj->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);
            //1.接受用户消息类型
            $msgType = $postObj -> MsgType;
            //时间戳
            $time = time();
            //文本发送模板
            $textTpl = "<xml>
                  <ToUserName><![CDATA[%s]]></ToUserName>
                  <FromUserName><![CDATA[%s]]></FromUserName>
                  <CreateTime>%s</CreateTime>
                  <MsgType><![CDATA[%s]]></MsgType>
                  <Content><![CDATA[%s]]></Content>
                  <FuncFlag>0</FuncFlag>
                  </xml>"; 
            //////////////////////////////////////////////////////////////////////////////////
            //如果用户发送的是文本类型文件,执行以下
            if($msgType == 'text'){
              if(!empty( $keyword ))
              {
                /*这是一个实例
                  //如果发送文本信息
                  $msgType = "text";
                  //回复内容
                  if($keyword == "李楠"){
                    $contentStr = "叫我干嘛";
                  }else{
                    $contentStr = "叫我干嘛";
                  }
                  //格式化xml模板,参数与上面的模板是一一对应的.fromUsername和头Username是相反的,只写带%s的
                  $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

                  //将xml信息返回给客户端
                  echo $resultStr;
                */
                if($keyword == "?" || $keyword == "?"){
                  $msgType = "text";
                  $contentStr = "1.特种服务号码\n2.通讯服务号码";
                  $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                  echo $resultStr;
                }elseif($keyword == 1){
                  $msgType = "text";
                  $contentStr = "1.匪警:110\n2.火警:119\n3.急救:120";
                  $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                  echo $resultStr;
                }elseif($keyword == 2){
                  $msgType = "text";
                  $contentStr = "1.中国移动:10086\n2.中国联通:10010";
                  $resultStr = sprintf($textTpl,$fromUsername,$toUsername,$time,$msgType,$contentStr);
                  echo $resultStr;
                }
              }else{
                echo "不能不说话";
              }
            }
            ////////////////////////////////////////////////////////////////////////////////////
            //接受图片信息
            if($msgType == "image"){
                //如果发送文本信息
                $msgType = "text";
                //回复内容
                $contentStr = "你发送的是图片文件";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //将xml信息返回给客户端
                echo $resultStr;
            }
            ////////////////////////////////////////////////////////////////////////////////////
            if($msgType == "voice"){
                //如果发送文本信息
                $msgType = "text";
                //回复内容
                $contentStr = "你发送的是语音文件";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //将xml信息返回给客户端
                echo $resultStr;
            }
            ////////////////////////////////////////////////////////////////////////////////////
            if($msgType == "video"){
                //如果发送文本信息
                $msgType = "text";
                //回复内容
                $contentStr = "你发送的是视频文件";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //将xml信息返回给客户端
                echo $resultStr;
            }
            ////////////////////////////////////////////////////////////////////////////////////
            if($msgType == "shortvideo"){
                //如果发送文本信息
                $msgType = "text";
                //回复内容
                $contentStr = "你发送的是小视频文件";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //将xml信息返回给客户端
                echo $resultStr;
            }
            ////////////////////////////////////////////////////////////////////////////////////
            if($msgType == "location"){
                //如果发送文本信息
                $msgType = "text";
                //回复内容
                $contentStr = "你发送的是地理位置文件";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //将xml信息返回给客户端
                echo $resultStr;
            }
            ////////////////////////////////////////////////////////////////////////////////////
            if($msgType == "link"){
                //如果发送文本信息
                $msgType = "text";
                //回复内容
                $contentStr = "你发送的是连接文件";
                //格式化字符串
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                //将xml信息返回给客户端
                echo $resultStr;
            }
            ////////////////////////////////////////////////////////////////////////////////////
            /*
            //判断用户发送关键词是否为空      

            if(!empty( $keyword ))
            {
              //如果发送文本信息
              $msgType = "text";
              //回复内容
              $contentStr = "大家好,我是hero";
              //格式化字符串
              $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
              //将xml信息返回给客户端
              echo $resultStr;
            }else{
              echo "Input something...";
            }
            */
        }else {
          echo "";
          exit;
        }
      }

      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 ){
          //相同返回true
          return true;
        }else{
          //不同返回false
          return false;
        }
      }
    }

    ?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例