本篇文章给大家带来的内容是关于小程序和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中belongsToMany() 模块名称的命名问题解决
以上是小程序和ThinkPHP5结合实现登录状态(附代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SublimeText3汉化版
中文版,非常好用