迹忆博客
当前位置: 主页 > 学无止境 > 网络 > 文章

微信公众号接收消息 事件消息处理

发布时间: 2016-10-18 作者: 迹忆 浏览次数:

我们知道,微信用户和公众号交互产生的消息分为两种:一种是普通消息,在《微信公众号接收消息 普通消息处理》这篇文章中做了详细的介绍;另一种是事件消息。本篇我们就来看一下事件消息。

事件消息分为关注/取消关注、扫描带参数的二维码、上报地理位置、自定义菜单、点击菜单拉取消息、点击菜单跳转链接共六种事件。

同普通消息一样,虽然事件消息也有六种情况,但是这几种事件消息的xml数据格式也都有几个相同的字段:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[FromUser]]></FromUserName>
  <CreateTime>123456789</CreateTime>
  <MsgType><![CDATA[event]]></MsgType>
  <Event><![CDATA[subscribe]]></Event>
</xml>

ToUserName 开发者微信号
FromUserName 发送方微信号
CreateTime 消息创建的时间
MsgType 消息类型 因为上面的六种情况都属于事件消息,所以这个字段的值是相同的都为event
Event 事件类型 这个字段是上面六种情况都有的,但是值是不同的。

对于上面六种情况,我们分别来看

关注/取消关注事件

用户在关注或者取消关注的时候,微信会把这个事件推送到开发者填写的URL。关注或取消关注的xml数据格式如下

<Event><![CDATA[subscribe]]></Event>   //关注
//
<Event><![CDATA[unsubscribe]]></Event>  //取消关注

扫描带参数二维码事件

用户扫描带场景的二维码的时候,推送的事件分为两种情况

第一 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
第二 如果用户已经关注公众号,则微信会将带场景值的扫描事件推送给开发者。

以上两种情况都有相同的字段,只是字段的值是不同的。

1.用户未关注时,扫描关注的事件推送

<Event><![CDATA[subscribe]]></Event>  //事件类型 subscribe
<EventKey><![CDATA[qrscene_123123]]></EventKey>  //事件KEY值,qrscene_ 是前缀,后面为二维码的参数值
<Ticket><![CDATA[TICKET]]></Ticket>  //二维码的ticket,可用来换取二维码图片

2.用户已关注时的事件推送

<Event><![CDATA[SCAN]]></Event>  //事件类型 SCAN
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>  //事件KEY值 是一个32位无符号整数,即创建二维码时的二维码scene_id
<Ticket><![CDATA[TICKET]]></Ticket>  //二维码的ticket,可用来换取二维码图片

上报地理位置事件

用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的URL。

<Event><![CDATA[LOCATION]]></Event>  //事件类型 LOCATION
<Latitude>23.137466</Latitude>   //地理位置纬度
<Longitude>113.352425</Longitude>  //地理位置经度
<Precision>119.385040</Precision>   //地理位置精度

自定义菜单事件

用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。

点击菜单拉取消息时的事件推送

<Event><![CDATA[CLICK]]></Event>  //事件类型 CLICK
<EventKey><![CDATA[EVENTKEY]]></EventKey>  //事件KEY值,与自定义菜单接口中KEY值对应

点击菜单跳转链接时的事件推送

<Event><![CDATA[VIEW]]></Event>   //事件类型 VIEW
<EventKey><![CDATA[www.onmpw.com]]></EventKey>  //事件KEY值,要跳转的链接

各种消息的格式就是我们上面所展示的那些。

function responseMsg()
{
         //get post data, May be due to the different environments
         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
         file_put_contents("/tmp/wx.txt", $postStr);  //将消息内容写入文件,便于我们自己观察
    //extract post data
         if (!empty($postStr)){
        //这里写消息处理代码
                   libxml_disable_entity_loader(true);
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                  $fromUsername = $postObj->FromUserName;
                  $toUsername = $postObj->ToUserName;
                  $msgType = $postObj->MsgType;
$event = $postObj->Event;
//根据不同的事件类型写不同的处理
                     
    }else {
       echo "";
       exit;
    }  
}
responseMsg()  //调用该函数,相当于开启这个接口供微信服务器调用从而推送消息

事件消息的接收处理其实和普通消息是没有什么区别的,主要还是看我们的业务逻辑对接收到的消息都要如何进行处理。

赞助
迹忆博客

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: