微信公众号事件推送总结

参考文献
自定义菜单事件https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
接收事件推送 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141016
接收普通消息 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
被动回复普通消息 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543
微信公众平台接口测试帐号申请https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

接收事件推送

在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许,详细内容如下:

目录

1 关注/取消关注事件
2 扫描带参数二维码事件
3 上报地理位置事件
4 自定义菜单事件
5 点击菜单拉取消息时的事件推送
6 点击菜单跳转链接时的事件推送

关注/取消关注事件

用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
推送XML数据包示例:

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

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,subscribe(订阅)、unsubscribe(取消订阅)

扫描带参数二维码事件

用户扫描带场景值二维码时,可能推送以下两种事件:
如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。

用户未关注时,进行关注后的事件推送

推送XML数据包示例:

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

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,subscribe
EventKey事件KEY值,qrscene_为前缀,后面为二维码的参数值
Ticket二维码的ticket,可用来换取二维码图片

用户已关注时的事件推送

推送XML数据包示例:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[FromUser]]></FromUserName>
  <CreateTime>123456789</CreateTime>
  <MsgType><![CDATA[event]]></MsgType>
  <Event><![CDATA[SCAN]]></Event>
  <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
  <Ticket><![CDATA[TICKET]]></Ticket>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,SCAN
EventKey事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
Ticket二维码的ticket,可用来换取二维码图片

上报地理位置事件

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

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>123456789</CreateTime>
  <MsgType><![CDATA[event]]></MsgType>
  <Event><![CDATA[LOCATION]]></Event>
  <Latitude>23.137466</Latitude>
  <Longitude>113.352425</Longitude>
  <Precision>119.385040</Precision>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,LOCATION
Latitude地理位置纬度
Longitude地理位置经度
Precision地理位置精度

自定义菜单事件推送

用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。

目录

1 点击菜单拉取消息时的事件推送
2 点击菜单跳转链接时的事件推送
3 scancode_push:扫码推事件的事件推送
4 scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框的事件推送
5 pic_sysphoto:弹出系统拍照发图的事件推送
6 pic_photo_or_album:弹出拍照或者相册发图的事件推送
7 pic_weixin:弹出微信相册发图器的事件推送
8 location_select:弹出地理位置选择器的事件推送
9 点击菜单跳转小程序的事件推送

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

推送XML数据包示例:

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

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,CLICK
EventKey事件KEY值,与自定义菜单接口中KEY值对应

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

推送XML数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[VIEW]]></Event>
<EventKey><![CDATA[www.qq.com]]></EventKey>
<MenuId>MENUID</MenuId>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,VIEW
EventKey事件KEY值,设置的跳转URL
MenuID指菜单ID,如果是个性化菜单,则可以通过这个字段,知道是哪个规则的菜单被点击了。

scancode_push:扫码推事件的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
<FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
<CreateTime>1408090502</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[scancode_push]]></Event>
<EventKey><![CDATA[6]]></EventKey>
<ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
<ScanResult><![CDATA[1]]></ScanResult>
</ScanCodeInfo>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,scancode_push
EventKey事件KEY值,由开发者在创建菜单时设定
ScanCodeInfo扫描信息
ScanType扫描类型,一般是qrcode
ScanResult扫描结果,即二维码对应的字符串信息

scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
<FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
<CreateTime>1408090606</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[scancode_waitmsg]]></Event>
<EventKey><![CDATA[6]]></EventKey>
<ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType>
<ScanResult><![CDATA[2]]></ScanResult>
</ScanCodeInfo>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,scancode_waitmsg
EventKey事件KEY值,由开发者在创建菜单时设定
ScanCodeInfo扫描信息
ScanType扫描类型,一般是qrcode
ScanResult扫描结果,即二维码对应的字符串信息

pic_sysphoto:弹出系统拍照发图的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
<FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
<CreateTime>1408090651</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[pic_sysphoto]]></Event>
<EventKey><![CDATA[6]]></EventKey>
<SendPicsInfo><Count>1</Count>
<PicList><item><PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
</item>
</PicList>
</SendPicsInfo>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,pic_sysphoto
EventKey事件KEY值,由开发者在创建菜单时设定
SendPicsInfo发送的图片信息
Count发送的图片数量
PicList图片列表
PicMd5Sum图片的MD5值,开发者若需要,可用于验证接收到图片

pic_photo_or_album:弹出拍照或者相册发图的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
<FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
<CreateTime>1408090816</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[pic_photo_or_album]]></Event>
<EventKey><![CDATA[6]]></EventKey>
<SendPicsInfo><Count>1</Count>
<PicList><item><PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
</item>
</PicList>
</SendPicsInfo>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,pic_photo_or_album
EventKey事件KEY值,由开发者在创建菜单时设定
SendPicsInfo发送的图片信息
Count发送的图片数量
PicList图片列表
PicMd5Sum图片的MD5值,开发者若需要,可用于验证接收到图片

