小程序授权登录完整步骤(开发实例)

开发使用的thinkphp5
一,小程序登录
可参考小程序登录

前端调用 wx.login() 获取 临时登录凭证code 。

二,微信授权
前端请求后端授权登录接口(code参数传递过来),代码实现。

          /*
     * APPID  //定义常量 APPID
     * SECRET  // 定义常量密钥
     * GRANTYPE  //定义常量类型
     * WX_LOGIN_URL  //定义常量微信请求地址  https://api.weixin.qq.com/sns/jscode2session
     * */
         $js_code=input('post.code');
         $url_param='?appid='.APPID.'&secret='.SECRET.'&js_code='.$js_code.'&grant_type='.GRANTYPE;
         $requre_url=WX_LOGIN_URL.$url_param;
        $wx_data_json=getCurl($requre_url);
       $wx_data=json_decode($wx_data_json,true);
       if (isset($wx_data['errcode']) !=0){
           Log::write('登录失败:错误码是-'.$wx_data_json,'debug');
    return json_return('1000','登录失败');
       }
        $openid = $wx_data['openid'];
        $session_key = $wx_data['session_key'];
        //信息保存在redis中,可根据需要保存自己可查看到的位置
        $openid_redis=$redis->set($openid,$session_key);
        //用户是否已获取信息
        $status=db('user_record')->where('openid',$openid)->value('id');
       $yzk_data['openid']=$openid;
       $yzk_data['status']=empty($status) ? 0 : 1;
       return json_return('0','success',$yzk_data);

三,获取个人信息

signature,rawData,openid,encryptedData,iv。需要前端传递的参数,后端数据解析获取用户信息。

 $redis=redis();
        $js_code=input('post.');
        // 数据签名校验
        $signature = $js_code['signature'];
        $rawData = $js_code['rawData'];
        $openid = $js_code['openid'];
        Log::write('获取用户信息------------'.$signature,'debug');
        if (empty($signature)) return json_return('4001','signature参数为空');
        $session_key=$redis->get($js_code['openid']);
        $signature2 = sha1($rawData . $session_key);
        if ($signature != $signature2) {
            return json_return('1000','数据签名验证失败!');
        }
        $encryptedData = $js_code['encryptedData'];
        $iv = $js_code['iv'];
        $pc = new WXBizDataCrypt(APPID, $session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);  //其中$data包含用户的所有数据
        $data = json_decode($data,true);
        if ($errCode == 0){

            //保存用户信息
            try{
                $res=$this->storageUser($data,$session_key);
              //  return json_return('0','success',$res);
//                if ($res == 'has'){
//
//                    return json_return('0','用户信息已存在');
//                }
                if($res){
//                    $info=$this->product_token($openid,$session_key);
                    return json_return('0','success',['info'=>$data]);

                }
                if (!$res) return json_return('1000','添加信息失败');
                $return_arr['info']=$data;
            }catch (Exception $exception){
                return json_return('1000',$exception->getMessage());
            }

           // $token_res=$redis->set($token,$session_key);
        }else{
            return json_return('1000','获取信息失败');
        }
        return json_return('0','success',$return_arr);

四,授权获取手机号,并绑定。

openid,encryptedData,iv。前端传递参数,后端接收参数解析并获取手机号。

 $redis=redis();
        $js_code=input('post.');
        $openid = $js_code['openid'];
        $session_key=$redis->get($js_code['openid']);
        $encryptedData = $js_code['encryptedData'];
        $iv = $js_code['iv'];
        $pc = new WXBizDataCrypt(APPID, $session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);  //其中$data包含用户的所有数据
        $data = json_decode($data,true);
        Log::write('errCode------------------'.$errCode,'debug');
        if ($errCode == 0){
        
            try{
                //判断用户信息是否已绑定
                $wx_bind=model('user_record')->where(array('mobile'=>$data['phoneNumber'],'openid'=>$openid))->value('id');

                if ($wx_bind){
                    $res_token=$this->product_token($openid,$session_key);
                    return json_return('0','success',$res_token);
                }
                //检查用户手机号是否存在
                $has_tel_id=model('user_record')->getUserTel($data);

                if ($has_tel_id){
                    //更新信息到手机用户
                    $res=model('user_record')->updateUserMess($has_tel_id,$openid,$session_key);
                    if (!$res) return json_return('1000','更新数据失败');
                }else{

                    //手机号绑定至用户
                    $info=model('user_record')->bindUserTel($data,$openid,$session_key);
                    if (empty($info)) return json_return('1000','绑定信息失败');
                }

         
                $return_arr=$this->product_token($openid,$session_key);
            }catch (Exception $exception){
                return json_return('1000',$exception->getMessage());
            }
            // $token_res=$redis->set($token,);
        }else{
            return json_return('1000','获取信息失败');
        }
        return json_return('0','success',$return_arr);

本实例是本人开发调用,可根据自己项目情况借鉴参考。如有疑问欢迎留言沟通

你可能感兴趣的:(小程序)