Python版實現微信公眾號掃碼登陸
基于python 實現公眾掃碼登陸
前提 申請公眾號服務,配置相關信息,并在相關平臺進行配置,就這么多東西

實現邏輯,使用臨時臨時二維碼,帶參數的二維碼掃碼登陸
流程,用戶已經掃碼關注,在登陸頁面直接掃碼登陸,
用戶未關注,則需要點擊關注后,直接登錄,
我們使用帶參數的場景值來區(qū)別是哪個用戶進行掃碼登陸
場景值用戶可以自定義,但是必須是唯一的,我用的時間戳
我現在要做的功能,有賬戶綁定需求,并且是前后端分離的情況下,
流程1
當用戶已經關注過,并且綁定賬號,直接掃碼登陸,
當用戶已經關注過,未綁定,需要掃碼后,跳轉到綁定手機號頁面,綁定后,進行登錄,
當用戶取消關注,相當于解綁,進行掃碼后,重新到綁定頁面,進行掃碼登陸,當然也要,對綁定已經綁定過的手機號驚醒判斷。
代碼如下
接口1 帶參數的場景值生成的二維碼
def get_wxcode(request):
"""
公眾號掃碼登陸
獲取帶參數二維碼
參數:
返回值:
{
"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", # 唯一掃碼場景值,用來判斷哪個用戶進行掃碼登陸
"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("微信", "微信公共號正在維護中,給你帶來的不便,敬請原諒")
except:
raise FieldError("微信", "微信公共號正在維護中,給你帶來的不便,敬請原諒")
接口返回有url 和sceneid URL直接就是一個二維碼,前端可以直接拿來展示,sceneid 是返回前端,讓前端進行保存,來進行判斷用戶是否掃碼,因為 微信服務,目前不支持sessionid 的緩存,所以需要我們自行緩存,我使用的將場景值存入redis
2 前端展示出來二維后,用戶開始掃碼,點擊關注后,微信服務就用戶信息,回調給我們在微信公眾填的服務器地址,如圖片

現在我們開始寫回調地址的代碼:
微信關注,類型是事件 來發(fā)送,具體類型看文檔
1 先通過于微信通信驗證,是get 請求

獲取用戶信息是post 請求
event 屬于關注事件


我們可以access_token 獲取用戶信息,將用戶信息保存,并將 場景值 eventkey 存入Redis 我設置的過期時間為1個小時
致此微信回調結束,3接口2 ,開始判斷用戶是否進行掃碼關注,我們需要前端給后端傳一個場景值,我們通過從redis 的場景值來獲取存入數據的用戶信息,如果已經存入,則用戶掃碼成功,直接登錄,用戶的openid 是唯一的
如果用戶信息,獲取,則用戶并沒有進行掃碼,這個獲取狀態(tài)的接口,需要一輪詢的方式進行查看 可以5s 進行一次
def get_public_wx_status(request):
'''
參數
scene_id 場景值 必傳 判斷是哪個用戶 掃碼
輪詢查看 公眾號 是否掃碼關注,掃碼關注是否綁定手機號
:param request:
:return:
{
"formError": {},
"delta_time": 713,
"errorCode": 0,
"params": {},
"message": "",
"data": {
"focus_state": 1, # 微信關注的狀態(tài) 1 已掃碼關注 0 未關注
"state": 0 # 關注后,是否綁定手機號 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
}
到此這篇關于Python版實現微信公眾號掃碼登陸的文章就介紹到這了,更多相關Python公眾號掃碼登陸內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- python+pywinauto+lackey實現PC端exe自動化的示例代碼
- PythonPC客戶端自動化實現原理(pywinauto)
- python自動化工具之pywinauto實例詳解
- Python 微信公眾號文章爬取的示例代碼
- 基于Python采集爬取微信公眾號歷史數據
- python如何導出微信公眾號文章方法詳解
- Python selenium爬取微信公眾號文章代碼詳解
- 如何通過50行Python代碼獲取公眾號全部文章
- Python如何爬取微信公眾號文章和評論(基于 Fiddler 抓包分析)
- python抓取搜狗微信公眾號文章
- python爬取微信公眾號文章的方法
- python使用pywinauto驅動微信客戶端實現公眾號爬蟲
相關文章
JavaScript控制兩個列表框listbox左右交換數據的方法
這篇文章主要介紹了JavaScript控制兩個列表框listbox左右交換數據的方法,實例分析了javascript操作列表框listbox的技巧,非常具有實用價值,需要的朋友可以參考下2015-03-03

