ソースを参照

wxlogon is ok

stanley-king 7 年 前
コミット
02575d7404

+ 80 - 20
helper/login/ilogin.php

@@ -37,6 +37,45 @@ abstract class ILogin
 
     abstract public function ismember();
 
+    public function register($user_info,$relay_id,$mobile)
+    {
+        if(empty($user_info) && empty($mobile)) return false;
+
+        if(empty($mobile)) {
+            $type = ILogin::wxunion_login;
+            $bind_mobile = 0;
+        } else {
+            $type = ILogin::mobile_login;
+            $bind_mobile = 1;
+        }
+
+        $info['member_type'] = $type;
+        $info['member_mobile_bind'] = $bind_mobile;
+
+        $relay_id = intval($relay_id);
+        $info['inviter_id'] = $relay_id;
+
+        if(!empty($user_info)) {
+            $info['member_nickname']  = $user_info['nickname'];
+            $info['member_wxunionid'] = $user_info['unionid'];
+            $info['member_avatar']   = $user_info['headimgurl'];
+            $info['member_sex']      = intval($user_info['sex']);
+        }
+
+        if(empty($mobile)) {
+            $mobile = '';
+        }
+        $info['member_mobile'] = $mobile;
+
+        $mod_member = Model('member');
+        $insert_id = $mod_member->addMember($info);
+        if($insert_id != false) {
+            $this->mMemberId = $insert_id;
+        }
+
+        return $insert_id;
+    }
+
     public function login()
     {
         if($this->mMemberId <= 0) return false;
@@ -59,25 +98,45 @@ abstract class ILogin
 
         return true;
     }
-    public function bind($user_info,$fUseOpenid = true)
+    public function wxauthored()
+    {
+        if($this->mMemberId <= 0) return false;
+        $minfo = new member_info($this->mMemberInfo);
+        return $minfo->wxauthored();
+    }
+    public function has_mobile() {
+        if($this->mMemberId <= 0) return false;
+        $minfo = new member_info($this->mMemberInfo);
+
+        return !empty($minfo->mobile());
+    }
+
+    public function bind($user_info,$mobile='')
     {
         if($this->mMemberId <= 0) return false;
         $mod_member = Model('member');
 
-        $update['member_nickname']  = $user_info['nickname'];
-        $update['member_wxunionid'] = $user_info['unionid'];
+        if(!empty($user_info)) {
+            $update['member_nickname']  = $user_info['nickname'];
+            $update['member_wxunionid'] = $user_info['unionid'];
+            $update['member_wxopenid'] = '';
 
-        if($fUseOpenid) {
-            $update['member_wxopenid'] = $user_info['openid'];
+            $update['member_avatar'] = $user_info['headimgurl'];
+            $update['member_sex'] = intval($user_info['sex']);
+        }
+        if(!empty($mobile)) {
+            $update['member_mobile'] = $mobile;
         }
 
-        $update['member_avatar'] = $user_info['headimgurl'];
-        $update['member_sex'] = intval($user_info['sex']);
         $ret = $mod_member->editMember(array('member_id' => $this->mMemberId), $update);
-        return $ret;
+        if($ret && $mod_member->affected_rows > 0) {
+            return true;
+        } else {
+            return false;
+        }
     }
 
-    public function unbind()
+    public function unbind_userinfo()
     {
         if($this->mMemberId <= 0) return false;
         $mod_member = Model('member');
@@ -101,22 +160,23 @@ abstract class ILogin
         $this->mMemberInfo['member_sex'] = $member->sex();
 
         $ret = $mod_member->editMember(array('member_id' => $this->mMemberId), $update);
-        return $ret;
+        if($ret && $mod_member->affected_rows > 0) {
+            return true;
+        } else {
+            return false;
+        }
     }
-    public function unbind_mobile($mobile,$member_id)
+
+    public function unbind_mobile()
     {
         if($this->mMemberId <= 0) return false;
 
         $mod_member = Model('member');
-        $ret = $mod_member->delete(['member_id' => $member_id]);
-        if($ret)
-        {
-            $ret = $mod_member->editMember(array('member_id' => $this->mMemberId), ['member_mobile' => $mobile]);
-            if($ret && $mod_member->affected_rows > 0) {
-                $this->login();
-            }
+        $ret = $mod_member->editMember(['member_id' => $this->mMemberId], ['member_mobile' => ""]);
+        if($ret && $mod_member->affected_rows > 0) {
+            return true;
+        } else {
+            return false;
         }
-
-        return $ret;
     }
 }

+ 13 - 1
helper/login/memberid_log.php

@@ -10,13 +10,25 @@ namespace login;
 
 class memberid_log extends ILogin
 {
-
     public function __construct($member_id)
     {
         $this->mMemberId = $member_id;
+        if($this->ismember() == false) {
+            throw_exception("错误的会员编号:{$member_id}");
+        }
     }
 
     public function ismember()
     {
+        $mod_member = Model('member');
+        $minfo = $mod_member->getMemberInfo(['member_id' => $this->mMemberId],ILogin::fields,true);
+        if(empty($minfo)) {
+            return false;
+        }
+        else {
+            $this->mMemberId = intval($minfo['member_id']);
+            $this->mMemberInfo = $minfo;
+            return true;
+        }
     }
 }

+ 0 - 21
helper/login/open_userinfo_log.php

@@ -42,25 +42,4 @@ class open_userinfo_log extends ILogin
             return true;
         }
     }
