目前只做了微博和qq的,前面的去connect.qq.com,open.weibo.com注册的步骤省略

qq和weibo站点都有可以现在的php版本的api,qq的api相对高大上一些。

<script>
function toLogin(who)
{
//以下为按钮点击事件的逻辑。注意这里要重新打开窗口
//否则后面跳转到QQ登录,授权页面时会直接缩小当前浏览器的窗口,而不是打开新窗口
   //"/dlt/index.php?wherego="+who+"&back_url=$url",这里的$url需要使用urlencode,js的话要用escape,encodeUrl函数
  //嵌套在iframe里时要用window.top.open
var A=window.open("/dlt/index.php?wherego="+who,"OauthLogin","width=450,height=320,menubar=0,scrollbars=1,resizable=1,status=1,titlebar=0,toolbar=0,location=1");
}
</script>
<li class="dl_tips">
<a href="javascript:void(0);" onclick="toLogin('qq');"><cite><img src="<?=static_path('images/login/qq.png')?>" /></cite><cite>腾讯QQ登录</cite></a>
<a href="javascript:void(0);" onclick="toLogin('wb');"><cite><img src="<?=static_path('images/login/wb.png')?>" /></cite><cite>新浪微博登录</cite></a>
</li>

整个实现登录的流程在一个独立的包里结构如下

/dlt---根目录
/dlt/index.php---入口地址
/dlt/callback.php--回调地址 /dlt/lib---自定类,配置义目录
/dlt/lib/dlt_client.php---流程入口
/dlt/lib/db_client.php
/dlt/lib/model.php /dlt/sdk---第三方sdk目录
/dlt/qq/API---qq的sdk目录,目录详情省略
/dlt/wb/API---weibo的sdk目录,目录详情省略 /dlt/var---日志记录目录

入口地址

<?php
$wherego = $_GET['wherego'];
if(!empty($wherego) && in_array( $wherego,array('qq','wb'))){
require 'lib/dlt_client.php';
$dlt_client = new DLT($wherego);
$dlt_client->save_referer();
$dlt_client->go();
}else{
exit('传入参数错误');
}

回调地址

<?php
$whereback = $_GET['whereback'];
if(!empty($whereback) && in_array( $whereback,array('qq','wb'))){
require 'lib/dlt_client.php';
$dlt_client = new DLT($whereback);
$dlt_client->callback();
}else{
exit('回传参数错误');
}

流程入口文件

<?php
class DLT {
public $who;
public $db;
public $user_model;
public $e_logo_prefix = 'http://user.X.com/static/';
private $_sdk_path;
private $_dlt_back_url; public function __construct($who){
$this->who = $who;
$this->_sdk_path = dirname(dirname(__FILE__)) . '/sdk/';
} public function save_referer(){
if(!empty($_GET['back_url'])){
setcookie ('dlt_back', $_GET['back_url'], time()+60*5, '/', 'X.com');
}else if(!empty($_SERVER['HTTP_REFERER'])){
setcookie ('dlt_back', $_SERVER['HTTP_REFERER'], time()+60*5, '/', 'X.com');
}else{
return false;
}
} public function go(){
$function_name = 'go_' . $this->who;
$this->$function_name();
} public function callback(){
$this->_dlt_back_url = $_COOKIE['dlt_back'];
if(empty($this->_dlt_back_url)){
$this->_dlt_back_url = 'http://user.X.com';
}
$function_name = 'callback_' . $this->who;
$this->$function_name();
} public function go_qq(){
require_once($this->_sdk_path . "qq/API/qqConnectAPI.php");
$qc = new QC();
$qc->qq_login();
} public function callback_qq(){
require_once($this->_sdk_path . "qq/API/qqConnectAPI.php");
$qc = new QC();
$access_token = $qc->qq_callback();
$openid = $qc->get_openid();
//var_dump($access_token);
//var_dump($openid);
if(empty($openid) || empty($access_token)){
exit('get QQ token error!');
}
$qc = new QC($access_token,$openid);
$arr = $qc->get_user_info();
//var_dump($arr);exit;
if(!isset($arr['nickname'])){
exit('get QQ userinfo error!');
}
$user_info['m_o_name'] = $arr["nickname"];
$user_info['m_dlt_type'] = 'qq';
$user_info['m_dlt_id'] = $openid; $this->do_login($user_info);
} public function go_wb(){
require_once($this->_sdk_path . "wb/API/wbConnectAPI.php");
$wbc = new WBC();
$wbc->wb_login();
} public function callback_wb(){
require_once($this->_sdk_path . "wb/API/wbConnectAPI.php");
$wbc = new WBC();
$access_token = $wbc->get_token();
$uid = $wbc->get_uid();
//var_dump($access_token);
//var_dump($uid);
if(empty($uid) || empty($access_token)){
exit('get WB token error!');
}
$arr = $wbc->get_user_info();
//var_dump($arr['name']);exit;
if(!isset($arr['name'])){
exit('get WB userinfo error!');
}
$user_info['m_o_name'] = $arr["name"];
$user_info['m_dlt_type'] = 'wb';
$user_info['m_dlt_id'] = $uid; $this->do_login($user_info);
} public function do_login($user_info){
require 'model.php';
     $this->model = new Model();
          //没有就插入,有就返回唯一id
$member_info = $this->model->check_member($user_info);
if(empty($member_info)){
exit('db operate error!');
}
          //回写获取的昵称
$member_info['m_o_name'] = $user_info['m_o_name'];
$this->init_session($member_info);
} public function init_session($member_info){
$data = $this->model->get_all($member_info['m_id']); $data['member_id'] = $data['m_id']; //会员id
$data['member_name'] = $data ['m_o_name'] = $member_info['m_o_name']; //会员名
$data['member_email'] = $data ['m_email']; //会员注册邮箱
$data['contact_name'] = $data['mp_name']; //会员名
$data['erp_source'] = $data ['m_source']; //会员来源地
$data['member_identity'] = 1; //会员身份 foreach($data as $key => $value){
if(!in_array($key,$sessionArr)){
unset($data[$key]);
}
}
//因为两者的api中都是用了session_start,所以要先销毁掉。
session_destroy();
$config["lifetime"]=0;
$config["path"] = '/';
$config["domain"] = '.X.com';
$config["secure"]=false;
$config["httponly"] =false;
session_set_cookie_params(
$config["lifetime"],
$config["path"],
$config["domain"],
$config["secure"],
$config["httponly"]
);
session_name('mphsess_id');
session_start();
   foreach($data as $key => $val){
$_SESSION[$key] = $val;
}
$this->dlt_back();
} //这里的window.opener.location.reload()有兼容性问题,可能还有跨域的问题,我在news站点使用,user站点的窗口不能调用父窗口news的reload方法。
    //window.close()也有浏览器兼容性问题,有的需要添加window.opener=null
