Heim  >  Artikel  >  Backend-Entwicklung  >  Mini-Programm und ThinkPHP5 kombiniert, um den Anmeldestatus zu erreichen (Code beigefügt)

Mini-Programm und ThinkPHP5 kombiniert, um den Anmeldestatus zu erreichen (Code beigefügt)

不言
不言Original
2018-08-11 14:00:3210841Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Kombination kleiner Programme und ThinkPHP5 zum Erreichen des Anmeldestatus (mit Code). Ich hoffe, dass er für Sie hilfreich ist.

WeChat-Miniprogramme umfassen im Allgemeinen drei Anmeldemethoden:
1. Melden Sie sich mit dem WeChat-Konto
an 2. Registrieren Sie sich und melden Sie sich mit Ihrem eigenen Konto an
3. Verwenden Sie andere Plattformkonten von Drittanbietern, um sich anzumelden.

Anmeldevorgang für das WeChat-Konto:

1. Das Miniprogramm erhält den Code über wx.login und sendet ihn an das Backend, das ihn austauscht der session_key und die openid;
2. Generieren Sie zufällig eine Zeichenfolge als session_key und openid als Wert und speichern Sie sie in Redis.
Beim Speichern sollte ein Timeout festgelegt werden . Der Client speichert die zurückgegebene Sitzungs-ID im Speicher. Wenn Sie Hintergrunddienste aufrufen, für deren Zugriff eine Anmeldeberechtigung erforderlich ist,
können Sie die im Speicher gespeicherte Sitzungs-ID herausnehmen und in die Anforderung übernehmen und sie anschließend im Hintergrundcode abrufen die Sitzungs-ID,
durchsucht Redis, um zu sehen, ob die Sitzungs-ID vorhanden ist, wird bestätigt, dass die Sitzung gültig ist.
Setzt die nachfolgende Codeausführung fort, andernfalls wird eine Fehlerbehandlung durchgeführt.

Dieser Artikel verwendet die kostenlose Kontoregistrierung und Anmeldung. Die Hauptideen und Prozesse sind wie folgt:

1. Um das Miniprogramm aufzurufen, erhalten Sie zunächst den Code über wx.login und senden Sie ihn an das Backend über die Backend-Schnittstelle tauscht die WeChat-API session_key und openid aus.

Bestimmen Sie, ob die openid in der Datenbank vorhanden ist > -- Wenn die openid nicht in der Datenbank vorhanden ist (bedeutet, dass kein solches Konto vorhanden ist):
Stellen Sie fest, ob die übergebene Mobiltelefonnummer leer ist (die Mobiltelefonnummer wird beim Anmelden in einer globalen Variablen gespeichert ). Wenn es nicht leer ist, bedeutet dies, dass Sie sich gerade angemeldet haben, und dann openid und openid_time (aktuelle Zeit) binden.
Wenn die Mobiltelefonnummer ebenfalls leer ist, bedeutet dies, dass Sie sich nicht angemeldet haben Es wird eine Anmeldefehlermeldung zurückgegeben, die dazu führt, dass der Client zur Anmeldeseite springt.
– Wenn die openid in der Datenbank vorhanden ist (bedeutet, dass ein entsprechendes Mobiltelefon in der Datenbank vorhanden ist),
Bestimmen Sie, ob openid_time Wenn die Zeit größer als 4 Stunden ist, geben Sie Informationen zum Anmeldefehler zurück und veranlassen Sie den Client, zur Anmeldeseite zu springen.
Wenn sie kleiner als 4 ist, aktualisieren Sie openid_time auf die aktuelle Zeit und geben Sie dann Informationen zum Anmeldeerfolg zurück und Handynummer.
3. Anmeldeseite: Stellen Sie fest, ob die Mobiltelefonnummer in der Datenbank vorhanden ist. Aktualisieren Sie openid_time auf die aktuelle Uhrzeit. Fügen Sie den Benutzer mit der Mobiltelefonnummer hinzu. Springen Sie dann zur Startseite und führen Sie die Methode wx.login aus. Die Anmeldung ist erfolgreich und der Anmeldestatus bleibt bestehen.

Detaillierter Prozess:

Schritt 1: Wenn Sie das Miniprogramm aufrufen, erhalten Sie zunächst den Code über wx.login und senden ihn über die Backend-Schnittstelle an das Backend. Das Backend tauscht den Sitzungsschlüssel aus openid mit der WeChat-API;

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

Schritt 2: Bestimmen Sie, ob die openid in der Datenbank vorhanden ist [eindeutige Kennung, muss an ein Konto (Mobiltelefonnummer) gebunden werden];

// 后台代码:
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'=>'读取失败',]);
            }
        }
    }

Schritt 3: Anmeldeseite: Springen Sie nach erfolgreicher Anmeldung zur Startseite, um die Methode wx.login auszuführen. Anschließend ist die Anmeldung erfolgreich und der Anmeldestatus bleibt erhalten.

// 前台登录
    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'=>'登录成功',]);
    }

So erhalten Sie Sitzungsschlüssel und OpenID basierend auf der WeChat-API

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;
    }
Testergebnisse:


Mini-Programm und ThinkPHP5 kombiniert, um den Anmeldestatus zu erreichen (Code beigefügt)Verwandte Empfehlungen:

Lösung des Namensproblems des Modulnamens „gehörtToMany()“ in thinkphp5

Detaillierte Analyse des Adaptermodus in PHP (mit Code)

Das obige ist der detaillierte Inhalt vonMini-Programm und ThinkPHP5 kombiniert, um den Anmeldestatus zu erreichen (Code beigefügt). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn