python代碼實現掃碼關註公眾號登錄的實戰
大致思路:調用微信帶參數二維碼接口生成二維碼,前端顯示二維碼同時於服務器進行長鏈接通信,監控關註狀態,如果有對應的場景碼參數的關註,則進行登錄操作。
下面是服務示意圖
主要代碼實現:
獲取二維碼部分
1.取access_token
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
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.取二維碼圖片(這裡返回圖片的同時把場景碼也一並返回給前端,這樣如果前端用輪詢獲取關註狀態的話就可以不使用長鏈接瞭)
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
解析微信服務器報文
新關註用戶掃碼報文內容
<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>
老用戶掃碼報文內容
<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
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獲取關註的微信用戶信息
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()
返回參數
{'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 掃碼關註公眾號登錄內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- PHP實現生成二維碼的示例代碼
- Python實現企業微信通知機器人的方法詳解
- 教你利用python實現企業微信發送消息
- 使用Python實現給企業微信發送消息功能
- Python OpenCV實現人物動漫化效果