pic_weixin:弹出微信相册发图器的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
<FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
<CreateTime>1408090816</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[pic_weixin]]></Event>
<EventKey><![CDATA[6]]></EventKey>
<SendPicsInfo><Count>1</Count>
<PicList><item><PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
</item>
</PicList>
</SendPicsInfo>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,pic_weixin
EventKey事件KEY值,由开发者在创建菜单时设定
SendPicsInfo发送的图片信息
Count发送的图片数量
PicList图片列表
PicMd5Sum图片的MD5值,开发者若需要,可用于验证接收到图片

location_select:弹出地理位置选择器的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
<FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
<CreateTime>1408091189</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[location_select]]></Event>
<EventKey><![CDATA[6]]></EventKey>
<SendLocationInfo><Location_X><![CDATA[23]]></Location_X>
<Location_Y><![CDATA[113]]></Location_Y>
<Scale><![CDATA[15]]></Scale>
<Label><![CDATA[ 广州市海珠区客村艺苑路 106号]]></Label>
<Poiname><![CDATA[]]></Poiname>
</SendLocationInfo>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,location_select
EventKey事件KEY值,由开发者在创建菜单时设定
SendLocationInfo发送的位置信息
Location_XX坐标信息
Location_YY坐标信息
Scale精度,可理解为精度或者比例尺、越精细的话 scale越高
Label地理位置的字符串信息
Poiname朋友圈POI的名字,可能为空

点击菜单跳转小程序的事件推送

推送XML数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[view_miniprogram]]></Event>
<EventKey><![CDATA[pages/index/index]]></EventKey>
<MenuId>MENUID</MenuId>
</xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,view_miniprogram
EventKey事件KEY值,跳转的小程序路径
MenuID菜单ID,如果是个性化菜单,则可以通过这个字段,知道是哪个规则的菜单被点击了

最后总结

每个事件消息的共用部分是Event,代表了事件类型。

事件类型(Event事件类型)

关注(subscribe)
取消关注(unsubscribe)
上报地理位置(LOCATION)
自定义菜单拉取消息(CLICK)
点击菜单跳转(VIEW)
扫描带参数二维码(SCAN)
扫码推事件(scancode_push)
扫描显示消息接受中(scancode_waitmsg)
弹出系统拍照发图(pic_sysphoto)
弹出拍照或者相册发图(pic_photo_or_album)
弹出微信相册发图器(pic_weixin)
弹出地理位置选择器(location_select)
模板消息送达情况提醒(TEMPLATESENDJOBFINISH)
群发消息后的通知(MASSSENDJOBFINISH)
微信小店订单支付后的通知(merchant_order)
资质认证成功(qualification_verify_success)
资质认证失败(qualification_verify_fail)
名称认证成功(naming_verify_success)
名称认证失败(naming_verify_fail)
年审通知(annual_renew)
认证过期失效通知(verify_expired)

重要知识点:

当扫描带参数二维码的时候需要判断用户是否已经关注了公众账号,如果关注了,那么了Event为SCAN,如果未关注的话,则是跳转到了公众号的关注页面,如果点了关注,会触发subscribe类型的事件,同时会把扫描带参数二维码里面的信息带到xml数据包中,也就是现在的关注和普通的搜索或者按照名片的关注不一样了,多带了参数,处理的时候要注意。

$Event = $postObj->Event;
if($Event == 'subscribe'){
// 关注
     if(isset($postObj->EventKey) || isset($postObj->Ticket)){
         // 扫描带参数二维码,未关注推送
         $EventKey = $postObj->EventKey; //事件KEY值,qrscene_为前缀,后面为二维码的参数值
         $Ticket   = $postObj->Ticket;   //二维码的ticket
     }else{
         // 普通关注
     }
}
// elseif中处理其他类型的事件

if($Event == 'SCAN'){
        // 扫描带参数二维码,已关注推送
        $EventKey = $postObj->EventKey;// 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
        $Ticket   = $postObj->Ticket;  //二维码的ticket
}
if($Event == 'TEMPLATESENDJOBFINISH'){
    // 模板消息发送结果提醒
    $status = $postObj->Status;
    if($status == 'success'){
        // 送达成功
    }elseif($status == 'failed:user block'){
        // 送达由于用户拒收
    }elseif($status == 'failed: system failed'){
        // 其他原因
    }else{
        echo "success";
    }
}
最后修改:2019 年 08 月 20 日 10 : 03 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论