最近在处理微信扫码关注公众号登录的需求时,遇到了扫描微信生成的带参数二维码后,事件推送中EventKey
一直是0
和qrscene_0
的问题。
首先确定的是在向微信申请二维码时,没有生成过 0 的参数,而且事件推送中的Ticket
是正确的。
下面是错误的事件推送数据包:
- 用户未关注时,进行关注后
<xml>
<ToUserName><![CDATA[gh_a786fbe98353]]></ToUserName>
<FromUserName><![CDATA[oW5Ux6ceqP-b0C-72qHEWZYk8Cr8]]></FromUserName>
<CreateTime>1648535359</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_0]]></EventKey>
<Ticket><![CDATA[gQGv7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydzVld0FUcmxjTkYxcEhEMnh5MVEAAgQvp0JiAwQ8AAAA]]></Ticket>
</xml>
- 用户已关注时
<xml>
<ToUserName><![CDATA[gh_a786fbe98353]]></ToUserName>
<FromUserName><![CDATA[oW5Ux6ceqP-b0C-72qHEWZYk8Cr8]]></FromUserName>
<CreateTime>1648535169</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[0]]></EventKey>
<Ticket><![CDATA[gQHQ7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAySDFsdEEycmxjTkYxcVdDMmh5MTQAAgR_pkJiAwQ8AAAA]]></Ticket>
</xml>
按理说在用户未关注时,进行关注后EventKey
的值为以qrscene_
为前缀,加上二维码的参数值,而用户已关注时,EventKey
的值为创建二维码时的二维码scene_id
。
于是将申请创建二维码ticket
接口的 POST 数据打印了一下,发现了端倪
微信文档中的格式是这样的:
{
"expire_seconds": 604800,
"action_name": "QR_SCENE",
"action_info": {
"scene": {
"scene_id": 123
}
}
}
而我发起的类似于:
{
"expire_seconds": 604800,
"action_name": "QR_SCENE",
"action_info": {
"scene_id": 123
}
}
action_info
中缺少了scene
字段,加上后进行验证可以收到正确的EventKey
了。
<xml>
<ToUserName><![CDATA[gh_a786fbe98353]]></ToUserName>
<FromUserName><![CDATA[oW5Ux6ceqP-b0C-72qHEWZYk8Cr8]]></FromUserName>
<CreateTime>1648537854</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[100001]]></EventKey>
<Ticket><![CDATA[gQHu7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyN3NrdkF1cmxjTkYxb1FOMk55MTQAAgT4sEJiAwQ8AAAA]]></Ticket>
</xml>
<xml>
<ToUserName><![CDATA[gh_a786fbe98353]]></ToUserName>
<FromUserName><![CDATA[oW5Ux6ceqP-b0C-72qHEWZYk8Cr8]]></FromUserName>
<CreateTime>1648535766</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_100001]]></EventKey>
<Ticket><![CDATA[gQFU8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNm55YUFEcmxjTkYxb2NGMjF5MU8AAgTQqEJiAwQ8AAAA]]></Ticket>
</xml>
另外还需要注意的是:用户未关注扫带参数的二维码和已关注扫描带参数的二维码,传过来的Event
和EventKey
是不一样:
Event
一个是subscribe
一个是SCAN
,而EventKey
一个带前缀qrscene_
一个不带,需要进行区分处理。
您好,朋友:
见字如面,
I’M 李海博客,是最老的一批九零后。
我通过 [虫洞] 页面随机穿越而来。
祝您诸事顺遂,万事安康。
期待和您再次相遇。
毕竟,苍生众相,有趣的灵魂,可不多…
——I’M 李海博客。