>  기사  >  백엔드 개발  >  미니 프로그램과 ThinkPHP5를 결합하여 로그인 상태 획득(코드 첨부)

미니 프로그램과 ThinkPHP5를 결합하여 로그인 상태 획득(코드 첨부)

不言
不言원래의
2018-08-11 14:00:3210821검색

이 글의 내용은 로그인 상태(코드 포함)를 달성하기 위한 작은 프로그램과 ThinkPHP5의 조합에 관한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

WeChat 미니 프로그램에는 일반적으로 세 가지 로그인 방법이 있습니다:
1. 위챗 계정으로 로그인
2. 자신의 계정으로 등록하고 로그인하세요
3. 다른 타사 플랫폼 계정을 사용하여 로그인

WeChat 계정 로그인 프로세스:

1. 애플릿은 wx.login을 통해 코드를 획득하고 이를 WeChat API와 session_key 및 openid를 교환하는 백엔드로 보냅니다. 2. 문자를 무작위로 생성합니다. 문자열은 sessionid(키)로 사용되며, session_key 및 openid는 안전을 위해 redis에 저장됩니다.
저장 시 시간 제한을 설정해야 합니다.
3. 로그인 후 백엔드 서비스에 접근하게 되면
스토리지에 저장된 세션ID를 꺼내서 백엔드 코드에서 세션ID를 가져온 후
여부를 확인하면 됩니다. sessionid가 redis에 존재하는 경우 세션이 유효한 것으로 확인됩니다.
후속 코드 실행을 계속하고 그렇지 않으면 오류 처리가 수행됩니다.

이 기사에서는 무료 계정 등록 및 로그인을 사용합니다. 주요 아이디어와 프로세스는 다음과 같습니다.

1. 미니 프로그램에 들어가려면 먼저 wx.login을 통해 코드를 얻은 후 백엔드 인터페이스를 통해 백엔드로 보냅니다. 백엔드는 session_key 및 openid를 WeChat API와 교환합니다. ;

2. openid가 데이터베이스에 있는지 확인합니다[고유 ID, 계정(휴대폰 번호)에 연결되어야 함],
-- openid가 존재하지 않는 경우 데이터베이스(해당 계정이 없음을 나타냄):
전달된 휴대폰 번호가 비어 있는지 확인합니다(로그인 시 휴대폰 번호가 전역 변수에 저장됩니다). 방금 로그인한 후 openid와 openid_time(현재 시간)을 바인딩합니다.
휴대폰 번호도 비어 있으면 로그인되지 않은 것입니다. 이를 통과하면 로그인 실패 메시지가 반환되어 클라이언트가 점프하게 됩니다. 로그인 페이지로
-- 데이터베이스에 openid가 있는 경우(데이터베이스에 해당 휴대폰 번호가 있음을 나타냄)
openid_time이 지금부터 4시간보다 큰지 확인합니다. , 로그인 실패 정보가 반환되어 클라이언트가 로그인 페이지로 이동합니다.
이 값보다 작은 경우 openid_time이 현재 시간으로 업데이트된 후 로그인 성공 정보와 휴대폰 번호가 반환됩니다.
3. 로그인 페이지: 데이터베이스에 휴대폰 번호가 있는지 확인하고, 없으면 openid_time을 현재 시간으로 업데이트합니다. 그런 다음 홈페이지로 이동하여 wx.login 메소드를 실행하면 로그인이 성공하고 로그인 상태가 유지됩니다.

상세 프로세스:

1단계: 미니 프로그램에 들어갈 때 먼저 wx.login을 통해 코드를 얻은 다음 백엔드 인터페이스를 통해 백엔드에서 이를 WeChat 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 메소드를 실행한 후 성공적으로 로그인하고 로그인 상태를 유지하세요. wechat api

// 前台登录
    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',
          })
        }
      }
    })

test 결과 :

관련 권장 사항 : thinksphp5에서 refortmany () 모듈 이름의 명명 문제에 대한 해결책에 대한 분리 된 권장 사항 :
미니 프로그램과 ThinkPHP5를 결합하여 로그인 상태 획득(코드 첨부)

rrereeRreee

method and openid를 얻을 수 있습니다. PHP의 어댑터 모드(코드 포함)

위 내용은 미니 프로그램과 ThinkPHP5를 결합하여 로그인 상태 획득(코드 첨부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.