微信扫码登录

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>