1.ThinkPHP5.1 与公众号对接
2. 业务逻辑文件
-
在application目录下自定义模块与控制器实现如下代码。
- 接收消息,将用户发送的消息解析为普通数组并返回。
/** * 接收消息 * @author Why * @return array $resArr 返回结果 */ public function recMsg(){ //接收微信发送的XML数据包 $postObj = file_get_contents("php://input"); //解析XML数据包为数组格式:SimpleXMLElement::__set_state(array()) $postArr = simplexml_load_string($postObj, "SimpleXMLElement", LIBXML_NOCDATA); //获取数组中用户发送的内容 $content = $postArr->Content; //将获取的内容转换为普通数组,方便以后的业务逻辑编写 $jsonStr = json_encode($content); $resArr = json_decode($jsonStr,true); return $resArr; }
- 回复消息,将一段字符串返回给微信公众号。
/** * 回复消息 * @author Why * @param string $content 回复内容 * @return xml $resMsg 返回结果 */ public function resTextMsg($content) { //接收微信发送的XML数据包 $postObj = file_get_contents("php://input"); //解析XML数据包为数组格式:SimpleXMLElement::__set_state(array()) $postArr = simplexml_load_string($postObj, "SimpleXMLElement", LIBXML_NOCDATA); //获取数组中的ToUserName $toUserName = $postArr->ToUserName; //获取数组中的FromUserName $fromUserName = $postArr->FromUserName; //config辅助函数调用config/extend目录下的回复消息格式 $tempText = config('extend.text'); //依次替换XML数据包模板中的%s $resMsg = sprintf($tempText, $fromUserName, $toUserName, $content); return $resMsg; }
-
测试消息接收和回复函数。
-
这里值得注意的是对微信公众平台发送的校验信息和公众号发送的内容信息的区分。
(1) 发送来的数据包中 echostr(随机字符串)不为空是校验信息。
发送来的数据包中 echostr(随机字符串)为空是内容消息。
(2) 发送来的数据包中不包含 content 关键字为校验消息。
发送来的数据包中包含 content 关键字为内容消息。
-
/** * @author Why * @param Request $request 请求对象 * @return xml|string $resMsg */ public function test(Request $request){ //随机字符串$echostr不为空 if($request::param('echostr')){ //校验微信公众号 return $this->isWechat($request); } //随机字符串$echostr为空,接收消息 $content = $this->recMsg($request); //将数组转换为字符串 $conStr = implode($content); //字符串拼接 $resStr = '您说:'.$conStr; //回复消息 $resMsg = $this->resTextMsg($resStr); return $resMsg; }
3. 配置文件
-
在config目录下自定义配置文件,实现如下代码。
- 这是一个回复文本消息的 xml 模板,供业务逻辑代码调用
config('文件名.关键字')
。
<?php //存放配置信息 //xml return [ //文本消息的格式 'text' => '<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>'.time().'</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml> ];
- 这是一个回复文本消息的 xml 模板,供业务逻辑代码调用