ホームページ  >  記事  >  バックエンド開発  >  ミニ プログラムと ThinkPHP5 を組み合わせてログイン状態を実現します (コードが添付されています)

ミニ プログラムと ThinkPHP5 を組み合わせてログイン状態を実現します (コードが添付されています)

不言
不言オリジナル
2018-08-11 14:00:3210754ブラウズ

この記事の内容は、小さなプログラムと ThinkPHP5 を組み合わせてログイン状態を実現する方法 (コード付き) に関するもので、一定の参考価値があります。困っている友人は参考にしていただければ幸いです。

WeChat ミニ プログラムには、通常 3 つのログイン方法があります:
1. WeChat アカウント
を使用してログインします。 2. 自分のアカウントで登録してログインします
3. 他のサードパーティのプラットフォーム アカウントを使用してログインします

WeChat アカウントのログイン プロセス:

1. アプレットは wx.login を通じてコードを取得し、それをバックエンドに送信し、バックエンドでsession_key と openid;
2. sessionid (キー) として文字列、値として session_key と openid をランダムに生成し、redis に保存します. 安全のため、
保存時にタイムアウトを設定する必要があります;
3 .クライアントは返されたセッション ID をストレージに保存し、アクセスにログインが必要なバックグラウンド サービスを呼び出すときに、ストレージに保存されたセッション ID を取り出してリクエストに含め、セッション ID の後のバックグラウンド コードで取得できます。 ,
redisにsessionidが存在するか確認し、存在すればセッションが有効であることを確認,
以降のコード実行を続行、そうでない場合はエラー処理が行われます。

この記事では無料のアカウント登録とログインを使用します。主なアイデアとプロセスは次のとおりです:

1. ミニ プログラムに入るには、まず wx.login を通じてコードを取得し、それをバックエンドに送信します。バックエンド インターフェイス経由。バックエンドはこれを使用して WeChat API で session_key と openid を交換します。##2. openid がデータベースに存在するかどうかを確認します [一意の ID、アカウント (携帯電話番号) にバインドする必要があります]

-- openid がデータベースに存在しない場合 (そのようなアカウントが存在しないことを意味します)):
渡された携帯電話番号が空かどうかを確認します (携帯電話番号はログイン時にグローバル変数に保存されます) ). 空でない場合は、ログインしたばかりであることを意味し、 openid と openid_time (現在時刻) をバインドします。
携帯電話番号も空の場合は、ログインしていないことを意味します。ログイン失敗メッセージが返され、クライアントはログイン ページにジャンプします。
-- データベースに openid がある場合 (データベースに対応する携帯電話があることを意味します)、
openid_time かどうかを判断します。現在時刻から 4 時間より大きい場合、ログイン失敗情報を返し、クライアントをログイン ページにジャンプさせます。
より小さい場合、openid_time を現在時刻に更新して、ログインを返します。成功情報と携帯電話番号。
3. ログイン ページ: 携帯電話番号がデータベースに存在するかどうかを確認します。存在する場合は、openid_time を現在時刻に更新します。存在しない場合は、携帯電話番号を使用してユーザーを追加します。その後、ホームページにジャンプして wx.login メソッドを実行すると、ログインに成功し、ログイン状態が残ります。

詳細なプロセス:

ステップ 1: ミニ プログラムに入るとき、まず wx.login を通じてコードを取得し、バックエンド インターフェイスを通じてバックエンドに送信します。バックエンドはこれを session_key と交換します。 WeChat API を使用した 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 がデータベースに存在するかどうかを確認します [一意の ID、アカウント (携帯電話番号) にバインドする必要があります];

// 后台代码:
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',
          })
        }
      }
    })
errree

WeChat API に基づいてセッションキーと openid を取得する方法

// 后台登录方法
    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'=>'登录成功',]);
    }
テスト結果:


ミニ プログラムと ThinkPHP5 を組み合わせてログイン状態を実現します (コードが添付されています)関連する推奨事項:

thinkphp5 のbelongsToMany() モジュール名の命名問題を解決します。

php でのアダプター モードの詳細な分析 (コード付き)

以上がミニ プログラムと ThinkPHP5 を組み合わせてログイン状態を実現します (コードが添付されています)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。