微信扫码登录
oauth原理:
下面是具体实现:
先发起请求
下面是控制器 :
public function oauth() {
$this->uid && $this->member_msg(fc_lang('请退出后再登录'), $_SERVER['HTTP_REFERER']);
$appid = $this->input->get('id');
$oauth = require WEBPATH.'config/oauth.php';
$config = $oauth[$appid];
!$config && $this->member_msg(fc_lang('OAuth错误: 缺少OAuth参数'));
// var_dump($config);
// die;
$code = $this->input->get('code', TRUE);
// var_dump($code);
// echo $code;
$MEMBER = $this->get_cache('member');
// var_dump($MEMBER);
// die;
if (IS_POST) {
$user = dr_string2array(dr_authcode($this->input->post('code'), 'DECODE'));
!$user && $this->member_msg(fc_lang('数据已过期,请重新登录'));
// var_dump($user);
// die;
$data = $this->input->post('data');
// var_dump($data);
// die;
$type = $this->input->post('type');
$error1 = $error2 = '';
if ($type == 1) {
// 登录
$rt = $this->member_model->login($data['username'], $data['password'], 36000);
if (strlen($rt) > 3) {
// 登录成功
!$this->uid && $this->member_msg(fc_lang('绑定失败,请重新登录'));
// 绑定到此账号
$user['uid'] = $this->uid;
$this->db->insert('member_oauth', $user);
$this->hooks->call_hook('member_login', $data); // 登录成功挂钩点
$this->member_msg(dr_weixin_emoji($user['nickname']).','.fc_lang('登录成功').$rt, dr_member_url('home/index'), 1, 1);
} elseif ($rt == -1) {
$error1 = fc_lang('会员不存在');
} elseif ($rt == -2) {
$error1 = fc_lang('密码不正确');
} elseif ($rt == -3) {
$error1 = fc_lang('Ucenter注册失败');
} elseif ($rt == -4) {
$error1 = fc_lang('Ucenter:会员名称不合法');
}
} else {
// 注册
$id = $this->member_model->register($data);
if ($id > 0) {
// 注册成功
$data['uid'] = $this->uid;
$this->hooks->call_hook('member_register_after', $data); // 注册之后挂钩点
// 注册后的登录
$rt = $this->member_model->login($id, $data['password'], 86400, 0, 1);
strlen($rt) > 3 && $this->hooks->call_hook('member_login', $data); // 登录成功挂钩点
// 绑定到此账号
$user['uid'] = $id;
$this->db->insert('member_oauth', $user);
$this->member_msg(dr_weixin_emoji($user['nickname']).','.fc_lang('登录成功').$rt, dr_member_url('home/index'), 1, 1);
} elseif ($id == -1) {
$error = array('name' => 'username', 'msg' => fc_lang('该会员【%s】已经被注册', $data['username']));
} elseif ($id == -2) {
$error = array('name' => 'email', 'msg' => fc_lang('邮箱格式不正确'));
} elseif ($id == -3) {
$error = array('name' => 'email', 'msg' => fc_lang('该邮箱【%s】已经被注册', $data['email']));
} elseif ($id == -4) {
$error = array('name' => 'username', 'msg' => fc_lang('同一IP在限制时间内注册过多'));
} elseif ($id == -5) {
$error = array('name' => 'username', 'msg' => fc_lang('Ucenter:会员名称不合法'));
} elseif ($id == -6) {
$error = array('name' => 'username', 'msg' => fc_lang('Ucenter:包含不允许注册的词语'));
} elseif ($id == -7) {
$error = array('name' => 'username', 'msg' => fc_lang('Ucenter:Email格式有误'));
} elseif ($id == -8) {
$error = array('name' => 'username', 'msg' => fc_lang('Ucenter:Email不允许注册'));
} elseif ($id == -9) {
$error = array('name' => 'username', 'msg' => fc_lang('Ucenter:Email已经被注册'));
} elseif ($id == -10) {
$error = array('name' => 'phone', 'msg' => fc_lang('手机号码必须是11位的整数'));
} elseif ($id == -11) {
$error = array('name' => 'phone', 'msg' => fc_lang('该手机号码已经注册'));
}
$error2 = $error['msg'];
}
$this->template->assign(array(
'type' => $type,
'code' => dr_authcode(dr_array2string($user), 'ENCODE'),
'oauth' => $user,
'error_1' => $error1,
'error_2' => $error2,
'regfield' => $MEMBER['setting']['regfield'],
));
$this->template->display('oauth.html');
exit;
}
$config['url'] = SITE_URL.'index.php?s=member&c=api&m=oauth&id='.$appid; // 回调地址设置
// var_dump($config['url']);
// die;
$this->load->library('OAuth2');
// OAuth
$oauth = $this->oauth2->provider($appid, $config);
// var_dump($code);
// die;
if (!$code) {
// 登录授权页
try {
$oauth->authorize();
} catch (OAuth2_Exception $e) {
$this->member_msg(fc_lang('OAuth授权错误').' _ '.$e);
}
} else {
// 回调返回数据
try {
$user = $oauth->get_user_info($oauth->access($code));
// var_dump($user);
// die;
if (is_array($user) && $user['oid']) {
!$user['nickname'] && $user['nickname'] = substr($user['oid'], 0, 10);
$code = $this->member_model->OAuth_login($appid, $user);
if ($code == 'bang') {
// 绑定账号
$this->template->assign(array(
'type' => 1,
'code' => dr_authcode(dr_array2string($user), 'ENCODE'),
'oauth' => $user,
'regfield' => $MEMBER['setting']['regfield'],
));
$this->template->display('oauth.html');
} else {
// 直接注册
$this->member_msg(dr_weixin_emoji($user['nickname']).','.fc_lang('登录成功').$code, dr_member_url('home/index'), 1, 3);
}
} else {
$this->member_msg(fc_lang('OAuth回调错误: 获取用户信息失败'));
}
} catch (OAuth2_Exception $e) {
$this->member_msg(fc_lang('OAuth回调错误: 获取用户信息失败').' - '.$e);
}
}
}
到这里 附带一个oauth页面 来自poscms的oauth 的页面
<!DOCTYPE html>
<!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]-->
<!--[if IE 9]> <html lang="en" class="ie9 no-js"> <![endif]-->
<!--[if !IE]><!-->
<html lang="en">
<!--<![endif]-->
<!-- BEGIN HEAD -->
<head>
<meta charset="utf-8" />
<title>快捷登录-绑定账号</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1" name="viewport" />
<meta content="www.dayrui.com" name="author" />
<!-- BEGIN GLOBAL MANDATORY STYLES -->
<link href="{THEME_PATH}admin/global/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link href="{THEME_PATH}admin/global/plugins/simple-line-icons/simple-line-icons.min.css" rel="stylesheet" type="text/css" />
<link href="{THEME_PATH}admin/global/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="{THEME_PATH}admin/global/plugins/uniform/css/uniform.default.css" rel="stylesheet" type="text/css" />
<link href="{THEME_PATH}admin/global/plugins/bootstrap-switch/css/bootstrap-switch.min.css" rel="stylesheet" type="text/css" />
<!-- END GLOBAL MANDATORY STYLES -->
<!-- BEGIN THEME GLOBAL STYLES -->
<link href="{THEME_PATH}admin/global/css/components-rounded.min.css" rel="stylesheet" id="style_components" type="text/css" />
<link href="{THEME_PATH}admin/global/css/plugins.min.css" rel="stylesheet" type="text/css" />
<!-- END THEME GLOBAL STYLES -->
<!-- BEGIN PAGE LEVEL STYLES -->
<link href="{THEME_PATH}admin/pages/css/login.min.css" rel="stylesheet" type="text/css" />
<!-- END PAGE LEVEL STYLES -->
<!--[if lt IE 9]>
<script src="{THEME_PATH}admin/global/plugins/respond.min.js"></script>
<script src="{THEME_PATH}admin/global/plugins/excanvas.min.js"></script>
<![endif]-->
<!-- BEGIN CORE PLUGINS -->
<script src="{THEME_PATH}admin/global/plugins/jquery.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/js.cookie.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/jquery-slimscroll/jquery.slimscroll.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/jquery.blockui.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/uniform/jquery.uniform.min.js" type="text/javascript"></script>
<script src="{THEME_PATH}admin/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js" type="text/javascript"></script>
<!-- END CORE PLUGINS -->
<!-- BEGIN THEME GLOBAL SCRIPTS -->
<script src="{THEME_PATH}admin/global/scripts/app.min.js" type="text/javascript"></script>
</head>
<!-- END HEAD -->
<body class=" login">
<div class="menu-toggler sidebar-toggler"></div>
<!-- END SIDEBAR TOGGLER BUTTON -->
<!-- BEGIN LOGO -->
<div class="logo">
<a href="{MEMBER_URL}">
<img src="{$oauth.avatar}" width="100" /> </a>
</div>
<!-- END LOGO -->
<!-- BEGIN LOGIN -->
<div class="content">
<!-- BEGIN LOGIN FORM -->
<form class="login-form" id="dform" action="" method="post" style="display:{if $type==1}block{else}none{/if}">
<input type="hidden" name="type" value="1">
<input type="hidden" name="code" value="{$code}">
<h3 class="form-title font-green">登录已有账号</h3>
{if $error_1}
<div class="alert alert-danger">
<button class="close" data-close="alert"></button>
<span> {$error_1} </span>
</div>
{/if}
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">会员账号/手机/邮箱</label>
<input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="会员账号/手机/邮箱" name="data[username]" /> </div>
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">登录密码</label>
<input class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="登录密码" name="data[password]" /> </div>
<div class="form-actions">
<button type="submit" class="btn green uppercase">立即绑定</button>
</div>
<div class="create-account">
<p>
<a href="javascript:;" onClick="$('#cform').show();$('#dform').hide();" class="uppercase">创建新账号</a>
</p>
</div>
</form>
<!-- END LOGIN FORM -->
<!-- BEGIN FORGOT PASSWORD FORM -->
<form class="forget-form" action="" id="cform" method="post" style="display:{if $type==2}block{else}none{/if}">
<input type="hidden" name="type" value="2">
<input type="hidden" name="code" value="{$code}">
<h3 class="form-title font-green">快速注册账号</h3>
{if $error_2}
<div class="alert alert-danger">
<button class="close" data-close="alert"></button>
<span> {$error_2} </span>
</div>
{/if}
{if @in_array('username', $regfield)}
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">会员名称</label>
<input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="会员名称" name="data[username]" />
</div>
{/if}
{if @in_array('phone', $regfield)}
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">手机号码</label>
<input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="手机号码" name="data[phone]" />
</div>
{/if}
{if @in_array('email', $regfield)}
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">安全邮箱</label>
<input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="安全邮箱" name="data[email]" />
</div>
{/if}
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">登录密码</label>
<input class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="登录密码" name="data[password]" />
</div>
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">确认密码</label>
<input class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="确认密码" name="data[password2]" />
</div>
<div class="form-actions">
<button type="submit" class="btn green uppercase">立即绑定注册</button>
</div>
<div class="create-account">
<p>
<a href="javascript:;" onClick="$('#dform').show();$('#cform').hide();" class="uppercase">绑定已有账号</a>
</p>
</div>
</form>
<!-- END FORGOT PASSWORD FORM -->
</div>
</body>
</html>