今天干点啥呢(12月9日)
文哥昨晚忙到2点 今天木有接口写 那么自由活动 捣鼓一下前端嘿嘿嘿
明哥给了任务:
熟悉登录模块,并且提出两个改进点
完善数据字典,这个我真不想做..
//首先我不知道这段代码的含义,下次问下
if(LOGIN_TYPE_DAISHU_WECHAT != $this->login_type()){ //log_message('debug','login type is not LOGIN_TYPE_DAISHU_WECHAT, request url : ' . $this->request_url()); $this->session->unset_userdata(KEY_USER_INFO); $this->session->unset_userdata(KEY_SOCIAL_USER_INFO); $this->input->set_cookie('enterprise_id', 0, COOKIE_CACHE_TIME); }
登录是用多次跳转完成的,一瞬间做的事情真的很多,要深入了解的话一定要在调试代码末尾加入exit来终止,不然得到的结果其实是跳转几次后的结果.
那么还是来看明老师check_wechat_login()这个方法.
第一次进入这个页面,所有状态都没有的情况下. $user_info = $this->session->userdata(KEY_USER_INFO); $social_info = $this->session->userdata(KEY_SOCIAL_USER_INFO); 这两个变量均为空,那么接下来就来看每一次跳转的过程:
以下是主要代码,供参考,这段代码以后简称主方法
if (((!$social_info) && (!$user_info)) || ($need_try_login && !$user_info)){
//首先满足$social_info跟$userinfo均为空的条件,进入该循环.马上设置cookie.这个cookie就是前文中不知道有何用的变量
$this->input->set_cookie('login_type', LOGIN_TYPE_DAISHU_WECHAT, COOKIE_CACHE_TIME);
//此处满足$social_info为空的条件,进入逻辑
if(!$social_info){
//此处其实就是授权方法,注意,此处就开始跳转了结果就是将授权信息放在了session中的KEY_SOCIAL_USER_INFO中.
//此处授权跳转说明:(之后会进行方法的详细注释)
//首先获取当前url作为callback参数,跳转到此处http://test.daishutijian.com/tijian/apps/wechat/wechat/wxauth?callback=...
//在wxauth方法中,首先设置回调地址.若没有传回调地址过来则默认为org/package,否则用传过来的回调地址.回到地址存放至session中,其实为什么要放到session中我也不知道.回调也是很重要的一部分.然后进入授权部分
//授权的第一步判断是来自哪种浏览器而调取不同的授权方法.在微信开发工具中调用的是wechatauth这个类.
//授权的结果就是将授权信息放在了session中,也就是$this->session->get(KEY_SOCIAL_USER_INFO)中.
//授权完毕后取出回调地址,进行跳转.再次回到这个页面,进入这个方法.现在呢,$user_info为空,而$social_info已经存储了拿到的授权信息.
//再次回到这个方法后,若传入check_wechat_login的参数为0的话,则只是单纯进行授权之后就没有操作了.
//而这次的参数为2,所以还是会再次回到这段代码中来.($need_try_login && !$user_info) 这次是满足这个条件.
$this->wechat_auth();
}else{
//那么跳转后因为$socail_info有值,则会进入这段逻辑.
log_message('debug','get social info ok:' . json_encode($social_info));
if($need_try_login){
$this->load->helper('wechat');
//从social_binder表中查询有无该open_id的对应关系,第一次到这里肯定是没有的
$user_info = get_user_info_by_social_id($social_info["social_id"], $social_info['bind_type']);
log_message('debug','####try binder_social_id login, get_user_info:' . json_encode($user_info));
if(empty($user_info) && $need_try_login){
//因为在socail_binder中无对应关系,则在user表中读取,第一次也是没有的
$social_id = $social_info['social_id'];
$user_info = CI_MyApi::excute('user/get_user_by_social_id', array('social_id' => $social_id), 'POST');
if(empty($user_info)){
//那么就进入这段逻辑,这里根据授权信息生成用户信息,然后放入user表中.注意此处指定了status=4这是游客身份的标识
$user_info = $this->create_guest($social_info);
$ret = CI_MyApi::excute('usercenter/save_entry', $user_info, 'POST');
if($ret > 0){
$user_info['id'] = $ret; //
}else{
$user_info = null;
}
}else{
log_message('debug', '####try guest login, ok!! social_id:' . $social_id);
}
}
//走出逻辑,此时user表中已经用授权信息新建了一个user,然后把id放了进来,这一步就是把信息存放到session中.
if($user_info){
$this->_login($user_info);
}
}
}
}
至此,第一次进入这个页面的逻辑就走完了.我们得到的结果是:
social_binder表中无记录,user表中将授权信息作为用户信息存了一条记录.
session中存放了授权信息以及用户信息.
以上的结果是在check_wechat_login(2)的情况下.
如果传入的是0的话.
就仅仅是session中存放了授权信息.
如果是1的话,则会有下面这段逻辑:
//登陆完成之后,再看是否需要强制跳转到登陆页面
if($need_login && !$this->is_register()){
log_message('debug', '####login with guest, but require phone user login. redirect to register page.');
//跳转前将回调地址放入session里了哈
$this->session->set_userdata(APP_REFERRER_URL, $this->request_url());
//跳转
redirect($this->config->item('wechat_root_path') . "user/register");
exit;
}
public function register()
{
$this->check_wechat_login(2);
$user_info = $this->session->userdata(KEY_USER_INFO);
//进入这个条件是要求status==1 而第一次登陆的我们status==4 是作为游客登录的
if($user_info && ($user_info['status'] == 1)){
//if(false){
$url = $this->request_url();
if(strpos($url, 'user/register') !== FALSE){
log_message('debug', 'request url:' . $this->request_url() . ',has logined,redirect to app_root_path');
redirect($this->config->item('app_path'));
}else{
redirect($url);
}
}
//var_dump($user_info);exit;
$data['head_title'] = '账号绑定 - ' . $this->config->item('app_name');
$data['app_referrer_url'] = $this->session->userdata(APP_REFERRER_URL);
$this->render('register_tpl', $data);
}
之后就是正常的用户绑定逻辑,绑定主要是修改当前用户的status+在绑定表中添加绑定关系

浙公网安备 33010602011771号