微信小程序登陆授权

小程序前端代码

function WXlogin(){
  wx.login({
    success: function (code) {
      wx.getUserInfo({
        success:function(userInfo){
            //发起请求
            wx.request({
              url: domain+'wxopen/wxapp/login',
              method:"POST",
              data:{
                code: code.code,
                encryptedData: userInfo.encryptedData,
                iv: userInfo.iv,
                rawData: userInfo.rawData,
                signature: userInfo.signature,
                appid:extConfig.appid
              },
              success:function(res){
                console.log(res,'login')
                wx.setStorageSync('session_3rd', res.data);//存token
              }
            })
        }
      })
      
    }
  });
}

//重新登陆更新
function reLogin(sess_3rd){
  console.log(sess_3rd,'s3rd')
  //发起请求
  wx.request({
    url: domain + 'wxopen/wxapp/reLogin',
    method: "POST",
    data: {
      session: sess_3rd,
    },
    success: function (res) {
      console.log(res, 'relogin')
      if(res.data == 0){
        WXlogin();//重新登陆
      }else{
        wx.setStorageSync('session_3rd', res.data);//存token
      }
      
    }
  })
}

  

后端PHP代码

function login(){
        $code = input('code');//登陆凭证
        $encryptedData = input('encryptedData');//
        $iv = input('iv');//
        $rawData = input('rawData');//
        $signature = input('signature');//
        $appid = input('appid');


        //第三方token,换取session_key
        $comp_token = $this->component->getAccessToken();
        $url ='https://api.weixin.qq.com/sns/component/jscode2session?appid='.$appid.'&js_code='.$code.'&grant_type=authorization_code&component_appid='.$this->appid.'&component_access_token='.$comp_token;

        $result = send_get($url);
        $result = json_decode($result,true);
        trace($result,'登陆返回');

        //根据业务需要对数据包进行签名校验,确保数据的完整性。
        $signature2 = sha1( $rawData.$result['session_key']);
        if ($signature != $signature2){
            return ['msg'=>'签名检验失败','status'=>0];
        }

        //解密获得用户的完整敏感信息
        $pc = new wxappBizDataCrypt($appid, $result['session_key']);

        $errCode = $pc->decryptData($encryptedData, $iv, $data );

        if ($errCode == 0) {
            $data = json_decode($data,true);
            $data['appid'] = $data['watermark']['appid'];
            $session_3rd = bin2hex(random_bytes(9));

            $data['session_3rd'] = $session_3rd;

            //检查用户是否存在,进行增加更新操作
            $userInfo = new UserInfo();
            $users = $userInfo::get(['openid'=>$result['openid']]);
            if ($users){
                $ret = $userInfo->allowField(true)->isUpdate(true)->save($data,['openid'=>$result['openid']]);

            }else{
                $ret = $userInfo->allowField(true)->isUpdate(false)->save($data);
            }

            if ($ret)
                return $session_3rd;
        }
        return 0;
    }


    //登陆过期,重新登陆
    function reLogin(){
        $session = input('session');
        $users = $this->user->where(['session_3rd'=>$session])->find();
        if ($users){
            $session_3rd = bin2hex(random_bytes(9));
            $ret = $this->user->where('id',$users['id'])->update(['session_3rd'=>$session_3rd]);//更新3rd

            return $session_3rd;
        }else{
            return 0;
        }
    }

  

原文地址:https://www.cnblogs.com/pangxiaox/p/8321864.html