腾讯微校 消息回复类应用 thinkphp 实现

整体采用thinkPHP框架,为MVC结构:
- Application-wxtest:保存整个微校模块部分代码
- Application-wxtest-View:View层,前端部分代码
- Application-wxtest-Controller:Control层,后端部分代码

IndexController.class.php

该文件为微校应用入口,基于微校开发文档给出的demo中的app.php

  1. 按照微校应用创建流程填写基本信息,其中应用启用地址为http://xxx.com/index.php/wxtest/index?type=open,后到我的应用/应用详情 根据页面提供修改代码中的API_KEYAPI_SECRET
  2. index()进入,按照case跳转至相应的函数
    open()函数下主要补充token 的值用于令牌验证,代码无误后接口测试成功
    trigger()为微校默认应用触发地址,主要实现了获取微校转发来的消息和向微校返回结果。
 public function trigger() {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);//获取消息类型
            switch ($RX_TYPE)//根据消息类型回复
            {
              case: $result = $this->receiveText($postObj);//文本
              case://图片
              ...  
            }
            echo $result;
        }
        else {
            echo "╭(╯^╰)╮";
            exit;
        }
    }

实现时主要问题出在不了解微校向应用服务器返回结果形式和应用服务器返回结果形式。 微校转发的消息和微信公众平台开发收到的消息形式相同,返回结果也和公众平台回复类似。

$GLOBALS['HTTP_RAW_POST_DATA']$_POST的区别

  • PHP默认只识别application/x-www.form-urlencoded标准的数据类型,对型如text/xml的内容无法解析为$_POST数组,会保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。如果post过来的数据不是PHP能够识别的,可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如 text/xml 或者 soap 等等
  • 另外还有一项 php://input 也可以实现此这个功能php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data“。参考china_skag博客文章

    simplexml_load_string() 函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象。

 //接收文本消息
 private function receiveText($object)
 {
    //主要是给出回复文本的content
    $result = $this->transmitText($object, $content);
    return $result;
 }
  //回复文本消息
 private function transmitText($object, $content)
    {
      $textTpl = "<xml>
     <ToUserName>ToUserName>
     <FromUserName>FromUserName>
     <CreateTime>%sCreateTime>
     <MsgType>MsgType>
     <Content>Content>
     xml>";//收到的消息格式和发送格式相同
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);//格式化字符串%s的位置替换为后面的变量
        return $result;
    }

你可能感兴趣的:(php学习)