| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- <?php
- namespace app\service;
- use app\common\model\Setting;
- use think\Db;
- class CommonService
- {
- /**
- * 实名认证--游戏充值值防沉迷判断
- */
- public function authentication($member_id, $gameid, $amount)
- {
- //游戏防沉迷限制
- $restrictInfo = model('GameRestrict')->where(['game_id' => $gameid, 'restrict_type' => 'preventhook'])->find();
- if ($restrictInfo) {
- $isPreventHook = intval($restrictInfo['restrict_status']);
- } else {
- $settingModel = new Setting;
- $isPreventHook = intval($settingModel::getSetting('CHILD_LIMIT'));
- }
- if ($isPreventHook == 2) {
- // 已实名认证用户做防沉迷判断
- $membersTwoInfo = model('MembersTwo')->where(['userid' => $member_id])->find();
- $gameInfo = model('Game')->where(['id' => $gameid])->find();
- if ($gameInfo['game_auth_type'] == 1 || $gameInfo['game_auth_type'] == 2) { //中宣部实名认证
- $gameAccountInfo = model('Subaccount')->where(['game_id' => $gameid, 'member_id' => $member_id])->find();
- if ($gameAccountInfo) {
- if ($gameAccountInfo['auth_status'] == 3) {
- $membersTwoInfo['realname'] = trim($gameAccountInfo['real_name']);
- $membersTwoInfo['idcard'] = trim($gameAccountInfo['idcard_num']);
- } else if ($gameAccountInfo['auth_status'] == 1) {
- $membersTwoInfo['realname'] = '';
- $membersTwoInfo['idcard'] = '';
- } else {
- $membersTwoInfo['realname'] = '';
- $membersTwoInfo['idcard'] = '';
- }
- } else {
- $membersTwoInfo['realname'] = '';
- $membersTwoInfo['idcard'] = '';
- }
- }
- if ($membersTwoInfo && !empty($membersTwoInfo['realname']) && !empty($membersTwoInfo['idcard']) && $membersTwoInfo['realname'] <> -1 && $membersTwoInfo['idcard'] <> -1) {
- $totalMonthRechargeAmt = model('Pay')->where(['userid' => $member_id, 'status' => 1, 'create_time' => ['egt', strtotime(date('Y-m-01'))]])->sum('amount');
- if (isMeetAgeByIDCard($membersTwoInfo['idcard'], 0, 12)) {
- return ['code' => 0, 'msg' => '未满12周岁的未成年用户,无法进行充值'];
- } else if (isMeetAgeByIDCard($membersTwoInfo['idcard'], 12, 16)) {
- if ($amount > 50) {
- return ['code' => 0, 'msg' => '12周岁以上未满16周岁的未成年用户,单次充值金额不得超过50元,每月累计充值上限为200元'];
- }
- if (($totalMonthRechargeAmt + $amount) > 200) {
- return ['code' => 0, 'msg' => '12周岁以上未满16周岁的未成年用户,单次充值金额不得超过50元,每月累计充值上限为200元'];
- }
- } else if (isMeetAgeByIDCard($membersTwoInfo['idcard'], 16, 18)) {
- if ($amount > 100) {
- return ['code' => 0, 'msg' => '16周岁以上未满18周岁的未成年用户,单次充值金额不得超过100元,每月累计充值上限为400元'];
- }
- if (($totalMonthRechargeAmt + $amount) > 400) {
- return ['code' => 0, 'msg' => '16周岁以上未满18周岁的未成年用户,单次充值金额不得超过100元,每月累计充值上限为400元'];
- }
- }
- }
- }
- return ['code' => 1];
- }
-
- /**
- * 获取玩家其他端游戏的渠道ID
- *
- * @param $member_id 用户ID
- * @param $game_id 游戏ID
- *
- * @return void
- */
- public function getGameOtherChannelId($member_id, $game_id) {
-
- $gameType = model('Common/Game')->where(['id' => $game_id])->value('type');
- $where = [];
- // 游戏类型:1=ios、2=安卓、3=h5
- if($gameType == 1){
- $where['ios_game_id'] = $game_id;
- $otherGameIds = ['android_game_id', 'h5_game_id'];
- } else if ($gameType == 2){
- $where['android_game_id'] = $game_id;
- $otherGameIds = ['ios_game_id', 'h5_game_id'];
- } else if ($gameType == 3) {
- $where['h5_game_id'] = $game_id;
- $otherGameIds = ['android_game_id', 'ios_game_id'];
- }
-
- $gameBandInfo = model('common/GameBand')->where($where)->find();
- // 没有绑定
- if(!$gameBandInfo){
- return '';
- }
-
- $memberGameIds = [];
- if($gameType == 1){
- $memberGameIds = [$gameBandInfo['android_game_id'], $gameBandInfo['h5_game_id']];
- } else if ($gameType == 2){
- $memberGameIds = [$gameBandInfo['ios_game_id'], $gameBandInfo['h5_game_id']];
- } else if ($gameType == 3) {
- $memberGameIds = [$gameBandInfo['android_game_id'], $gameBandInfo['ios_game_id']];
- }
- $gameIds = array_filter($memberGameIds, function($v) {
- return $v>0;
- });
-
- $channelId = model('common/MemberChannelGame')->where(['member_id' => $member_id, 'game_id' => ['in', $gameIds]])->value('channel_id');
- if($channelId){
- return $channelId;
- }
-
- return '';
- }
-
- /**
- * 处理归属绑定保护
- *
- * 账户注册时间一个月内,如果发现同一实名信息的其他账户在该游戏,则当前归属使用其他实名账户渠道;
- * 1. 规定时间内注册的玩家,根据实名信息进行一个月归属保护;
- * 2. 归属期内在多个渠道注册且相同实名的玩家,归属始终为在第一次注册渠道所属。
- * 例如:
- * 1. 玩家1 在归属保护期内,在 甲会长 下注册了账号,然后又去 乙会长 下注册账户,此时注册后归属于 甲会长 。
- *
- *
- * @param $member_id 处理的玩家ID
- * @param $member_channel_id 当前绑定的渠道ID
- * @param $game_id 游戏ID
- * @param $realname 实名-姓名
- * @param $idcard 实名-身份证号
- *
- * @return false
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function handleBelongToBinding($member_id, $member_channel_id, $game_id, $idcard = '', $realname = '') {
- // $date = date('Y-m-d', time());
- $time = time();
- // 获取是否需要处理绑定关联
- $gameInfo = Db::table('cy_game')->alias('cg')
- ->join('cy_gameinfo cgi', 'cg.id = cgi.game_id', 'left')
- ->field('cg.id, cg.name, cg.game_auth_type, cgi.belonging_status')
- ->where(['cg.id' => $game_id])->find();
- if($gameInfo['belonging_status'] != 1){
- return false;
- }
- $channelInfo = Db::table('nw_subaccount')
- ->where(['game_id' => $game_id, 'idcard_num' => $idcard, 'auth_status' => 3])
- ->field('id as sub_id,channel_id,create_time')
- ->order('create_time desc')
- ->find();
- if(!$channelInfo){
- $channelInfo = Db::table('cy_memberstwo')->alias('cmt')
- ->join('nw_subaccount ns', 'cmt.userid = ns.member_id', 'left')
- ->where(['cmt.idcard' => $idcard, 'ns.game_id' => $game_id])
- ->field('ns.id as sub_id, ns.channel_id, ns.create_time')
- ->order('ns.create_time desc')
- ->find();
- }
- if(empty($channelInfo)){
- return false;
- }
- if($channelInfo['channel_id'] == $member_channel_id){
- return false;
- }
- $timestamp = (new \DateTime("@{$channelInfo['create_time']}"))->modify('+1 month')->getTimestamp();
- if($timestamp < $time){
- return false;
- }
- Db::startTrans();
- try {
- $channel_id = $channelInfo['channel_id'];
- $updateTime = NOW_TIMESTAMP;
- // 用户 - 初始化注册的记录,可以不用改(需要查用户是否归属保护过时可以根据实名信息,对比账户表子账户所属归属)
- // model('common/Members')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['id' => $member_id]);
- // 子账户
- model('common/Subaccount')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['game_id' => $game_id, 'member_id' => $member_id]);
- // 玩家-渠道-游戏 关联
- model('common/MemberChannelGame')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['member_id' => $member_id, 'game_id' => $game_id]);
- // 玩家-游戏-区服 关联 【不用处理,因为牵扯到‘归属功能’,玩家登录时候还没有进游戏】
- // model('common/MemberGameServer')->update(["channel_id" => $channel_id, "update_time" => $updateTime], ['member_id' => $member_id, 'game_id' => $game_id]);
- // 修复切换归属渠道时的登录记录没有改变
- model('common/Logininfo')->update(["channel_id" => $channel_id], ['userid' => $member_id, 'sub_id' => $channelInfo['sub_id'], 'gameid' => $game_id]);
- // 记录日志
- $channelName = model('common/Channel')->where(['id' =>['in', [$channel_id, $member_channel_id]]])->column('name', 'id');
- Db::table('cy_member_history')->insert([
- 'userid' => $member_id,
- 'channel' => $gameInfo['name'] . " 渠道归属 {$channelName[$member_channel_id]} 改为 {$channelName[$channel_id]}(归属绑定处理)",
- 'ip' => request()->ip(),
- 'create_time' => $time
- ]);
- Db::commit();
- return true;
- }catch (\Exception $e) {
- Db::rollback();
- log_message('## CommonService@handleBelongToBinding: ' . $e->getMessage().' - '.$e->getFile().':'.$e->getLine(), 'log', LOG_PATH . 'exception/');
- }
- return false;
- }
- }
|