MemberController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. <?php
  2. /**
  3. * MemberController.php UTF-8
  4. * 玩家接口
  5. *
  6. * @date : 2018/1/16 16:48
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace api\sdk\controller\v8;
  13. use api\common\controller\V2ApiBaseController;
  14. use ban\Ban;
  15. use ban\BanConst;
  16. use huo\controller\app\FloatPoint;
  17. use huo\controller\common\HuoCookie;
  18. use huo\controller\member\FindPwd;
  19. use huo\controller\member\Login;
  20. use huo\controller\member\Member;
  21. use huo\controller\member\Register;
  22. use huo\logic\member\MemberLogic;
  23. use huo\model\log\MemLoginLogModel;
  24. use huo\model\member\MemberModel;
  25. use huoIdentify\controller\Identify;
  26. use huolib\sms\Sms;
  27. use huolib\sms\SmsType;
  28. use huolib\status\MemberStatus;
  29. use huolib\tool\SimpleSec;
  30. use huolib\tool\StrUtils;
  31. use think\Cookie;
  32. use think\Log;
  33. use think\Session;
  34. class MemberController extends V2ApiBaseController {
  35. public function _initialize() {
  36. parent::_initialize();
  37. }
  38. public function getReturn($mem_data, $app_id = 0, $device_id = '') {
  39. $_rdata = (new FloatPoint())->getFloat($app_id);
  40. $_rdata['mem_id'] = $mem_data['mem_id'];
  41. $_rdata['agentgame'] = $mem_data['agent_game'];
  42. $_token = HuoCookie::getMemToken();
  43. $_rdata['user_token'] = $_token;
  44. $_rdata['is_bind'] = $mem_data['is_bind'];
  45. $_rdata['cp_user_token'] = SimpleSec::encode($_token, config('CPAUTHCODE'));
  46. $_rdata['url'] = $mem_data['url'];
  47. /* Modified by chenbingling BEGIN 2019/11/29 ISSUES:10837 实名认证新规调整 */
  48. $_auth_info = (new Identify())->getMemIdentifyInfo($app_id, $mem_data['mem_id'], $device_id);
  49. $_rdata['url'] = get_val($_auth_info, 'url', '');
  50. $_rdata['auth_info'] = get_val($_auth_info, 'auth_info', null);
  51. /* END 2019/11/29 ISSUES:10837 */
  52. /* Modified by chenbingling BEGIN 2021/9/7 ISSUES:#15622 产品需求 未成年玩家优先弹出限制,不显示小号*/
  53. if (!empty($_rdata['auth_info']['age']) && $_rdata['auth_info']['age'] < 18 && !empty($_rdata['url'])) {
  54. $_rdata['account_url'] = '';
  55. }
  56. /* END 2021/9/7 ISSUES:#15622 */
  57. return $_rdata;
  58. }
  59. public function getUrl() {
  60. return '';
  61. }
  62. /**
  63. * 一键注册
  64. * http://doc.1tsdk.com/138?page_id=2900
  65. * 【域名】/v8/user/regone
  66. */
  67. public function regOne() {
  68. $_channel_rq = $this->setChannelData();
  69. $_mem_class = new Member();
  70. $_rdata['username'] = $_mem_class->genUsername();
  71. $_rdata['password'] = StrUtils::getRandChars(8);
  72. $_rdata['agentgame'] = $_channel_rq->getAgentGame();
  73. $_rdata['status'] = 1;
  74. $_rdata['type'] = 2;
  75. $this->success(lang('SUCCESS'), $_rdata);
  76. }
  77. /**
  78. * 普通注册
  79. * http://doc.1tsdk.com/138?page_id=2901
  80. * 【域名】/v8/user/reg
  81. */
  82. public function register() {
  83. $_game_rq = $this->setGameData();
  84. $_channel_rq = $this->setChannelData();
  85. $_device_rq = $this->setDeviceData();
  86. $_mem_rq = $this->setMemData(true);
  87. $_mr_class = new Register();
  88. $_status = $this->request->param('status', 1);
  89. if (!empty($_status)) {
  90. $_mem_rq->setStatus($_status);
  91. }
  92. $_rdata = $_mr_class->register($_game_rq, $_channel_rq, $_device_rq, $_mem_rq);
  93. if (MemberStatus::NO_ERROR != $_rdata['code']) {
  94. $this->error($_rdata['msg'], [], $_rdata['code']);
  95. }
  96. $this->success(
  97. $_rdata['msg'], $this->getReturn($_rdata['data'], $_game_rq->getHAppId(), $_device_rq->getDeviceId()),
  98. $_rdata['code']
  99. );
  100. }
  101. /**
  102. * 手机注册
  103. * http://doc.1tsdk.com/138?page_id=2902
  104. * 【域名】/v8/user/regm
  105. */
  106. public function regMobile() {
  107. $_game_rq = $this->setGameData();
  108. $_channel_rq = $this->setChannelData();
  109. $_device_rq = $this->setDeviceData();
  110. $_mem_rq = $this->setMemData();
  111. $_sms_data = $this->rq_data['sms'];
  112. $_mobile = $_sms_data['mobile'];
  113. $_type = $_sms_data['type'];
  114. $_code = $_sms_data['code'];
  115. /** 注册前校验IP封禁 */
  116. // if ((new Ban())->isBan(BanConst::BAN_TYPE_IP, $_device_rq->getIp())) {
  117. // $this->error(BanConst::IP_BAN_MSG, [], MemberStatus::MEM_ACCOUNT_ANOMALY);
  118. // }
  119. /* 校验短信是否正确 */
  120. $_sms_rs = (new Sms())->check($_mobile, $_code, $_type);
  121. if (MemberStatus::NO_ERROR != $_sms_rs['code']) {
  122. $this->error($_sms_rs['msg'], [], $_sms_rs['code']);
  123. }
  124. $_mr_class = new Register();
  125. $_rdata = $_mr_class->regMobile($_game_rq, $_channel_rq, $_device_rq, $_mem_rq, $_mobile);
  126. if (MemberStatus::NO_ERROR != $_rdata['code']) {
  127. $this->error($_rdata['msg'], [], $_rdata['code']);
  128. }
  129. $this->success(
  130. lang('SUCCESS'), $this->getReturn($_rdata['data'], $_game_rq->getHAppId(), $_device_rq->getDeviceId())
  131. );
  132. }
  133. /**
  134. * 普通登录
  135. * http://doc.1tsdk.com/138?page_id=2903
  136. * 【域名】/v8/user/login
  137. */
  138. public function login() {
  139. $_game_rq = $this->setGameData();
  140. $_channel_rq = $this->setChannelData();
  141. $_device_rq = $this->setDeviceData();
  142. $_mem_rq = $this->setMemData();
  143. $_mr_class = new Login();
  144. $_rdata = $_mr_class->login($_game_rq, $_channel_rq, $_device_rq, $_mem_rq);
  145. if (MemberStatus::NO_ERROR != $_rdata['code']) {
  146. $this->error($_rdata['msg'], [], $_rdata['code']);
  147. }
  148. $this->success(
  149. $_rdata['msg'], $this->getReturn($_rdata['data'], $_game_rq->getHAppId(), $_device_rq->getDeviceId()),
  150. $_rdata['code']
  151. );
  152. }
  153. /**
  154. * 手机短信登录
  155. * http://doc.1tsdk.com/138?page_id=2904
  156. * 【域名】/v8/user/loginm
  157. */
  158. public function loginMobile() {
  159. $_game_rq = $this->setGameData();
  160. $_channel_rq = $this->setChannelData();
  161. $_device_rq = $this->setDeviceData();
  162. $_mem_rq = $this->setMemData();
  163. $_sms_data = $this->rq_data['sms'];
  164. $_mobile = $_sms_data['mobile'];
  165. $_type = $_sms_data['type'];
  166. $_code = $_sms_data['code'];
  167. /* 校验短信是否正确 */
  168. $_sms_rs = (new Sms())->check($_mobile, $_code, $_type);
  169. if (MemberStatus::NO_ERROR != $_sms_rs['code']) {
  170. $this->error($_sms_rs['msg'], [], $_sms_rs['code']);
  171. }
  172. $_mr_class = new Login();
  173. $_rdata = $_mr_class->loginMobile($_game_rq, $_channel_rq, $_device_rq, $_mem_rq, $_mobile);
  174. if (MemberStatus::NO_ERROR != $_rdata['code']) {
  175. $this->error($_rdata['msg'], [], $_rdata['code']);
  176. }
  177. $this->success(
  178. $_rdata['msg'], $this->getReturn($_rdata['data'], $_game_rq->getHAppId(), $_device_rq->getDeviceId()),
  179. $_rdata['code']
  180. );
  181. }
  182. /**
  183. * 第三方登录
  184. * http://doc.1tsdk.com/138?page_id=2905
  185. * 【域名】/v8/user/loginoauth
  186. */
  187. public function oauthLogin() {
  188. }
  189. /**
  190. * 玩家登出
  191. * http://doc.1tsdk.com/138?page_id=2906
  192. * 【域名】/v8/user/logout
  193. */
  194. public function logout() {
  195. $_rdata['url'] = $this->getUrl();
  196. // TODO: wuyonghong 2018/5/30 异步任务处理 调用低层处理
  197. Session::clear();
  198. Cookie::clear();
  199. HuoCookie::delMemToken();
  200. /* Modified by luowei BEGIN 2021-03-11 ISSUES:14299 实名认证数据上报 */
  201. $_game_rq = $this->setGameData();
  202. $_mem_rq = $this->setMemData();
  203. if (!empty($_game_rq->getHAppId()) && !empty($_mem_rq->getMemId())) {
  204. $_class_name = '\huoIdentify\controller\Identify';
  205. if (class_exists($_class_name)) {
  206. (new $_class_name())->reportLogoutBehavior($_game_rq->getHAppId(), $_mem_rq->getMemId());
  207. }
  208. }
  209. /* END 2021-03-11 ISSUES:14299 */
  210. Session::set('is_wx_login_out', 1);
  211. $this->success(lang('SUCCESS'), $_rdata);
  212. }
  213. /**
  214. * 获取用户信息
  215. * http://doc.1tsdk.com/138?page_id=3131
  216. * 【域名】/user/detail
  217. */
  218. public function read() {
  219. // h5i不走此方法
  220. $this->checkLogin();
  221. $_rdata = (new Member())->getMemInfo($this->mem_id);
  222. /* Modified by chenbingling BEGIN 2019/11/29 ISSUES:10837 实名认证新规调整 */
  223. $_game_rq = $this->setGameData();
  224. $_device_rq = $this->setDeviceData();
  225. $_auth_info = (new Identify())->getMemIdentifyInfo(
  226. $_game_rq->getHAppId(), $this->mem_id, $_device_rq->getDeviceId(), $this->token
  227. );
  228. $_rdata['url'] = get_val($_auth_info, 'url', '');
  229. $_rdata['auth_info'] = get_val($_auth_info, 'auth_info', null);
  230. $siteInfo = cmf_get_site_info();
  231. $_rdata['wap_app_down_url'] = get_val($siteInfo, 'wap_app_down_url', '');
  232. /* END 2019/11/29 ISSUES:10837 */
  233. $_code = MemberStatus::NO_ERROR;
  234. $this->success(MemberStatus::getMsg($_code), $_rdata);
  235. }
  236. /**
  237. * 获取找回密码验证token
  238. * http://doc.1tsdk.com/138?page_id=3138
  239. * 【域名】/user/passwd/sms_check
  240. */
  241. public function smsCheck() {
  242. $_sms_data = get_val($this->rq_data, 'sms', []);
  243. $_mobile = get_val($_sms_data, 'mobile', '');
  244. $_type = get_val($_sms_data, 'type', SmsType::SMS_ID_VERIFY);
  245. $_code = get_val($_sms_data, 'code', '');
  246. /* 校验短信是否正确 */
  247. $_sms_rs = (new Sms())->check($_mobile, $_code, $_type);
  248. if (MemberStatus::NO_ERROR != $_sms_rs['code']) {
  249. $this->error($_sms_rs['msg'], [], $_sms_rs['code']);
  250. }
  251. $_chk_rs = (new FindPwd())->checkMobile($_mobile);
  252. if (MemberStatus::NO_ERROR != $_chk_rs['code']) {
  253. $this->error($_chk_rs['msg'], [], $_chk_rs['code']);
  254. }
  255. $_member_list = (new MemberModel())->getMemListByMobile($_mobile);
  256. $_r_data['data'] = $_member_list;
  257. $_data['verify_token'] = StrUtils::genToken();
  258. Session::set('verify_token', $_data['verify_token']);
  259. $_r_data['verify_token'] = $_data['verify_token'];
  260. Session::set('find_pwd_mobile', $_mobile);
  261. $this->success($_sms_rs['msg'], $_r_data, $_sms_rs['code']);
  262. $this->error($_chk_rs['msg'], $_data, $_chk_rs['code']);
  263. }
  264. /**
  265. * 重置密码
  266. * http://doc.1tsdk.com/138?page_id=3141
  267. * 【域名】/v8//user/passwd/reset
  268. * 【域名】/user/passwd/reset
  269. *
  270. */
  271. public function updatePassword() {
  272. $_verify_token = get_val($this->rq_data, 'verify_token', '');
  273. $_check_token = Session::get('verify_token');
  274. if ($_verify_token != $_check_token) {
  275. $_code = MemberStatus::INVALID_PARAMS;
  276. $this->error(MemberStatus::getMsg($_code), [], $_code);
  277. }
  278. $_mobile = Session::get('find_pwd_mobile');
  279. Session::delete('find_pwd_mobile');
  280. Session::delete('verify_token');
  281. $_mem_rq = $this->setMemData();
  282. $_password = $_mem_rq->getPassword();
  283. $_rs = (new FindPwd())->updatePasswordByUsername($_mem_rq->getUsername(), $_password);
  284. if (MemberStatus::NO_ERROR != $_rs['code']) {
  285. $this->error($_rs['msg'], [], $_rs['code']);
  286. }
  287. $this->success($_rs['msg'], [], $_rs['code']);
  288. }
  289. /***
  290. * 获取设备登录过的账号
  291. * http://doc.1tsdk.com/138?page_id=3519
  292. * 【域名】/user/device_user
  293. */
  294. public function recoverAccount() {
  295. $_game_rq = $this->setGameData();
  296. $_device_rq = $this->setDeviceData();
  297. $_param['app_id'] = $_game_rq->getHAppId();
  298. $_param['device_id'] = $_device_rq->getDeviceId();
  299. $_mem_log_model = new MemLoginLogModel();
  300. $_i = 0;
  301. do {
  302. $_param['time'] = strtotime('-'.$_i++.'month');
  303. $_data = $_mem_log_model->getDeviceGameUser($_param);
  304. } while (empty($_data) && $_i < 3); //为空,只取3个月内记录
  305. $this->success(MemberStatus::getMsg(MemberStatus::NO_ERROR), $_data, MemberStatus::NO_ERROR);
  306. }
  307. /**
  308. * 账号绑定信息
  309. * http://doc.1tsdk.com/138?page_id=3520
  310. * 【域名】/user/bind_info
  311. */
  312. public function accountBindInfo() {
  313. $_mem_rq = $this->setMemData();
  314. $_username = $_mem_rq->getUsername();
  315. $_is_uname = (new Member())->checkUserName($_username);
  316. if (false == $_is_uname) {
  317. $this->error(
  318. MemberStatus::getMsg(MemberStatus::USERNAME_NOT_EXISTS), [], MemberStatus::USERNAME_NOT_EXISTS
  319. );
  320. }
  321. $_data = (new MemberLogic())->getMobileEmailByName($_username);
  322. if (empty($_data['mobile'])) {
  323. $this->error(MemberStatus::getMsg(MemberStatus::PHONE_NOT_BIND), [], MemberStatus::PHONE_NOT_BIND);
  324. }
  325. Session::set('bing_mobile_'.$_username, $_data['mobile']);
  326. $_data['mobile'] = substr_replace($_data['mobile'], '****', 3, 4);
  327. $this->success(MemberStatus::getMsg(MemberStatus::NO_ERROR), $_data, MemberStatus::NO_ERROR);
  328. }
  329. /**
  330. * 找回密码发送短信
  331. * http://doc.1tsdk.com/138?page_id=3521
  332. * 【域名】/password/send_sms
  333. */
  334. public function recoverPwdSendMsm() {
  335. $_mem_rq = $this->setMemData();
  336. $_username = $_mem_rq->getUsername();
  337. $_mobile = Session::get('bing_mobile_'.$_username);
  338. if (empty($_mobile)) {
  339. $this->error(MemberStatus::getMsg(MemberStatus::PHONE_EMPTY), [], MemberStatus::PHONE_EMPTY);
  340. }
  341. $_rs = (new Sms())->send($_mobile, SmsType::SMS_FIND_PWD);
  342. if (MemberStatus::NO_ERROR == $_rs['code']) {
  343. $this->success($_rs['msg'], $_rs['data'], $_rs['code']);
  344. }
  345. $this->error($_rs['msg'], $_rs['data'], $_rs['code']);
  346. }
  347. /**
  348. * 验证找回密码短信验证码
  349. * http://doc.1tsdk.com/138?page_id=3522
  350. * 【域名】/password/sms_verify
  351. */
  352. public function recoverPwdCheckVerify() {
  353. $_mem_rq = $this->setMemData();
  354. $_username = $_mem_rq->getUsername();
  355. $_sms_data = $this->rq_data['sms'];
  356. $_code = $_sms_data['code'];
  357. $_mobile = Session::get('bing_mobile_'.$_username);
  358. /* 校验短信是否正确 */
  359. $_sms_rs = (new Sms())->check($_mobile, $_code, SmsType::SMS_FIND_PWD);
  360. if (MemberStatus::NO_ERROR != $_sms_rs['code']) {
  361. $this->error($_sms_rs['msg'], [], $_sms_rs['code']);
  362. }
  363. $_member_list = (new MemberModel())->getMemListByMobile($_mobile);
  364. Session::set('change_pwd_'.$_username, 1);
  365. $this->success($_sms_rs['msg'], [], $_sms_rs['code']);
  366. }
  367. /**
  368. * 重置用户密码
  369. * http://doc.1tsdk.com/138?page_id=3524
  370. * 【域名】/password/reset
  371. */
  372. public function resetPwd() {
  373. $_mem_rq = $this->setMemData();
  374. $_username = $_mem_rq->getUsername();
  375. $_password = $_mem_rq->getPassword();
  376. $_is_change = Session::get('change_pwd_'.$_username);
  377. if (empty($_is_change)) {
  378. $this->error(MemberStatus::getMsg(MemberStatus::UNKNOWN_ERROR), [], MemberStatus::UNKNOWN_ERROR);
  379. }
  380. Session::delete('change_pwd_'.$_username);
  381. Session::delete('bing_mobile_'.$_username);
  382. $_mem_id = (new MemberLogic())->getIdByName($_username);
  383. if (empty($_mem_id)) {
  384. $this->error(
  385. MemberStatus::getMsg(MemberStatus::USERNAME_NOT_EXISTS), [], MemberStatus::USERNAME_NOT_EXISTS
  386. );
  387. }
  388. $_rs = (new Member())->updatePassword($_mem_id, $_password);
  389. if (is_numeric($_rs)) {
  390. $this->success(MemberStatus::getMsg($_rs), [], $_rs);
  391. } elseif (false !== $_rs) {
  392. $this->error(MemberStatus::getMsg(MemberStatus::NO_ERROR), [], MemberStatus::NO_ERROR);
  393. } else {
  394. $this->error(MemberStatus::getMsg(MemberStatus::UNKNOWN_ERROR), [], MemberStatus::UNKNOWN_ERROR);
  395. }
  396. }
  397. }