search
HomeBackend DevelopmentPHP TutorialSource code analysis on CI framework development of Sina Weibo login interface

This article mainly introduces the source code analysis of the Sina Weibo login interface developed by the CI framework. It has a certain reference value. Now it is shared with everyone. Friends in need can refer to it.

Note: This article is only Suitable for CI framework. Functional implementation: The login interface jumps to the link successfully, obtains the user information (including the most important u_id) successfully, connects the user to the local platform, stores the information after the user logs in successfully, and designs the third-party login table of the local database. In short, the interface process has been completed. I have notes on almost every key step and explain it in detail.

First let’s look at the process:
Process principle:
1. Obtain the access_token through code and obtain authorization, and obtain the user’s information (including user u_id) (this u_id is in the third-party login form behind) It's called sina_id, and you need to build that table yourself)
2. Query the third-party login table. If the user sina_id does not exist, there are two situations. One: The user already has an account on the platform. In this case, the platform (such as : The user table of the platform is: user_reg) The user id is bound to the third-party login table (for example: third_login table), and then the customer is allowed to log in; At the same time of registration, the information is written into the uer_reg table, and the user sina_id is also written into the third-party login table for binding;
3. Query the third-party login table (third_login), and if the user sina_id exists, query the user table (user_reg ), if the email address has been activated, log in directly. If it is not activated, the user is prompted to go to the email address to activate the account.

Let’s start with the detailed steps:

Step 1: Apply for App key and App secret. Application address: http://open.weibo.com/ Click on the website to access the WEB, and just go in and apply. After passing, you will get the App Key and App Secret as follows:
App Key: 1428003339
App Sercet: f1c6177a38b39f764c76a1690720a6dc
Callback address: http://test.com/callback.php

Note: After applying, your Sina account will be a test account. You can use this account to debug during development. Other accounts cannot log in and return information. Before development, it is best to check the development process on the official website. The process is the most important. As long as the ideas are clear, the rest is to use code to realize what you want.

Step 2: Download the SDK, download the php version, download address (official website): http://code.google.com/p/libweibo/downloads/list, there are 5 files downloaded, among which One is saetv2.ex.class.php, I only need this file.

Step 3: Code

1
. Create a third-party login table to store third-party login information (Sina is u_id, QQ is openid, they are both unique, used Identifies the user, we store it based on this):

CREATE TABLE IF NOT EXISTS `third_login` (
  `user_id` INT(6) NOT NULL,
  `sina_id` BIGINT(16) NULL,
  `qq_id` varchar(64) NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC),
  INDEX `sina_id` (`sina_id` ASC),
  INDEX `index4` (`qq_id` ASC))
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_bin
COMMENT = '第三方登录表'

Description: The platform returns u_id, which is the unique identifier of the user. I save it as sina_id, user_id is associated with the platform user table user_reg I will not list the id and user_reg tables here. You can build the tables according to actual project requirements. The recommended operating tools are phpmyadmin and MySQL Workbench, which are easy to operate.

If you only need to make the Sina login interface, you can remove the qq_id field.

2.

Write the configuration file, create a new file sina_conf.php under application, and write the App Key and App Secret you just applied for , the code is as follows:

<?php
$config["sina_conf"] = array(
    "App_Key" => &#39;1428003339&#39;,
    "App_Secret" =>&#39;f1c6177a38b39f764c76a1690720a6dc&#39;,
    "WB_CALLBACK_URL" => &#39;http://test.com/callback.php&#39;
);

Save

3.

oauth authentication class, copy the saetv2.ex.class.php file you just downloaded to application/libraries. Note: This is a very important class. Login, authorization, and obtaining user information all use the methods in this class. Without it, you can’t play. Stick it intact to application/libraries
.

4.

Write the Sina Weibo login class (QQ login is also available, and the QQ login here is also packaged together. Even if I only make the Sina login interface, it will not affect it), in application/models Create a file third_login_model.php, code:

<?php
/**
 * Description of third_login_model
 *第三方接口授权,登录model
 * @author
 */