-
-    public function register($user_info,$relay_id = 0)
-    {
-        if(empty($user_info)) return false;
-
-        $info['member_type'] = ILogin::wxunion_login;
-        $info['member_mobile_bind'] = 0;
-        $info['inviter_id'] = $relay_id;
-        $info['member_nickname']  = $user_info['nickname'];
-        $info['member_wxunionid'] = $user_info['unionid'];
-        $info['member_avatar']   = $user_info['headimgurl'];
-        $info['member_sex']      = intval($user_info['sex']);
-
-        $mod_member = Model('member');
-        $insert_id = $mod_member->addMember($info);
-        if($insert_id != false) {
-            $this->mMemberId = $insert_id;
-        }
-
-        return $insert_id;
-    }
 }

+ 0 - 5
helper/login/pub_userinfo_log.php

@@ -33,9 +33,4 @@ class pub_userinfo_log extends ILogin
             return true;
         }
     }
-
-    public function register($user_info,$relay_id = 0)
-    {
-
-    }
 }

+ 0 - 4
helper/login/unionid_log.php

@@ -30,8 +30,4 @@ class unionid_log extends ILogin
             return true;
         }
     }
-    public function register($user_info,$relay_id = 0)
-    {
-
-    }
 }

+ 2 - 2
helper/login_helper.php

