thinkSDK在thinkphp官网下载:http://www.thinkphp.cn/extend/292.html,感谢作者哈。
github下载地址:https://github.com/Aoiujz/ThinkSDK
这里只介绍在Onethink中的二次开发(qq登录和微博登录),针对用户模块来做的,方便管理和维护。
1、后台配置来个截图,也是为了方便管理,后期可以新增其他第三方登录配置信息,配置分组自行在后台操作,登录操作看看。
2、为什么写在配置里面的原因:thinkSDK已经有配置文件oauth.php,所以直接把配置文件中对应的第三方秘钥变量替换第三方秘钥生成我们定义的扩展配置文件名称webconfig.php,这里已经写过一篇文章,onethink配置文件生成方法,同onethink安装生存配置文件
(1)、后台配置KEY和SECRET:
(2),oauth.php原配置文件:
(3)点击保存生成配置文件:
以上步骤完成第三方秘钥配置文件生成。
3、文件放置位置:thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/,如果涉及到命名空间请自行添加。
4、本站点再有时间的情况下已经实现了QQ登录和微博登录,以及qq,微博登录后,直接完成帐号密码信息,实现一键登录。
5、以下说明User模块二次开发扩展红色标注两个文件,以及Home模块下User控制器相关方法。
文件说明:OauthApi.class.phpApi文件和OauthMember更新表的数据处理文件,所下载的TypeEvent.class.php这个文件中的方法也搬家到了OauthApi.class.php中,方便User控制器直接调用。
OauthApi.class.php文件代码:
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace User\Api;
use User\Api\Api;
use User\Model\OauthMemberModel;
class OauthApi extends Api{
/**
* 构造方法,实例化操作模型
*/
protected function _init(){
$this->model = new OauthMemberModel();
}
/**
* 注册一个新Oauth用户
* @param string $type 类型 1:QQ 2:新浪微博 3:豆瓣 4:人人 5:开心网
* @param string $nickname 第三方昵称
* @param string $head_img 第三方头像
* @param string $openid 第三方用户id
* @param string $idaccess_token access_token token
* @return integer 注册成功-用户信息,注册失败-错误编号
*/
public function register($uid,$type, $nickname, $head_img, $openid, $access_token){
return $this->model->register($uid,$type, $nickname, $head_img, $openid, $access_token);
}
/**
* 获取用户Oauth用户信息
* @param string $oauthmember id或openid
* @param string $type 1表示uid,2表示openid
* @return array Oauth用户信息
*/
public function getOauthMemberInfo($oauthmember,$type = 1){
return $this->model->getOauthMemberInfo($oauthmember,$type);
}
/**
* 更新Oauth用户
* @param string $type 类型 1:QQ 2:新浪微博 3:豆瓣 4:人人 5:开心网
* @param string $nickname 第三方昵称
* @param string $head_img 第三方头像
* @param string $openid 第三方用户id
* @param string $idaccess_token access_token token
* @return integer 注册成功-用户信息,注册失败-错误编号
*/
public function updateOauthMember($uid,$type, $nickname, $head_img, $openid, $access_token){
return $this->model->updateOauthMember($uid,$type, $nickname, $head_img, $openid, $access_token);
}
//登录成功,获取腾讯QQ用户信息
public function qq($token){
import("ORG.ThinkSDK.ThinkOauth");
$qq = \ThinkOauth::getInstance('qq', $token);
$data = $qq->call('user/get_user_info');
if($data['ret'] == 0){
$userInfo['type'] = 1;
$userInfo['name'] = $data['nickname'];
$userInfo['nickname'] = $data['nickname'];
$userInfo['head_img'] = $data['figureurl_2'];
return $userInfo;
} else {
throw_exception("获取腾讯QQ用户信息失败:{$data['msg']}");
}
}
//登录成功,获取腾讯微博用户信息
public function tencent($token){
import("ORG.ThinkSDK.ThinkOauth");
$tencent = \ThinkOauth::getInstance('tencent', $token);
$data = $tencent->call('user/info');
if($data['ret'] == 0){
$userInfo['type'] = 'TENCENT';
$userInfo['name'] = $data['data']['name'];
$userInfo['nickname'] = $data['data']['nick'];
$userInfo['head_img'] = $data['data']['head'];
return $userInfo;
} else {
throw_exception("获取腾讯微博用户信息失败:{$data['msg']}");
}
}
//登录成功,获取新浪微博用户信息
public function sina($token){
$sina = \ThinkOauth::getInstance('sina', $token);
$data = $sina->call('users/show', "uid={$sina->openid()}");
if($data['error_code'] == 0){
$userInfo['type'] = 2;
$userInfo['name'] = $data['name'];
$userInfo['nickname'] = $data['screen_name'];
$userInfo['head_img'] = $data['avatar_large'];
return $userInfo;
} else {
throw_exception("获取新浪微博用户信息失败:{$data['error']}");
}
}
//登录成功,获取网易微博用户信息
public function t163($token){
$t163 = \ThinkOauth::getInstance('t163', $token);
$data = $t163->call('users/show');
if($data['error_code'] == 0){
$userInfo['type'] = 'T163';
$userInfo['name'] = $data['name'];
$userInfo['nickname'] = $data['screen_name'];
$userInfo['head_img'] = str_replace('w=48&h=48', 'w=180&h=180', $data['profile_image_url']);
return $userInfo;
} else {
throw_exception("获取网易微博用户信息失败:{$data['error']}");
}
}
//登录成功,获取人人网用户信息
public function renren($token){
$renren = \ThinkOauth::getInstance('renren', $token);
$data = $renren->call('user/get');
if(!isset($data['error'])){
$userInfo['type'] = 4;
$userInfo['name'] = $data['response']['name'];
$userInfo['nickname'] = $data['response']['name'];
$userInfo['head_img'] = $data['response']['avatar'][3]['url'];
return $userInfo;
} else {
throw_exception("获取人人网用户信息失败:{$data['error_msg']}");
}
}
//登录成功,获取360用户信息
public function x360($token){
$x360 = \ThinkOauth::getInstance('x360', $token);
$data = $x360->call('user/me');
if($data['error_code'] == 0){
$userInfo['type'] = 'X360';
$userInfo['name'] = $data['name'];
$userInfo['nickname'] = $data['name'];
$userInfo['head_img'] = $data['avatar'];
return $userInfo;
} else {
throw_exception("获取360用户信息失败:{$data['error']}");
}
}
//登录成功,获取豆瓣用户信息
public function douban($token){
$douban = \ThinkOauth::getInstance('douban', $token);
$data = $douban->call('user/~me');
if(empty($data['code'])){
$userInfo['type'] = 3;
$userInfo['name'] = $data['name'];
$userInfo['nickname'] = $data['name'];
$userInfo['head_img'] = $data['avatar'];
return $userInfo;
} else {
throw_exception("获取豆瓣用户信息失败:{$data['msg']}");
}
}
//登录成功,获取Github用户信息
public function github($token){
$github = \ThinkOauth::getInstance('github', $token);
$data = $github->call('user');
if(empty($data['code'])){
$userInfo['type'] = 'GITHUB';
$userInfo['name'] = $data['login'];
$userInfo['nickname'] = $data['name'];
$userInfo['head_img'] = $data['avatar_url'];
return $userInfo;
} else {
throw_exception("获取Github用户信息失败:{$data}");
}
}
//登录成功,获取Google用户信息
public function google($token){
$google = \ThinkOauth::getInstance('google', $token);
$data = $google->call('userinfo');
if(!empty($data['id'])){
$userInfo['type'] = 'GOOGLE';
$userInfo['name'] = $data['name'];
$userInfo['nickname'] = $data['name'];
$userInfo['head_img'] = $data['picture'];
return $userInfo;
} else {
throw_exception("获取Google用户信息失败:{$data}");
}
}
//登录成功,获取Google用户信息
public function msn($token){
$msn = \ThinkOauth::getInstance('msn', $token);
$data = $msn->call('me');
if(!empty($data['id'])){
$userInfo['type'] = 'MSN';
$userInfo['name'] = $data['name'];
$userInfo['nickname'] = $data['name'];
$userInfo['head_img'] = '微软暂未提供头像URL,请通过 me/picture 接口下载';
return $userInfo;
} else {
throw_exception("获取msn用户信息失败:{$data}");
}
}
//登录成功,获取点点用户信息
public function diandian($token){
$diandian = \ThinkOauth::getInstance('diandian', $token);
$data = $diandian->call('user/info');
if(!empty($data['meta']['status']) && $data['meta']['status'] == 200){
$userInfo['type'] = 'DIANDIAN';
$userInfo['name'] = $data['response']['name'];
$userInfo['nickname'] = $data['response']['name'];
$userInfo['head_img'] = "https://api.diandian.com/v1/blog/{$data['response']['blogs'][0]['blogUuid']}/avatar/144";
return $userInfo;
} else {
throw_exception("获取点点用户信息失败:{$data}");
}
}
//登录成功,获取淘宝网用户信息
public function taobao($token){
$taobao = \ThinkOauth::getInstance('taobao', $token);
$fields = 'user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info';
$data = $taobao->call('taobao.user.buyer.get', "fields={$fields}");
if(!empty($data['user_buyer_get_response']['user'])){
$user = $data['user_buyer_get_response']['user'];
$userInfo['type'] = 'TAOBAO';
$userInfo['name'] = $user['user_id'];
$userInfo['nickname'] = $user['nick'];
$userInfo['head_img'] = $user['avatar'];
return $userInfo;
} else {
throw_exception("获取淘宝网用户信息失败:{$data['error_response']['msg']}");
}
}
//登录成功,获取百度用户信息
public function baidu($token){
$baidu = \ThinkOauth::getInstance('baidu', $token);
$data = $baidu->call('passport/users/getLoggedInUser');
if(!empty($data['uid'])){
$userInfo['type'] = 'BAIDU';
$userInfo['name'] = $data['uid'];
$userInfo['nickname'] = $data['uname'];
$userInfo['head_img'] = "http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']}";
return $userInfo;
} else {
throw_exception("获取百度用户信息失败:{$data['error_msg']}");
}
}
//登录成功,获取开心网用户信息
public function kaixin($token){
$kaixin = \ThinkOauth::getInstance('kaixin', $token);
$data = $kaixin->call('users/me');
if(!empty($data['uid'])){
$userInfo['type'] = 5;
$userInfo['name'] = $data['uid'];
$userInfo['nickname'] = $data['name'];
$userInfo['head_img'] = $data['logo50'];
return $userInfo;
} else {
throw_exception("获取开心网用户信息失败:{$data['error']}");
}
}
//登录成功,获取搜狐用户信息
public function sohu($token){
$sohu = \ThinkOauth::getInstance('sohu', $token);
$data = $sohu->call('user/get_info');
if('success' == $data['message'] && !empty($data['data'])){
$userInfo['type'] = 'SOHU';
$userInfo['name'] = $data['data']['open_id'];
$userInfo['nickname'] = $data['data']['nick'];
$userInfo['head_img'] = $data['data']['icon'];
return $userInfo;
} else {
throw_exception("获取搜狐用户信息失败:{$data['message']}");
}
}
}
OauthMemberModel.class.php文件代码:
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace User\Model;
use Think\Model;
/**
* 会员Oauth模型
*/
class OauthMemberModel extends Model{
/**
* 数据表前缀
* @var string
*/
protected $tablePrefix = UC_TABLE_PREFIX;
/**
* 数据库连接
* @var string
*/
protected $connection = UC_DB_DSN;
/* 用户模型自动验证 */
// 自动验证
protected $_validate=array(
array('type','require','类型必填'),
array('nickname','require','昵称必填'),
array('head_img','require','头像必填'),
array('openid','require','openid必填'),
array('access_token','require','access_token必填'),
);
// 自动完成
protected $_auto=array(
array('create_time','time',1,'function'),
array('last_login_time','time',3,'function'),
array('last_login_ip','getLoginIp',3,'callback'),
array('login_times',1),
array('status',1),
array('is_admin',0),
);
/**
* 注册一个新Oauth用户
* @param string $type 类型 1:QQ 2:新浪微博 3:豆瓣 4:人人 5:开心网
* @param string $nickname 第三方昵称
* @param string $head_img 第三方头像
* @param string $openid 第三方用户id
* @param string $idaccess_token access_token token
* @return integer 注册成功-用户信息,注册失败-错误编号
*/
public function register($uid,$type, $nickname, $head_img, $openid, $access_token){
$data = array(
'uid' =>$uid,
'type' => $type,
'nickname' => $nickname,
'head_img' => $head_img,
'openid' => $openid,
'access_token' => $access_token
);
/* 添加用户 */
if($this->create($data)){
$id = $this->add();
return $id ? $id : 0; //0-未知错误,大于0-注册成功
} else {
return $this->getError(); //错误详情见自动验证注释
}
}
/**
* 更新新Oauth用户
* @param string $type 类型 1:QQ 2:新浪微博 3:豆瓣 4:人人 5:开心网
* @param string $nickname 第三方昵称
* @param string $head_img 第三方头像
* @param string $openid 第三方用户id
* @param string $idaccess_token access_token token
* @return integer 注册成功-用户信息,注册失败-错误编号
*/
public function updateOauthMember($uid, $type, $nickname, $head_img, $openid, $access_token){
$data = array(
'uid' =>$uid,
'type' => $type,
'nickname' => $nickname,
'head_img' => $head_img,
'openid' => $openid,
'access_token' => $access_token
);
$openid=$data['openid'];
if($create=$this->create($data)){
$create['login_times']=array('exp','login_times+1');
unset($create['status']);
unset($create['create_time']);
$this->where(array('openid'=>$openid))->save($create);
return $this->getFieldByOpenid($openid,'id');
}
}
/**
* 获取用户信息
* @param string $oauthuser 唯一标识
* @param integer $type 类型 (1-id,2-openid)
* @return array oauth记录
*/
public function getOauthMemberInfo($oauthmember, $type = 1){
$map = array();
switch ($type) {
case 1:
$map['id'] = $oauthmember;
break;
case 2:
$map['openid'] = $oauthmember;
break;
default:
return 0; //参数错误
}
/* 获取oauth数据 */
$oauth_member = $this->where($map)->find();
if(is_array($oauth_member) && $oauth_member['status']){
/* 验证用户密码 */
return $oauth_member;
} else {
return -1; //用户不存在或被禁用
}
}
// 获得登陆ip
function getLoginIp(){
$ip=get_client_ip();
return $ip;
}
}
发表评论 取消回复