CommonService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. namespace app\service;
  3. use app\common\model\Setting;
  4. use think\Db;
  5. class CommonService
  6. {
  7. /**
  8. * 实名认证--游戏充值值防沉迷判断
  9. */
  10. public function authentication($member_id, $gameid, $amount)
  11. {
  12. //游戏防沉迷限制
  13. $restrictInfo = model('GameRestrict')->where(['game_id' => $gameid, 'restrict_type' => 'preventhook'])->find();
  14. if ($restrictInfo) {
  15. $isPreventHook = intval($restrictInfo['restrict_status']);
  16. } else {
  17. $settingModel = new Setting;
  18. $isPreventHook = intval($settingModel::getSetting('CHILD_LIMIT'));
  19. }
  20. if ($isPreventHook == 2) {
  21. // 已实名认证用户做防沉迷判断
  22. $membersTwoInfo = model('MembersTwo')->where(['userid' => $member_id])->find();
  23. $gameInfo = model('Game')->where(['id' => $gameid])->find();
  24. if ($gameInfo['game_auth_type'] == 1 || $gameInfo['game_auth_type'] == 2) { //中宣部实名认证
  25. $gameAccountInfo = model('Subaccount')->where(['game_id' => $gameid, 'member_id' => $member_id])->find();
  26. if ($gameAccountInfo) {
  27. if ($gameAccountInfo['auth_status'] == 3) {
  28. $membersTwoInfo['realname'] = trim($gameAccountInfo['real_name']);
  29. $membersTwoInfo['idcard'] = trim($gameAccountInfo['idcard_num']);
  30. } else if ($gameAccountInfo['auth_status'] == 1) {
  31. $membersTwoInfo['realname'] = '';
  32. $membersTwoInfo['idcard'] = '';
  33. } else {
  34. $membersTwoInfo['realname'] = '';
  35. $membersTwoInfo['idcard'] = '';
  36. }
  37. } else {
  38. $membersTwoInfo['realname'] = '';
  39. $membersTwoInfo['idcard'] = '';
  40. }
  41. }
  42. if ($membersTwoInfo && !empty($membersTwoInfo['realname']) && !empty($membersTwoInfo['idcard']) && $membersTwoInfo['realname'] <> -1 && $membersTwoInfo['idcard'] <> -1) {
  43. $totalMonthRechargeAmt = model('Pay')->where(['userid' => $member_id, 'status' => 1, 'create_time' => ['egt', strtotime(date('Y-m-01'))]])->sum('amount');
  44. if (isMeetAgeByIDCard($membersTwoInfo['idcard'], 0, 12)) {
  45. return ['code' => 0, 'msg' => '未满12周岁的未成年用户,无法进行充值'];
  46. } else if (isMeetAgeByIDCard($membersTwoInfo['idcard'], 12, 16)) {
  47. if ($amount > 50) {
  48. return ['code' => 0, 'msg' => '12周岁以上未满16周岁的未成年用户,单次充值金额不得超过50元,每月累计充值上限为200元'];
  49. }
  50. if (($totalMonthRechargeAmt + $amount) > 200) {
  51. return ['code' => 0, 'msg' => '12周岁以上未满16周岁的未成年用户,单次充值金额不得超过50元,每月累计充值上限为200元'];
  52. }
  53. } else if (isMeetAgeByIDCard($membersTwoInfo['idcard'], 16, 18)) {
  54. if ($amount > 100) {
  55. return ['code' => 0, 'msg' => '16周岁以上未满18周岁的未成年用户,单次充值金额不得超过100元,每月累计充值上限为400元'];
  56. }
  57. if (($totalMonthRechargeAmt + $amount) > 400) {
  58. return ['code' => 0, 'msg' => '16周岁以上未满18周岁的未成年用户,单次充值金额不得超过100元,每月累计充值上限为400元'];
  59. }
  60. }
  61. }
  62. }
  63. return ['code' => 1];
  64. }
  65. /**
  66. * 获取玩家其他端游戏的渠道ID
  67. *
  68. * @param $member_id 用户ID
  69. * @param $game_id 游戏ID
  70. *
  71. * @return void
  72. */
  73. public function getGameOtherChannelId($member_id, $game_id) {
  74. $gameType = model('Common/Game')->where(['id' => $game_id])->value('type');
  75. $where = [];
  76. // 游戏类型:1=ios、2=安卓、3=h5
  77. if($gameType == 1){
  78. $where['ios_game_id'] = $game_id;
  79. $otherGameIds = ['android_game_id', 'h5_game_id'];
  80. } else if ($gameType == 2){
  81. $where['android_game_id'] = $game_id;
  82. $otherGameIds = ['ios_game_id', 'h5_game_id'];
  83. } else if ($gameType == 3) {
  84. $where['h5_game_id'] = $game_id;
  85. $otherGameIds = ['android_game_id', 'ios_game_id'];
  86. }
  87. $gameBandInfo = model('common/GameBand')->where($where)->find();
  88. // 没有绑定
  89. if(!$gameBandInfo){
  90. return '';
  91. }
  92. $memberGameIds = [];
  93. if($gameType == 1){
  94. $memberGameIds = [$gameBandInfo['android_game_id'], $gameBandInfo['h5_game_id']];
  95. } else if ($gameType == 2){
  96. $memberGameIds = [$gameBandInfo['ios_game_id'], $gameBandInfo['h5_game_id']];
  97. } else if ($gameType == 3) {
  98. $memberGameIds = [$gameBandInfo['android_game_id'], $gameBandInfo['ios_game_id']];
  99. }
  100. $gameIds = array_filter($memberGameIds, function($v) {
  101. return $v>0;
  102. });
  103. $channelId = model('common/MemberChannelGame')->where(['member_id' => $member_id, 'game_id' => ['in', $gameIds]])->value('channel_id');
  104. if($channelId){
  105. return $channelId;
  106. }
  107. return '';
  108. }
  109. /**
  110. * 处理归属绑定保护
  111. *
  112. * 账户注册时间一个月内,如果发现同一实名信息的其他账户在该游戏,则当前归属使用其他实名账户渠道;
  113. * 1. 规定时间内注册的玩家,根据实名信息进行一个月归属保护;
  114. * 2. 归属期内在多个渠道注册且相同实名的玩家,归属始终为在第一次注册渠道所属。
  115. * 例如:
  116. * 1. 玩家1 在归属保护期内,在 甲会长 下注册了账号,然后又去 乙会长 下注册账户,此时注册后归属于 甲会长 。
  117. *
  118. *
  119. * @param $member_id 处理的玩家ID
  120. * @param $member_channel_id 当前绑定的渠道ID
  121. * @param $game_id 游戏ID
  122. * @param $realname 实名-姓名
  123. * @param $idcard 实名-身份证号
  124. *
  125. * @return false
  126. * @throws \think\db\exception\DataNotFoundException
  127. * @throws \think\db\exception\ModelNotFoundException
  128. * @throws \think\exception\DbException
  129. */
  130. public function handleBelongToBinding($member_id, $member_channel_id, $game_id, $idcard = '', $realname = '') {
  131. // $date = date('Y-m-d', time());
  132. $time = time();
  133. // 获取是否需要处理绑定关联
  134. $gameInfo = Db::table('cy_game')->alias('cg')
  135. ->join('cy_gameinfo cgi', 'cg.id = cgi.game_id', 'left')
  136. ->field('cg.id, cg.name, cg.game_auth_type, cgi.belonging_status')
  137. ->where(['cg.id' => $game_id])->find();
  138. if($gameInfo['belonging_status'] != 1){
  139. return false;
  140. }
  141. $channelInfo = Db::table('nw_subaccount')
  142. ->where(['game_id' => $game_id, 'idcard_num' => $idcard, 'auth_status' => 3])
  143. ->field('id as sub_id,channel_id,create_time')
  144. ->order('create_time desc')
  145. ->find();
  146. if(!$channelInfo){
  147. $channelInfo = Db::table('cy_memberstwo')->alias('cmt')
  148. ->join('nw_subaccount ns', 'cmt.userid = ns.member_id', 'left')
  149. ->where(['cmt.idcard' => $idcard, 'ns.game_id' => $game_id])
  150. ->field('ns.id as sub_id, ns.channel_id, ns.create_time')
  151. ->order('ns.create_time desc')
  152. ->find();
  153. }
  154. if(empty($channelInfo)){
  155. return false;
  156. }
  157. if($channelInfo['channel_id'] == $member_channel_id){
  158. return false;
  159. }
  160. $timestamp = (new \DateTime("@{$channelInfo['create_time']}"))->modify('+1 month')->getTimestamp();
  161. if($timestamp < $time){
  162. return false;
  163. }
  164. Db::startTrans();
  165. try {
  166. $channel_id = $channelInfo['channel_id'];
  167. $updateTime = NOW_TIMESTAMP;
  168. // 用户 - 初始化注册的记录,可以不用改(需要查用户是否归属保护过时可以根据实名信息,对比账户表子账户所属归属)
  169. // model('common/Members')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['id' => $member_id]);
  170. // 子账户
  171. model('common/Subaccount')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['game_id' => $game_id, 'member_id' => $member_id]);
  172. // 玩家-渠道-游戏 关联
  173. model('common/MemberChannelGame')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['member_id' => $member_id, 'game_id' => $game_id]);
  174. // 玩家-游戏-区服 关联 【不用处理,因为牵扯到‘归属功能’,玩家登录时候还没有进游戏】
  175. // model('common/MemberGameServer')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['member_id' => $member_id, 'game_id' => $game_id]);
  176. // 修复切换归属渠道时的登录记录没有改变
  177. model('common/Logininfo')->update(["channel_id" => $channel_id], ['userid' => $member_id, 'sub_id' => $channelInfo['sub_id'], 'gameid' => $game_id]);
  178. // 记录日志
  179. $channelName = model('common/Channel')->where(['id' =>['in', [$channel_id, $member_channel_id]]])->column('name', 'id');
  180. Db::table('cy_member_history')->insert([
  181. 'userid' => $member_id,
  182. 'channel' => $gameInfo['name'] . " 渠道归属 {$channelName[$member_channel_id]} 改为 {$channelName[$channel_id]}(归属绑定处理)",
  183. 'ip' => request()->ip(),
  184. 'create_time' => $time
  185. ]);
  186. Db::commit();
  187. return true;
  188. }catch (\Exception $e) {
  189. Db::rollback();
  190. log_message('## CommonService@handleBelongToBinding: ' . $e->getMessage().' - '.$e->getFile().':'.$e->getLine(), 'log', LOG_PATH . 'exception/');
  191. }
  192. return false;
  193. }
  194. }