php thinkphp3.2怎么做会员登录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php thinkphp3.2怎么做会员登录相关的知识,希望对你有一定的参考价值。

现在很多网站都有 QQ互联 和新浪微博 一键登录功能,国内很多php开源项目的代码都是使用thinkphp框架编写的,但是thinkphp框架如何添加QQ互联 和新浪微博 一键登录功能呢?
工具/原料
Thinkphp3.2版本源码
QQ互联 和新浪微博 申请到的 APPID和APPKEY。
方法/步骤
一:到腾讯QQ互联上申请APPID和APPKEY。申请地址: http://connect.qq.com/ 如同,这里我们可以获取到需要跳转到的APPID和APPKEY。新浪微博的申请同理

二:在Thinkphp官网下载 Thinkphp3.2版本的框架源码

本地安装好Thinkphp后,找到应用下的,Common/conf/config.php文件里加上。QQ互联对应的APPID和APPKEY等QQ_AUTH配置信息:

\'QQ_AUTH\' => array(
\'APP_ID\' => \'1XDXXXXX\', //你的QQ互联APPID
\'APP_KEY\' => \'2XXXXXXXXXXXXXXXXXXXXX\',
\'SCOPE\' => \'get_user_info,get_repost_list,add_idol,add_t,del_t,add_pic_t,del_idol\',
\'CALLBACK\' => \'http://www.baidu.com/user/oauth/callback/type/qq.html\',

),
//新浪微博的配置同理一样。
在Common目录下建立一个文件夹api。创建文件QQConnect.class.php ,添加如下代码,这里是 我们写好的一个类:

<?php
namespace Common\\Api;
class QQConnect
/**
* 获取QQconnect Login 跳转到的地址值
* @return array 返回包含code state
*
**/
public function login($app_id, $callback, $scope)
$_SESSION[\'state\'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
.$app_id. "&redirect_uri=" . urlencode($callback)
. "&state=" . $_SESSION[\'state\']
. "&scope=".urlencode($scope);
//显示出登录地址
header(\'Location:\'.$login_url);


/**
* 获取access_token值
* @return array 返回包含access_token,过期时间的数组
* */
private function get_token($app_id,$app_key,$code,$callback,$state)
if($state !== $_SESSION[\'state\'])
return false;
exit();

$url = "https://graph.qq.com/oauth2.0/token";
$param = array(
"grant_type" => "authorization_code",
"client_id" => $app_id,
"client_secret" => $app_key,
"code" => $code,
"state" => $state,
"redirect_uri" => $callback
);

$response = $this->get_url($url, $param);
if($response == false)
return false;

$params = array();
parse_str($response, $params);
return $params["access_token"];


/**
* 获取client_id 和 openid
* @param $access_token access_token验证码
* @return array 返回包含 openid的数组
* */
private function get_openid($access_token)
$url = "https://graph.qq.com/oauth2.0/me";
$param = array(
"access_token" => $access_token
);

$response = $this->get_url($url, $param);
if($response == false)
return false;

if (strpos($response, "callback") !== false)
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);


$user = json_decode($response);
if (isset($user->error) || $user->openid == "")
return false;

return $user->openid;


/**
* 获取用户信息
* @param $client_id
* @param $access_token
* @param $openid
* @return array 用户的信息数组
* */
public function get_user_info($app_id,$token,$openid)
$url = \'https://graph.qq.com/user/get_user_info?oauth_consumer_key=\'.$app_id.\'&access_token=\'.$token.\'&openid=\'.$openid.\'&format=json\';
$str = $this->get_url($url);
if($str == false)
return false;

$arr = json_decode($str,true);
return $arr;


/**
* 请求URL地址,返回callback得到返回字符串
* @param $url qq提供的api接口地址
* */

public function callback($app_id, $app_key, $callback)
$code = $_GET[\'code\'];
$state = $_GET[\'state\'];
$token = $this->get_token($app_id,$app_key,$code,$callback,$state);
$openid = $this->get_openid($token);
if(!$token || !$openid)
return false;
exit();

return array(\'openid\' => $openid, \'token\' => $token);


/*
* HTTP GET Request
*/
private function get_url($url, $param = null)
if($param != null)
$query = http_build_query($param);
$url = $url . \'?\' . $query;

$ch = curl_init();
if(stripos($url, "https://") !== false)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);


curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200)
return $content;
else
echo $status["http_code"];
return false;



/*
* HTTP POST Request
*/
private function post_url($url, $params)
$ch = curl_init();
if(stripos($url, "https://") !== false)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);


curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200)
return $content;
else
return false;




在项目下创建一个User模板,然后再创建一个OauthConnect.class.php文件,用户调用 QQConnect.class.php。
OauthConnect.class.php里面加入如下,
<?php
namespace User\\Controller;
use Think\\Controller;
class OauthController extends Controller
/*
* Type类型,初始化
* QQConnet WeiboConnect
*/
public function index()
switch ($_GET[\'type\'])
/* QQ互联登录 */
case qq:
$app_id = C(\'QQ_AUTH.APP_ID\');
$scope = C(\'QQ_AUTH.SCOPE\');
$callback = C(\'QQ_AUTH.CALLBACK\');
$sns = new \\Common\\Api\\QQConnect;
参考技术A 前台post数据
后端配好数据库
对接收过来的用户密码与数据库的数据相匹配,正确则登录
参考技术B 加一个控制器 验证登陆信息 然后跳转不就可以了么

Thinkphp5笔记三:创建基类

做项目之前,一定要先部署要自己的"基类",非常的重要。打个比方,要访问会员中心相关的控制器,这类控制器是不是都要有一个“登录限制”,才让访问会员相关的控制器?

 

一、创建三大基类

原始基类

位置:thinkphp\apps\common\controller\Base.php

作用:Base模块下的内容,Index模块,和Admin模块都可以调用

代码:

<?php
/**
 * 原始基类
 * */
namespace app\Common\controller;
use  think\Controller;

class Base extends Controller{

    public function _initialize()
    {
        parent::_initialize();
        echo 原始基类;
    }
    public function test1(){
        return test1;
    }
}

 

Index模块基类

位置:thinkphp\apps\common\controller\Base.php

作用:Index模块下的控制器,都要“继承基类”并且“调用基类”

代码:

<?php
/**
 * 前端基类
 * */
namespace app\index\controller;
use  app\Common\controller\Base;

class IndexBase extends  Base
{
    public function _initialize()
    {
        parent::_initialize();
    }
    public function index()
    {
        
    }


}

 

Admin模块基类

位置:thinkphp\apps\common\controller\Base.php

作用:Admin模块下的控制器,都要“继承基类”并且“调用基类”

代码:

/**
 * 后台首页
 * */

namespace app\Admin\controller;
use app\Admin\controller\AdminBase;

class Index extends AdminBase
{
    public function _initialize()
    {
        parent::_initialize();
    }

    public function index()
    {
        return $this->fetch();
    }

}

(User模块基类,如果有会员的话,这个也必须要创建的)

 

创建基类的主要目的,就是“继承”与“调用

以上是关于php thinkphp3.2怎么做会员登录的主要内容,如果未能解决你的问题,请参考以下文章

使用Thinkphp3.2开发会员管理系统-添加页面

使用Thinkphp3.2开发会员管理系统-准备工作

《果然新鲜》电商项目(25)- 会员唯一登录

PHP-会员登录与注册例子解析-学习笔记

ThinkPHP3.2对接开发支付宝即时到帐接口

PHP - 使用登录系统保护仅限会员的页面