本篇文章給大家帶來的內容是關于小程序和ThinkPHP5結合實現登錄狀態(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
html' target='_blank'>微信小程序中,一般會涉及三種登錄方式:
1. 使用微信賬號登錄
2. 自有的賬號注冊和登錄
3. 使用其他第三方平臺賬號登錄
1. 小程序通過wx.login獲取code,發往后臺,后臺以此向微信API換取session_key和openid;
2. 隨機生成字符串作為sessionid(key),session_key和openid作為value,存入redis中,為了安全,
存入的時候還應設置一個超時的時間;
3. 客戶端將返回的sessionid存入storage,調用那些需要登錄后才有權限的訪問的后臺服務時,
你可以將保存在storage中的sessionid取出并攜帶在請求中,后臺代碼中獲取到該sessionid后,
從redis中查找是否有該sessionid存在,存在的話,即確認該session是有效的,
繼續后續的代碼執行,否則進行錯誤處理。
var user_phone = app.globalData.user_phone;wx.login({ success: res = { // 發送 res.code 到后臺換取 openId, sessionKey, unionId wx.request({ url: http://www.tphoutai.com/wx/index , data: { code: res.code, user_phone: user_phone, success: function (result) { var res = result.data; console.log(res); if(res.sendsure == 0){ wx.reLaunch({ url: ../login/login , }else if(res.sendsure == 1){ wx.reLaunch({ url: ../index/index , })步驟2:判斷數據庫中有無該openid【唯一標識,需和賬號(手機號)綁定】;
// 后臺代碼:public function index(Request $request){ $url = http://api.weixin.qq.com/sns/jscode2session // 參數 $params[ appid ]= 小程序的appid $params[ secret ]= 小程序的AppSecret $params[ js_code ]= $request - param( code $params[ grant_type ]= authorization_code $user_phone= $request - param( user_phone // 微信API返回的session_key 和 openid $arr = httpCurl($url, $params, POST $arr = json_decode($arr,true); // 判斷是否成功 if(isset($arr[ errcode ]) !empty($arr[ errcode ])){ return json([ code = 2 , message = $arr[ errmsg ], result = null]); $openid = $arr[ openid $session_key = $arr[ session_key // 從數據庫中查找是否有該openid $is_openid = Db::table( user_info )- where( openid ,$openid)- find(); // 如果openid存在,更新openid_time,返回登錄成功信息及手機號 if($is_openid){ // openid存在,先判斷openid_time,與現在的時間戳相比,如果相差大于4個小時,則則返回登錄失敗信息,使客戶端跳轉登錄頁,如果相差在四個小時之內,則更新openid_time,然后返回登錄成功信息及手機號; // 根據openid查詢到所在條數據 $data = Db::table( user_info )- where( openid ,$openid)- find(); // 計算openid_time與現在時間的差值 $time = time() - $data[ openid_time $time = $time / 3600; // 如果四個小時沒更新過,則登陸態消失,返回失敗,重新登錄 if($time 4){ return json([ sendsure = 0 , message = 登錄失敗 ,]); }else{ // 根據手機號更新openid時間 $update = Db::table( user_info )- where( openid , $openid)- update([ openid_time = time()]); // 判斷是否更新成功 if($update){ return json([ sendsure = 1 , message = 登錄成功 , user_phone = $data[ user_phone ]]); }else{ return json([ sendsure = 0 , message = 登錄失敗 // openid不存在時 }else{ // dump($user_phone); // 如果openid不存在, 判斷手機號是否為空 if(isset($user_phone) !empty($user_phone)){ // 如果不為空,則說明是登錄過的,就從數據庫中找到手機號,然后綁定openid,+時間 // 登錄后,手機號不為空,則根據手機號更新openid和openid_time $update = Db::table( user_info ) - where( user_phone , $user_phone) - update([ openid = $openid, openid_time = time(), ]); if($update){ return json([ sendsure = 1 , message = 登錄成功 ,]); }else{ // 如果也為空,則返回登錄失敗信息,使客戶端跳轉登錄頁 return json([ sendsure = 0 , message = 讀取失敗 ,]); }步驟3:登錄頁面:登錄成功后,跳轉首頁執行wx.login方法,然后登錄成功,保持登陸狀態。
// 前臺登錄 wx.request({ url: http://www.tphoutai.com/wx/login , data: { user_phone: user_phone success: function (result) { var res = result.data; if (res.sendsure == 1){ app.globalData.user_phone = that.data.user_phone; wx.reLaunch({ url: ../loading/loading , })
// 后臺登錄方法 public function login(Request $request){ // 獲取到前臺傳輸的手機號 $user_phone = $request - param( user_phone // 判斷數據庫中該手機號是否存在 $is_user_phone = Db::table( user_info )- where( user_phone ,$user_phone)- find(); if(isset($is_user_phone) !empty($is_user_phone)){ // 登錄時,數據庫中存在該手機號,則更新openid_time $update = Db::table( user_info ) - where( user_phone , $user_phone) - update([ openid_time = time(), ]); if($update){ return json([ sendsure = 1 , message = 登錄成功 ,]); }else{ $data = [ user_phone = $user_phone, pass = 12345 // 如果數據庫中不存在該手機號,則進行添加 Db::table( user_info )- insert($data); } return json([ sendsure = 1 , message = 登錄成功 ,]); }根據微信API獲取sessionkey 和 openid的方法
function httpCurl($url, $params, $method = GET , $header = array(), $multi = false){ date_default_timezone_set( PRC $opts = array( CURLOPT_TIMEOUT = 30, CURLOPT_RETURNTRANSFER = 1, CURLOPT_SSL_VERIFYPEER = false, CURLOPT_SSL_VERIFYHOST = false, CURLOPT_HTTPHEADER = $header, CURLOPT_COOKIESESSION = true, CURLOPT_FOLLOWLOCATION = 1, CURLOPT_COOKIE = session_name(). = .session_id(), /* 根據請求類型設置特定參數 */ switch(strtoupper($method)){ case GET : // $opts[CURLOPT_URL] = $url . ? . http_build_query($params); // 鏈接后拼接參數 非? $opts[CURLOPT_URL] = $url . ? . http_build_query($params); break; case POST : //判斷是否傳輸文件 $params = $multi ? $params : http_build_query($params); $opts[CURLOPT_URL] = $url; $opts[CURLOPT_POST] = 1; $opts[CURLOPT_POSTFIELDS] = $params; break; default: throw new Exception( 不支持的請求方式! /* 初始化并執行curl請求 */ $ch = curl_init(); curl_setopt_array($ch, $opts); $data = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if($error) throw new Exception( 請求發生錯誤: . $error); return $data; }
測試結果:
相關推薦:
thinkphp5中belongsToMany() 模塊名稱的命名問題解決
php中適配器模式的詳細解析(附代碼)
以上就是小程序和ThinkPHP5結合實現登錄狀態(附代碼)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答