Member.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. <?php
  2. /**
  3. * Member.php UTF-8
  4. * 玩家管理类
  5. *
  6. * @date : 2017/11/24 22:30
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huo\controller\member;
  13. use huo\controller\common\Base;
  14. use huo\controller\common\HuoCookie;
  15. use huo\controller\common\HuoSession;
  16. use huo\controller\request\Channel;
  17. use huo\controller\request\Device;
  18. use huo\controller\request\Game;
  19. use huo\controller\request\Mem;
  20. use huo\controller\sign\Sign;
  21. use huo\controller\wallet\GmCache;
  22. use huo\logic\member\MemberLogic;
  23. use huo\model\log\MemLoginLogModel;
  24. use huo\model\member\MemBaseModel;
  25. use huo\model\member\MemberModel;
  26. use huo\model\member\MemGameModel;
  27. use huo\model\member\MemTokenModel;
  28. use huolib\constant\CommonConst;
  29. use huolib\constant\DeviceTypeConst;
  30. use huolib\constant\GameConst;
  31. use huolib\constant\MemConst;
  32. use huolib\constant\OauthConst;
  33. use huolib\constant\OptionConst;
  34. use huolib\status\MemberStatus;
  35. use huolib\tool\StrUtils;
  36. use huolib\utils\UserUtils;
  37. use think\Cookie;
  38. use think\Log;
  39. class Member extends Base {
  40. /**
  41. * 插入登陆记录
  42. *
  43. * @param Game $game_rq
  44. * @param Channel $channel
  45. * @param Device $device
  46. * @param Mem $member
  47. * @param $mem_data
  48. *
  49. * @return bool|int|string
  50. */
  51. public function insertLoginLog(Game $game_rq, Channel $channel, Device $device, Mem $member, $mem_data) {
  52. /* 插入mem_game */;
  53. $_data = $device->toArray();
  54. $_data['mem_id'] = $mem_data['mem_id'];
  55. $_data['mg_mem_id'] = $mem_data['mg_mem_id'];
  56. $_data['agent_id'] = $channel->getAgentId();
  57. $_data['agent_game'] = $channel->getAgentGame();
  58. $_data['app_id'] = $game_rq->getHAppId();
  59. $_data['reg_time'] = get_val($mem_data, 'create_time', 0);
  60. $_data['reg_app_id'] = get_val($mem_data, 'app_id', 0);
  61. // 使用请求时间
  62. $_request_time = request()->server('REQUEST_TIME', 0);
  63. $_data['create_time'] = !empty($_request_time) ? $_request_time : time();
  64. /* 异步处理数据 */
  65. $member->setRegTime($_data['reg_time']);
  66. $member->setMemId($_data['mem_id']);
  67. $member->setMgMemId($_data['mg_mem_id']);
  68. $member->setLoginTime(time());
  69. $channel->setCh($mem_data['agent_id']);
  70. $_device_from = $device->getFrom();
  71. if ((GameConst::GAME_MP != $_device_from) || (1 == $member->getisReg())) {
  72. if (1 == $member->getisReg()) {
  73. $member->setRegTime($_data['reg_time']);
  74. (new \huo\controller\queue\Mem($game_rq->getHAppId()))->create($device, $game_rq, $channel, $member);
  75. } else {
  76. (new \huo\controller\queue\Mem($game_rq->getHAppId()))->online($device, $game_rq, $channel, $member);
  77. }
  78. }
  79. /* 添加最后登录时间与登录次数 */
  80. $_me_cache = MemCache::ins();
  81. $_me_data = $_me_cache->getMeInfoById($mem_data['mem_id']);
  82. $_me_data['login_cnt'] += 1;
  83. $_me_data['last_login_time'] = $_data['create_time'];
  84. $_me_data['last_login_ip'] = $device->getIp();
  85. $_me_cache->updateMeCache($mem_data['mem_id'], $_me_data);
  86. /* Modified by luowei BEGIN 2021-03-11 ISSUES:14299 实名认证数据上报 */
  87. $_class_name = '\huoIdentify\controller\Identify';
  88. if (class_exists($_class_name)) {
  89. (new $_class_name())->reportLoginBehavior($game_rq->getHAppId(), $_data['mem_id']);
  90. }
  91. /* END 2021-03-11 ISSUES:14299 */
  92. return (new MemLoginLogModel())->insertLog($_data);
  93. }
  94. /**
  95. * 自动生成用户名
  96. *
  97. * @param string $type
  98. *
  99. * @return string
  100. */
  101. public function genUsername($type = '') {
  102. $_mb_model = new MemBaseModel();
  103. switch ($type) {
  104. case OauthConst::OAUTH_QQ:
  105. $type = OauthConst::OAUTH_QQ_PREFIX;
  106. break;
  107. case OauthConst::OAUTH_WEIBO:
  108. $type = OauthConst::OAUTH_WB_PREFIX;
  109. break;
  110. case OauthConst::OAUTH_WEIXIN:
  111. case OauthConst::OAUTH_WXQRCODE:
  112. $type = OauthConst::OAUTH_WX_PREFIX;
  113. break;
  114. case OauthConst::OAUTH_MP:
  115. $type = OauthConst::OAUTH_MP_PREFIX;
  116. break;
  117. default:
  118. $type = 't';
  119. }
  120. $_username = $_mb_model->genUsername($type);
  121. $_rs = $this->checkUserName($_username);
  122. $_i = 0;
  123. while ($_rs && $_i < 20) {
  124. $_i++;
  125. $_username = $_mb_model->genUsername();
  126. $_rs = $this->checkUsername($_username);
  127. }
  128. return $_username.'';
  129. }
  130. /**
  131. * 验证用户是否存在
  132. *
  133. * @param string $username 用户名
  134. *
  135. * @return bool 用户名已经注册返回true;没注册返回false
  136. */
  137. public function checkUserName($username = '') {
  138. $_mem_id = $this->getIdByName($username);
  139. return empty($_mem_id) ? false : true;
  140. }
  141. /**
  142. * 通过用户名获取Id
  143. *
  144. * @param string $username
  145. *
  146. * @return array|bool
  147. */
  148. public function getIdByName($username = '') {
  149. $_mem_id = (new MemberLogic())->getIdByName($username);
  150. return $_mem_id;
  151. }
  152. /**
  153. * 通过手机号获取Id
  154. *
  155. * @param string $mobile
  156. *
  157. * @return array|bool
  158. */
  159. public function getIdByMobile($mobile = '') {
  160. $_mem_id = (new MemberLogic())->getIdByMobile($mobile);
  161. return $_mem_id;
  162. }
  163. /**
  164. * 验证手机号是否存在
  165. *
  166. * @param string $mobile 手机号
  167. *
  168. * @return bool 手机号已经注册返回true;没注册返回false
  169. */
  170. public function checkMobile($mobile = '') {
  171. $_mem_data = $this->getInfoByMobile($mobile);
  172. return $_mem_data ? true : false;
  173. }
  174. /**
  175. * 校验手机号是否注册
  176. *
  177. * @param $mobile
  178. *
  179. * @return bool
  180. */
  181. public function getInfoByMobile($mobile) {
  182. $_mem_data = (new MemberLogic())->getInfoByMobile($mobile);
  183. return $_mem_data;
  184. }
  185. /**
  186. * 添加用户
  187. *
  188. * @param array $mem_data 玩家数据
  189. *
  190. * @return int
  191. */
  192. public function addMember($mem_data) {
  193. $_mem_id = (new MemberModel())->addMem($mem_data);
  194. if (!empty($_mem_id) && $_mem_id > 0) {
  195. MemCache::ins()->getInfoById($_mem_id);
  196. return $_mem_id;
  197. } else {
  198. return 0;
  199. }
  200. }
  201. /**
  202. * 校验密码
  203. *
  204. * @param $no_en_pwd
  205. * @param $db_pwd
  206. *
  207. * @return bool
  208. */
  209. public function checkPwd($no_en_pwd, $db_pwd) {
  210. if (cmf_password($no_en_pwd) != $db_pwd) {
  211. return false;
  212. }
  213. return true;
  214. }
  215. /**
  216. * @param string $mem_id
  217. * @param string $new_pwd
  218. *
  219. * @return bool
  220. */
  221. public function updatePassword($mem_id, $new_pwd) {
  222. $_rs = UserUtils::checkPassword($new_pwd);
  223. if (MemberStatus::NO_ERROR != $_rs) {
  224. return $_rs;
  225. }
  226. $_data['password'] = $new_pwd;
  227. //$_data['status'] = 2;
  228. return MemCache::ins()->updateMem($mem_id, $_data);
  229. }
  230. public function setMemRq(Game $game_rq, Channel $channel, Device $device, Mem &$member) {
  231. $member->setAgentId($channel->getAgentId());
  232. $member->setAppId($game_rq->getHAppId());
  233. $member->setDeviceId($device->getDeviceId());
  234. $member->setAgentId($channel->getAgentId());
  235. $member->setAgentGame($channel->getAgentGame());
  236. $member->setRegIp($device->getIp());
  237. $member->setFromDevice($device->getFromDevice());
  238. }
  239. /**
  240. * 获取玩家信息 组合
  241. *
  242. * @param $mem_id
  243. * @param $app_id
  244. *
  245. * @return mixed
  246. */
  247. public function getMemInfo($mem_id, $app_id = 0) {
  248. $_mc_class = MemCache::ins();
  249. $_mem_data = $_mc_class->getInfoById($mem_id);
  250. $_me_data = $_mc_class->getMeInfoById($mem_id);
  251. $_gm_data = null;
  252. if (!empty($app_id)) {
  253. $_gm_class = GmCache::ins();
  254. $_gm_data = $_gm_class->getInfoByMemGame($mem_id, $app_id);
  255. }
  256. $_rdata['mem_id'] = isset($_mem_data['id']) ? $_mem_data['id'] : 0;
  257. $_rdata['avatar'] = !empty($_mem_data['avatar']) ? $_mem_data['avatar']
  258. : STATICSITE.'\h5wap\images\mine_touxiang.png';
  259. $_rdata['real_name'] = isset($_mem_data['real_name']) ? $_mem_data['real_name'] : '';
  260. $_rdata['id_card'] = isset($_mem_data['id_card']) ? $_mem_data['id_card'] : '';
  261. $_rdata['mobile'] = isset($_mem_data['mobile']) ? $_mem_data['mobile'] : '';
  262. $_rdata['alipay_account'] = isset($_mem_data['alipay_account']) ? $_mem_data['alipay_account'] : '';
  263. $_rdata['nickname'] = empty($_mem_data['nickname']) ? $_mem_data['username'] : $_mem_data['nickname'];
  264. $_rdata['username'] = $_mem_data['username'];
  265. $_rdata['my_integral'] = isset($_me_data['my_integral']) ? $_me_data['my_integral'] : 0;
  266. $_rdata['gift_cnt'] = isset($_me_data['gift_cnt']) ? $_me_data['gift_cnt'] : 0;
  267. $_rdata['game_cnt'] = isset($_me_data['game_cnt']) ? $_me_data['game_cnt'] : 0;
  268. $_rdata['ptb_cnt'] = isset($_me_data['ptb_cnt']) ? StrUtils::formatNumber($_me_data['ptb_cnt']) : 0;
  269. $_rdata['gm_cnt'] = isset($_gm_data['remain']) ? StrUtils::formatNumber($_gm_data['remain']) : 0;
  270. $_rdata['has_msg'] = isset($_me_data['has_msg']) ? $_me_data['has_msg'] : 0;
  271. $_rdata['last_sign_time'] = isset($_me_data['last_sign_time']) ? $_me_data['last_sign_time'] : 0;
  272. $_rdata['sign_days'] = isset($_me_data['sign_days']) ? $_me_data['sign_days'] : 0;
  273. $_rdata['has_identify'] = empty($_mem_data['id_card']) ? 1 : 2;
  274. $_rdata['has_bind_mobile'] = empty($_mem_data['mobile']) ? 1 : 2;
  275. $_rdata['status'] = !empty($_mem_data['status']) ? $_mem_data['status'] : 2;
  276. list($_rdata['sign_days'], $_rdata['last_sign_time']) = Sign::getSignDaysAndTime(
  277. $_me_data['sign_days'], $_me_data['last_sign_time']
  278. );
  279. $_rdata['has_sign'] = Sign::isSignToday($_rdata['last_sign_time']) ? 2 : 1;
  280. return $_rdata;
  281. }
  282. protected function retSucMsg($code, $data = []) {
  283. $_msg = MemberStatus::getMsg($code);
  284. return $this->huoSuccess($code, $_msg, $data);
  285. }
  286. protected function retErrMsg($code) {
  287. $_err_msg = MemberStatus::getMsg($code);
  288. return $this->huoError($code, $_err_msg);
  289. }
  290. protected function getReturnData($mem_data, $app_id = 0, $device_type = '') {
  291. $_mg_data = $this->memGameLogin($mem_data, $app_id);
  292. $_rdata['mem_id'] = $mem_data['id'];
  293. $_rdata['mg_mem_id'] = !empty($_mg_data['id']) ? $_mg_data['id'] : 0;
  294. $_rdata['agent_game'] = $mem_data['agent_game'];
  295. $_rdata['agent_id'] = $mem_data['agent_id'];
  296. $_rdata['is_bind'] = !empty($mem_data['mobile']) ? 2 : 1;
  297. $_rdata['create_time'] = $mem_data['create_time'];
  298. $_rdata['url'] = $this->getUrl();
  299. $_rdata['is_reg'] = isset($mem_data['is_reg']) ? $mem_data['is_reg'] : MemConst::MEM_IS_LOGIN;
  300. $_rdata['app_id'] = $mem_data['app_id'];//20200809新增注册游戏id
  301. if (empty($mem_data['mobile'])) {
  302. $_rdata['is_bind'] = 2;
  303. }
  304. (new Member())->updateToken($mem_data['id'], $device_type);
  305. return $_rdata;
  306. }
  307. /**
  308. * 玩家游戏登陆
  309. *
  310. * @param $mem_data
  311. * @param $app_id
  312. *
  313. * @return array|bool|false
  314. */
  315. public function memGameLogin($mem_data, $app_id) {
  316. $_mg_data = (new MemGameModel())->login($mem_data, $mem_data['id'], $app_id);
  317. if (false == $_mg_data) {
  318. return false;
  319. }
  320. (new HuoSession($mem_data['id'], $app_id))->setMgMemId($_mg_data['id']);
  321. return $_mg_data;
  322. }
  323. /**
  324. * 登陆成功后跳转地址
  325. *
  326. * @param string $key
  327. *
  328. * @return mixed|string
  329. */
  330. public function getUrl($key = '') {
  331. if (!empty($key)) {
  332. $_redirect_url = Cookie::get($key);
  333. }
  334. if (empty($_redirect_url)) {
  335. //$_redirect_url = '';// TODO: wuyonghong 2018/4/26
  336. $_redirect_url = request()->param('redirect_url', '');
  337. }
  338. return $_redirect_url;
  339. }
  340. /**
  341. * 修改密码
  342. *
  343. * @param $mem_id
  344. * @param $oldpwd
  345. * @param $newpwd
  346. *
  347. * @return array|int
  348. */
  349. public function updatePwd($mem_id, $oldpwd, $newpwd) {
  350. $_mem_data = MemCache::ins()->getInfoById($mem_id);
  351. if (empty($_mem_data)) {
  352. $_code = MemberStatus::USERNAME_NOT_EXISTS;
  353. return $this->huoError($_code, MemberStatus::getMsg($_code));
  354. }
  355. //验证旧密码
  356. $_chk_pwd = $this->checkPwd($oldpwd, $_mem_data['password']);
  357. if (false == $_chk_pwd) {
  358. $_code = MemberStatus::PASSWORD_ERROR;
  359. return $this->huoError($_code, MemberStatus::getMsg($_code));
  360. }
  361. //验证新密码
  362. $_chk_pwd_rs = UserUtils::checkPassword($newpwd);
  363. if (MemberStatus::NO_ERROR != $_chk_pwd_rs) {
  364. return $this->huoError($_chk_pwd_rs, MemberStatus::getMsg($_chk_pwd_rs));
  365. }
  366. //修改密码
  367. $_rs = $this->updatePassword($mem_id, $newpwd);
  368. if (is_numeric($_rs)) {
  369. $_code = $_rs;
  370. } elseif (false !== $_rs) {
  371. $_code = MemberStatus::NO_ERROR;
  372. } else {
  373. $_code = MemberStatus::UNKNOWN_ERROR;
  374. }
  375. return $this->huoError($_code, MemberStatus::getMsg($_code));
  376. }
  377. /**
  378. * 修改昵称
  379. *
  380. * @param $mem_id
  381. * @param $nickname
  382. *
  383. * @return array
  384. */
  385. public function updateNickname($mem_id, $nickname) {
  386. $_res = $this->checkMemCanEdit($mem_id);
  387. if ($_res['code'] != MemberStatus::NO_ERROR) {
  388. return $_res;
  389. }
  390. $_chk_nickname_rs = UserUtils::checkNickname($nickname);
  391. if (MemberStatus::NO_ERROR != $_chk_nickname_rs) {
  392. return $this->huoError($_chk_nickname_rs, MemberStatus::getMsg($_chk_nickname_rs));
  393. }
  394. $_mem_class = new Member();
  395. $_mem_data = $_mem_class->getMemInfo($mem_id);
  396. if (empty($_mem_data)) {
  397. $_code = MemberStatus::USERNAME_NOT_EXISTS;
  398. return $this->huoError($_code, MemberStatus::getMsg($_code));
  399. }
  400. $_data['nickname'] = $nickname;
  401. $_rs = MemCache::ins()->updateMem($mem_id, $_data);
  402. if (is_numeric($_rs)) {
  403. $_code = $_rs;
  404. } elseif (false !== $_rs) {
  405. $_code = MemberStatus::NO_ERROR;
  406. } else {
  407. $_code = MemberStatus::UNKNOWN_ERROR;
  408. }
  409. return $this->huoError($_code, MemberStatus::getMsg($_code));
  410. }
  411. /**
  412. * 通过token获取玩家Id
  413. *
  414. * @param string $token Token
  415. *
  416. * @param string $device_type 设备信息
  417. * @param bool $is_up 是否更新
  418. *
  419. * @return int
  420. */
  421. public function getMemIdByToken($token, $device_type = DeviceTypeConst::DEVICE_TYPE_MP, $is_up = false) {
  422. if (empty($token)) {
  423. return 0;
  424. }
  425. $_mt_model = new MemTokenModel();
  426. $_mt_data = $_mt_model->getTokenInfoByToken($token, $device_type);
  427. if (empty($_mt_data)) {
  428. return 0;
  429. }
  430. $_now_time = time();
  431. if ($_now_time > $_mt_data['expire_time']) {
  432. /* 已过期 */
  433. return 0;
  434. }
  435. $_mem_id = $_mt_data['mem_id'];
  436. $_rs = $is_up;
  437. /* 时间大于一天 86400s 更新token */
  438. if ($_rs && $_now_time > $_mt_data['update_time'] + CommonConst::CONST_DAY_SECONDS) {
  439. $_edit_rs = $this->updateToken($_mem_id, $device_type);
  440. if (false === $_edit_rs) {
  441. return 0;
  442. }
  443. }
  444. return $_mem_id;
  445. }
  446. /**
  447. * @param int $mem_id
  448. * @param string $device_type
  449. *
  450. * @return bool
  451. */
  452. public function addToken($mem_id, $device_type = DeviceTypeConst::DEVICE_TYPE_MP) {
  453. $_token = (new MemTokenModel())->addToken($mem_id, $device_type);
  454. if (false === $_token) {
  455. return false;
  456. }
  457. HuoCookie::setMemToken($_token);
  458. return true;
  459. }
  460. /**
  461. * 更新玩家token
  462. *
  463. * @param int $mem_id
  464. * @param string $device_type
  465. *
  466. * @return bool
  467. */
  468. public function updateToken($mem_id, $device_type = DeviceTypeConst::DEVICE_TYPE_MP) {
  469. $_mt_model = new MemTokenModel();
  470. $_mt_data = $_mt_model->getTokenInfoByMemDevice($mem_id, $device_type);
  471. if (empty($_mt_data)) {
  472. $_token = $_mt_model->addToken($mem_id, $device_type);
  473. if (false == $_token) {
  474. return false;
  475. }
  476. } else {
  477. $_token = $_mt_model->editToken($_mt_data, $_mt_data['id']);
  478. if (false == $_token) {
  479. return false;
  480. }
  481. }
  482. Log::write(
  483. "@@@@@@@@" . $_token, Log::ERROR
  484. );
  485. HuoCookie::setMemToken($_token);
  486. Log::write(
  487. "????????" . Cookie::get('MTT'), Log::ERROR
  488. );
  489. return $_token;
  490. }
  491. /**
  492. * 查找玩家支付宝是否绑定玩家
  493. *
  494. * @param string $alipay_account
  495. *
  496. * @return int
  497. */
  498. public function getMemIdByAlipayAccount($alipay_account) {
  499. return (new MemberModel())->getMemIdByAlipayAccount($alipay_account);
  500. }
  501. /**
  502. * 修改昵称
  503. *
  504. * @param int $mem_id 玩家ID
  505. * @param string $avatar 头像地址
  506. *
  507. * @return array
  508. */
  509. public function updateAvatar($mem_id, $avatar) {
  510. $_res = $this->checkMemCanEdit($mem_id);
  511. if ($_res['code'] != MemberStatus::NO_ERROR) {
  512. return $_res;
  513. }
  514. $_mc_class = MemCache::ins();
  515. $_mem_data = $_mc_class->getInfoById($mem_id);
  516. if (empty($_mem_data)) {
  517. $_code = MemberStatus::USERNAME_NOT_EXISTS;
  518. return $this->huoError($_code, MemberStatus::getMsg($_code));
  519. }
  520. $_data['avatar'] = $avatar;
  521. $_rs = $_mc_class->updateMem($mem_id, $_data);
  522. if (is_numeric($_rs)) {
  523. $_code = $_rs;
  524. } elseif (false !== $_rs) {
  525. $_code = MemberStatus::NO_ERROR;
  526. } else {
  527. $_code = MemberStatus::UNKNOWN_ERROR;
  528. }
  529. return $this->huoError($_code, MemberStatus::getMsg($_code));
  530. }
  531. public function checkMemCanEdit($mem_id) {
  532. $_mc_class = MemCache::ins();
  533. $_mem_data = $_mc_class->getMeInfoById($mem_id);
  534. if (empty($_mem_data)) {
  535. $_code = MemberStatus::USERNAME_NOT_EXISTS;
  536. return $this->huoError($_code, MemberStatus::getMsg($_code));
  537. }
  538. $_conf = cmf_get_option(OptionConst::WAP_MEM_EDIT_SETTING);
  539. if (empty($_conf['mem_can_edit_pay_amount'])) {
  540. $_code = MemberStatus::NO_ERROR;
  541. return $this->huoError($_code, MemberStatus::getMsg($_code));
  542. }
  543. if ($_mem_data['sum_money'] < $_conf['mem_can_edit_pay_amount']) {
  544. $_code = MemberStatus::MEM_NOT_REACH_STAND;
  545. $_msg = '该功能只开放VIP玩家,充值'.$_conf['mem_can_edit_pay_amount'].'元以上的会员';
  546. return $this->huoError($_code, $_msg);
  547. }
  548. $_code = MemberStatus::NO_ERROR;
  549. return $this->huoError($_code, MemberStatus::getMsg($_code));
  550. }
  551. }