php使用第三方登录
目前只做了微博和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使用第三方登录的更多相关文章
- iOS微信第三方登录实现
iOS微信第三方登录实现 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...
- 使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样
使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样openid生成是根据应用的appid和QQ号的一些信息加密生成,对于一个appid和QQ号来说,openid是唯一的 ...
- 腾讯开放平台web第三方登录获取信息类(包含签名)
不清楚具体参数的可以先看下第三方登录的文档: class QQ { //$appid 你的appid //$openid 获取到的唯一的用户openid //$openkey 获取到的openkey ...
- 第三方登录插件.NET版XY.OAuth-CSharp
XY.OAuth-CSharp GitHub:XY.OAuth-CSharp OSChina:XY.OAuth-CSharp 第三方登录插件.NET版 使用 首先,从NuGet上安装"XY. ...
- iOS之ShareSDK实现分享、第三方登录等功能
(1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...
- 利用ShareSDK进行第三方登录和分享
到相应开发者平台注册开发者账号,并添加你要进行分享和使用第三方登录应用的信息. 添加新浪微博应用 注册网址 http://open.weibo.com添加QQ应用 注册网址 http://mobil ...
- 分享前端Facebook及Twitter第三方登录
最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...
- iOS - Share 分享/第三方登录
1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...
- IOS 集成第三方登录
我使用的是友盟上集成的第三方登录功能,一共使用了三个应用的登录授权,QQ.微信.新浪微博.由于第三方登录授权成功后,需要跳转到一个新的界面,所以这里需要在项目里设置第三方登录的SSO授权.就是必须安装 ...
- 使用cocoaPods一键集成第三方登录(新浪微博,qq,微信)
第三方登录是现在app很常用的功能,而这个功能我已经写过两三次了...每次都写大同小异的代码真的是很痛苦,而且每次都要根据说明去添加那些依赖库,配置linkFlag什么的,完全是体力活,所以一直想把这 ...
随机推荐
- SQL技术内幕-13 SQL优化方法论之分析实例级别的等待
优化方法论的第一步是在实例级别上找出什么类型的等待占用了大部分的等待时间,这可以通过查询动态管理图(DMV,dynamic management view)sys.dm_os_wait_stats 运 ...
- 14个Xcode中常用的快捷键操作
在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效,对于在代码文件中快速导航.定位Bug以及新增应用特性都是极有效的. 当然,你戳进这篇文章的目的也在于想要快速的对代码文件进行操作,或者 ...
- Hadoop完全分布式集群配置
1.前话 寒假实在太闲了,所以闲着无聊地去了解"大数据"这个新概念,这几年到处都在说什么大数据时代的,不能不让我感到好奇啊. 大数据有啥用?随便谷歌百度一大堆我也不多说了. 我自己 ...
- 使用原生JavaScript
如果你只需要针对现代浏览器,很多功能使用原生的 JavaScript 就可以实现. DOM Selectors //jQuery var ele = $("#id .class") ...
- Linux命令-date
[root@localhost ~]# date 2016年 09月 07日 星期三 :: CST [root@localhost ~]# date "+%Y" [root@loc ...
- 着色器(Shader)
着色器(Shader) 顶点着色器(Vertex shader) 片段着色器(Fragment shader) 几何着色器(Geometry Shader) 提供通用计算能力的着色器(Compute ...
- [IT] 关闭笔记本的蜂鸣提示
很久没有写什么了,今天开过workshop, 稍微放松些, 一时动念上来看看,没想到最近一篇都是2010年的了, 不得不感叹时光流逝之快啊. 那就写点什么吧. 现在每天工作用的DELL笔记本,性能差强 ...
- cdev、udev
udev :应用层的守护进程,由启动脚本加载,负责建立热拨插的接点 cdev :建立字符设备接口 platform device :相关平台直接总线建立的设备,主要出现需要自己直接挂到平台的时候,因为 ...
- Allegro16.3约束设置
差分对的约束设置 第一步,差分对的设置 差分对的设置有很多方法,下面介绍两种最常用的方法. 1. 点击菜单Logic→Assign Differential Pair... 弹出以下对话框. 点击你想 ...
- JSON(3)Google解析Json库Gson
本文参考 : http://www.cnblogs.com/chenlhuaf/archive/2011/05/01/gson_test.html 1.资料 官网: http://groups.goo ...