标签:
写在前面的话:上一篇讲解了如何接收用户发送的文本消息并自动回复用户文本消息,对与微信进行交互的思路进行了描述,并以实例代码进行了详细说明。一旦明白了操作的基本的思想,那么进行其他消息的处理,也会非常容易,这一篇就把其他能够处理的信息类型进行一下整理,看完这篇文章对于接收用户消息,并自动回复用户消息应该会有一个完整的认识了。
======正文开始========
这篇文章通过三个部分进行讲解:接收不同消息类型说明;回复用户不同消息说明;实例代码演示。
一、接收不同消息类型说明
目前能够接收到的用户消息类型分两大类:1.普通消息。2.事件消息。每个大类里面又分为多个小类,如下:
1.普通消息:文档地址
(1)文本消息(2)图片消息(3)语音消息(4)语音消息2(开启语音识别后)
(5)视频消息(6)小视频消息(7)地理位置消息(8)链接消息
2. 事件消息:文档地址
(1)关注事件消息(2)取消关注事件消息(3)扫描带参数二维码事件消息(4)上报地理位置事件消息(5)自定义菜单事件消息
(6)点击菜单拉取消息时获取的事件消息(7)点击菜单跳转链接时获取的事件消息
目前接收到的不同消息类型的消息,有一个共同点:都是通过XML格式POST至我们填写的服务器地址。上一篇中我们已经能够对文本消息进行灵活的处理,所以现在再去看开发者文档,应该是比较清楚了,我们可以按照XML数据的格式,获取我们想要的信息。例如:我们可以通过MsgType这一项数据,来判断用户发送的是什么类型消息。
至此,接收用户消息,应该已经心中有数。
二、回复用户不同消息说明
这里我们发现,我们回复用户消息,其实是一种被动的方式,即当用户给我们公众号发送消息的时候,才能够触发回复动作,所以并不是调用微信的接口,而是对微信POST请求的一种响应。如果想要主动给用户发送消息,那么就需要别的微信接口了。
回复用户消息分为下面几个类别:1.被动回复用户消息。2.客服接口。3.群发接口。4.模板消息接口。对于2、3、4接口,留作后面的文章介绍,这里仅仅介绍1。
1.被动回复用户消息:文档地址
(1)回复文本消息(2)回复图片消息(3)回复语音消息(4)回复视频消息
(5)回复音乐消息(6)回复单图文消息(7)回复多图文消息
回复用户消息,也是有一个共同点:都是通过XML格式,直接echo 回复即可。上一篇中我们已经能够回复文本消息,所以现在再去看开发者文档,应该是比较清楚了,我们可以按照回复XML数据的格式,进行自定义回复。
这里需要注意一点:对于回复文本消息,没有问题,但是回复其他消息的话,需要提前将素材上传至微信,然后才能获取相应素材信息,进而合成回复消息中的XML中的各个数据项,这里可以假设已经获取了所需素材的消息。而具体如何上传素材等等操作,也是再后面文章中介绍,不用太纠结。
三、实例代码演示
接下来我们通过实现如下功能来进行演示:接收用户消息,根据接收的不同消息类型,进行不同的回复。我们把仍然把代码写在wechat.php文件之中。
1、接收用户发送的消息。
$postData = $GLOBALS["HTTP_RAW_POST_DATA"];
2、将接收的xml格式消息转化为对象格式,方便操作。
$postObj=json_decode(json_encode(simplexml_load_string($postData, ‘SimpleXMLElement‘, LIBXML_NOCDATA)));
这里需要注意:对接收到的消息需要先json_encode,再json_decode,如果直接json_decode的话,获取的对象会有些小问题的。
3、获取XML消息具体内容。
$fromUserName = $postObj->FromUserName; $toUserName = $postObj->ToUserName; $msgType=$postObj->MsgType;
4、根据消息的不同类型回复用户不同消息。
switch($msgType) { case "text": $content="您发送的是文本消息"; break; case "image": $content="您发送的是图片消息"; break; case "voice": $content="您发送的是语音消息"; break; case "video": $content="您发送的是视频消息"; break; case"shortvideo": $content="您发送的是小视频消息"; break; case "location": $content="您发送的是位置消息"; break; case "link": $content="您发送的是链接消息"; break; case "event": $content="您发送的是事件消息"; break; } $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $time = time(); $msgType="text"; $resultStr = sprintf($textTpl, $fromUserName, $toUserName, $time, $msgType, $content); echo $resultStr;
大家可以自己试着在自己的公众号里面尝试一下,当然也可以关注一下我的个人公众号:guangleiwu,进行体验,二维码如下:
至此,如何接收消息和回复消息,算是说明白了,但是这里会发现,我们一直回复的是文本消息,并没有回复其他类型的消息,那是因为在回复其他类型消息,如图片消息、语音消息等的时候,需要先将素材进行上传才能够回复。所以,在后面的文章中,将要介绍如何进行素材管理,讲完那一篇,我们就能够回复用户其他类型的消息了。
(完)
附源代码:
<?php $postData = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj=json_decode(json_encode(simplexml_load_string($postData, ‘SimpleXMLElement‘, LIBXML_NOCDATA))); $fromUserName = $postObj->FromUserName; $toUserName = $postObj->ToUserName; $msgType=$postObj->MsgType; switch($msgType) { case "text": $content="您发送的是文本消息"; break; case "image": $content="您发送的是图片消息"; break; case "voice": $content="您发送的是语音消息"; break; case "video": $content="您发送的是视频消息"; break; case"shortvideo": $content="您发送的是小视频消息"; break; case "location": $content="您发送的是位置消息"; break; case "link": $content="您发送的是链接消息"; break; case "event": $content="您发送的是事件消息"; break; } $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $time = time(); $msgType="text"; $resultStr = sprintf($textTpl, $fromUserName, $toUserName, $time, $msgType, $content); echo $resultStr; ?>
详解微信开发者文档——4接收用户其他类型消息并进行自定义处理
标签:
原文地址:http://www.cnblogs.com/wuguanglei/p/4397946.html