Member.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. <?php
  2. /**
  3. * 前台用户公共业务逻辑类
  4. *
  5. */
  6. namespace app\common\logic;
  7. use app\common\model\Game;
  8. use app\common\model\MembersTwo;
  9. use app\service\CommonService;
  10. use think\Config;
  11. use think\Db;
  12. use think\Env;
  13. use think\Exception;
  14. class Member {
  15. /**
  16. * 同步用户信息到账户中心
  17. *
  18. * @param $username:用户名
  19. * @param $password:明文密码
  20. * @param $mobile:手机号码
  21. * @param $now_time:当前时间
  22. *
  23. * @return string mem_openid
  24. */
  25. public function syncMember($username, $password, $mobile,$now_time)
  26. {
  27. $mgMemberInfo = Db::connect('db_config_resource_center')->table('mg_member')->field('mem_id,mem_openid')->where(['mem_login_name'=>$username,'pl_id'=>2])->find();
  28. $data = ['mem_password' => password_hash($password, PASSWORD_DEFAULT),
  29. 'mem_mobile' => $mobile,
  30. 'mem_updatetime'=> $now_time,
  31. ];
  32. // 账户不存在,做插入
  33. if(empty($mgMemberInfo)) {
  34. $data['pl_id'] = 2;
  35. $data['mem_openid'] = md5($now_time.rand(1000, 9999));
  36. $data['mem_login_name'] = $username;
  37. Db::connect('db_config_resource_center')->table('mg_member')->insert($data);
  38. $openid = $data['mem_openid'];
  39. }else{ // 存在,更新账户的手机号和密码
  40. Db::connect('db_config_resource_center')->table('mg_member')->where(['mem_id'=>$mgMemberInfo['mem_id']])->update($data);
  41. $openid = $mgMemberInfo['mem_openid'];
  42. }
  43. return $openid;
  44. }
  45. /**
  46. * 检测txt文件
  47. * @param $users
  48. * @return boolean
  49. */
  50. public function checkContent($users)
  51. {
  52. if (empty($users)) {
  53. return '格式有误,请重新上传1';
  54. }
  55. $users = array_map('trim', $users);
  56. foreach ($users as $user) {
  57. if (! preg_match('/^[0-9a-zA-Z]+:[0-9a-zA-Z]+$/', $user)) {
  58. return '格式有误,请重新上传';
  59. }
  60. }
  61. return true;
  62. }
  63. /**
  64. * 用户注册
  65. * @param $data
  66. * @return boolean
  67. */
  68. public function registerUser($data)
  69. {
  70. $now_time = request()->time();
  71. $data['password'] = auth_code($data['password'], "ENCODE", Env::get('auth_key')); // 加密
  72. $data['reg_time'] = $now_time;
  73. $data['login_time'] = $now_time;
  74. $data['ip'] = request()->ip();
  75. // 启动事务
  76. Db::startTrans();
  77. try {
  78. $member_id = Db::table('cy_members')->insertGetId($data);
  79. if ($member_id) {
  80. // 插入玩家历史记录
  81. Db::table('cy_member_history')->insert([
  82. 'userid' => $member_id,
  83. 'password' => $data['password'],
  84. 'ip' => request()->ip(),
  85. 'create_time' => $now_time
  86. ]);
  87. //插入用户扩展记录
  88. Db::table('cy_memberstwo')->insert([
  89. 'userid' => $member_id,
  90. 'username' => $data['username'],
  91. 'realname' => -1,
  92. 'idcard' => -1,
  93. 'create_time' => $now_time
  94. ]);
  95. // 登录时 绑定该游戏的归属渠道
  96. Db::table('cy_member_channel_game_rel')->insert([
  97. 'member_id' => $member_id,
  98. 'channel_id' => $data['channel_id'],
  99. 'game_id' => $data['gameid'],
  100. 'mcgr_createtime' => time(),
  101. 'update_time' => time(),
  102. 'mcgr_ip' => request()->ip()
  103. ]);
  104. $sub_username = strtolower(random(20)).'_'.$data['gameid'].Env::get('sdk_mark_type');
  105. Db::table('nw_subaccount')->insert([
  106. 'member_id' => $member_id,
  107. 'game_id' => $data['gameid'],
  108. 'channel_id' => $data['channel_id'],
  109. 'sub_username' => $sub_username,
  110. 'create_time' => time(),
  111. 'update_time' => time(),
  112. ]);
  113. Db::table('cy_members')->where(['id' => $member_id])->update(['nickname' => random(3).$member_id]);
  114. // // 另一端游戏提前绑定当前渠道
  115. // $gameType = Db::table('cy_game')->where(['id' => $data['gameid']])->value('type');
  116. // if ($gameType == 1) { // ios
  117. // $gameBandId = Db::table('nw_game_band')->where(['ios_game_id' => $data['gameid']])->value('android_game_id');
  118. // } else if ($gameType == 2) { // 安卓
  119. // $gameBandId = Db::table('nw_game_band')->where(['android_game_id' => $data['gameid']])->value('ios_game_id');
  120. // }
  121. // if ($gameBandId) {
  122. // Db::table('cy_member_channel_game_rel')->insert([
  123. // 'member_id' => $member_id,
  124. // 'channel_id' => $data['channel_id'],
  125. // 'game_id' => $gameBandId,
  126. // 'mcgr_createtime' => time(),
  127. // 'update_time' => time(),
  128. // 'mcgr_ip' => request()->ip()
  129. // ]);
  130. //
  131. // $sub_username = strtolower(random(20)).'_'.$gameBandId.Env::get('sdk_mark_type');
  132. // Db::table('nw_subaccount')->insert([
  133. // 'member_id' => $member_id,
  134. // 'game_id' => $gameBandId,
  135. // 'channel_id' => $data['channel_id'],
  136. // 'sub_username' => $sub_username,
  137. // 'create_time' => time(),
  138. // 'update_time' => time(),
  139. // ]);
  140. // }
  141. } else {
  142. throw new Exception("注册失败!");
  143. }
  144. Db::commit();
  145. return true;
  146. } catch (Exception $e) {
  147. Db::rollback();
  148. return $e->getMessage();
  149. }
  150. }
  151. /**
  152. * 游戏-账号-角色查询
  153. * @param array $condition
  154. * @return \think\Paginator|\think\paginator\Collection
  155. */
  156. public function accountQuery($condition, $pageNum=20)
  157. {
  158. $infoList = Db::table('cy_role_info')->alias('info')
  159. ->join('cy_members user', 'info.userid = user.id', 'left')
  160. ->join('cy_game game', 'game.id = info.gameid', 'left')
  161. ->field(['game.name', 'user.username', 'info.serverid','info.servername', 'info.roleid','info.rolename', 'info.rolelevel', 'info.create_time'])
  162. ->where($condition)
  163. ->order('info.id', 'desc')
  164. ->paginate($pageNum, false, ['query' => input('get.')]);
  165. return $infoList;
  166. }
  167. /**
  168. * 游戏-账号-角色查询
  169. * @param array $condition
  170. * @return \think\Paginator|\think\paginator\Collection
  171. */
  172. public function queryUserRole(array $condition)
  173. {
  174. $roleInfo = Db::table('cy_role_info')
  175. ->field(['servername', 'rolename', 'rolelevel'])
  176. ->where($condition)
  177. ->order('id', 'asc')
  178. ->find();
  179. return $roleInfo;
  180. }
  181. /**
  182. * 实名认证同步
  183. *
  184. * @param int $memberId 用户ID
  185. * @param int $gameId 游戏ID
  186. *
  187. * @return array
  188. */
  189. public function realNameSync($memberId, $gameId){
  190. $gameInfo = Db::table('cy_game')->where('id', $gameId)->field('type,game_auth_type')->find();
  191. $bandWhere = [];
  192. $bandField = ['android_game_id', 'ios_game_id', 'h5_game_id'];
  193. // ## 游戏类型:1=ios、2=安卓、3=h5
  194. if($gameInfo['type'] == 1){
  195. $bandWhere['android_game_id'] = $gameId;
  196. unset($bandField['android_game_id']);
  197. } else if($gameInfo['type'] == 2){
  198. $bandWhere['ios_game_id'] = $gameId;
  199. unset($bandField['ios_game_id']);
  200. } else if($gameInfo['type'] == 3){
  201. $bandWhere['h5_game_id'] = $gameId;
  202. unset($bandField['h5_game_id']);
  203. }
  204. $gameBandIds = Db::table('nw_game_band')->where($bandWhere)->field($bandField)->find();
  205. // 获取其他平台最新的实名信息
  206. $realType = 1;
  207. // ## 认证类型: 0平台认证, 1中宣部实名认证 2通过上游认证
  208. $realInfo = Db::table('nw_subaccount')->where([
  209. 'member_id' => $memberId,
  210. 'game_id' => ['in', $gameBandIds],
  211. 'real_name' => ['>', ''],
  212. 'idcard_num' => ['>', ''],
  213. 'auth_status' => 3
  214. ])->field('real_name,idcard_num,create_time')->order('create_time desc')->find();
  215. $realData = [];
  216. if($realInfo){
  217. $realData = [
  218. 'real_name' => $realInfo['real_name'],
  219. 'idcard_num' => $realInfo['idcard_num']
  220. ];
  221. }else{
  222. $realInfo = Db::table('cy_memberstwo')->where([
  223. 'userid' => $memberId,
  224. 'realname' => ['>', ''],
  225. 'idcard' => ['>', '']
  226. ])->field('realname as real_name,idcard as idcard_num,create_time')->order('create_time desc')->find();
  227. if($realInfo){
  228. $realData = [
  229. 'real_name' => $realInfo['real_name'],
  230. 'idcard_num' => $realInfo['idcard_num']
  231. ];
  232. }
  233. $realType = 2;
  234. }
  235. if($realData){
  236. $result = $this->realNameHandle($gameInfo['game_auth_type'], $memberId, $gameId, $realData['real_name'], $realData['idcard_num']);
  237. if($result['code'] != 200){
  238. return ['code' => -110, 'msg' => $result['msg']];
  239. }
  240. return ['code' => 200, 'data' => [], 'msg' => 'succes'];
  241. }
  242. return ['code' => -100, 'msg' => '实名认证同步失败'];
  243. }
  244. /**
  245. * 实名认证处理
  246. *
  247. * @param int $realType 认证类型:1=中宣部实名认证, 2=平台认证
  248. * @param int $memberId 用户ID
  249. * @param int $gameId 游戏ID
  250. * @param string $realName 真实姓名
  251. * @param string $idcardNum 身份证号码
  252. *
  253. * @return array
  254. * @throws \think\db\exception\DataNotFoundException
  255. * @throws \think\db\exception\ModelNotFoundException
  256. * @throws \think\exception\DbException
  257. */
  258. public function realNameHandle($realType = 1, $memberId, $gameId, $realName, $idcardNum){
  259. $membersTwoModel = new MembersTwo();
  260. $gameInfo = Db::table('cy_game')->alias('cg')
  261. ->join('cy_gameinfo cgi', 'cg.id=cgi.game_id', 'left')
  262. ->where(['cg.id' => $gameId])->field('cg.game_bizid, cgi.belonging_status')->find();
  263. $subInfo = Db::table('nw_subaccount')->alias('ns')
  264. ->join('cy_members cm', 'ns.member_id = cm.id')
  265. ->field('ns.id, cm.username, ns.channel_id')
  266. ->where(['ns.game_id' => $gameId, 'ns.member_id' => $memberId])->find();
  267. $memberData = [
  268. 'realname' => $realName,
  269. 'idcard' => $idcardNum,
  270. 'update_time' => time()
  271. ];
  272. if($realType == 1){
  273. vendor('authSdk.Authentication', '.class.php');
  274. $auth = new \Authentication();
  275. $ai = $gameId.'-'.$memberId.'-'.$subInfo['id'];
  276. $result = $auth->checkV2(trim($gameInfo['game_bizid']), $ai, $realName, $idcardNum);
  277. if($result['code'] != 200){
  278. return ['code' => -110, 'msg' => $result['msg']];
  279. }
  280. $resultData = $result['data'];
  281. try {
  282. $subAccountData = [
  283. 'auth_type' => 1,
  284. 'real_name' => trim($realName),
  285. 'idcard_num' => trim($idcardNum),
  286. 'auth_pi' => $resultData['pi'],
  287. 'last_auth_time' => time()
  288. ];
  289. Db::startTrans();
  290. if ($resultData['status'] == 0) {
  291. $subAccountData['auth_status'] = 3;
  292. $subResult = model('Subaccount')->where(['id' => $subInfo['id']])->update($subAccountData);
  293. if (!$subResult) {
  294. throw new \Exception('实名认证结果保存异常', -120);
  295. }
  296. // 更新用户扩展信息的实名信息
  297. $merRsult = $membersTwoModel->update($memberData, ['userid' => $memberId]);
  298. if (!$merRsult) {
  299. throw new \Exception('实名认证结果保存异常', -121);
  300. }
  301. } else if ($resultData['status'] == 1) {
  302. $subAccountData['auth_status'] = 1;
  303. $subResult = model('Subaccount')->where(['id' => $subInfo['id']])->update($subAccountData);
  304. if (!$subResult) {
  305. throw new \Exception('实名信息已提交审核,请耐心等待认证结果', -123);
  306. }
  307. } else {
  308. throw new \Exception('实名认证,未通过', -124);
  309. }
  310. Db::commit();
  311. } catch (\Exception $e) {
  312. Db::rollback();
  313. return ['code' => -100, 'data' => [], 'msg' => $e->getMessage().', '.$e->getCode()];
  314. }
  315. }else{
  316. try {
  317. Db::startTrans();
  318. // 实名认证数据更新
  319. if ($membersTwoModel->where(['userid' => $memberId])->find()) {
  320. $merSaveResult = $membersTwoModel->update($memberData, ['userid' => $memberId]);
  321. } else {
  322. $memberData['userid'] = $memberId;
  323. $memberData['username'] = $subInfo['username'];
  324. $memberData['create_time'] = time();
  325. $merSaveResult = $membersTwoModel->insert($memberData);
  326. }
  327. if(!$merSaveResult){
  328. throw new \Exception('实名认证,保存失败', -150);
  329. }
  330. Db::commit();
  331. } catch (\Exception $e) {
  332. Db::rollback();
  333. return ['code' => -130, 'data' => [], 'msg' => $e->getMessage().', '.$e->getCode()];
  334. }
  335. }
  336. // 插入玩家历史记录
  337. $historyRsult = Db::table('cy_member_history')->insert([
  338. 'userid' => $memberId,
  339. 'password' => $subInfo['username'] . ' - ' . $realName . ' - ' . $idcardNum,
  340. 'mobile' => '',
  341. 'ip' => request()->ip(),
  342. 'create_time' => time(),
  343. ]);
  344. if (!$historyRsult) {
  345. return ['code' => -160, 'data' => [], 'msg' => '认证记录存储失败'];
  346. }
  347. // ## (归属保护)处理游戏绑定渠道管理
  348. if($gameInfo['belonging_status'] != 1){
  349. (new CommonService())->handleBelongToBinding($memberId, $subInfo['channel_id'], $gameId, $realName, $idcardNum);
  350. }
  351. return ['code' => 200, 'data' => [], 'msg' => 'success'];
  352. }
  353. }