class third_login_model extends CI_Model{
    //put your code here
    private $sina=array();
    private $qq  =array();
    private $users =&#39;&#39;;
    private $third=&#39;&#39;;
    public function __construct() {
        parent::__construct();
//        $this->l = DIRECTORY_SEPARATOR;
        $this->load->database();   
        $this->load->library(&#39;session&#39;);
        include_once APPPATH."/libraries"."/saetv2.ex.class.php";
        $this->third =  $this->db->&#39;third_login&#39;;//第三方登录表
        $this->users = $this->db->&#39;user_reg&#39;;//本项目用户表
        $this->config->load("sina_conf");
        $this->sina= $this->config->item("sina_conf");

    }

    /**
      * @uses : 新浪微博登录
      * @param :
      * @return : $sina_url----登录地址
      */
    public function sina_login(){
        $obj = new SaeTOAuthV2($this->sina[&#39;App_Key&#39;],$this->sina[&#39;App_Secret&#39;]);
        $sina_url = $obj->getAuthorizeURL( $this->sina[&#39;WB_CALLBACK_URL&#39;] );
        return $sina_url;
    }

    /**
      * @uses : 登录后,通过返回的code值,获取token,实现授权完成,然后获取用户信息
      * @param : $code
      * @return : $user_message--用户信息
      */
    public function sina_callback($code){
      $obj = new SaeTOAuthV2($this->sina[&#39;App_Key&#39;],$this->sina[&#39;App_Secret&#39;]);
      if (isset($code)) {
      $keys = array();
      $keys[&#39;code&#39;] = $code;
      $keys[&#39;redirect_uri&#39;] = $this->sina[&#39;WB_CALLBACK_URL&#39;];
      try {
        $token = $obj->getAccessToken( &#39;code&#39;, $keys ) ;//完成授权
      } catch (OAuthException $e) {
    }
      }
      $c = new SaeTClientV2($this->sina[&#39;App_Key&#39;], $this->sina[&#39;App_Secret&#39;], $token[&#39;access_token&#39;]);
      $ms =$c->home_timeline();
      $uid_get = $c->get_uid();//获取u_id
      $uid = $uid_get[&#39;uid&#39;];
      $user_message = $c->show_user_by_id($uid);//获取用户信息
      return $user_message;
    }

    /**
      * @uses : 查询第三方登录表
      * @param : $where
      * @return : 第三方登录用户记录结果集
      */
    public function select_third($where) {
        $result = false;
        $this->db->select();
        $this->db->from($this->third);
        $this->db->where($where);
        $query = $this->db->get();
        if($query){
            $result = $query->row_array();
        }
        return $result;
    }

    /*-
      * @uses : sina---查询用户表和第三方登录表
      * @param : $where
      * @return : 第三方登录用户记录结果集
      */
    public function select_user_name($where) {
        $field ="user.id,user.password,user.username,utl.*";
        $sql = "select {$field} from {$this->third} as utl "
                ." left join {$this->users} as user on user.id=utl.user_id"
                . " where utl.sina_id={$where}";
        $query = $this->db->query($sql);
        $result = $query->row_array();
        return $result;
    }

    /**
      * @uses : qq---查询用户表和第三方登录表
      * @param : $where
      * @return : 第三方登录用户记录结果集
      */
    public function select_user_qqname($where) {
        $field ="user.id,user.password,user.username,utl.*";
        $sql = "select {$field} from {$this->third} as utl "
                ." left join {$this->users} as user on user.id=utl.user_id"
                . " where utl.qq_id=&#39;{$where}&#39;";
        $query = $this->db->query($sql);
        $result = $query->row_array();
        return $result;
    }
    
    /**
      * @uses : 将用户和第三方登录表信息绑定
      * @param : $datas
      * @return :
      */
    public function binding_third($datas) {
        if (!is_array($datas)) show_error (&#39;wrong param&#39;);
        if($datas[&#39;sina_id&#39;]==0 && $datas[&#39;qq_id&#39;]==0)  return;

        $resa =&#39;&#39;;
        $resb =&#39;&#39;;
        $resa = $this->select_third(array("user_id"=>$datas[&#39;user_id&#39;]));
        $temp =array(
            "user_id"=>$datas[&#39;user_id&#39;],
            "sina_id"=>$resa[&#39;sina_id&#39;]!=0 ? $resa[&#39;sina_id&#39;] : $datas[&#39;sina_id&#39;],
            "qq_id"  => $resa[&#39;qq_id&#39;]!=0 ? $resa[&#39;qq_id&#39;] : $datas[&#39;qq_id&#39;],
        );
        if($resa){
            $resb = $this->db->update($this->third, $temp,array("user_id"=>$datas[&#39;user_id&#39;]));
        }else{
            $resb = $this->db->insert($this->third,$temp);
        }
        if($resb) {
            $this->session->unset_userdata(&#39;sina_id&#39;);//注销
            $this->session->unset_userdata(&#39;qq_id&#39;);//注销
        }
        return $resb;
    }
}

Save

Description: This code is passed from the entry file callback.php, and its detailed code will be in step 7.
Now that the configuration file, model, and data table are all there, the next step is the controller and view files.

5.

Write login controller Under application/controllers, create the login.php file (you can choose the name yourself), Code:

<?php   if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);
/**
 * Description of index
 * @author victory
 */
class Login extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model(&#39;login_model&#39;,&#39;login&#39;);//这个类是本项目的用户登录类,本贴不提供原代码,因为不同的项目,需求不同,可根据你项目需求可以自己封装
        $this->load->model("third_login_model","third");
        $this->load->library(&#39;session&#39;);
    }
    public function index() {
        header("content-type: text/html; charset=utf-8");
        $this->load->model("third_login_model","third");//加载新浪登录接口类
        $datas[&#39;sina_url&#39;] = $this->third->sina_login();//调用类中的sina_login方法
        $this->load->view("index.php",$datas);//调取视图文件,并传入数据
     }
    public function callback(){
        header("content-type: text/html; charset=utf-8");
        $this->load->model("user_reg_model","user_reg");
        $code = $_REQUEST[&#39;code&#39;];//code值由入口文件callback.php传过来
        $arr =array();
        $arr = $this->third->sina_callback($code);//通过授权并获取用户信息(包括u_id)
        $res = $this->third->select_third(array("sina_id"=>$arr[&#39;id&#39;]));
        if(!empty($res)){//用户已有帐号记录,先判断帐号是否激活
            $user_info = $this->user_reg->user_detect(array("id"=>$res[&#39;user_id&#39;]));//查询用户表邮箱状态,user_detect方法就是查询用户信息的方法,上面也说了,login_model.php这个类本贴不提供,需要大家自己去封装。
            if($user_info[&#39;status&#39;]){//根据status的状态判断用户帐号是否激活,user_reg表中的字段status,1为未激活,0为已激活
                echo "<script>alert(&#39;您的账号未激活,请去邮箱激活!&#39;);location=&#39;/login/index&#39;;</script>";die();
            }
            $datas = $this->third->select_user_name($arr[&#39;id&#39;]);//激活后,把信息写入用户表和第三方登录表
            $uname = $datas[&#39;username&#39;];//username,password都是user_reg表的字段,user_reg数据表的构建本帖也不提供,因为每个项目都不一样,需要根据实际项目来
            $password = $datas[&#39;password&#39;];
            $this->load->model("login_model","login");
            $this->login->validation($uname,$password);//validation方法是登录的主要方法,这里主要是在登录的时候,将用户信息写入第三方登录表,下面仅提供写入第三方登录表的代码
            echo "<script>alert(&#39;登录成功!&#39;);location=&#39;/user_center&#39;</script>";die();
        }else{//用户第三方表没有记录,询问用户是否在平台有过帐号,没有跳转注册,有跳转登录
            $this->session->set_userdata(&#39;sina_id&#39;,$arr[&#39;id&#39;]);
            echo "<script>if(!confirm(&#39;是否在平台注册过用户?&#39;)){location=&#39;/register/index&#39;}else{location=&#39;/login&#39;};</script>";
        }     
    }
    public function login_validation(){
      //第三方登录用户id ,sina_id,qq_id的记录增改
        $third_info =array(
            "user_id" => $user_ser[&#39;id&#39;],
            "sina_id" => $this->session->userdata(&#39;sina_id&#39;),
            "qq_id"   =>$this->session->userdata(&#39;qq_id&#39;),
        );
        if($third_info[&#39;sina_id&#39;]||$third_info[&#39;qq_id&#39;])    $this->third->binding_third($third_info);  // 绑定
}

//保存

     //在注册控制器里,用户信息写入user_reg表,同时也把sina_id写入third_login表,我这里只展示第三方登录接口用户id存入数据表的代码
class Register extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library(&#39;session&#39;);
    }
    public function reg() {
          $haha =array(
                      "user_id" => $rs,
                      "sina_id" => $this->session->userdata(&#39;sina_id&#39;),
                      "qq_id"   =>$this->session->userdata(&#39;qq_id&#39;),
                      );
            if($haha[&#39;sina_id&#39;]||$haha[&#39;qq_id&#39;])    $this->third->binding_third($haha);
    }
}

Save

6.

View file layout Sina Weibo login button, create index.php file under application/view, code:

<html>
<head>
    <meta content="text/html; charset=utf-8">
    <title>新浪微博登录接口</title>
</head>
<body>
     <p><a href="<?=$sina_url?>"><img  src="/static/imghwm/default1.png"  data-src="http://images.cnblogs.com/weibo_login.png"  class="lazy"      style="max-width:90%"  / alt="Source code analysis on CI framework development of Sina Weibo login interface" ></a></p>
</body>
</html>

Save

Description: This is a picture button , you can download the picture from the official website, download address: http://open.weibo.com/widget/loginbutton.php

7.回调地址
前面在第1步配置文件文件的时候,设置了回调地址:http://test.com/callback.php ,那这个callback.php放在什么地方呢,它需要放在和入口index.php同级的位置,它和application也是同级的。所在在开始的目录下新建文件callback.php。代码:

<?php
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
//新浪微博登录回调入口文件,将路径转移到login/callback方法里,并将code值传过去
$code =&#39;&#39;;
$url = &#39;&#39;;
$str =&#39;&#39;;
$code = $_REQUEST[&#39;code&#39;];
$url  = "/login/callback";
$str = "<!doctype html>
<html>
    <head>
    <meta charset=\"UTF-8\">
    <title>自动跳转</title>
    </head>
<body>";
$str .="<form action=\"{$url}\" method=\"post\" id=\"form\" autocomplete=&#39;off&#39;>";
$str .="<input type=&#39;hidden&#39; name=&#39;code&#39; value=&#39;{$code}&#39;>";
$str .="</form>
        </body>
        </html>
        <script type=\"text/javascript\">
           document.getElementById(&#39;form&#39;).submit();
        </script>";
echo $str;

保存

这个时候,你用浏览器访问index.php文件的时候,会看到一个用微博帐号登录的登录按钮,点击按钮,会跳转到微博登录页面,要你输入新浪微博用户名密码,他会做不同的操作。具体流程我在上面也说过了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何使用CodeIgniter开发实现支付宝接口调用

The above is the detailed content of Source code analysis on CI framework development of Sina Weibo login interface. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
主板aafp是什么接口主板aafp是什么接口Aug 29, 2022 am 10:50 AM

主板上的aafp是音频接口;该接口的功能是启用前面板的“3.5mm”插孔,起到传输音频的作用,aafp跳线基本上由两个部分组成,一部分是固定在主板、硬盘等设备上的,由两根或两根以上金属跳针组成,另一部分是跳线帽,是一个可以活动的组件,外层是绝缘塑料,内层是导电材料,可以插在跳线针上。

cha fan表示什么风扇cha fan表示什么风扇Sep 15, 2022 pm 03:09 PM

“cha fan”表示的是机箱风扇;“cha”是“chassis”的缩写,是机箱的意思,“cha fan”接口是主板上的风扇供电接口,用于连接主板与机箱风扇,可以配合温度传感器反馈的信息进行智能的转速调节、控制噪音。

ioioi是什么接口ioioi是什么接口Aug 31, 2022 pm 04:50 PM

ioioi是指COM接口,即串行通讯端口,简称串口,是采用串行通信方式的扩展接口。COM接口是指数据一位一位地顺序传送;其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

link/act是什么接口link/act是什么接口Feb 23, 2023 pm 04:14 PM

link/act是物理数据接口;交换机上的link/act指示灯表示线路是否连接或者活动的状态;通常Link/ACT指示灯用来观察线路是否激活或者通畅;一般情况下,若是线路畅通,则指示灯长亮,若是有数据传送时,则指示灯闪烁。

sata6g是什么接口sata6g是什么接口Sep 14, 2022 am 11:46 AM

sata6g是数据传输速度为“6G/s”的sata接口;sata即“Serial ATA”,也就是串行ATA,是主板接口的名称,现在的硬盘和光驱都使用sata接口与主板相连,这个接口的规格目前已经发展到第三代sata3接口。

鼠标插在主机哪个接口鼠标插在主机哪个接口Sep 13, 2022 pm 03:50 PM

鼠标插在主机的串口接口、PS/2接口或USB接口上。串行接口是最古老的鼠标接口,是一种9针或25针的D型接口,将鼠标接到电脑主机串口上就能使用。PS/2接口是1987年IBM公司推出的鼠标接口,是一种鼠标和键盘的专用接口,是一种6针的圆型接口。USB接口,是一种高速的通用接口,具有非常高的数据传输率,且支持热插拔。

dc接口是什么意思dc接口是什么意思Aug 24, 2022 am 10:47 AM

dc接口是一种为转变输入电压后有效输出固定电压接口的意思;dc接口是由横向插口、纵向插口、绝缘基座、叉形接触弹片、定向键槽组成,两只叉型接触弹片定位在基座中心部位,成纵横向排列互不相连,应用于手机、MP3、数码相机、便携式媒体播放器等产品中。

pump fan是什么接口pump fan是什么接口Jun 25, 2021 pm 02:55 PM

pump fan是散热风扇接口。主板上的风扇接口有cpu fun、sys fun、pump fun,对于一般普通用户来说区别不大,一般接哪个都行,而pump fun上的电流更大一点,用于接功率大一点的水冷风扇头。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools