微信扫描二维码后 【未关注】 和 【关注】 之后的扫码事件推送
可能会遇到这么个需求,通过微信生成的二维码,在用户扫码后(这个期间,若用户第一次扫码,没关注公众号,此时会跳转到关注界面,点击关注之后,才会推送消息,然后就可以用到下面关注取消推送事件机制了。)
微信生成二维码 传送门
以下是官方文档说明:
接收事件推送
在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许,详细内容如下:
目录
1 关注/取消关注事件
2 扫描带参数二维码事件
关注/取消关注事件
用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
关于重试的消息排重,推荐使用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,可用来换取二维码图片
注意:未关注和关注推送的信息类型不一致
类型 | MsgType 消息类型 | Event 事件类型 | EventKey事件KEY值 | Ticket 二维码的ticket |
---|---|---|---|---|
未关注 | event | subscribe | qrscene_(以此开头后面是key值) | TICKET |
关注 | event | SCAN | SCENE_VALUE(值即为key值) | TICKET |
获取二维码中的值,根据MsgType (消息类型)一致 可以根据 Event (事件类型)来区分,然后根据key值判断获取!
不废话了直接上代码:
// xmlData 是微信返回给你服务器的xml数据包,转为map后的数据格式。
String event = xmlData.get("Event");
String wxId = xmlData.get("FromUserName");
//url事件
if (event.equals("VIEW")) {
return baseMsg = RequestParamTool.url(xmlData);
//点击事件
}else if (event.equals("CLICK")) {
return baseMsg = RequestParamTool.handleClick(xmlData);
//Event 事件类型 判断关注和未关注
} else if (event.equals("SCAN") || event.equals("subscribe")) {
String eventKey = xmlData.get("EventKey");
//
if (eventKey.contains("qrscene_")) {
eventKey = eventKey.replace("qrscene_", "");
}
log.info("eventKey === {} " , eventKey); //eventKey
更多关注微信众号