Python版實(shí)現(xiàn)微信公眾號(hào)掃碼登陸
基于python 實(shí)現(xiàn)公眾掃碼登陸
前提 申請(qǐng)公眾號(hào)服務(wù),配置相關(guān)信息,并在相關(guān)平臺(tái)進(jìn)行配置,就這么多東西
實(shí)現(xiàn)邏輯,使用臨時(shí)臨時(shí)二維碼,帶參數(shù)的二維碼掃碼登陸
流程,用戶已經(jīng)掃碼關(guān)注,在登陸頁(yè)面直接掃碼登陸,
用戶未關(guān)注,則需要點(diǎn)擊關(guān)注后,直接登錄,
我們使用帶參數(shù)的場(chǎng)景值來區(qū)別是哪個(gè)用戶進(jìn)行掃碼登陸
場(chǎng)景值用戶可以自定義,但是必須是唯一的,我用的時(shí)間戳
我現(xiàn)在要做的功能,有賬戶綁定需求,并且是前后端分離的情況下,
流程1
當(dāng)用戶已經(jīng)關(guān)注過,并且綁定賬號(hào),直接掃碼登陸,
當(dāng)用戶已經(jīng)關(guān)注過,未綁定,需要掃碼后,跳轉(zhuǎn)到綁定手機(jī)號(hào)頁(yè)面,綁定后,進(jìn)行登錄,
當(dāng)用戶取消關(guān)注,相當(dāng)于解綁,進(jìn)行掃碼后,重新到綁定頁(yè)面,進(jìn)行掃碼登陸,當(dāng)然也要,對(duì)綁定已經(jīng)綁定過的手機(jī)號(hào)驚醒判斷。
代碼如下
接口1 帶參數(shù)的場(chǎng)景值生成的二維碼
def get_wxcode(request): """ 公眾號(hào)掃碼登陸 獲取帶參數(shù)二維碼 參數(shù): 返回值: { "formError": {}, "delta_time": 951, "errorCode": 0, "params": { "scene_id": "512" }, "message": "", "data": { "url": "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQEi8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyUFNnZ2RNRlU5Y1QxWkJqZDF1Y1QAAgTlmMReAwSAOgkA", "sceneid": "2500", # 唯一掃碼場(chǎng)景值,用來判斷哪個(gè)用戶進(jìn)行掃碼登陸 "type": "get" } } """ try: scene_id = str(int((time.time()))) access_token = get_access_token() if access_token: user_info_url = u'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' + access_token params = { 'expire_seconds': 604800, 'action_name': 'QR_STR_SCENE', 'action_info': {"scene": {"scene_str": scene_id}}, } params = json.dumps(params) userinfo = requests.post(user_info_url, data=params).json() ticket = userinfo['ticket'] # except: # raise FieldError("ticket", "ticket獲取異常") data = { "type": 'get', 'url': 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket, 'sceneid':scene_id } return data else: raise FieldError("微信", "微信公共號(hào)正在維護(hù)中,給你帶來的不便,敬請(qǐng)?jiān)?) except: raise FieldError("微信", "微信公共號(hào)正在維護(hù)中,給你帶來的不便,敬請(qǐng)?jiān)?)
接口返回有url 和sceneid URL直接就是一個(gè)二維碼,前端可以直接拿來展示,sceneid 是返回前端,讓前端進(jìn)行保存,來進(jìn)行判斷用戶是否掃碼,因?yàn)?微信服務(wù),目前不支持sessionid 的緩存,所以需要我們自行緩存,我使用的將場(chǎng)景值存入redis
2 前端展示出來二維后,用戶開始掃碼,點(diǎn)擊關(guān)注后,微信服務(wù)就用戶信息,回調(diào)給我們?cè)谖⑿殴娞畹姆?wù)器地址,如圖片
現(xiàn)在我們開始寫回調(diào)地址的代碼:
微信關(guān)注,類型是事件 來發(fā)送,具體類型看文檔
1 先通過于微信通信驗(yàn)證,是get 請(qǐng)求
獲取用戶信息是post 請(qǐng)求
event 屬于關(guān)注事件
我們可以access_token 獲取用戶信息,將用戶信息保存,并將 場(chǎng)景值 eventkey 存入Redis 我設(shè)置的過期時(shí)間為1個(gè)小時(shí)
致此微信回調(diào)結(jié)束,3接口2 ,開始判斷用戶是否進(jìn)行掃碼關(guān)注,我們需要前端給后端傳一個(gè)場(chǎng)景值,我們通過從redis 的場(chǎng)景值來獲取存入數(shù)據(jù)的用戶信息,如果已經(jīng)存入,則用戶掃碼成功,直接登錄,用戶的openid 是唯一的
如果用戶信息,獲取,則用戶并沒有進(jìn)行掃碼,這個(gè)獲取狀態(tài)的接口,需要一輪詢的方式進(jìn)行查看 可以5s 進(jìn)行一次
def get_public_wx_status(request): ''' 參數(shù) scene_id 場(chǎng)景值 必傳 判斷是哪個(gè)用戶 掃碼 輪詢查看 公眾號(hào) 是否掃碼關(guān)注,掃碼關(guān)注是否綁定手機(jī)號(hào) :param request: :return: { "formError": {}, "delta_time": 713, "errorCode": 0, "params": {}, "message": "", "data": { "focus_state": 1, # 微信關(guān)注的狀態(tài) 1 已掃碼關(guān)注 0 未關(guān)注 "state": 0 # 關(guān)注后,是否綁定手機(jī)號(hào) 0 未綁定 1 已綁定,直接登錄 } } ''' post_info = request.POST scene_id = post_info.get("scene_id", '') if not scene_id: raise FieldError('scene_id','scene_id不能為空') openid = redis_conn.get(scene_id) if openid == None: return {'focus_state': 0} else: uid = redis_conn.get(str(openid)) if uid == None: return {'focus_state':0} else: user = UserWxInfo.objects.get(openid=openid) if user.focus_state == 1: state = 1 _ = User.objects.get(uid=user.uid) request.apisession["uid"] = user.uid request.apisession["pwd_updatetime"] = _.pwd_updatetime ip = '' if request.META.has_key('HTTP_X_FORWARD_FOR'): ip = request.META['HTTP_X_FORWARD_FOR'] else: ip = request.META['REMOTE_ADDR'] UserLoginLog(uid=user.uid, ip=ip).save() else: state = 0 return { 'focus_state':1, 'state':state }
到此這篇關(guān)于Python版實(shí)現(xiàn)微信公眾號(hào)掃碼登陸的文章就介紹到這了,更多相關(guān)Python公眾號(hào)掃碼登陸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python+pywinauto+lackey實(shí)現(xiàn)PC端exe自動(dòng)化的示例代碼
- PythonPC客戶端自動(dòng)化實(shí)現(xiàn)原理(pywinauto)
- python自動(dòng)化工具之pywinauto實(shí)例詳解
- Python 微信公眾號(hào)文章爬取的示例代碼
- 基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù)
- python如何導(dǎo)出微信公眾號(hào)文章方法詳解
- Python selenium爬取微信公眾號(hào)文章代碼詳解
- 如何通過50行Python代碼獲取公眾號(hào)全部文章
- Python如何爬取微信公眾號(hào)文章和評(píng)論(基于 Fiddler 抓包分析)
- python抓取搜狗微信公眾號(hào)文章
- python爬取微信公眾號(hào)文章的方法
- python使用pywinauto驅(qū)動(dòng)微信客戶端實(shí)現(xiàn)公眾號(hào)爬蟲
相關(guān)文章
ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別解析
var可以穿透控制語句、條件語句這樣的作用域,導(dǎo)致變量沖突經(jīng)常發(fā)生,這篇文章主要介紹了ES6?關(guān)鍵字?let?和?ES5?及關(guān)鍵字?var?的區(qū)別,需要的朋友可以參考下2022-09-09使用原生JS實(shí)現(xiàn)滾輪翻頁(yè)效果的示例代碼
這篇文章主要介紹了使用原生JS實(shí)現(xiàn)滾輪翻頁(yè)效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05JavaScript實(shí)現(xiàn)學(xué)生在線做題計(jì)時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)學(xué)生在線做題計(jì)時(shí)器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12基于BootStrap柵格欄系統(tǒng)完成網(wǎng)站底部版權(quán)信息區(qū)
網(wǎng)站底部版權(quán)信息區(qū)可以用bootstrap的“柵格系統(tǒng)”完成,下面給大家分享一個(gè)未經(jīng)處理的底部版權(quán)信息區(qū)的樣式,大家可以做個(gè)參考2016-12-12JS函數(shù)進(jìn)階之繼承用法實(shí)例分析
這篇文章主要介紹了JS函數(shù)進(jìn)階之繼承用法,結(jié)合實(shí)例形式分析了JavaScript函數(shù)繼承相關(guān)定義與使用操作技巧,需要的朋友可以參考下2020-01-01離開當(dāng)前頁(yè)面前使用js判斷條件提示是否要離開頁(yè)面
這篇文章主要介紹了離開當(dāng)前頁(yè)面前如何使用js判斷條件提示是否要離開頁(yè)面,需要的朋友可以參考下2014-05-05