腾讯微校 消息回复类应用 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><![CDATA[%s]]></ToUserName>
     <FromUserName><![CDATA[%s]]></FromUserName>
     <CreateTime>%s</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[%s]]></Content>
     </xml>";//收到的消息格式和发送格式相同
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);//格式化字符串%s的位置替换为后面的变量
        return $result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值