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.
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.
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', }) } } }) } })
// 后台代码: 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'=>'读取失败',]); } } }
// 前台登录 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'=>'登录成功',]); }
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; }
Verwandte Empfehlungen:
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!