@@ -20,14 +20,14 @@ require_once(BASE_ROOT_PATH . '/helper/push_helper.php');
 class login_helper
 {
     //微信授权之后,并且验证码通过后的处理
-    public static function onBinded($mobile,$code,$relay_id=0,$fUseOpenid = true)
+    public static function onBinded($mobile,$code,$relay_id=0)
     {
         $logger = new login\mobile_log($mobile);
         if($logger->ismember() == true)
         {
             $user_info = self::user_info();
             if($user_info != false) {
-                $logger->bind($user_info,$fUseOpenid);
+                $logger->bind($user_info);
                 unset($_SESSION['wx_author']);
             }
             return $logger->login();

+ 64 - 4
helper/session_helper.php

@@ -251,9 +251,9 @@ class session_helper
 
     static public function need_wechat_author()
     {
-//        if (BASE_SITE_URL != 'http://p.lrlz.com') {
-//            return false;
-//        }
+        if(array_key_exists('author_orgin_url',$_SESSION)) {
+            unset($_SESSION['author_orgin_url']);
+        }
 
         if (util::from_wechat() == false) {
             return false;
@@ -272,7 +272,7 @@ class session_helper
                         unset($_SESSION['wx_author']);
                     }
                     else {
-                        $loginer->register($user_info,session_helper::relay_id());
+                        $loginer->register($user_info,session_helper::relay_id(),session_helper::cur_mobile());
                     }
                 }
 
@@ -501,4 +501,64 @@ class session_helper
             unset($_SESSION['fcode_num']);
         }
     }
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    static public function has_regmobile() {
+        return !empty(self::get_regmobile());
+    }
+    static public function get_regmobile()
+    {
+        if(array_key_exists('regmobile',$_SESSION)) {
+            return $_SESSION['regmobile'];
+        } else {
+            return "";
+        }
+    }
+
+    static public function set_regmobile($mobile) {
+        $_SESSION['regmobile'] = $mobile;
+    }
+
+    static public function clear_regmobile()
+    {
+        if(array_key_exists('regmobile',$_SESSION)) {
+            unset($_SESSION['regmobile']);
+        }
+    }
+}
+
+class wx_userinfo
+{
+    static public function has_userinfo() {
+        return !empty(self::userinfo());
+    }
+
+    static public function userinfo()
+    {
+        if(array_key_exists('wx_author',$_SESSION)) {
+            return $_SESSION['wx_author']['user_info'];
+        } else {
+            return "";
+        }
+    }
+    static public function handled()
+    {
+        if(array_key_exists('wx_author',$_SESSION)) {
+            return boolval($_SESSION['wxauthor']['handled']);
+        } else {
+            return false;
+        }
+    }
+
+    static public function set_userinfo($userinfo) {
+        $_SESSION['wx_author']['user_info'] = $userinfo;
+        $_SESSION['wx_author']['handled'] = false;
+    }
+
+    static public function clear_wxinfo()
+    {
+        if(array_key_exists('wxauthor',$_SESSION)) {
+            unset($_SESSION['wx_author']);
+        }
+    }
 }

+ 220 - 78
mobile/control/login.php

@@ -31,28 +31,61 @@ class loginControl extends mobileHomeControl
     private static $fields = 'member_id,member_mobile,member_wxunionid,member_wxopenid,member_name,member_truename,member_signname,' .
     'member_nickname,member_avatar,member_sex,member_birthday,member_passwd,member_paypwd,member_email,member_mobile_bind,member_state';
 
