ソースを参照

Merge branch 'goods' of 121.43.114.153:/home/git/repositories/shopnc into goods

stanley-king 9 年 前
コミット
ecc3851448

+ 71 - 27
data/model/mb_user_token.model.php

@@ -2,52 +2,96 @@
 /**
  * 手机端令牌模型
  *
- * 
+ *
  *
  *
  */
 
 defined('InShopNC') or exit('Access Invalid!');
 
-class mb_user_tokenModel extends Model{
-    public function __construct(){
+class mb_user_tokenModel extends Model
+{
+    const token_expire = 600;     // 单位:分钟
+
+    public function __construct()
+    {
         parent::__construct('mb_user_token');
     }
 
     /**
-	 * 查询
+     * 查询
      *
-	 * @param array $condition 查询条件
+     * @param array $condition 查询条件
      * @return array
-	 */
-    public function getMbUserTokenInfo($condition) {
+     */
+    public function getMbUserTokenInfo($condition)
+    {
         return $this->where($condition)->find();
     }
 
-    public function getMbUserTokenInfoByToken($token) {
-        if(empty($token)) {
+    public function getMbUserTokenInfoByToken($token)
+    {
+        if (empty($token)) {
             return null;
         }
         return $this->getMbUserTokenInfo(array('token' => $token));
     }
 
-	/**
-	 * 新增
-	 *
-	 * @param array $param 参数内容
-	 * @return bool 布尔类型的返回结果
-	 */
-	public function addMbUserToken($param){
-        return $this->insert($param);	
-	}
-	
-	/**
-	 * 删除
-	 *
-	 * @param int $condition 条件
-	 * @return bool 布尔类型的返回结果
-	 */
-	public function delMbUserToken($condition){
+    /**
+     * 新增
+     *
+     * @param array $param 参数内容
+     * @return bool 布尔类型的返回结果
+     */
+    public function addMbUserToken($param)
+    {
+        return $this->insert($param);
+    }
+
+    /**
+     * 生成token
+     *
+     * @param array $param 参数内容
+     * @return bool 布尔类型的返回结果
+     */
+    public function gen_token($member_id, $member_name, $client)
+    {
+        //生成新的token
+        $mb_user_token_info = array();
+        $token = md5($member_name . strval(TIMESTAMP) . strval(rand(0, 999999)));
+        $mb_user_token_info['member_id'] = $member_id;
+        $mb_user_token_info['member_name'] = $member_name;
+        $mb_user_token_info['token'] = $token;
+        $mb_user_token_info['login_time'] = TIMESTAMP;
+        $mb_user_token_info['client_type'] = $client;
+
+        $condition['member_id'] = $member_id;
+        $result = $this->where($condition)->select();
+
+        foreach($result as $value){
+            $key = func::gen_token_key($value['token']);
+            dcache($key);
+        }
+        $this->where($condition)->delete();
+        $ret = $this->addMbUserToken($mb_user_token_info);
+        if ($ret) {
+            $key = $this->gen_token_key($token);
+            wcache($key, array('token' => serialize($mb_user_token_info)),'',self::token_expire);
+
+            return $token;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 删除
+     *
+     * @param int $condition 条件
+     * @return bool 布尔类型的返回结果
+     */
+    public function delMbUserToken($condition)
+    {
         return $this->where($condition)->delete();
-	}	
+    }
 }

+ 100 - 0
data/model/member.model.php

@@ -98,6 +98,106 @@ class memberModel extends Model
     }
 
     /**
+     * 校验登陆(登陆是个不频繁操作,可以不使用缓存)
+     */
+    public function checkPasswd($mobile, $passwd)
+    {
+        // 登陆信息
+        $conditions['member_mobile'] = $mobile;
+        $conditions['member_passwd'] = md5($passwd);
+        $user = $this->getMemberInfo($conditions);
+        if (empty($user)) {
+            return -1;
+        }
+        $member_info = array();
+        $member_info['member_id'] = $user['member_id'];
+        $member_info['member_mobile'] = $user['member_mobile'];
+        $member_info['member_name'] = $user['member_name'];
+        $member_info['member_sex'] = $user['member_sex'];
+        $member_info['member_points'] = $user['member_points'];
+        return $member_info;
+    }
+
+    /**
+     * 微信登陆校验
+     * @param $openid
+     * @return array|int
+     */
+    public function checkWxopenid($openid)
+    {
+        // 登陆信息
+        $conditions['member_wxopenid'] = $openid;
+        $user = $this->getMemberInfo($conditions);
+        if (empty($user)) {
+            return -1;
+        }
+        $member_info = array();
+        $member_info['member_id'] = $user['member_id'];
+        $member_info['member_mobile'] = $user['member_mobile'];
+        $member_info['member_name'] = $user['member_name'];
+        $member_info['member_sex'] = $user['member_sex'];
+        $member_info['member_points'] = $user['member_points'];
+        return $member_info;
+    }
+
+    /**
+     * 修改密码
+     */
+    public function chPasswd($mobile, $oldpasswd, $newpasswd)
+    {
+        $info = $this->checkPasswd($mobile, $oldpasswd);
+        if ($info == -1) {
+            return -1;
+        }
+        // 修改密码
+        $condition = array();
+        $condition['member_id'] = $info['member_id'];
+        $data = array();
+        $passwd = trim($newpasswd);
+        $data['member_passwd'] = empty($passwd) ? $passwd : md5($passwd);
+        $ret = $this->table('member')->where($condition)->update($data);
+        if (!$ret) {
+            return -1;
+        }
+        return $info;
+    }
+
+    /**
+     * 更新用户密码
+     */
+    public function uptPasswd($member_id, $passwd)
+    {
+        // 修改密码
+        $condition = array();
+        $condition['member_id'] = $member_id;
+        $data = array();
+        $passwd = trim($passwd);
+        $data['member_passwd'] = empty($passwd) ? $passwd : md5($passwd);
+        $ret = $this->table('member')->where($condition)->update($data);
+        if (!$ret) {
+            return -1;
+        }
+        return 0;
+    }
+
+    /**
+     * 绑定微信账号
+     */
+    public function bindwx($member_id, $openid)
+    {
+        $condition = array();
+        $condition['member_id'] = $member_id;
+        $data = array();
+        $conditions['member_wxopenid'] = $openid;
+
+        $ret = $this->table('member')->where($condition)->update($data);
+        if (!$ret) {
+            return -1;
+        }
+        return 0;
+    }
+
+    /**
      * 取得会员详细信息(优先查询缓存)
      * 如果未找到,则缓存所有字段
      * @param int $member_id

+ 23 - 0
helper/func.php

@@ -0,0 +1,23 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: dell
+ * Date: 2016/2/18
+ * Time: 17:47
+ */
+
+class func
+{
+    // 生成验证码key
+    public static function gen_auth_code_key($mobile)
+    {
+        return 'mobile_auth_code:' . $mobile;
+    }
+
+    // 生成token的key
+    public static function gen_token_key($token)
+    {
+        return 'token:' . $token;
+    }
+
+}

+ 0 - 0
helper/http_header.php


+ 0 - 0
helper/session.php


+ 217 - 5
mobile/control/member_login.php

@@ -1,32 +1,244 @@
 <?php
+
 /**
  * 用户身份认证相关操作
  */
 
+defined('InShopNC') or exit('Access Invalid!');
+
+class LoginType extends SplEnum
+{
+    const __default = self::Login_mobile;
+
+    const Login_mobile = 0;
+    const Login_weixin = 2;
+}
+
 class member_loginControl extends mbMemberControl
 {
+    const auth_code_expire = 5;   // 单位:分钟
+    const token_expire = 600;     // 单位:分钟
 
     public function __construct()
     {
         parent::__construct();
     }
 
+    // 获取验证码
+    public function getacodeOp()
+    {
+        $mobile = trim($_POST['mobile']);
+        $validator = new Validate();
+        $validator->setValidate(Validate::verify_mobile($mobile));
+        $err = $validator->validate();
+        if ($err != '') {
+            return joutput_error(errcode::ErrParamter, $err);
+        }
+        $sms = new Sms();
+        $code = makeSmscode();
+        $status = $sms->send($mobile, array('code' => $code, 'type' => Sms::register_code, 'time' => '5'));
+        if ($status == 0) {
+            $key = func::gen_auth_code_key($mobile);
+            wcache($key, array('code' => $code, 'mobile' => $mobile), '', self::auth_code_expire);
+        } else {
+            return joutput_error(errcode::ErrSms, "send error={$status}.");
+        }
+        joutput_data(NULL);
+    }
+
     // 注册
-    public function registerOp(){
+    public function registerOp()
+    {
+        $mobile = trim($_GET['mobile']);
+        $acode = trim($_GET['code']);
+        $passwd = trim($_GET['passwd']);
+
+        // 输入内容判断
+        $validator = new Validate();
+        $validator->setValidate(Validate::verify_mobile($mobile));
+        $validator->setValidate(Validate::verify_password($passwd));
+        $err = $validator->validate();
+        if ($err != '' || empty($acode) || empty($passwd)) {
+            return joutput_error(errcode::ErrInputParam);
+        }
 
+        // 校验验证码
+        if (!$this->checkacode($mobile, $acode)) {
+            return joutput_error(errcode::ErrVerifyCode);
+        }
+
+        // 判断是否已经注册
+        $model = Model('member');
+        $ret = $model->where(array('member_mobile' => $mobile))->find();
+        if (!empty($ret)) {
+            return joutput_error(errcode::ErrMemberExist);
+        }
+        // 添加注册
+        $member_info = array();
+        $member_info['member_mobile'] = $mobile;
+        $member_info['member_passwd'] = $passwd;
+        $ret = $model->addMember($member_info);
+        if (!$ret) {
+            return joutput_error(errcode::ErrDB);
+        }
+        // 登陆成功
+        joutput_data(null);
     }
 
     // 登陆
-    public function loginOp(){
+    public function loginOp()
+    {
+        $login_type = trim($_GET['type']);
+        $client = trim($_GET['client']);
+        if (empty($login_type) || empty($client)) {
+            return joutput_error(errcode::ErrInputParam);
+        }
+        switch ($login_type) {
+            case LoginType::Login_mobile:
 
+                $mobile = trim($_GET['mobile']);
+                $validator = new Validate();
+                $validator->setValidate(Validate::verify_mobile($mobile));
+                $err = $validator->validate();
+                if ($err != '') {
+                    return joutput_error(errcode::ErrInputParam);
+                }
+                $passwd = trim($_GET['passwd']);
+                $model = Model('member');
+                $ret = $model->checkPasswd($mobile, $passwd);
+                if ($ret == -1) {
+                    return joutput_error(errcode::ErrLogin);
+                } else {
+                    $mb_user_token = Model('mb_user_token');
+                    $token = $mb_user_token->gen_token($ret['member_id'], $ret['member_name'], $client);
+                    if (empty($token)) {
+                        return joutput_error(errcode::ErrLogin);
+                    } else {
+                        return joutput_data(array('token' => $token));
+                    }
+                }
+                break;
+            case LoginType::Login_weixin:
+
+                $openid = trim($_GET['openid']);
+                $model = Model('member');
+                $ret = $model->checkWxopenid($openid);
+                if ($ret == -1) {
+                    return joutput_error(errcode::ErrWxNotExist);
+                } else {
+                    $mb_user_token = Model('mb_user_token');
+                    $token = $mb_user_token->gen_token($ret['member_id'], $ret['member_name'], $client);
+                    if (empty($token)) {
+                        return joutput_error(errcode::ErrLogin);
+                    } else {
+                        return joutput_data(array('token' => $token));
+                    }
+                }
+                break;
+            default:
+                return joutput_error(errcode::ErrLoginType);
+        }
     }
 
-    // 验证校验码
-    public function checkvcode(){
+    // 微信绑定账号
+    public function bindOp()
+    {
+        $wx_openid = trim($_GET['wx_openid']);
+        $token = trim($_GET['token']);
+        $user_info = trim($_GET['user_info']);
+
+        $key = func::gen_token_key($token);
+        $ret = rcache($key);
+        $member_info = unserialize($ret);
+        $model = Model('member');
+        $ret = $model->bindwx($member_info['member_id'], $wx_openid);
+        if($ret != 0){
+            return joutput_error(errcode::ErrDB);
+        }
 
+        return joutput_data(null);
     }
 
-    //
+    // 修改密码(目前没有使用)
+    public function chpasswdOp()
+    {
+        $mobile = trim($_GET['mobile']);
+        $oldpasswd = trim($_GET['oldpasswd']);
+        $newpasswd = trim($_GET['newpasswd']);
+
+        // 校验原有用户内容
+        $model = Model('member');
+        $ret = $model->chPasswd($mobile, $oldpasswd, $newpasswd);
+        if ($ret == -1) {
+            return joutput_error(errcode::ErrPasswd);
+        }
+
+        return joutput_data(null);
+    }
+
+    // 手机验证码找回密码
+    public function getpasswdOp()
+    {
+        $mobile = trim($_GET['mobile']);
+        $acode = trim($_GET['code']);
+        $passwd = trim($_GET['passwd']);
+        $validator = new Validate();
+        $validator->setValidate(Validate::verify_mobile($mobile));
+        $err = $validator->validate();
+        if ($err != '') {
+            return joutput_error(errcode::ErrParamter, $err);
+        }
+        if (!$this->checkacode($mobile, $acode)) {
+            return joutput_error(errcode::ErrVerifyCode);
+        }
+        // 判断用户是否存在
+        $model = Model('member');
+        $result = $model->where(array('member_mobile' => $mobile))->find();
+        if (empty($result)) {
+            return joutput_error(errcode::ErrMemberNotExist);
+        }
+        $ret = $model->uptPasswd($result['member_id'], $passwd);
+        if ($ret == -1) {
+            return joutput_error(errcode::ErrDB);
+        }
+        joutput_data(null);
+    }
+
+    // 登出
+    public function logoutOp()
+    {
+        $token = trim($_GET['token']);
+        $key = func::gen_token_key($token);
+        dcache($key);
+        joutput_data(null);
+    }
+
+    // 验证校验码
+    public function checkacode($mobile, $acode)
+    {
+        $key = func::gen_auth_code_key($mobile);
+        $ret = rcache($key, '');
+        if (empty($ret)) {
+            return false;
+        }
+        if ($ret['code'] == $acode) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 
+    // 通过token获取信息
+    public function getInfoByToken()
+    {
+        $token = trim($_GET['token']);
+        $key = func::gen_token_key($token);
+        $ret = rcache($key);
+        if (empty($result)) {
+            return -1;
+        }
 
+        $info = unserialize($ret['info']);
+        return $info;
+    }
 }

+ 8 - 1
mobile/util/errcode.php

@@ -17,6 +17,8 @@ class errcode extends SplEnum
     const ErrIDbinded = 10008;
     const ErrUserExisted = 10009;
 
+    const ErrPasswd    = 10010;
+
     const ErrSpecial  = 10100;
     const ErrCart  = 10200;
     const ErrOrder  = 10300;
@@ -32,6 +34,8 @@ class errcode extends SplEnum
     const ErrInputParam = 13002;
     const ErrVerifyCode = 13003;
     const ErrMemberExist = 13004;
+    const ErrWxNotExist = 13005;
+    const ErrLoginType = 13006;
 
 
     static function msg($code) 
@@ -39,7 +43,7 @@ class errcode extends SplEnum
         switch ($code) {
             case errcode::Success: return 'Success';
             case errcode::ErrApptype : return 'ErrApptype';
-            case errcode::ErrLogin : return 'ErrLogin error password or phone or openid';
+            case errcode::ErrLogin : return 'ErrLogin error password or phone';
             case errcode::ErrGenuser : return 'ErrGenuser';
             case errcode::ErrUsertype : return 'ErrUsertype';
             case errcode::ErrTokenExpire : return 'ErrTokenExpire';
@@ -53,6 +57,9 @@ class errcode extends SplEnum
             case errcode::ErrInputParam: return 'error input param';
             case errcode::ErrVerifyCode: return 'error verify code';
             case errcode::ErrMemberExist: return '用户已经存在';
+            case errcode::ErrPasswd: return '密码错误';
+            case errcode::ErrWxNotExist: return '微信账号不存在';
+            case errcode::ErrLoginType: return '登陆类型错误';
 
             case errcode::ErrDB : return 'ErrorDB';
             case errcode::ErrSms : return 'ErrSms,Send sms error.';