小程序和ThinkPHP5結合實現登錄狀態(含代碼)


本篇文章給大家帶來的內容是關於小程序和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;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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【唯一標識,需和賬號(手機號)綁定】;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

// 后台代碼:

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, 'GET');       

        $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方法,然后登錄成功,保持登陸狀態。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// 前台登錄

    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',

          })

        }

      }

    })

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 后台登錄方法

    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的方法

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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;

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM