* @version : HUOSDK 8.0 */ namespace huo\controller\member; use huo\controller\common\Base; use huo\controller\common\HuoCookie; use huo\controller\common\HuoSession; use huo\controller\request\Channel; use huo\controller\request\Device; use huo\controller\request\Game; use huo\controller\request\Mem; use huo\controller\sign\Sign; use huo\controller\wallet\GmCache; use huo\logic\member\MemberLogic; use huo\model\log\MemLoginLogModel; use huo\model\member\MemBaseModel; use huo\model\member\MemberModel; use huo\model\member\MemGameModel; use huo\model\member\MemTokenModel; use huolib\constant\CommonConst; use huolib\constant\DeviceTypeConst; use huolib\constant\GameConst; use huolib\constant\MemConst; use huolib\constant\OauthConst; use huolib\constant\OptionConst; use huolib\status\MemberStatus; use huolib\tool\StrUtils; use huolib\utils\UserUtils; use think\Cookie; use think\Log; class Member extends Base { /** * 插入登陆记录 * * @param Game $game_rq * @param Channel $channel * @param Device $device * @param Mem $member * @param $mem_data * * @return bool|int|string */ public function insertLoginLog(Game $game_rq, Channel $channel, Device $device, Mem $member, $mem_data) { /* 插入mem_game */; $_data = $device->toArray(); $_data['mem_id'] = $mem_data['mem_id']; $_data['mg_mem_id'] = $mem_data['mg_mem_id']; $_data['agent_id'] = $channel->getAgentId(); $_data['agent_game'] = $channel->getAgentGame(); $_data['app_id'] = $game_rq->getHAppId(); $_data['reg_time'] = get_val($mem_data, 'create_time', 0); $_data['reg_app_id'] = get_val($mem_data, 'app_id', 0); // 使用请求时间 $_request_time = request()->server('REQUEST_TIME', 0); $_data['create_time'] = !empty($_request_time) ? $_request_time : time(); /* 异步处理数据 */ $member->setRegTime($_data['reg_time']); $member->setMemId($_data['mem_id']); $member->setMgMemId($_data['mg_mem_id']); $member->setLoginTime(time()); $channel->setCh($mem_data['agent_id']); $_device_from = $device->getFrom(); if ((GameConst::GAME_MP != $_device_from) || (1 == $member->getisReg())) { if (1 == $member->getisReg()) { $member->setRegTime($_data['reg_time']); (new \huo\controller\queue\Mem($game_rq->getHAppId()))->create($device, $game_rq, $channel, $member); } else { (new \huo\controller\queue\Mem($game_rq->getHAppId()))->online($device, $game_rq, $channel, $member); } } /* 添加最后登录时间与登录次数 */ $_me_cache = MemCache::ins(); $_me_data = $_me_cache->getMeInfoById($mem_data['mem_id']); $_me_data['login_cnt'] += 1; $_me_data['last_login_time'] = $_data['create_time']; $_me_data['last_login_ip'] = $device->getIp(); $_me_cache->updateMeCache($mem_data['mem_id'], $_me_data); /* Modified by luowei BEGIN 2021-03-11 ISSUES:14299 实名认证数据上报 */ $_class_name = '\huoIdentify\controller\Identify'; if (class_exists($_class_name)) { (new $_class_name())->reportLoginBehavior($game_rq->getHAppId(), $_data['mem_id']); } /* END 2021-03-11 ISSUES:14299 */ return (new MemLoginLogModel())->insertLog($_data); } /** * 自动生成用户名 * * @param string $type * * @return string */ public function genUsername($type = '') { $_mb_model = new MemBaseModel(); switch ($type) { case OauthConst::OAUTH_QQ: $type = OauthConst::OAUTH_QQ_PREFIX; break; case OauthConst::OAUTH_WEIBO: $type = OauthConst::OAUTH_WB_PREFIX; break; case OauthConst::OAUTH_WEIXIN: case OauthConst::OAUTH_WXQRCODE: $type = OauthConst::OAUTH_WX_PREFIX; break; case OauthConst::OAUTH_MP: $type = OauthConst::OAUTH_MP_PREFIX; break; default: $type = 't'; } $_username = $_mb_model->genUsername($type); $_rs = $this->checkUserName($_username); $_i = 0; while ($_rs && $_i < 20) { $_i++; $_username = $_mb_model->genUsername(); $_rs = $this->checkUsername($_username); } return $_username.''; } /** * 验证用户是否存在 * * @param string $username 用户名 * * @return bool 用户名已经注册返回true;没注册返回false */ public function checkUserName($username = '') { $_mem_id = $this->getIdByName($username); return empty($_mem_id) ? false : true; } /** * 通过用户名获取Id * * @param string $username * * @return array|bool */ public function getIdByName($username = '') { $_mem_id = (new MemberLogic())->getIdByName($username); return $_mem_id; } /** * 通过手机号获取Id * * @param string $mobile * * @return array|bool */ public function getIdByMobile($mobile = '') { $_mem_id = (new MemberLogic())->getIdByMobile($mobile); return $_mem_id; } /** * 验证手机号是否存在 * * @param string $mobile 手机号 * * @return bool 手机号已经注册返回true;没注册返回false */ public function checkMobile($mobile = '') { $_mem_data = $this->getInfoByMobile($mobile); return $_mem_data ? true : false; } /** * 校验手机号是否注册 * * @param $mobile * * @return bool */ public function getInfoByMobile($mobile) { $_mem_data = (new MemberLogic())->getInfoByMobile($mobile); return $_mem_data; } /** * 添加用户 * * @param array $mem_data 玩家数据 * * @return int */ public function addMember($mem_data) { $_mem_id = (new MemberModel())->addMem($mem_data); if (!empty($_mem_id) && $_mem_id > 0) { MemCache::ins()->getInfoById($_mem_id); return $_mem_id; } else { return 0; } } /** * 校验密码 * * @param $no_en_pwd * @param $db_pwd * * @return bool */ public function checkPwd($no_en_pwd, $db_pwd) { if (cmf_password($no_en_pwd) != $db_pwd) { return false; } return true; } /** * @param string $mem_id * @param string $new_pwd * * @return bool */ public function updatePassword($mem_id, $new_pwd) { $_rs = UserUtils::checkPassword($new_pwd); if (MemberStatus::NO_ERROR != $_rs) { return $_rs; } $_data['password'] = $new_pwd; //$_data['status'] = 2; return MemCache::ins()->updateMem($mem_id, $_data); } public function setMemRq(Game $game_rq, Channel $channel, Device $device, Mem &$member) { $member->setAgentId($channel->getAgentId()); $member->setAppId($game_rq->getHAppId()); $member->setDeviceId($device->getDeviceId()); $member->setAgentId($channel->getAgentId()); $member->setAgentGame($channel->getAgentGame()); $member->setRegIp($device->getIp()); $member->setFromDevice($device->getFromDevice()); } /** * 获取玩家信息 组合 * * @param $mem_id * @param $app_id * * @return mixed */ public function getMemInfo($mem_id, $app_id = 0) { $_mc_class = MemCache::ins(); $_mem_data = $_mc_class->getInfoById($mem_id); $_me_data = $_mc_class->getMeInfoById($mem_id); $_gm_data = null; if (!empty($app_id)) { $_gm_class = GmCache::ins(); $_gm_data = $_gm_class->getInfoByMemGame($mem_id, $app_id); } $_rdata['mem_id'] = isset($_mem_data['id']) ? $_mem_data['id'] : 0; $_rdata['avatar'] = !empty($_mem_data['avatar']) ? $_mem_data['avatar'] : STATICSITE.'\h5wap\images\mine_touxiang.png'; $_rdata['real_name'] = isset($_mem_data['real_name']) ? $_mem_data['real_name'] : ''; $_rdata['id_card'] = isset($_mem_data['id_card']) ? $_mem_data['id_card'] : ''; $_rdata['mobile'] = isset($_mem_data['mobile']) ? $_mem_data['mobile'] : ''; $_rdata['alipay_account'] = isset($_mem_data['alipay_account']) ? $_mem_data['alipay_account'] : ''; $_rdata['nickname'] = empty($_mem_data['nickname']) ? $_mem_data['username'] : $_mem_data['nickname']; $_rdata['username'] = $_mem_data['username']; $_rdata['my_integral'] = isset($_me_data['my_integral']) ? $_me_data['my_integral'] : 0; $_rdata['gift_cnt'] = isset($_me_data['gift_cnt']) ? $_me_data['gift_cnt'] : 0; $_rdata['game_cnt'] = isset($_me_data['game_cnt']) ? $_me_data['game_cnt'] : 0; $_rdata['ptb_cnt'] = isset($_me_data['ptb_cnt']) ? StrUtils::formatNumber($_me_data['ptb_cnt']) : 0; $_rdata['gm_cnt'] = isset($_gm_data['remain']) ? StrUtils::formatNumber($_gm_data['remain']) : 0; $_rdata['has_msg'] = isset($_me_data['has_msg']) ? $_me_data['has_msg'] : 0; $_rdata['last_sign_time'] = isset($_me_data['last_sign_time']) ? $_me_data['last_sign_time'] : 0; $_rdata['sign_days'] = isset($_me_data['sign_days']) ? $_me_data['sign_days'] : 0; $_rdata['has_identify'] = empty($_mem_data['id_card']) ? 1 : 2; $_rdata['has_bind_mobile'] = empty($_mem_data['mobile']) ? 1 : 2; $_rdata['status'] = !empty($_mem_data['status']) ? $_mem_data['status'] : 2; list($_rdata['sign_days'], $_rdata['last_sign_time']) = Sign::getSignDaysAndTime( $_me_data['sign_days'], $_me_data['last_sign_time'] ); $_rdata['has_sign'] = Sign::isSignToday($_rdata['last_sign_time']) ? 2 : 1; return $_rdata; } protected function retSucMsg($code, $data = []) { $_msg = MemberStatus::getMsg($code); return $this->huoSuccess($code, $_msg, $data); } protected function retErrMsg($code) { $_err_msg = MemberStatus::getMsg($code); return $this->huoError($code, $_err_msg); } protected function getReturnData($mem_data, $app_id = 0, $device_type = '') { $_mg_data = $this->memGameLogin($mem_data, $app_id); $_rdata['mem_id'] = $mem_data['id']; $_rdata['mg_mem_id'] = !empty($_mg_data['id']) ? $_mg_data['id'] : 0; $_rdata['agent_game'] = $mem_data['agent_game']; $_rdata['agent_id'] = $mem_data['agent_id']; $_rdata['is_bind'] = !empty($mem_data['mobile']) ? 2 : 1; $_rdata['create_time'] = $mem_data['create_time']; $_rdata['url'] = $this->getUrl(); $_rdata['is_reg'] = isset($mem_data['is_reg']) ? $mem_data['is_reg'] : MemConst::MEM_IS_LOGIN; $_rdata['app_id'] = $mem_data['app_id'];//20200809新增注册游戏id if (empty($mem_data['mobile'])) { $_rdata['is_bind'] = 2; } (new Member())->updateToken($mem_data['id'], $device_type); return $_rdata; } /** * 玩家游戏登陆 * * @param $mem_data * @param $app_id * * @return array|bool|false */ public function memGameLogin($mem_data, $app_id) { $_mg_data = (new MemGameModel())->login($mem_data, $mem_data['id'], $app_id); if (false == $_mg_data) { return false; } (new HuoSession($mem_data['id'], $app_id))->setMgMemId($_mg_data['id']); return $_mg_data; } /** * 登陆成功后跳转地址 * * @param string $key * * @return mixed|string */ public function getUrl($key = '') { if (!empty($key)) { $_redirect_url = Cookie::get($key); } if (empty($_redirect_url)) { //$_redirect_url = '';// TODO: wuyonghong 2018/4/26 $_redirect_url = request()->param('redirect_url', ''); } return $_redirect_url; } /** * 修改密码 * * @param $mem_id * @param $oldpwd * @param $newpwd * * @return array|int */ public function updatePwd($mem_id, $oldpwd, $newpwd) { $_mem_data = MemCache::ins()->getInfoById($mem_id); if (empty($_mem_data)) { $_code = MemberStatus::USERNAME_NOT_EXISTS; return $this->huoError($_code, MemberStatus::getMsg($_code)); } //验证旧密码 $_chk_pwd = $this->checkPwd($oldpwd, $_mem_data['password']); if (false == $_chk_pwd) { $_code = MemberStatus::PASSWORD_ERROR; return $this->huoError($_code, MemberStatus::getMsg($_code)); } //验证新密码 $_chk_pwd_rs = UserUtils::checkPassword($newpwd); if (MemberStatus::NO_ERROR != $_chk_pwd_rs) { return $this->huoError($_chk_pwd_rs, MemberStatus::getMsg($_chk_pwd_rs)); } //修改密码 $_rs = $this->updatePassword($mem_id, $newpwd); if (is_numeric($_rs)) { $_code = $_rs; } elseif (false !== $_rs) { $_code = MemberStatus::NO_ERROR; } else { $_code = MemberStatus::UNKNOWN_ERROR; } return $this->huoError($_code, MemberStatus::getMsg($_code)); } /** * 修改昵称 * * @param $mem_id * @param $nickname * * @return array */ public function updateNickname($mem_id, $nickname) { $_res = $this->checkMemCanEdit($mem_id); if ($_res['code'] != MemberStatus::NO_ERROR) { return $_res; } $_chk_nickname_rs = UserUtils::checkNickname($nickname); if (MemberStatus::NO_ERROR != $_chk_nickname_rs) { return $this->huoError($_chk_nickname_rs, MemberStatus::getMsg($_chk_nickname_rs)); } $_mem_class = new Member(); $_mem_data = $_mem_class->getMemInfo($mem_id); if (empty($_mem_data)) { $_code = MemberStatus::USERNAME_NOT_EXISTS; return $this->huoError($_code, MemberStatus::getMsg($_code)); } $_data['nickname'] = $nickname; $_rs = MemCache::ins()->updateMem($mem_id, $_data); if (is_numeric($_rs)) { $_code = $_rs; } elseif (false !== $_rs) { $_code = MemberStatus::NO_ERROR; } else { $_code = MemberStatus::UNKNOWN_ERROR; } return $this->huoError($_code, MemberStatus::getMsg($_code)); } /** * 通过token获取玩家Id * * @param string $token Token * * @param string $device_type 设备信息 * @param bool $is_up 是否更新 * * @return int */ public function getMemIdByToken($token, $device_type = DeviceTypeConst::DEVICE_TYPE_MP, $is_up = false) { if (empty($token)) { return 0; } $_mt_model = new MemTokenModel(); $_mt_data = $_mt_model->getTokenInfoByToken($token, $device_type); if (empty($_mt_data)) { return 0; } $_now_time = time(); if ($_now_time > $_mt_data['expire_time']) { /* 已过期 */ return 0; } $_mem_id = $_mt_data['mem_id']; $_rs = $is_up; /* 时间大于一天 86400s 更新token */ if ($_rs && $_now_time > $_mt_data['update_time'] + CommonConst::CONST_DAY_SECONDS) { $_edit_rs = $this->updateToken($_mem_id, $device_type); if (false === $_edit_rs) { return 0; } } return $_mem_id; } /** * @param int $mem_id * @param string $device_type * * @return bool */ public function addToken($mem_id, $device_type = DeviceTypeConst::DEVICE_TYPE_MP) { $_token = (new MemTokenModel())->addToken($mem_id, $device_type); if (false === $_token) { return false; } HuoCookie::setMemToken($_token); return true; } /** * 更新玩家token * * @param int $mem_id * @param string $device_type * * @return bool */ public function updateToken($mem_id, $device_type = DeviceTypeConst::DEVICE_TYPE_MP) { $_mt_model = new MemTokenModel(); $_mt_data = $_mt_model->getTokenInfoByMemDevice($mem_id, $device_type); if (empty($_mt_data)) { $_token = $_mt_model->addToken($mem_id, $device_type); if (false == $_token) { return false; } } else { $_token = $_mt_model->editToken($_mt_data, $_mt_data['id']); if (false == $_token) { return false; } } Log::write( "@@@@@@@@" . $_token, Log::ERROR ); HuoCookie::setMemToken($_token); Log::write( "????????" . Cookie::get('MTT'), Log::ERROR ); return $_token; } /** * 查找玩家支付宝是否绑定玩家 * * @param string $alipay_account * * @return int */ public function getMemIdByAlipayAccount($alipay_account) { return (new MemberModel())->getMemIdByAlipayAccount($alipay_account); } /** * 修改昵称 * * @param int $mem_id 玩家ID * @param string $avatar 头像地址 * * @return array */ public function updateAvatar($mem_id, $avatar) { $_res = $this->checkMemCanEdit($mem_id); if ($_res['code'] != MemberStatus::NO_ERROR) { return $_res; } $_mc_class = MemCache::ins(); $_mem_data = $_mc_class->getInfoById($mem_id); if (empty($_mem_data)) { $_code = MemberStatus::USERNAME_NOT_EXISTS; return $this->huoError($_code, MemberStatus::getMsg($_code)); } $_data['avatar'] = $avatar; $_rs = $_mc_class->updateMem($mem_id, $_data); if (is_numeric($_rs)) { $_code = $_rs; } elseif (false !== $_rs) { $_code = MemberStatus::NO_ERROR; } else { $_code = MemberStatus::UNKNOWN_ERROR; } return $this->huoError($_code, MemberStatus::getMsg($_code)); } public function checkMemCanEdit($mem_id) { $_mc_class = MemCache::ins(); $_mem_data = $_mc_class->getMeInfoById($mem_id); if (empty($_mem_data)) { $_code = MemberStatus::USERNAME_NOT_EXISTS; return $this->huoError($_code, MemberStatus::getMsg($_code)); } $_conf = cmf_get_option(OptionConst::WAP_MEM_EDIT_SETTING); if (empty($_conf['mem_can_edit_pay_amount'])) { $_code = MemberStatus::NO_ERROR; return $this->huoError($_code, MemberStatus::getMsg($_code)); } if ($_mem_data['sum_money'] < $_conf['mem_can_edit_pay_amount']) { $_code = MemberStatus::MEM_NOT_REACH_STAND; $_msg = '该功能只开放VIP玩家,充值'.$_conf['mem_can_edit_pay_amount'].'元以上的会员'; return $this->huoError($_code, $_msg); } $_code = MemberStatus::NO_ERROR; return $this->huoError($_code, MemberStatus::getMsg($_code)); } }