整体采用thinkPHP框架,为MVC结构:
- Application-wxtest
:保存整个微校模块部分代码
- Application-wxtest-View
:View层,前端部分代码
- Application-wxtest-Controller
:Control层,后端部分代码
IndexController.class.php
该文件为微校应用入口,基于微校开发文档给出的demo中的app.php
- 按照微校应用创建流程填写基本信息,其中应用启用地址为http://xxx.com/index.php/wxtest/index?type=open,后到
我的应用/应用详情
根据页面提供修改代码中的API_KEY
和API_SECRET
- 由
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;
}