集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk

news2024/12/23 13:26:20

下载地址:

https://githubfast.com/anerg2046/sns_auth

安装方式建议使用composer进行安装

如果linux执行composer不方便的话,可以在本地新建个文件夹,然后执行上面的composer命令,把代码sdk和composer文件一起上传到项目适当位置:然后,

示例代码:

<?php
    //以thinkCMF框架为例

    namespace app\home\controller;
    use cmf\controller\HomeBaseController;
    use think\facade\Db;
    use anerg\OAuth2\OAuth;

    class UserController extends HomebaseController{

        private function getThirdConfig($name){


            $site='http://xxxx.com'; //更改为自己站点域名
        
            //下面的参数需要根据自己的实际需求替换

            $line_config=[
                'app_id'=>'login_line_appid',
                'app_secret'=>'login_line_secret',
                'scope'=>'profile'
            ];


            $facebook_config=[
                'app_id'=>'login_facebook_appid',
                'app_secret'=>'login_facebook_secret',
                'scope'=>'public_profile'
            ];

            $google_config=[
                'app_id'=>'login_google_appid'.'.apps.googleusercontent.com',
                'app_secret'=>'login_google_secret',
                'scope'=>'https://www.googleapis.com/auth/userinfo.profile'
            ];

            $twitter_config=[
                'app_id'=>'login_twitter_appid',
                'app_secret'=>'login_twitter_secret'
            ];

            $config=[];

            switch ($name) {
                case 'line':
                    $config=$line_config;
                    break;
            
                case 'facebook':
                    $config=$facebook_config;
                    break;

                case 'google':
                    $config=$google_config;
                    break;

                case 'twitter':
                    $config=$twitter_config;
                    break;
            }

            $config['callback']=$site.'/home/user/'.$name.'_callback';

            return $config;

        }

        /**
         * Line登录
         */
        public function line(){
            require_once '/sns_auth/vendor/autoload.php';

            $name='line';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }
	
	    /**
	    Line登陆回调
	    **/
	    public function line_callback(){

            $code= $_GET['code'] ?? '';

		    if($code!=""){

                $this->third_callback('line');

		    }else{
                $this->error('三方回调信息获取失败');
            }

	    }

        /**
         * facebook登录
         */
        public function facebook(){
            require_once '/sns_auth/vendor/autoload.php';
            $name='facebook';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }

        /**
        * Facebook登陆回调
        */
        public function facebook_callback(){
            $code= $_GET['code'] ?? '';

            if($code!=""){

                $this->third_callback('facebook');

            }else{
                $this->error('三方回调信息获取失败');
            }
        }

        /**
         * Google登录
         */
        public function google(){
            require_once '/sns_auth/vendor/autoload.php';
            $name='google';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }

        /**
        * Google登陆回调
        */
        public function google_callback(){
            $code= $_GET['code'] ?? '';

            if($code!=""){

                $this->third_callback('google');

            }else{
                $this->error('三方回调信息获取失败');
            }
        }


        /**
         * twitter登录
         */
        public function twitter(){
            require_once '/sns_auth/vendor/autoload.php';
            $name='twitter';
            $config=$this->getThirdConfig($name);
        
            return redirect(OAuth::$name($config)->getRedirectUrl());
        }

        /**
        * twitter登陆回调
        */
        public function twitter_callback(){
            $code= $_GET['code'] ?? '';

            if($code!=""){

                $this->third_callback('twitter');

            }else{
                $this->error('三方回调信息获取失败');
            }
        }


        protected function third_callback($name){

            require_once '/sns_auth/vendor/autoload.php';

            $config=$this->getThirdConfig($name);
    
            $openinfo = OAuth::$name($config)->userinfo();

            if(!$openinfo){
                $this->error('三方信息验证失败');
                return;
            }

            /*$openinfo=[
                'openid'=>'唯一标识',
                'channel'=>'line',
                'nick'=>'line昵称',
                'gender'=>'性别',
                'avatar'=>'line头像'
            ];*/

            $openid=$openinfo['openid'];
            $channel=$openinfo['channel'];
        

            $nickname=$openinfo['nick'];
            $avatar=$openinfo['avatar'];
            $userinfo=$this->loginByThird($channel,$openid,$nickname,$avatar);
            if($userinfo==1001){
                $this->assign("jumpUrl",'/');
                $this->error('该账号已被禁用');
                return;
            }


            if($userinfo==1002){
                $this->assign("jumpUrl",'/');
                $this->error('该账号已被注销');
                return;
            }

            if($userinfo==1003){
                $this->assign("jumpUrl",'/');
                $this->error('该账号已被禁用');
                return;
            }

            $configpub=getConfigPub();
        
            session('uid',$userinfo['id']);
            session('token',$userinfo['token']);
            session('user',$userinfo);
            $href='http://xxxx.com'; //替换为自己站点的域名
            echo "<meta http-equiv=refresh content='0; url=$href'>";
        }

    
        protected function loginByThird($type,$openid,$nickname,$avatar){

            //实际业务代码,根据自己项目做修改

            $info=DB::name('user')
            ->where("openid='{$openid}' and login_type='{$type}' and user_type=2")
            ->find();
            
		    if(!$info){
			    /* 注册 */
			    $user_pass='abcdefg123456';
			    $user_pass=cmf_password($user_pass); //密码加密,方法请自己实现
			    $user_login=$type.'_'.time().rand(100,999);

			    if(!$nickname){
				    $nickname=$type.'用户-'.substr($openid,-4);
			    }else{
				    $nickname=urldecode($nickname);
			    }
			    if(!$avatar){
				    $avatar='/default.jpg';
				    $avatar_thumb='/default_thumb.jpg';
			    }else{
				    $avatar=urldecode($avatar);
                    $avatar_thumb=$avatar;
			    }
			
			    $data=array(
				    'user_login'    => $user_login,
				    'user_nickname' =>$nickname,
				    'user_pass'     =>$user_pass,
				    'signature'     =>'这家伙很懒,什么都没留下',
				    'avatar'        =>$avatar,
				    'avatar_thumb'  =>$avatar_thumb,
				    'last_login_ip' =>get_client_ip(0,true),
				    'create_time'   => time(),
				    'user_status'   => 1,
				    'openid'        => $openid,
				    'login_type'    => $type,
				    "user_type"     =>2,//会员
				    "source"        =>'pc'
			    );
            
			
                $uid=DB::name('user')->insertGetId($data);

            
			    $info['id']=$uid;
			    $info['user_nickname']=$data['user_nickname'];
			    $info['avatar']=$data['avatar'];
			    $info['avatar_thumb']=$data['avatar_thumb'];
			    $info['sex']='2';
			    $info['signature']=$data['signature'];
			    $info['coin']='0';
			    $info['login_type']=$data['login_type'];
			    $info['province']='';
			    $info['city']='';
			    $info['birthday']='';
			    $info['consumption']='0';
			    $info['votestotal']='0';
			    $info['user_status']=1;
			    $info['last_login_time']='';
                $info['end_bantime']='0';
		    }else{
			    if(!$avatar){
				    $avatar='/default.jpg';
				    $avatar_thumb='/default_thumb.jpg';
			    }else{
				    $avatar=urldecode($avatar);
                    $avatar_thumb=$avatar;
			    }
			
			    $info['avatar']=$avatar;
			    $info['avatar_thumb']=$avatar_thumb;
			
			    $data=array(
				    'avatar' =>$avatar,
				    'avatar_thumb' =>$avatar_thumb,
			    );
			
		    }
		
		    if($info['user_status']=='0'){
			    return 1001;					
		    }

		    if($info['user_status']=='3'){
			    return 1002;					
		    }

		    if($info['user_status']=='1'&& $info['end_bantime']>time()){
			    return 1003;					
		    }
		
		    $info['isreg']='0';
		    $info['isagent']='0';
		    if($info['last_login_time']=='' ){
			    $info['isreg']='1';
			    $info['isagent']='1';
		    }


		    $info['avatar']=get_upload_path($info['avatar']);
		    $info['avatar_thumb']=get_upload_path($info['avatar_thumb']);

            return $info;
        }
    }

代码中各个配置参数如何获取:

facebook:

Line:

Google:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1203307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity插件】2D模拟绳子的插件——Rope 2D Editor

文章目录 前言资源unity商店地址&#xff1a;我这里有一个比较老旧的版本&#xff1a; 使用创建绳子场景使用时效果 参考完结 前言 最近发现一个很有意思的插件Rope 2D Editor&#xff0c;这是一个简单而强大的 2d 绳索编辑器。这是我为我的游戏&#xff08;Dabdob&#xff09…

郑州大学2020级信息安全专业——保研小结

最终上岸 夏令营&#xff1a; 夏令营开始的时间一般比较早&#xff0c;在期末考试之前就已经开始了&#xff0c;需要提前联系导师&#xff0c;有的学校是弱com&#xff0c;导师愿意要你入营的概率和优营的概率就会比较大&#xff0c;因此要提前联系导师&#xff0c;复习好项目…

打开word文档报错,提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0

某用户遇到这样一个奇怪的问题&#xff0c;就是回复完word的批注后&#xff0c;保存文档再打开就会报错&#xff0c;提示很抱歉&#xff0c;无法打开XXX&#xff0c;因为内容有问题。&#xff0c;详细信息提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0 c…

docker简易入门(极简,纯干货)

简介 Docker是一种容器化平台&#xff0c;它可以用来轻松地创建、部署和运行应用程序和服务。Docker使用容器技术来管理应用程序的运行环境&#xff0c;它将应用程序和服务打包到一个易于移植的容器中&#xff0c;然后在任何地方运行这个容器&#xff0c;无需担心不同环境之间…

动作捕捉系统通过VRPN与ROS系统通信

NOKOV度量动作捕捉系统支持通过VRPN与机器人操作系统ROS通信&#xff0c;进行动作捕捉数据的传输。 一、加载数据 打开形影动捕软件&#xff0c;加载一段后处理数据。 这里选择一段小车飞机的同步数据。在这段数据里面&#xff0c;场景下包含两个刚体&#xff0c;分别是小车和…

基于注解的声明式事务

1.什么是事务 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 2.事务的特性 A&#xff1a;原子性(A…

互联网Java工程师面试题·微服务篇·第一弹

目录 ​编辑 1、您对微服务有何了解&#xff1f; 2、微服务架构有哪些优势&#xff1f; 3、微服务有哪些特点&#xff1f; 4、设计微服务的最佳实践是什么&#xff1f; 5、微服务架构如何运作&#xff1f; 6、微服务架构的优缺点是什么&#xff1f; 7、单片&#xff0c…

【MySQL】事务(上)

文章目录 事务概念什么是事务&#xff1f;为什么要有事务&#xff1f;事务的版本支持事务的提交方式事务常见操作方式基本操作 事务概念 mysql 本身内部采用 多线程的方式&#xff0c;来实现数据存储 相关的工作 就注定对数据 有并发访问的场景 为了解决这类问题&#xff0c;就…

RestCloud AppLink已支持的数据源有哪些?

RestCloud AppLink是什么&#xff1f; 首先&#xff0c;我们需要了解RestCloud AppLink是什么&#xff0c;AppLink是一款由RestCloud公司推出的超级应用连接器。不需要开发&#xff0c;零代码&#xff0c;低成本即可快速打通数百款应用之间的数据。通过流程搭建&#xff0c;可…

【ATTCK】MITRE Caldera 简介

一、什么是Caldera caldera是一个基于MITRE ATT&CK™构建的网络安全框架。其目标是创建一种工具&#xff0c;通过提供自动化安全评估来增强网络从业者的能力&#xff0c;从而节省用户的时间、金钱和精力。为此&#xff0c;需要几个关键组件才能使 Caldera 成为行业领先的平…

在Gradio实现两个下拉框进行联动案例解读:change/click/input实践(三)

本文的代码来自ChuanhuChatGPT&#xff0c;通过拆解写得比较好的gradio项目&#xff0c;可以更快理解gradio的一些使用。 ChuanhuChatGPT整体页面效果是比较合理的&#xff1a; 1 下拉框联动效果的解读 本篇是将一个其中【对话】中的【Prompt加载】小模块抽取出来并稍稍修改…

电商平台api接口,淘宝/天猫、1688、拼多多、亚马逊等电商数据平台api接口演示案例

API简单来说是一种数据的传输方式&#xff0c;使用已经开发好的API接口可以缩短项目时间&#xff0c;减少开发成本。 比如说数据宝平台提供的实名认证API接口&#xff0c;像这种实名认证类的API接口是无法自行开发的&#xff0c;如果自行对接部委&#xff0c;能否成功不说&…

【已解决】vscode 配置C51和MDK环境配置

使用命令 gcc -v -E -x c - 看自己gcc 有没有安装好 也可以在自己的vscode中新建一个终端 gcc -v g -v 首先把自己的C51 和MDK 路径 设置好 vscode 中设置 C51 和 MDK 的路径 这是你keil 中写 51单片机和 STM32 的 如果你出现什么include 的什么波浪线&#xff0c;那估计…

力扣511. 游戏玩法分析 I

答案&#xff1a; select player_id,min(event_date) as first_login from Activity a group by player_id我最开始写的错误答案是这样的&#xff1a; select player_id,event_date as first_login from Activity a group by player_id having event_date min(event_date…

一篇揭秘Linux高性能服务epoll 的本质

导语 epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序&#xff0c;特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况)&#xff0c;在该情况下能…

copilot 产生 python工具函数并生成单元测试

stock.py 这个文件&#xff0c;我只写了注释&#xff08;的开头&#xff09;&#xff0c;大部分注释内容和函数都是copilot # split a string and extract the environment variable from it # input can be , pathabc, pathabc;pathdef, pathabc;pathdef;pathghi # output i…

快速拉取聚水潭单据的ETL工具

聚水潭介绍 聚水潭平台则是国内较为出名的电商ERP平台&#xff0c;为企业提供了便捷的销售和管理服务&#xff0c;专注于提高交易效率&#xff0c;但是如何将数据快速同步到其他系统一直是很多企业的痛点。 ETLCloud数据集成平台提供了丰富的数据分析工具和算法模型&#xff…

Oracle 账户被锁:the account is locked 解决方法

Oracle 账户被锁&#xff1a;the account is locked 解决方法 连接Oracle数据库时报错账户已锁定错误 解决方法一&#xff1a;命令行模式&#xff1a; 步骤一&#xff1a; WinR打开命令行输入&#xff1a;sqlplus 使用system或sys账户以管理员身份登录&#xff0c;口令即安装…

MySQL如何查找删除重复行?

如何查找重复行 第一步是定义什么样的行才是重复行。多数情况下很简单&#xff1a;它们某几列具有相同的值。本例采用这种定义&#xff0c;或许你对“重复”的定义得很复杂&#xff0c;你需要对sql做些修改。本例要用到的数据样本&#xff1a; create table test(id int not …