2
0

ExtensionsController.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. <?php
  2. namespace App\Http\Controllers\Game;
  3. use App\dao\Pay\AccountPayInfo;
  4. use App\Facade\TableName;
  5. use App\Game\AgentLinks;
  6. use App\Game\AgentUser;
  7. use App\Game\GlobalUserInfo;
  8. use App\Game\Services\AgentService;
  9. use App\Http\helper\NumConfig;
  10. use App\Models\AccountsInfo;
  11. use App\Services\ExtensionCopy;
  12. use App\Services\Extensions;
  13. use App\Util;
  14. use App\Utility\SetNXLock;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Crypt;
  17. use Illuminate\Support\Facades\DB;
  18. use Illuminate\Support\Facades\Log;
  19. use Illuminate\Support\Facades\Redis;
  20. use Illuminate\Support\Str;
  21. // 裂变入口
  22. // 数值统一要除 100
  23. class ExtensionsController
  24. {
  25. public static function customEncrypt($string) {
  26. $string = (string) $string;
  27. // 自定义加密逻辑,这里使用简单的替换算法
  28. $characters = 'e8fi0mKL9MNOno7pqaDE1FghGb|-3cduvwxyzA6BCHIJPjklQRS4TU2VWXrs5tYZ';
  29. $result = '';
  30. for ($i = 0; $i < strlen($string); $i++) {
  31. $char = $string[$i];
  32. $pos = strpos($characters, $char);
  33. $newPos = ($pos + 5) % strlen($characters); // 替换规则,这里偏移值为5,可以根据需求修改
  34. $result .= $characters[$newPos];
  35. }
  36. return $result;
  37. }
  38. public static function customDecrypt($string) {
  39. // 自定义解密逻辑,与加密逻辑相反
  40. $characters = 'e8fi0mKL9MNOno7pqaDE1FghGb|-3cduvwxyzA6BCHIJPjklQRS4TU2VWXrs5tYZ';
  41. $result = '';
  42. for ($i = 0; $i < strlen($string); $i++) {
  43. $char = $string[$i];
  44. $pos = strpos($characters, $char);
  45. $newPos = ($pos - 5 + strlen($characters)) % strlen($characters); // 解密的反向操作
  46. $result .= $characters[$newPos];
  47. }
  48. return $result;
  49. }
  50. private function getTurnplateActivity(Request $request)
  51. {
  52. $user = $request->user()??LoginController::checkLogin($request);
  53. $UserID = @$user->UserID ?? 0;
  54. $GlobalUID = @$user->GlobalUID ?? "";
  55. $FPID=$request->input("bfp","");
  56. $where=[];
  57. if(!$where&&$UserID)$where=['UserID',$UserID];
  58. if(!$where&&!empty($GlobalUID))$where=['GlobalUID',$GlobalUID];
  59. if(!$where&&!empty($FPID))$where=['FPID',$FPID];
  60. if(empty($where)){
  61. $where=['UserID',0];
  62. }
  63. $activity = DB::table('agent.dbo.ActivityTurnplate')
  64. ->where([$where])
  65. ->first();
  66. //用UserID没拿到,那看指纹ID
  67. if(!$activity&&$UserID){
  68. $activity = DB::table('agent.dbo.ActivityTurnplate')
  69. ->where('FPID',$FPID)
  70. ->where('UserID',0)
  71. ->first();
  72. //顺便更新下
  73. if($activity&&$UserID){
  74. DB::table('agent.dbo.ActivityTurnplate')
  75. ->where('FPID',$FPID)->update(['UserID'=>$UserID,'GlobalUID'=>$GlobalUID]);
  76. }
  77. }
  78. $insert = 0;
  79. if($activity){
  80. $turnplate = [
  81. 'times' => $activity->NewTimes+$activity->OldTimes,
  82. 'countdown' => $activity->Created+86400*3-time(),
  83. 'total_amount' => 4000,
  84. 'collect_amount' => intval($activity->Amount)
  85. ];
  86. }else{
  87. $turnplate = [
  88. 'times' => 1,
  89. 'countdown' => 86400*3,
  90. 'total_amount' => 4000,
  91. 'collect_amount' => 0
  92. ];
  93. $insert = 1;
  94. }
  95. if($insert){
  96. $data = [
  97. 'UserID' => $UserID,
  98. 'GlobalUID' => $GlobalUID,
  99. 'FPID' => $FPID,
  100. 'Amount' => $turnplate['collect_amount'],
  101. 'NewTimes' => 1,
  102. 'Created' => time(),
  103. 'LastFreeTimes' => time()
  104. ];
  105. $ID=DB::table('agent.dbo.ActivityTurnplate')->insertGetId($data);
  106. $activity=DB::table('agent.dbo.ActivityTurnplate')->where('ID',$ID)->first();
  107. }
  108. return compact('activity','turnplate','user','where');
  109. }
  110. public function triggerInvite(Request $request)
  111. {
  112. $user = $request->user()??LoginController::checkLogin($request);
  113. $UserID = @$user->UserID ?? 0;
  114. $activityController = new ActivityController();
  115. $activityController->triggerInvite($UserID);
  116. return apiReturnSuc();
  117. }
  118. public function turnplate(Request $request){
  119. $data=$this->getTurnplateActivity($request);
  120. $activity=$data['activity'];
  121. $turnplate=$data['turnplate'];
  122. $user=$data['user'];
  123. $where=$data['where'];
  124. $FPID=$request->bfp??"";
  125. $UserID=0;
  126. $GlobalUID="";
  127. if($activity) {
  128. try {
  129. $UserID = intval($activity->UserID ?? 0);
  130. $FPID = $activity->FPID;
  131. $GlobalUID = $activity->GlobalUID;
  132. // $activityController = new ActivityController();
  133. // $activityController->triggerInvite($UserID);
  134. } catch (\Exception $exception) {
  135. Log::error("turnplate:" . $exception->getMessage(), compact('data', 'user', 'where'));
  136. }
  137. }
  138. $redisKey = 'turnplate_index_'.$where[1];
  139. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  140. if (!$res) {
  141. return apiReturnFail(['web.turnplate.toofast','Requested too frequently']);
  142. }
  143. $myRecord = [];
  144. $dao = new AccountPayInfo();
  145. $myRecordList = DB::connection('write')->table('agent.dbo.ActivityTurnplateHistory')->where('State',1)->where([$where])->get();
  146. if($myRecordList && $UserID){
  147. $account = new AccountsInfo();
  148. $myInfo = $account->getUserPhone($UserID);
  149. $userInfo = DB::table(TableName::QPAccountsDB() . 'AccountsInfo')
  150. ->where('UserID', $UserID)
  151. ->first();
  152. if($userInfo) {
  153. $nickname = $userInfo->NickName;
  154. foreach ($myRecordList as $itemM) {
  155. $myRecord[] = ['phone' => $myInfo ?: '', 'name' => $nickname, 'amount' => 40];
  156. }
  157. }
  158. }
  159. if (Redis::exists('turnplate_record1')) {
  160. $record = Redis::get('turnplate_record1');
  161. $record = json_decode($record,true);
  162. } else{
  163. $record = [];
  164. for($i=0;$i<50;$i++){
  165. $record[] = ['phone' => rand(1234, 9876) . '' . rand(1234, 9876) . '' . rand(12, 98), 'name' => rand(1, 100) > 10 ? $dao->randUserName('') : 'U' . rand(1234, 9876), 'amount' => rand(40,2000)];
  166. }
  167. Redis::set('turnplate_record1',json_encode($record));
  168. Redis::expire('turnplate_record1', 100);
  169. }
  170. $numbers = [];
  171. $link = AgentService::getShareLink($GlobalUID??"",'WheelFree100');
  172. SetNXLock::release($redisKey);
  173. return apiReturnSuc(compact('turnplate', 'record','link','numbers','myRecord'));
  174. }
  175. public function kanOp(Request $request){
  176. // return;
  177. //这里需要实现一个逻辑,就是我砍一刀我刚才拿配置还没注册
  178. $data=$this->getTurnplateActivity($request);
  179. $activity=$data['activity'];
  180. $turnplate=$data['turnplate'];
  181. $user=$data['user'];
  182. $where=$data['where'];
  183. $UserID=intval($activity->UserID);
  184. $FPID=$activity->FPID;
  185. $GlobalUID=$activity->GlobalUID;
  186. if($activity->State == 2){
  187. // return apiReturnFail('invalid state');
  188. return apiReturnFail(['web.turnplate.invalid','Invalid state']);
  189. }
  190. // if($activity->Created<time()-86400*3){
  191. //// return apiReturnFail('expired');
  192. // return apiReturnFail(['web.turnplate.expired','Activity Expired']);
  193. // }
  194. $type=1;
  195. $result = 0;
  196. $money = $activity->Amount;
  197. $newTimes = $activity->NewTimes;
  198. $oldTimes = $activity->OldTimes;
  199. if($newTimes+$oldTimes<1){
  200. return apiReturnFail(['web.turnplate.notimes','No times']);
  201. }
  202. $redisKey = 'turnplate_kan_'.$UserID;
  203. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  204. if (!$res) {
  205. return apiReturnFail(['web.turnplate.toofast','Requested too frequently']);
  206. }
  207. if($activity->TotalKan == 0){
  208. $result = rand(3000,3600);
  209. $type = 2;
  210. }else{
  211. $type=1;
  212. $result = 0;
  213. }
  214. DB::connection('write')->table('agent.dbo.ActivityTurnplate')->where('UserID', $UserID)->update(['NewTimes'=> $newTimes?$activity->NewTimes-1:$activity->NewTimes,'OldTimes'=> (!$newTimes)?$activity->OldTimes-1:$activity->OldTimes,'Amount' => $money+$result,'State' =>$money+$result>=4000?1:0,'TotalKan' => $activity->TotalKan+1 ]);
  215. SetNXLock::release($redisKey);
  216. return apiReturnSuc(['type' => $type,'bonus' => $result,'times' => $oldTimes+$newTimes-1,'collect_amount' => intval($money+$result)]);
  217. }
  218. public function kanBonus(Request $request) {
  219. $UserID = $request->user() ?$request->user()->UserID : 0;
  220. $start = 0;
  221. $end = 0;
  222. $activity = DB::table('agent.dbo.ActivityTurnplate')
  223. ->where('UserID',$UserID)->first();
  224. // if($activity->State != 1){
  225. //
  226. // return apiReturnFail(['web.turnplate.invalid','Invalid state']);
  227. //
  228. // }
  229. $redisKey = 'turnplate_bonus_'.$UserID;
  230. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  231. if (!$res) {
  232. return apiReturnFail(['web.turnplate.toofast','Requested too frequently']);
  233. }
  234. $exchangeScore = intval($activity->Amount ?? 0);
  235. if ($exchangeScore < 4000) {
  236. SetNXLock::release($redisKey);
  237. return apiReturnFail(['web.turnplate.no_amount','No reward can be collected now']);
  238. }
  239. $withdrawInfo = DB::table(TableName::QPAccountsDB() . 'AccountWithDrawInfo')
  240. ->where('UserID', $UserID)
  241. ->first();
  242. if (!$withdrawInfo) {
  243. SetNXLock::release($redisKey);
  244. return apiReturnFail(['web.turnplate.withdraw_info_missing','Please complete withdrawal info first']);
  245. }
  246. // $taxRate = DB::table(TableName::QPAccountsDB() . 'SystemStatusInfo')
  247. // ->where('StatusName', 'WithDrawTax')
  248. // ->value('StatusValue') ?? 0;
  249. // $tax = (int) round($exchangeScore * intval($taxRate) / 10000);
  250. // $withDrawAmount = max($exchangeScore - $tax, 0);
  251. // $orderId = 'TP' . date('YmdHis') . strtoupper(Str::random(4));
  252. $insertData = json_decode(json_encode($activity), true);
  253. $insertData['updated'] = time();
  254. unset($insertData['id']);
  255. $writeConn = DB::connection('write');
  256. $recordTable = TableName::QPRecordDB() . 'RecordUserTotalStatistics';
  257. $historyWithDraw = intval($withdrawInfo->HistoryWithDraw ?? 0);
  258. $winAmount = intval($withdrawInfo->Win ?? 0);
  259. $newHistory = max(0, $historyWithDraw - $exchangeScore);
  260. $newWin = $winAmount + $exchangeScore;
  261. try {
  262. $writeConn->beginTransaction();
  263. $writeConn->table('agent.dbo.ActivityTurnplate')
  264. ->where('UserID', $UserID)
  265. ->delete();
  266. $writeConn->table('agent.dbo.ActivityTurnplateHistory')->insert($insertData);
  267. $writeConn->table(TableName::QPAccountsDB() . 'OrderWithDraw')->insert([
  268. 'UserID' => $UserID,
  269. 'AccountsBank' => $withdrawInfo->AccountsBank ?? '',
  270. 'PhoneNumber' => $withdrawInfo->PhoneNumber ?? '',
  271. 'IFSCNumber' => $withdrawInfo->IFSCNumber ?? '',
  272. 'BankUserName' => $withdrawInfo->BankUserName ?? '',
  273. 'EmailAddress' => $withdrawInfo->EmailAddress ?? '',
  274. 'PANNumber' => $withdrawInfo->PANNumber ?? '',
  275. 'AdhaarNumber' => $withdrawInfo->AdhaarNumber ?? '',
  276. 'WithDraw' => $exchangeScore,
  277. 'State' => 1,
  278. 'AiCheckState' => 0,
  279. 'BankNO' => $withdrawInfo->BankNO ?? '',
  280. 'ServiceFee' => 0,
  281. 'CreateDate' => now(),
  282. 'BranchBank' => $withdrawInfo->BranchBank ?? '',
  283. 'OrderId' => $activity->id,
  284. 'PixNum' => $withdrawInfo->PixNum ?? '',
  285. 'PixType' => $withdrawInfo->PixType ?? 1,
  286. 'score_type' => 2
  287. ]);
  288. $writeConn->table(TableName::QPAccountsDB() . 'AccountWithDrawInfo')
  289. ->where('UserID', $UserID)
  290. ->update([
  291. 'HistoryWithDraw' => $newHistory,
  292. 'Win' => $newWin,
  293. ]);
  294. $stats = $writeConn->table($recordTable)->where('UserID', $UserID)->first();
  295. if ($stats) {
  296. $writeConn->table($recordTable)
  297. ->where('UserID', $UserID)
  298. ->update(['DrawBase' => intval($stats->DrawBase ?? 0) + $exchangeScore]);
  299. } else {
  300. $writeConn->table($recordTable)
  301. ->insert(['UserID' => $UserID, 'DrawBase' => $exchangeScore]);
  302. }
  303. // 邀请人发起提现后,解除其下所有被邀请人的绑定关系
  304. AgentUser::query()
  305. ->where('Higher1ID', $UserID)
  306. ->update([
  307. 'Higher1GUID' => null,
  308. 'Higher1ID' => 0,
  309. 'Higher2GUID' => null,
  310. 'Higher2ID' => 0,
  311. 'Higher3GUID' => null,
  312. 'Higher3ID' => 0,
  313. 'Higher4GUID' => null,
  314. 'Higher4ID' => 0,
  315. 'LinkCode' => '',
  316. ]);
  317. $writeConn->commit();
  318. } catch (\Throwable $e) {
  319. $writeConn->rollBack();
  320. SetNXLock::release($redisKey);
  321. Log::error('turnplate bonus failed', [
  322. 'user_id' => $UserID,
  323. 'error' => $e->getMessage()
  324. ]);
  325. return apiReturnFail(['web.turnplate.bonus_fail','failed'], [], 500);
  326. }
  327. // select @AccountsBank = AccountsBank,@BankUserName = BankUserName,@Switch=Switch,
  328. // @PhoneNumber = PhoneNumber,@IFSCNumber = IFSCNumber,@EmailAddress = EmailAddress,
  329. // @PANNumber = PANNumber,@AdhaarNumber = AdhaarNumber,@BankNO = BankNO,@BranchBank = BranchBank,@PixNum=PixNum,@PixType=PixType
  330. // from QPAccountsDB.dbo.AccountWithDrawInfo where UserID = @UserID
  331. // insert into QPAccountsDB.dbo.OrderWithDraw (UserID,AccountsBank,PhoneNumber,IFSCNumber,
  332. // BankUserName,EmailAddress,PANNumber,AdhaarNumber,WithDraw,[State],AiCheckState,BankNO,ServiceFee,CreateDate,BranchBank,OrderId,PixNum,PixType)
  333. // values(@UserID,@AccountsBank,@PhoneNumber,@IFSCNumber,@BankUserName,@EmailAddress,@PANNumber,@AdhaarNumber,@ExchangeScore-@TAX,1,
  334. // 0,@BankNO,@TAX,GETDATE(),@BranchBank,@OrderId,@PixNum,@PixType)
  335. //update QPAccountsDB.dbo.AccountWithDrawInfo set HistoryWithDraw = HistoryWithDraw-@ExchangeScore,Win=Win+@ExchangeScore where UserID = @UserID
  336. //
  337. // UPDATE QPRecordDB.dbo.RecordUserTotalStatistics SET DrawBase=DrawBase+@ExchangeScore WHERE UserID=@UserID
  338. SetNXLock::release($redisKey);
  339. return apiReturnSuc(['Amount' => 0]);
  340. }
  341. public function kanShare(Request $request) {
  342. return;
  343. $user = LoginController::checkLogin($request);
  344. $UserID = @$user->UserID ?? 0;
  345. $GlobalUID = $user->GlobalUID ?? "";
  346. $FPID=$request->input("bfp","");
  347. $start = 0;
  348. $end = 0;
  349. $act = AgentService::decodeAct($request);
  350. if(is_numeric($act)) {
  351. if ($act == 0) {
  352. return apiReturnFail(['web.activity.invalid_act', 'No act found']);
  353. } else if ($act == -1) {
  354. return apiReturnFail(['web.activity.invalid_act', 'Invalid String']);
  355. }
  356. }
  357. // $httpserver=$_SERVER['HTTP_ORIGIN']??trim($_SERVER['HTTP_REFERER'],"/");
  358. // $link = $httpserver .'/?act='.$this->customEncrypt("tp|".$UserID."|".$GlobalUID);
  359. $SpreadID =$act->UserID;
  360. if(intval($SpreadID)<10000 || $UserID == $SpreadID){
  361. // var_dump($UserID,$SpreadID);
  362. return apiReturnFail(['web.activity.invalid_act_uid','Invalid UserID']);
  363. }
  364. $redisKey = 'turnplate_share_'.$UserID;
  365. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  366. if (!$res) {
  367. return apiReturnFail(['web.turnplate.to_many_request','Too many request']);
  368. }
  369. $activity = DB::table('agent.dbo.ActivityTurnplate')
  370. ->where('UserID',$SpreadID)->first();
  371. if($activity){
  372. //检查是否帮助过
  373. // $where=[['HelpUserID',$SpreadID]];
  374. // $where[]=$UserID?['UserID',$UserID]:['FPID',$FPID];
  375. $findUserID=$UserID;
  376. if($UserID==0)$findUserID=999999999;
  377. $alreadyHelp=DB::table("agent.dbo.ActivityTurnplateHelpRecord")
  378. ->whereRaw("HelpUserID='$SpreadID' and (UserID=$findUserID or FPID='$FPID')")->exists();
  379. if($alreadyHelp){
  380. return apiReturnFail(['web.turnplate.already_help','Already Help']);
  381. }
  382. DB::table("agent.dbo.ActivityTurnplateHelpRecord")->insert([
  383. 'UserID' => $UserID,
  384. 'GlobalUID' => $GlobalUID,
  385. 'FPID' => $FPID,
  386. 'HelpUserID' => $SpreadID,
  387. 'HelpFPID' => $activity->FPID,
  388. 'HelpGlobalUID' => $activity->GlobalUID,
  389. ]);
  390. //给帮助的+1
  391. DB::connection('write')->table('agent.dbo.ActivityTurnplate')->where('UserID',$SpreadID)->update(['OldTimes' => $activity->OldTimes+1]);
  392. SetNXLock::release($redisKey);
  393. $helpUser=GlobalUserInfo::getGameUserInfo('GlobalUID',$activity->GlobalUID);
  394. return apiReturnSuc(['NickName'=>$helpUser->NickName,'GameID'=>$helpUser->GameID,'GlobalUID'=>$helpUser->GlobalUID],['turnplate.help_success',"Thanks for your help ,$helpUser->NickName get new chance!"]);
  395. }else{
  396. SetNXLock::release($redisKey);
  397. return apiReturnFail(['web.activity.wrong_act','Invalid act string.']);
  398. }
  399. }
  400. }