微信掃描二維碼后 【未關(guān)注】 和 【關(guān)注】 之后的掃碼事件推送
可能會(huì)遇到這么個(gè)需求,通過(guò)微信生成的二維碼,在用戶掃碼后(這個(gè)期間优烧,若用戶第一次掃碼,沒(méi)關(guān)注公眾號(hào)链峭,此時(shí)會(huì)跳轉(zhuǎn)到關(guān)注界面畦娄,點(diǎn)擊關(guān)注之后,才會(huì)推送消息弊仪,然后就可以用到下面關(guān)注取消推送事件機(jī)制了熙卡。)
微信生成二維碼 傳送門(mén)
以下是官方文檔說(shuō)明:
接收事件推送
在微信用戶和公眾號(hào)產(chǎn)生交互的過(guò)程中,用戶的某些操作會(huì)使得微信服務(wù)器通過(guò)事件推送的形式通知到開(kāi)發(fā)者在開(kāi)發(fā)者中心處設(shè)置的服務(wù)器地址励饵,從而開(kāi)發(fā)者可以獲取到該信息驳癌。其中,某些事件推送在發(fā)生后役听,是允許開(kāi)發(fā)者回復(fù)用戶的颓鲜,某些則不允許,詳細(xì)內(nèi)容如下:
目錄
1 關(guān)注/取消關(guān)注事件
2 掃描帶參數(shù)二維碼事件
關(guān)注/取消關(guān)注事件
用戶在關(guān)注與取消關(guān)注公眾號(hào)時(shí)典予,微信會(huì)把這個(gè)事件推送到開(kāi)發(fā)者填寫(xiě)的URL灾杰。方便開(kāi)發(fā)者給用戶下發(fā)歡迎消息或者做帳號(hào)的解綁。為保護(hù)用戶數(shù)據(jù)隱私熙参,開(kāi)發(fā)者收到用戶取消關(guān)注事件時(shí)需要?jiǎng)h除該用戶的所有信息艳吠。
微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會(huì)斷掉連接,并且重新發(fā)起請(qǐng)求孽椰,總共重試三次昭娩。
關(guān)于重試的消息排重,推薦使用FromUserName + CreateTime 排重黍匾。
假如服務(wù)器無(wú)法保證在五秒內(nèi)處理并回復(fù)栏渺,可以直接回復(fù)空串,微信服務(wù)器不會(huì)對(duì)此作任何處理锐涯,并且不會(huì)發(fā)起重試磕诊。
推送XML數(shù)據(jù)包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>
參數(shù)說(shuō)明:
參數(shù) 描述
ToUserName 開(kāi)發(fā)者微信號(hào)
FromUserName 發(fā)送方帳號(hào)(一個(gè)OpenID)
CreateTime 消息創(chuàng)建時(shí)間 (整型)
MsgType 消息類型,event
Event 事件類型纹腌,subscribe(訂閱)霎终、unsubscribe(取消訂閱)
掃描帶參數(shù)二維碼事件
用戶掃描帶場(chǎng)景值二維碼時(shí),可能推送以下兩種事件:
如果用戶還未關(guān)注公眾號(hào)升薯,則用戶可以關(guān)注公眾號(hào)莱褒,關(guān)注后微信會(huì)將帶場(chǎng)景值關(guān)注事件推送給開(kāi)發(fā)者。
如果用戶已經(jīng)關(guān)注公眾號(hào)涎劈,則微信會(huì)將帶場(chǎng)景值掃描事件推送給開(kāi)發(fā)者广凸。
- 用戶未關(guān)注時(shí)阅茶,進(jìn)行關(guān)注后的事件推送
推送XML數(shù)據(jù)包示例:
<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>
參數(shù)說(shuō)明:
參數(shù) 描述
ToUserName 開(kāi)發(fā)者微信號(hào)
FromUserName 發(fā)送方帳號(hào)(一個(gè)OpenID)
CreateTime 消息創(chuàng)建時(shí)間 (整型)
MsgType 消息類型,event
Event 事件類型谅海,subscribe
EventKey 事件KEY值脸哀,qrscene_為前綴,后面為二維碼的參數(shù)值
Ticket 二維碼的ticket扭吁,可用來(lái)?yè)Q取二維碼圖片
- 用戶已關(guān)注時(shí)的事件推送
推送XML數(shù)據(jù)包示例:
<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>
參數(shù)說(shuō)明:
參數(shù) 描述
ToUserName 開(kāi)發(fā)者微信號(hào)
FromUserName 發(fā)送方帳號(hào)(一個(gè)OpenID)
CreateTime 消息創(chuàng)建時(shí)間 (整型)
MsgType 消息類型撞蜂,event
Event 事件類型,SCAN
EventKey 事件KEY值智末,是一個(gè)32位無(wú)符號(hào)整數(shù)谅摄,即創(chuàng)建二維碼時(shí)的二維碼scene_id
Ticket 二維碼的ticket徒河,可用來(lái)?yè)Q取二維碼圖片
注意:未關(guān)注和關(guān)注推送的信息類型不一致
類型 | MsgType 消息類型 | Event 事件類型 | EventKey事件KEY值 | Ticket 二維碼的ticket |
---|---|---|---|---|
未關(guān)注 | event | subscribe | qrscene_(以此開(kāi)頭后面是key值) | TICKET |
關(guān)注 | event | SCAN | SCENE_VALUE(值即為key值) | TICKET |
獲取二維碼中的值系馆,根據(jù)MsgType (消息類型)一致 可以根據(jù) Event (事件類型)來(lái)區(qū)分,然后根據(jù)key值判斷獲韧缯铡由蘑!
不廢話了直接上代碼:
// xmlData 是微信返回給你服務(wù)器的xml數(shù)據(jù)包,轉(zhuǎn)為map后的數(shù)據(jù)格式代兵。
String event = xmlData.get("Event");
String wxId = xmlData.get("FromUserName");
//url事件
if (event.equals("VIEW")) {
return baseMsg = RequestParamTool.url(xmlData);
//點(diǎn)擊事件
}else if (event.equals("CLICK")) {
return baseMsg = RequestParamTool.handleClick(xmlData);
//Event 事件類型 判斷關(guān)注和未關(guān)注
} 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
更多關(guān)注微信眾號(hào)