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 扫码关注公众号登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python 使用 requests 模块发送http请求 的方法
本文分步骤给大家介绍了python 使用 requests 模块发送http请求 的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下2018-12-12Python数据分析Pandas Dataframe排序操作
这篇文章主要介绍了Python数据分析Pandas Dataframe排序操作,数据的排序是比较常用的操作,DataFrame 的排序分为两种,一种是对索引进行排序,另一种是对值进行排序,接下来就分别都介绍一下,需要的小伙伴可以参考一下2022-05-05
最新评论