public function dlt_back(){
//header("Location: {$this->_dlt_back_url}");
echo <<<EOT
<script language="javascript" type="text/javascript">
window.opener.location='{$this->_dlt_back_url}';
window.close();
</script>
EOT;
exit;
}
}

php使用第三方登录的更多相关文章

  1. iOS微信第三方登录实现

    iOS微信第三方登录实现   一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...

  2. 使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样

    使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样openid生成是根据应用的appid和QQ号的一些信息加密生成,对于一个appid和QQ号来说,openid是唯一的 ...

  3. 腾讯开放平台web第三方登录获取信息类(包含签名)

    不清楚具体参数的可以先看下第三方登录的文档: class QQ { //$appid 你的appid //$openid 获取到的唯一的用户openid //$openkey 获取到的openkey ...

  4. 第三方登录插件.NET版XY.OAuth-CSharp

    XY.OAuth-CSharp GitHub:XY.OAuth-CSharp OSChina:XY.OAuth-CSharp 第三方登录插件.NET版 使用 首先,从NuGet上安装"XY. ...

  5. iOS之ShareSDK实现分享、第三方登录等功能

    (1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...

  6. 利用ShareSDK进行第三方登录和分享

    到相应开发者平台注册开发者账号,并添加你要进行分享和使用第三方登录应用的信息. 添加新浪微博应用 注册网址 http://open.weibo.com添加QQ应用 注册网址  http://mobil ...

  7. 分享前端Facebook及Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  8. iOS - Share 分享/第三方登录

    1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...

  9. IOS 集成第三方登录

    我使用的是友盟上集成的第三方登录功能,一共使用了三个应用的登录授权,QQ.微信.新浪微博.由于第三方登录授权成功后,需要跳转到一个新的界面,所以这里需要在项目里设置第三方登录的SSO授权.就是必须安装 ...

  10. 使用cocoaPods一键集成第三方登录(新浪微博,qq,微信)

    第三方登录是现在app很常用的功能,而这个功能我已经写过两三次了...每次都写大同小异的代码真的是很痛苦,而且每次都要根据说明去添加那些依赖库,配置linkFlag什么的,完全是体力活,所以一直想把这 ...

随机推荐

  1. 安装DirectX SDK (June 2010) 失败(Error Code S1023)(转)

    解决: 在控制面板里面搜索“Microsoft Visual C++*”,然后卸载,这个工具的名字大概是: Microsoft Visual C++ 2010 x86/x64 redistribuab ...

  2. (转)android ListView详解

    转自:  http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 在android开发中ListView是比较常用的组件,它以列表的形 ...

  3. Eclipse调试Java的十个技巧

      先提三点 不要使用System.out.println()作为调试工具 启用所有组件的详细的日志记录级别 使用一个日志分析器来阅读日志   1.条件断点 想象一下我们平时如何添加断点,通常的做法是 ...

  4. Things about single men that women hate

    Things about single men that women hate为何你俘获不了女神的心?If you listen in to a group of single women talki ...

  5. CentOS系统常用命令

    1.进入目录命令 cd /usr/bin //进入etc目录 cd .. //切换到上一层目录 cd / //进入主目录 2.新建文件命令 比如进入某个目录后执行 vim test 2.查看运行的项目 ...

  6. TForm的显示过程

    新建一个空窗体项目,然后运行,此时首先运行: procedure TApplication.Run; begin FRunning := True; try AddExitProc(DoneAppli ...

  7. oracle记录解锁

    oracle 怎样查一个表中的记录是否被锁住了   怎么查询一个数据库中有几个表引用了其中某个特定表的主键做为其外键的select t.table_name from user_constraints ...

  8. Oracle 全文索引相关命令

    --用sys用户登录,解锁ctxsys用户alter user ctxsys account unlock; --授权给对应用户grant execute on ctx_ddl to yw; --用y ...

  9. Android 代码检查工具SonarQube

    http://blog.csdn.net/rain_butterfly/article/details/42170601 代码检查工具能帮我们检查一些隐藏的bug,代码检查工具中sonar是比较好的一 ...

  10. spring路径通配符

    在应用Spring的工程中,使用class path的方式加载配置文件应该是最常用的做法,然而对大部分人来说,刚开始使用Spring时,几乎都碰到过加载配置文件失败的情况,除了配置上的错误外,很多时候 ...