首頁 >後端開發 >php教程 >小程式和ThinkPHP5結合實作登入狀態(附程式碼)

小程式和ThinkPHP5結合實作登入狀態(附程式碼)

不言
不言原創
2018-08-11 14:00:3210860瀏覽

這篇文章帶給大家的內容是關於小程式和ThinkPHP5結合實現登入狀態(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

微信小程式中,一般會涉及三種登入方式:
     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是有效的,
   繼續後續的程式碼執行,否則進行錯誤處理。

本文採用的是自由的帳號註冊和登錄,主要想法和流程如下:

1.  進入小程式首先透過wx.login取得code,透過後台介面發往後台,後台以此向微信API換取session_key和openid;
2. 判斷資料庫中有無該openid【唯一標識,需和帳號(手機號碼)綁定】,
   --  如果資料庫中沒有該openid(表示沒有該帳號):
   判斷傳過來的手機號碼是否為空(登入時會將手機號碼存到全域變數),如果不為空,則表示是剛登入過的,然後綁定openid及openid_time(目前時間) ,
   如果手機號碼也為空,表示沒登入過,則返回登入失敗訊息,使客戶端跳轉登入頁面;
   -- 如果資料庫中有該openid(說明資料庫中有相對應的手機號),
   判斷openid_time距離現在的時間是否大於4小時,如果大於,返回登入失敗訊息,使客戶端跳轉登入頁面;
   如果小於,則更新openid_time為當前時間,然後返回登入成功資訊及手機號。
3. 登入頁面:判斷資料庫中該手機號碼是否存在,如果存在,則更新openid_time為目前時間,如果不存在,則新增該手機號碼使用者。然後跳轉首頁執行wx.login方法,登入成功,保持登陸狀態。

詳細流程:

步驟1:進入小程式先透過wx.login取得code,透過後台介面傳送到後台,後台以此向微信API換取session_key和openid;

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 = "https://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結合實作登入狀態(附程式碼)

相關推薦:

# thinkphp5中belongsToMany() 模組名稱的命名問題解決

php中適配器模式的詳細解析(附程式碼)

以上是小程式和ThinkPHP5結合實作登入狀態(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn