资讯专栏INFORMATION COLUMN

Yii2集成第三方微博登录(包含账号申请、建表和常用业务逻辑全套流程)

EdwardUp / 3367人阅读

摘要:微博登录是最常用的第三方账号登录之一。当前状态是未提交审核,待你开发完了上线后,提交微博审核,审核通过后即可正常使用。集成微博登录首先简介一下,第三方登录开发的流程。文件是首页,其实他的唯一作用就是产生一个微博登录跳转链接。

微博登录是最常用的第三方账号登录之一。由于其网站用户量大,可操作接口功能多,所以受到很多开发者的青睐。

既然是第三方,如果想使用它们的账号进行登录,那么第一步就应该申请一个开发账号。

前面啰嗦两句,这里有两个条件是硬性的,否则将影响你的开发。

微博账号,这个应该都有。

域名和服务器,也就是说你要有你自己的网站。不过为公司开发就方便多了。

申请开发账号

首先去微博开放平台:http://open.weibo.com/connect,点击立即接入,填写一个表单,验证一下网站就OK了

之后你在我的应用里面就可以看到你申请的应用。当前状态是未提交审核,待你开发完了上线后,提交微博审核,审核通过后即可正常使用。(未审核之前只能是测试账号访问)

到这一步为止,我们就可以先进行开发工作。进入网站信息页面,首先获取我们需要的app_id和secret信息。

下面我们进入开发,我们这里使用YII2框架,高级版本。其他框架原理相同。

YII2集成微博登录

首先简介一下,第三方登录开发的流程。

通过填入各项参数,生成一个URL链接,跳转到微微博。

微博验证完这些参数有效之后,跳转回你给定的返回地址,同时带上一个参数code

你获取到code参数后,用code作为参数,请求一个地址,获取token

token就是你的钥匙,拿着它你可以获取微博的所有可访问接口。(比如获取用户信息,获取用户ID),所以要收好了,我们把它放session

下面就是你自己网站业务逻辑了。

1、新建数据表

第一步,我们来建立网站常用的业务数据表,来开发账号绑定功能。我们需要两张表。

用户表
CREATE TABLE `br_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_nickname` varchar(30) NOT NULL,
  `user_password` varchar(80) NOT NULL,
  `user_email` varchar(255) NOT NULL,
  `auth_key` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `USEREMAIL` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT="用户信息表";

第三方账号表
CREATE TABLE `br_open_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT "微信登录id",
  `open_id` varchar(64) NOT NULL COMMENT "第三方登录的open_id",
  `user_id` int(11) NOT NULL COMMENT "网站用户ID",
  `nickname` varchar(300) NOT NULL COMMENT "第三方用户昵称",
  `type` tinyint(1) NOT NULL DEFAULT "1" COMMENT "1:微博",
  `create_time` int(11) unsigned NOT NULL COMMENT "创建时间",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8;

用户表没什么好说的,我们说一下第三方信息表。

open_id是第三方登录时候给你的一个用户唯一标识,不会改变。

user_id为你自己网站的用户ID,这样可以把本站用户和第三方账号关联了起来。

nickname这个字段看需求,一般存放第三方用户昵称,而本站的用户昵称还是存在用户表,这样假设用户不想用第三方昵称,可以随意修改而也保留第三方昵称。

type的作用重点是,你网站可能不止使用一个第三方登录,比如微博,qq,微信,这样我们做个区分。

2、整合代码

开发之前,我们要先去微博官网下载一个SDK来加速我们的开发。毕竟人家都写好了,拿来用比较方便。

下载下来大概长这个样子:

其中saetv2.ex.class.php是他的核心文件,其他文件基本都是辅助作用。

index.php文件是首页,其实他的唯一作用就是产生一个微博登录跳转链接。

config.php是一些配置文件,就是你刚刚从官网申请来的app_id之类的

callback.php是你跳转到微博后,它再跳转回来的一个地址。

weibolist.php是授权成功后,你获取到他的微博列表的一个demo

这个文件夹文件可以直接放在网站根目录访问,不过我们不准备这样做,我们要把他们拆分了,直接集成到YII

首先针对config.php文件,这个也最简单,我们打开它,发现只有几行代码。


其实就是配置了app_id,app_secret,callback我们把他们扔到Yii配置文件params.php

"weibo"=>[
        "app_key"=>"你的app_key",
        "app_secret"=>"你的app_secret",
        "back_url"=>"你的回跳地址,比如:http://www.bidianer.com/login/weibo-back(这是我的)"
    ],

下面我们看下,saetv2.ex.class.php,打开后我们发现,这个文件里面有两个类,为了便于开发,我们将其拆分成为2个文件存放。第一个文件存放靠上面的类,第二个文件存放靠下面的类。同时,我们将其拷贝到Yii2目录vendor/yiisoft/yii2/web,这个随自己喜欢。

我们将拆分后的文件命名为SaeAuth.phpSaeTClientV2.php,类名同文件名。同时加上命名空间yii web(这里反斜杠打不出来)。

3、控制器开发

下面我们来到控制器开始做真正开发工作。

1、新建LoginController.php,在init方法中,我们将配置信息加载过来:

$this->app_key = Yii::$app->params["weibo"]["app_key"];
$this->app_secret = Yii::$app->params["weibo"]["app_secret"];
$this->back_url = Yii::$app->params["weibo"]["back_url"];

2、新建登录首页index方法,同时生成微博跳转链接

$sea = new SaeAuth($this->app_key , $this->app_secret);
$weibo_url = $sea->getAuthorizeURL($this->back_url);

在此之前你需要 use yii web SaeAuth(这里反斜杠打不出来)

3、接下来我们新建weibo-back方法来处理微博回跳后处理。

获取微博返回参数code

$code = Yii::$app->request->get("code");

获取token

$sea = new SaeAuth($this->app_key , $this->app_secret);
if ($code)
{
    $keys = array();
    $keys["code"] = $code;
    $keys["redirect_uri"] = $this->back_url;
    try {
        $token = $sea->getAccessToken( "code", $keys ) ;
    } catch (Exception $e) {
        throw new NotFoundHttpException;
    }
}

下面如果获取token成功,我们就将其放入session存起来,留着后面用

if ($token)
{
    $session = Yii::$app->session;
            $session["token"] = [
                "access_token"=>$token["access_token"],
                "uid"=>$token["uid"],
                "lifetime"=> 24*3600 // 这里我设置了一天,你们可以自己设置合适时间
            ];
    $this->redirect(Url::toRoute("/login/complete-info"));
}

为啥我们不在这个页面处理其他逻辑?因为,code不能重复利用,啥意思?就是在这个页面:http://www.bidianer.com/login/weibo-back?code=XXXX你不能刷新,否则微博就给你个错误。所以我们拿到code获取token,就赶紧放session跑路,到其他页面,慢慢弄。

4、完善用户信息

下面我们到一个关键步奏了,这个方法主要做两件事,判断用户是否绑定账号,如果没有,显示表单,补全信息绑定。如果绑定了,OK,直接自动登录,跳走。

下面先进行简单的一步:检测用户是否绑定账号。

之前br_open_info表有个字段叫open_id这是微博给你的一个用户唯一识别码,而且不会变。下次第三方请求后,我们可以从微博获取这个open_id去数据库查询一下,如果存在,则用户已经绑定过。反之,未绑定。

我们session中放着token,我们可以利用它去获取用户唯一ID

$token = Yii::$app->session->get("token");
$c = new SaeTClientV2( $this->app_key , $this->app_secret , $token["access_token"] );
$uid_get = $c->get_uid();
$uid = $uid_get["uid"];

下面在common/models中新建OpenInfo.php,直接调用查询:

$open_user = OpenInfo::findOne(["open_id"=>$uid , "type"=>"1"]); // 其中 type = 1 代表微博。

如果存在,则说明用户已经绑定账号,直接自动登录。

if($open_user)
{
    $user = User::findOne($open_user->user_id); // 当open_info信息存在,则直接取其user_id去用户表查询用户信息
    Yii::$app->user->login($user, 3600 * 24 * 30);
    $this->goHome();
}

如果没有绑定,我们获取用户基本信息,展示用户补全信息表单,填写绑定账号。

$user_message = $c->show_user_by_id( $uid);//根据ID获取用户等基本信息
return $this->render("completeInfo",["info"=>$user_message]);

我们到completeInfo视图打印下用户信息:

还是非常详细的。啥都有。

我们把用户头像展示在表单顶端,帮助用户自动填写昵称(用微博昵称),让用户填写下邮箱和密码,补全资料,然后提交,绑定账号。

4、用户注册

这样用户设置完邮箱和密码后,就可以注册。这里的注册和你网站账号注册流程一致。

不过在这里提交表单时候,我们需要多提交一些信息,我们把这些信息放在表单隐藏域中。

" /> // 头像
" /> // 微博用户唯一识别码
" /> // 微博用户昵称

这样当用户插入到br_user表之后,我们将本地用户账号和第三方用户账号关联。即在br_open_info表插入一条数据。

注册代码

$user = new User();
$user->setPassword($post["user_password"]);
$user->generateAuthKey();
$user->user_nickname = $post["user_nickname"];
$user->user_email = $post["user_email"];
$user->user_headimg = isset($post["user_headimg"])? $post["user_headimg"] : null;
$user->save();

注册成功后,我们将获得user_id

5、账号绑定

下面进行账号绑定

$open = new OpenInfo();
$open->open_id = $post["open_id"];
$open->user_id = $user->user_id;
$open->nickname = $post["open_nickname"];
$open->type = 1; // type=1为微博
$open->create_time = time();
if($open->validate())
{
    $open->save();
}

下次当该用户再次点击微博登录按钮,就会执行以下操作

跳转到微博获取code,回跳到网站页面

通过code获取token,将token放入session

通过token获取微博用户open_id

通过open_id去第三方用户信息表br_open_info查询

如果发现有记录,则根据br_open_info表存储的user_idbr_user表获取用户信息

自动登录,直接跳转走

整个过程用户无需输入任何账号密码信息,十分便捷。

严颖 2016-09-28

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30510.html

相关文章

  • RageFrame 一个 Yii2 + AdminLET 免费开源多商户通用后台管理系统

    摘要:极致的插件机制,系统内的系统,安装和卸载不会对原来的系统产生影响强大的功能完全满足各阶段的需求,支持用户多端访问后台微信前台等,系统中的系统。多入口模式,多入口分为后台前端,微信,对内接口,对外接口,不同的业务,不同的设备,进入不同的入口。 RageFrame 2.0 为二次开发而生,让开发变得更简单 项目地址:https://github.com/jianyan74/... 前言 这...

    sunny5541 评论0 收藏0
  • RageFrame 一个 Yii2 + AdminLET 免费开源多商户通用后台管理系统

    摘要:极致的插件机制,系统内的系统,安装和卸载不会对原来的系统产生影响强大的功能完全满足各阶段的需求,支持用户多端访问后台微信前台等,系统中的系统。多入口模式,多入口分为后台前端,微信,对内接口,对外接口,不同的业务,不同的设备,进入不同的入口。 RageFrame 2.0 为二次开发而生,让开发变得更简单 项目地址:https://github.com/jianyan74/... 前言 这...

    Ali_ 评论0 收藏0
  • 基于Yii2的应用开发引擎RageFrame

    摘要:多入口模式,多入口分为后台前端,微信,其他或接口对接,不同的业务不同的设备进入不同的入口。对接微信公众号,使用了一款优秀的微信非官方,系统内已集成了该,调用方式会在文档说明,也可直接看其文档进入深入开发。 RageFrame 为二次开发而生,让开发变得更简单。 前言 RageFrame项目创建于2016年4月16日,基于Yii2框架开发的应用开发引擎,目前正在成长中,目的是为了集成更多...

    enda 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<