-    public function __construct()
-    {
+    public function __construct() {
         parent::__construct();
     }
 
     public function statusOp()
     {
         if (session_helper::logined()) {
-            session::instance()->set_cookie($_SESSION['MPHPSESSID']);
-            account_helper::onStatus($_SESSION['member_id']);
-            return self::outsuccess(['member_id' => $_SESSION['member_id'],'HPHPSESSID' => $_SESSION['MPHPSESSID'],'userinfo' => $this->userinfo()]);
+            session::instance()->set_cookie(session_helper::session_id());
+            account_helper::onStatus(session_helper::memberid());
+            return self::outsuccess($this->ret_value());
         }
-        else
-        {
+        else {
             $fcode = new user_session\fcode();
             $fcode->onStatus();
-            return self::outsuccess(NULL);
+            return self::outsuccess($this->ret_value());
         }
     }
 
+    private function ret_value()
+    {
+        $has_mobile = empty($_SESSION['member_mobile']) ? false : true;
+        if(!$has_mobile) {
+            $has_mobile = session_helper::has_regmobile();
+        }
+
+        $has_author = empty($_SESSION['member_wxunionid']) ? false : true;
+        if(!$has_author) {
+            $has_author = wx_userinfo::has_userinfo();
+        }
+
+        $ret = ['ismember'   => $has_mobile, 'isauthor' => $has_author, //for前向兼容
+                'hasmobile' => $has_mobile,  'hasauthor'=> $has_author,
+                'member_id'  => session_helper::memberid(),
+                'HPHPSESSID' => session_helper::session_id(),
+                'userinfo' => $this->userinfo()];
+        return $ret;
+    }
+
+    private function userinfo()
+    {
+        $result = [];
+        $result['member_avatar'] = session_helper::avatar();
+        $result['member_mobile'] = session_helper::cur_mobile();
+        $result['member_nickname'] = session_helper::nickname();
+        $result['member_sex'] = session_helper::sex();
+
+        return $result;
+    }
+
     public function wxauthorOp()
     {
+        if(session_helper::logined()) {
+            return self::outsuccess($this->ret_value());
+        }
+
         $user_info = $_GET['user_info'];
         if(empty($user_info)) {
             return self::outerr(errcode::ErrParamter, "上传的用户信息为空.");
@@ -63,52 +96,86 @@ class loginControl extends mobileHomeControl
             return self::outerr(errcode::ErrParamter, "上传的用户信息为空.");
         }
 
-        if(session_helper::logined())
+        //cur-> wx
+        $unionid_loginner = new login\open_userinfo_log($user_info);
+        if($unionid_loginner->ismember())
         {
-            $loginner = new login\open_userinfo_log($user_info);
-            if($loginner->ismember())
+            if($unionid_loginner->has_mobile())
             {
-                if(session_helper::memberid() == $loginner->memberid())
+                //pre-> mobile
+                if(session_helper::has_regmobile())
                 {
-                    return self::outsuccess(array('ismember'   => true,'isauthor' => true,
-                                                  'member_id'  => $_SESSION['member_id'],
-                                                  'HPHPSESSID' => $_SESSION['MPHPSESSID'],'userinfo' => $this->userinfo()));
+                    $mobile = session_helper::get_regmobile();
+
+                    $mobile_loginner = new login\mobile_log($mobile);
+                    if($mobile_loginner->ismember()) {
+                        $unionid_loginner->unbind_userinfo();
+                        $unionid_loginner->unbind_mobile();
+                        $mobile_loginner->bind($user_info,$mobile);
+                        $mobile_loginner->login();
+                    }
+                    else {
+                        $unionid_loginner->bind($user_info,$mobile); //前向兼容很久前用openid登录情况。
+                        $unionid_loginner->login();
+                    }
                 }
                 else
                 {
-                    $loginner->unbind();
+                    $unionid_loginner->bind($user_info);
+                    $unionid_loginner->login();
+                }
+            }
+            else
+            {
+                //pre-> mobile
+                if(session_helper::has_regmobile())
+                {
+                    $mobile = session_helper::get_regmobile();
+
+                    $mobile_loginner = new login\mobile_log($mobile);
+                    if($mobile_loginner->ismember()) {
+                        $unionid_loginner->unbind_userinfo();
+                        $mobile_loginner->bind($user_info,$mobile);
+                        $mobile_loginner->login();
+                    }
+                    else {
+                        $unionid_loginner->bind($user_info,$mobile); //前向兼容很久前用openid登录情况。
+                        $unionid_loginner->login();
+                    }
+
+                    session_helper::clear_regmobile();
+                    wx_userinfo::clear_wxinfo();
+                }
+                else {
+                    wx_userinfo::set_userinfo($user_info);
                 }
             }
-
-            $id_loginer = new login\memberid_log(session_helper::memberid());
-            $id_loginer->bind($user_info,false);
-            $id_loginer->login();
-            return self::outsuccess(['ismember' => true,'isauthor' => true,
-                                     'member_id' => $_SESSION['member_id'],'HPHPSESSID' => $_SESSION['MPHPSESSID'],
-                                     'userinfo' => $this->userinfo()]);
         }
         else
         {
-            $loginner = new login\open_userinfo_log($user_info);
-            if($loginner->ismember()) {
-                $loginner->bind($user_info,false);
-                $loginner->login();
-                return self::outsuccess(['ismember' => true,'isauthor' => true,
-                                         'member_id' => $_SESSION['member_id'],
-                                         'HPHPSESSID' => $_SESSION['MPHPSESSID'],
-                                         'userinfo' => $this->userinfo()]);
-            }
-            else
+            if(session_helper::has_regmobile())
             {
-                $loginner->register($user_info,session_helper::relay_id());
+                $mobile = session_helper::get_regmobile();
+                $mobile_loginner = new login\mobile_log($mobile);
 
-                $user_info['openid'] = '';
-                $_SESSION['wx_author']['user_info'] = $user_info;
-                $_SESSION['wx_author']['handled'] = false;
+                if($mobile_loginner->ismember()) {
+                    $mobile_loginner->bind($user_info);
+                    $mobile_loginner->login();
+                }
+                else {
+                    $unionid_loginner->register($user_info,session_helper::relay_id(),$mobile);
+                    $unionid_loginner->login();
 
-                return self::outsuccess(['ismember' => false,'isauthor' => true]);
+                    session_helper::clear_regmobile();
+                    wx_userinfo::clear_wxinfo();
+                }
+            }
+            else {
+                wx_userinfo::set_userinfo($user_info);
             }
         }
+
+        return self::outsuccess($this->ret_value());
     }
 
     private function is_special($mobile,$code)
@@ -126,18 +193,21 @@ class loginControl extends mobileHomeControl
             return false;
         }
     }
