| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609 | <?php/** * Member.php UTF-8 * 玩家管理类 * * @date    : 2017/11/24 22:30 * * @license 这不是一个自由软件,未经授权不许任何使用和传播。 * @author  : wuyonghong <wyh@huosdk.com> * @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));    }}
 |