why.xingtongworld.com项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

215 lines
6.9 KiB

<?php
// +----------------------------------------------------------------------
// | YFCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://www.rainfer.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: rainfer <81818832@qq.com>
// +----------------------------------------------------------------------
namespace app\home\controller;
use think\Db;
class Oauth extends Base
{
public function login($type = null,$redirect = null)
{
empty($type) && $this->error(lang('parameter error'));
if(!empty($redirect)){session('login_http_referer',$redirect);}
$sns = \thinksdk\ThinkOauth::getInstance($type);
if(request()->isMobile()){
$sns->setDisplay('mobile');
}
$this->redirect($sns->getRequestCodeURL());
}
public function callback($type = null, $code = null)
{
(empty($type)) && $this->error(lang('parameter error'));
if(empty($code)){
$this->redirect(__ROOT__."/");
}
$sns = \thinksdk\ThinkOauth::getInstance($type);
$extend = null;
if($type == 'tencent'){
$extend = array('openid' => input("openid"), 'openkey' => input("openkey"));
}
$ignore_stat = true; //验证stat 防刷
$token = $sns->getAccessToken($code , $extend);
//获取当前登录用户信息
if(is_array($token)){
$user_info = $sns->userinfo();
$oauth_bang_s=session('oauth_bang');
if($oauth_bang_s){
$this->_bang_handle($user_info, $type, $token);
}else{
$this->_login_handle($user_info, $type, $token);
}
}else{
$this->success(lang('login failed'),$this->_get_login_redirect());
}
}
public function bang($type="")
{
if(session('hid')){
empty($type) && $this->error(lang('parameter error'));
$sns = \thinksdk\ThinkOauth::getInstance($type);
session('oauth_bang',1);
$this->redirect($sns->getRequestCodeURL());
}else{
$this->error(lang('not logged'));
}
}
private function _get_login_redirect()
{
$login_http_referer_s=session('login_http_referer');
return empty($login_http_referer_s)?__ROOT__."/":$login_http_referer_s;
}
//绑定第三方账号
private function _bang_handle($user_info, $type, $token)
{
$current_uid=session('hid');
$type=strtolower($type);
$oauth_id=($type=='wechat' || $type=='weixin')?'unionid':'openid';
$find_oauth_user = Db::name('OauthUser')->where(array("oauth_from"=>$type,$oauth_id=>$token[$oauth_id]))->find();
$need_bang=true;
if($find_oauth_user){
if($find_oauth_user['uid']==$current_uid){
session('oauth_bang',null);
$this->error(lang('bound already'),url('home/Center/bang'));exit;
}else{
session('oauth_bang',null);
$this->error(lang('bound other account'),url('home/Center/bang'));exit;
}
}
if($need_bang){
if($current_uid){
//第三方用户表中创建数据
$new_oauth_user_data = array(
'oauth_from' => $type,
'name' => $user_info['name'],
'head_img' => $user_info['head'],
'create_time' =>time(),
'uid' => $current_uid,
'last_login_time' => time(),
'last_login_ip' => request()->ip(),
'login_times' => 1,
'user_status' => 1,
'access_token' => $token['access_token'],
'expires_date' => (int)(time()+$token['expires_in']),
$oauth_id => $token[$oauth_id],
);
$new_oauth_user_data['openid']=$user_info['openid'];
$new_oauth_user_id=Db::name('OauthUser')->insertGetId($new_oauth_user_data);
if($new_oauth_user_id){
session('oauth_bang',null);
$this->success(lang('bind success'),url('home/Center/bang'));
}else{
session('oauth_bang',null);
$this->error(lang('bind failed'),url('home/Center/bang'));
}
}else{
session('oauth_bang',null);
$this->error(lang('bind failed'),url('home/Center/bang'));
}
}
}
//登陆
private function _login_handle($user_info, $type, $token)
{
$type=strtolower($type);
$oauth_id=($type=='wechat' || $type=='weixin')?'unionid':'openid';
$find_oauth_user = Db::name('OauthUser')->where(array("oauth_from"=>$type,$oauth_id=>$token[$oauth_id]))->find();
$need_register=true;
if($find_oauth_user){
//更新第三方表
$data=array(
'last_login_time' => time(),
'last_login_ip' => request()->ip(),
'access_token' => $token['access_token'],
'expires_date' => (int)(time()+$token['expires_in']),
'name' => $user_info['name'],
'head_img' => $user_info['head'],
);
Db::name('OauthUser')->where(array("oauth_from"=>$type,$oauth_id=>$token[$oauth_id]))->update($data);
$find_user = Db::name("member_list")->where(array("member_list_id"=>$find_oauth_user['uid']))->find();
if($find_user){
$need_register=false;
if($find_user['member_list_open']==0){
$this->error(lang('user disabled'),$this->_get_login_redirect());
}
//更新字段
$data = array(
'last_login_time' => time(),
'last_login_ip' => request()->ip(),
);
Db::name("member_list")->where(array('member_list_id'=>$find_user["member_list_id"]))->update($data);
session('hid',$find_user['member_list_id']);
session('user',$find_user);
$this->redirect($this->_get_login_redirect());
}else{
$need_register=true;
}
}
if($need_register){
//本地用户中创建对应一条数据
$new_user_data = array(
'member_list_username' => $user_info['name'],
'member_list_nickname' => $user_info['name'],
'member_list_headpic' => $user_info['head'],
'member_list_addtime' => time(),
'member_list_groupid'=>1,
'member_list_sex'=>3,
'member_list_open'=>1,
'member_list_from'=>$type,
'last_login_time' => time(),
'last_login_ip' => request()->ip(),
'user_status'=>1,//第三方默认已激活
);
$users_model=Db::name("member_list");
$new_user_id = Db::name("member_list")->insertGetId($new_user_data);
$new_user_data=Db::name("member_list")->find($new_user_id);
if($new_user_id){
//第三方用户表中创建数据
$new_oauth_user_data = array(
'oauth_from' => $type,
'name' => $user_info['name'],
'head_img' => $user_info['head'],
'create_time' =>time(),
'uid' => $new_user_id,
'last_login_time' => time(),
'last_login_ip' => request()->ip(),
'login_times' => 1,
'user_status' => 1,
'access_token' => $token['access_token'],
'expires_date' => (int)(time()+$token['expires_in']),
$oauth_id => $token[$oauth_id],
);
$new_oauth_user_data['openid']=$user_info['openid'];
$new_oauth_user_id=Db::name("OauthUser")->insertGetId($new_oauth_user_data);
if($new_oauth_user_id){
session('hid',$new_user_id);
session('user',$new_user_data);
$this->redirect($this->_get_login_redirect());
}else{
$users_model->where(array("member_list_id"=>$new_user_id))->delete();
$this->error(lang('login failed'),$this->_get_login_redirect());
}
}else{
$this->error(lang('login failed'),$this->_get_login_redirect());
}
}
}
}