大致思路:調用微信帶參數二維碼接口生成二維碼,前端顯示二維碼同時于服務器進行長鏈接通信,監控關注狀態,如果有對應的場景碼參數的關注,則進行登錄操作。
下面是服務示意圖
主要代碼實現:
獲取二維碼部分
1.取access_token
1
2
3
4
5
6
7
|
app_id = 'xxxx' app_secret = 'xxxxxx' url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}' . format (app_id, app_secret) resp = requests.get(url) rs = util.get_redis_con() access_token = resp.json()[ 'access_token' ] print (access_token) |
這個access_token的有效期是兩小時,所以建議寫個定時任務,每一小時執行一下,存到redis,用的時候redis取一下。
2.取ticket
1
2
3
4
5
6
7
8
9
|
my_scene_str = 'xxxxx' # 場景碼可以做個key放到redis里并設置一個和二維碼一樣的過期時間 url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}' . format (access_token) data = { "expire_seconds" : 604800 , "action_name" : "QR_STR_SCENE" , "action_info" : { "scene" : { "scene_str" : md5_user_key}} } resp = requests.post(url, json = data) ticket = resp.json()[ 'ticket' ] |
3.取二維碼圖片(這里返回圖片的同時把場景碼也一并返回給前端,這樣如果前端用輪詢獲取關注狀態的話就可以不使用長鏈接了)
1
2
3
4
|
url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket resp = requests.get(url) img = base64.b64encode(resp.content).decode( 'ascii' ) print (img) |
這個里取到的圖片用base64返回給前端,前端使用src="data:image/png;base64,"+img 就可以顯示了
獲取關注狀態值
方法一:使用場景碼輪詢
發送請求輪詢md5_user_key
方法二:使用場景碼建立長鏈接連接,等待服務器推送
flask建議使用socketio
解析微信服務器報文
新關注用戶掃碼報文內容
1
2
3
4
5
6
7
8
9
|
< xml > < ToUserName > <![CDATA[xxxxxxxxxxxxx]]> </ ToUserName > < FromUserName > <![CDATA[xxxxxxxxxxx]]> </ FromUserName > < CreateTime >1609128953</ CreateTime > < MsgType > <![CDATA[event]]> </ MsgType > < Event > <![CDATA[subscribe]]> </ Event > < EventKey > <![CDATA[xxxxxx]]> </ EventKey > < Ticket > <![CDATA[xxxxxxxx]]> </ Ticket > </ xml > |
老用戶掃碼報文內容
1
2
3
4
5
6
7
8
9
|
< xml > < ToUserName > <![CDATA[xxxxxxxxxxxx]]> </ ToUserName > < FromUserName > <![CDATA[xxxxxxxxxxxxx]]> </ FromUserName > < CreateTime >1609127524</ CreateTime > < MsgType > <![CDATA[event]]> </ MsgType > < Event > <![CDATA[SCAN]]> </ Event > < EventKey > <![CDATA[xxxxxxxxxxxxxx]]> </ EventKey > < Ticket > <![CDATA[xxxxxxxxxxxxxxxxxxx]]> </ Ticket > </ xml > |
ToUserName:公眾號的id
FromUserName:用戶的openid
1
2
3
4
5
6
7
8
9
10
11
|
import xml.etree.ElementTree as ET root = ET.fromstring(request.data.decode( 'utf-8' )) dic = {} for x in root: dic[x.tag] = x.text if dic.get( 'MsgType' ) = = 'event' : if dic.get( 'Event' ) = = 'subscribe' : parse_subscribe(dic) # 新關注用戶掃碼 if dic.get( 'Event' ) = = 'SCAN' : parse_scan(dic) # 已經關注用戶掃碼 |
使用openid獲取關注的微信用戶信息
1
2
3
4
|
url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={access_token}&openid={open_id}&lang=zh_CN" resp = requests.get(url. format (access_token = access_token, open_id = open_id)) resp.encoding = 'utf-8' return resp.json() |
返回參數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
{ 'subscribe' : 1, 'openid' : 'xxxxxxxxxxxxxxxxxxx' , 'nickname' : 'xxx' , 'sex' : 1, 'language' : 'zh_CN' , 'city' : 'xx' , 'province' : 'xx' , 'country' : 'xx' , 'headimgurl' : 'http://thirdwx.qlogo.cn/mmopen/xxxxxxxxxxxxxxxxxx/xxx' , 'subscribe_time' : 1609128953, 'unionid' : 'xxxxxxxxxxxxxxxxx' , 'remark' : '' , 'groupid' : 0, 'tagid_list' : [], 'subscribe_scene' : 'ADD_SCENE_QR_CODE' , 'qr_scene' : 0, 'qr_scene_str' : 'xxxxxxxxxxxxxxxxxxxx' } |
到此這篇關于python代碼實現掃碼關注公眾號登錄的實戰的文章就介紹到這了,更多相關python 掃碼關注公眾號登錄內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7024324555476828168