-    public function bind_mobileOp()
+
+    public function bind_mobilexOp()
     {
+        if(session_helper::logined()) {
+            return self::outsuccess($this->ret_value());
+        }
+
         $mobile = trim($_GET['mobile']);
-        $code = trim($_GET['code']);
+        $code   = trim($_GET['code']);
 
+        //一些平台测试账户,特殊处理
         if($this->is_special($mobile,$code))
         {
-            if(login_helper::onBinded($mobile,$code,0,false))
-            {
-                return self::outsuccess(['ismember' => true,'isauthor' => true,
-                    'member_id' => $_SESSION['member_id'],
-                    'HPHPSESSID' => $_SESSION['MPHPSESSID'],'userinfo' => $this->userinfo()]);
+            if(login_helper::onBinded($mobile,$code,0,false)) {
+                return self::outsuccess($this->ret_value());
             }
         }
 
@@ -149,40 +219,128 @@ class loginControl extends mobileHomeControl
         if ($err != '') {
             return self::outerr(errcode::ErrInputParam,$err);
         }
-
         // 校验验证码
         $ret = sms_helper::check_code(Sms::register_code,$code,$mobile);
         if(is_array($ret)) {
             return self::outerr($ret['code'], $ret['msg']);
         }
 
-        $loginner = new login\mobile_log($mobile);
-        if($loginner->ismember()) {
+        //cur-> mobile
+        $mobile_loginner = new login\mobile_log($mobile);
+        if($mobile_loginner->ismember())
+        {
+            if($mobile_loginner->wxauthored())
+            {
+                //pre->wx
+                if(wx_userinfo::has_userinfo())
+                {
+                    $user_info = wx_userinfo::userinfo();
+
+                    $union_logginer = new login\open_userinfo_log($user_info);
+                    if($union_logginer->ismember()) {
+                        $mobile_loginner->unbind_mobile();
+                        $mobile_loginner->unbind_userinfo();
+
+                        $union_logginer->bind([],$mobile);
+                        $union_logginer->login();
+                    }
+                    else{
+                        $mobile_loginner->bind(wx_userinfo::userinfo());
+                        $mobile_loginner->login();
+                    }
+                    session_helper::clear_regmobile();
+                    wx_userinfo::clear_wxinfo();
+                }
+                else {
+                    $mobile_loginner->login();
+                }
+            }
+            else
+            {
+                //pre->wx
+                if(wx_userinfo::has_userinfo())
+                {
+                    $user_info = wx_userinfo::userinfo();
+
+                    $union_logginer = new login\open_userinfo_log($user_info);
+                    if($union_logginer->ismember()) {
+                        $mobile_loginner->unbind_mobile();
+                        $union_logginer->bind([],$mobile);
+                        $union_logginer->login();
+                    }
+                    else {
+                        $mobile_loginner->bind(wx_userinfo::userinfo());
+                        $mobile_loginner->login();
+                    }
+                    session_helper::clear_regmobile();
+                    wx_userinfo::clear_wxinfo();
+                }
+                else {
+                    session_helper::set_regmobile($mobile);
+                }
+            }
+        }
+        else
+        {
+            //pre->wx
+            if(wx_userinfo::has_userinfo())
+            {
+                $user_info = wx_userinfo::userinfo();
 
+                $union_logginer = new login\open_userinfo_log($user_info);
+                if($union_logginer->ismember()) {
+                    $union_logginer->bind([],$mobile);
+                    $union_logginer->login();
+                }
+                else {
+                    $mobile_loginner->register($user_info,session_helper::relay_id(),$mobile);
+                    $mobile_loginner->login();
+                }
+                session_helper::clear_regmobile();
+                wx_userinfo::clear_wxinfo();
+            }
+            else {
+                session_helper::set_regmobile($mobile);
+            }
+        }
+
+        return self::outsuccess($this->ret_value());
+    }
+
+    public function bind_mobileOp()
+    {
+        $mobile = trim($_GET['mobile']);
+        $code = trim($_GET['code']);
+
+        if($this->is_special($mobile,$code))
+        {
+            if(login_helper::onBinded($mobile,$code,0,false)) {
+                return self::outsuccess($this->ret_value());
+            }
+        }
+
+        // 输入内容判断
+        $validator = new Validator();
+        $validator->setValidate(Validator::verify_mobile($mobile));
+        $validator->setValidate(Validator::verify_smscode($code));
+        $err = $validator->validate();
+        if ($err != '') {
+            return self::outerr(errcode::ErrInputParam,$err);
         }
-        else {
 
+        // 校验验证码
+        $ret = sms_helper::check_code(Sms::register_code,$code,$mobile);
+        if(is_array($ret)) {
+            return self::outerr($ret['code'], $ret['msg']);
         }
 
         if(login_helper::onBinded($mobile,$code,session_helper::relay_id(),false)) {
-            $isauthor = empty($_SESSION['member_wxunionid']) ? false : true;
-            return self::outsuccess(['ismember' => true,'isauthor' => $isauthor,'member_id' => $_SESSION['member_id'],'HPHPSESSID' => $_SESSION['MPHPSESSID'],'userinfo' => $this->userinfo()]);
+            return self::outsuccess($this->ret_value());
         } else {
             return self::outerr(errcode::ErrDB,"对不起,系统出现错误:(");
         }
     }
 
-    private function userinfo()
-    {
-        $result = [];
-        $result['member_avatar'] = session_helper::avatar();
-        $result['member_mobile'] = session_helper::cur_mobile();
-        $result['member_nickname'] = session_helper::nickname();
-        $result['member_sex'] = session_helper::sex();
-
-        return $result;
-    }
-
     public function getcodexOp()
     {
         $mobile = trim($_POST['mobile']);
@@ -269,22 +427,6 @@ class loginControl extends mobileHomeControl
         return self::outsuccess(array('member_id' => $_SESSION['member_id'],'HPHPSESSID' => $_SESSION['MPHPSESSID']));
     }
 
-    private function register_open($model_member,$type,$openid)
-    {
-        if($type == self::wxopen_login)
-        {
-            $id = $model_member->insert(array('member_wxopenid' => $openid));
-            if($id > 0) {
-                return $this->getMemberInfoEx($model_member,$openid,$type);
-            } else {
-                return NULL;
-            }
-        }
-        else {
-            return NULL;
-        }
-    }
-
     private function getMemberInfoEx($model_member,$openid, $type, $passwd = '')
     {
         $conditions = array();