ExtensionsController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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\GlobalUserInfo;
  7. use App\Game\Services\AgentService;
  8. use App\Http\helper\NumConfig;
  9. use App\Models\AccountsInfo;
  10. use App\Services\ExtensionCopy;
  11. use App\Services\Extensions;
  12. use App\Util;
  13. use App\Utility\SetNXLock;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Crypt;
  16. use Illuminate\Support\Facades\DB;
  17. use Illuminate\Support\Facades\Log;
  18. use Illuminate\Support\Facades\Redis;
  19. use Illuminate\Support\Str;
  20. // 裂变入口
  21. // 数值统一要除 100
  22. class ExtensionsController
  23. {
  24. public static function customEncrypt($string) {
  25. $string = (string) $string;
  26. // 自定义加密逻辑,这里使用简单的替换算法
  27. $characters = 'e8fi0mKL9MNOno7pqaDE1FghGb|-3cduvwxyzA6BCHIJPjklQRS4TU2VWXrs5tYZ';
  28. $result = '';
  29. for ($i = 0; $i < strlen($string); $i++) {
  30. $char = $string[$i];
  31. $pos = strpos($characters, $char);
  32. $newPos = ($pos + 5) % strlen($characters); // 替换规则,这里偏移值为5,可以根据需求修改
  33. $result .= $characters[$newPos];
  34. }
  35. return $result;
  36. }
  37. public static function customDecrypt($string) {
  38. // 自定义解密逻辑,与加密逻辑相反
  39. $characters = 'e8fi0mKL9MNOno7pqaDE1FghGb|-3cduvwxyzA6BCHIJPjklQRS4TU2VWXrs5tYZ';
  40. $result = '';
  41. for ($i = 0; $i < strlen($string); $i++) {
  42. $char = $string[$i];
  43. $pos = strpos($characters, $char);
  44. $newPos = ($pos - 5 + strlen($characters)) % strlen($characters); // 解密的反向操作
  45. $result .= $characters[$newPos];
  46. }
  47. return $result;
  48. }
  49. private function getTurnplateActivity(Request $request)
  50. {
  51. $user = $request->user()??LoginController::checkLogin($request);
  52. $UserID = @$user->UserID ?? 0;
  53. $GlobalUID = @$user->GlobalUID ?? "";
  54. $FPID=$request->input("bfp","");
  55. $where=[];
  56. if(!$where&&$UserID)$where=['UserID',$UserID];
  57. if(!$where&&!empty($GlobalUID))$where=['GlobalUID',$GlobalUID];
  58. if(!$where&&!empty($FPID))$where=['FPID',$FPID];
  59. if(empty($where)){
  60. $where=['UserID',0];
  61. }
  62. $activity = DB::table('agent.dbo.ActivityTurnplate')
  63. ->where([$where])
  64. ->first();
  65. //用UserID没拿到,那看指纹ID
  66. if(!$activity&&$UserID){
  67. $activity = DB::table('agent.dbo.ActivityTurnplate')
  68. ->where('FPID',$FPID)
  69. ->where('UserID',0)
  70. ->first();
  71. //顺便更新下
  72. if($activity&&$UserID){
  73. DB::table('agent.dbo.ActivityTurnplate')
  74. ->where('FPID',$FPID)->update(['UserID'=>$UserID,'GlobalUID'=>$GlobalUID]);
  75. }
  76. }
  77. $insert = 0;
  78. if($activity){
  79. if($activity->Created<time()-86400*3 && $activity->State == 0){ //超过3天
  80. $turnplate = [
  81. 'times' => 1,
  82. 'countdown' => 86400*3,
  83. 'total_amount' => 10000,
  84. 'collect_amount' => 0
  85. ];
  86. $insert = 1;
  87. $insertData = json_decode(json_encode($activity),true);
  88. $insertData['updated'] = time();
  89. unset($insertData['ID'],$insertData['id']);
  90. DB::connection('write')->table('agent.dbo.ActivityTurnplateHistory')->insert($insertData);
  91. DB::connection('write')->table('agent.dbo.ActivityTurnplate')->where('UserID', $UserID)->delete();
  92. }else{
  93. if($activity->LastFreeTimes+86400-3600<time()){
  94. $activity->OldTimes += 1;
  95. DB::connection('write')->table('agent.dbo.ActivityTurnplate')->where('UserID', $UserID)->update(['OldTimes'=> $activity->OldTimes,'LastFreeTimes' => time()]);
  96. }
  97. $turnplate = [
  98. 'times' => $activity->NewTimes+$activity->OldTimes,
  99. 'countdown' => $activity->Created+86400*3-time(),
  100. 'total_amount' => 10000,
  101. 'collect_amount' => intval($activity->Amount)
  102. ];
  103. }
  104. }else{
  105. $turnplate = [
  106. 'times' => 1,
  107. 'countdown' => 86400*3,
  108. 'total_amount' => 10000,
  109. 'collect_amount' => 0
  110. ];
  111. $insert = 1;
  112. }
  113. if($insert){
  114. $data = [
  115. 'UserID' => $UserID,
  116. 'GlobalUID' => $GlobalUID,
  117. 'FPID' => $FPID,
  118. 'Amount' => $turnplate['collect_amount'],
  119. 'NewTimes' => 1,
  120. 'Created' => time(),
  121. 'LastFreeTimes' => time()
  122. ];
  123. $ID=DB::table('agent.dbo.ActivityTurnplate')->insertGetId($data);
  124. $activity=DB::table('agent.dbo.ActivityTurnplate')->where('ID',$ID)->first();
  125. }
  126. return compact('activity','turnplate','user','where');
  127. }
  128. public function turnplate(Request $request){
  129. $data=$this->getTurnplateActivity($request);
  130. $activity=$data['activity'];
  131. $turnplate=$data['turnplate'];
  132. $user=$data['user'];
  133. $where=$data['where'];
  134. $FPID=$request->bfp??"";
  135. $UserID=0;
  136. $GlobalUID="";
  137. if($activity) {
  138. try {
  139. $UserID = intval($activity->UserID ?? 0);
  140. $FPID = $activity->FPID;
  141. $GlobalUID = $activity->GlobalUID;
  142. } catch (\Exception $exception) {
  143. Log::error("turnplate:" . $exception->getMessage(), compact('data', 'user', 'where'));
  144. }
  145. }
  146. $redisKey = 'turnplate_index_'.$where[1];
  147. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  148. if (!$res) {
  149. return apiReturnFail(['web.turnplate.toofast','Requested too frequently']);
  150. }
  151. $myRecord = [];
  152. $dao = new AccountPayInfo();
  153. $myRecordList = DB::connection('write')->table('agent.dbo.ActivityTurnplateHistory')->where('State',1)->where([$where])->get();
  154. if($myRecordList && $UserID){
  155. $account = new AccountsInfo();
  156. $myInfo = $account->getUserPhone($UserID);
  157. $userInfo = DB::table(TableName::QPAccountsDB() . 'AccountsInfo')
  158. ->where('UserID', $UserID)
  159. ->first();
  160. if($userInfo) {
  161. $nickname = $userInfo->NickName;
  162. foreach ($myRecordList as $itemM) {
  163. $myRecord[] = ['phone' => $myInfo ?: '', 'name' => $nickname, 'amount' => 100];
  164. }
  165. }
  166. }
  167. if (Redis::exists('turnplate_record1')) {
  168. $record = Redis::get('turnplate_record1');
  169. $record = json_decode($record,true);
  170. } else{
  171. $record = [];
  172. for($i=0;$i<50;$i++){
  173. $record[] = ['phone' => rand(1234, 9876) . '' . rand(1234, 9876) . '' . rand(12, 98), 'name' => rand(1, 100) > 10 ? $dao->randUserName('') : 'U' . rand(1234, 9876), 'amount' => 100];
  174. }
  175. Redis::set('turnplate_record1',json_encode($record));
  176. Redis::expire('turnplate_record1', 100);
  177. }
  178. if (Redis::exists('turnplate_numbers_1_'.$FPID)) {
  179. $numbers = Redis::get('turnplate_numbers_1_'.$FPID);
  180. $numbers = json_decode($numbers,true);
  181. } else{
  182. $numbers = [];
  183. // for($i=0;$i<50;$i++){
  184. // array_push($numbers,'55'.rand(1234,9876).''.rand(1234,9876).''.rand(12,98));
  185. // }
  186. $result=DB::connection('write')->select("SELECT TOP 20 ap.PhoneNum
  187. FROM
  188. QPAccountsDB.dbo.AccountPhone ap
  189. INNER JOIN
  190. QPAccountsDB.dbo.AccountsInfo ai ON ap.UserID = ai.UserID
  191. WHERE
  192. DATEDIFF(day, ai.LastLogonDate, GETDATE()) > 7
  193. ORDER BY
  194. NEWID()");
  195. $numbers=array_map(function($item){
  196. return '55'.trim($item->PhoneNum);
  197. },$result);
  198. Redis::set('turnplate_numbers_1_'.$FPID,json_encode($numbers));
  199. Redis::expire('turnplate_numbers_1_'.$FPID, 86400*3);
  200. }
  201. // $httpserver=$_SERVER['HTTP_ORIGIN']??(@$_SERVER['HTTP_REFERER']?trim($_SERVER['HTTP_REFERER'],"/"):"https://24680.com");
  202. // $link = $httpserver .'/#/cashwheel?act='.self::encodeAct($GlobalUID,'WheelFree100');
  203. $link = AgentService::getShareLink($GlobalUID??"",'WheelFree100');
  204. SetNXLock::release($redisKey);
  205. return apiReturnSuc(compact('turnplate', 'record','link','numbers','myRecord'));
  206. }
  207. public function kanOp(Request $request){
  208. //这里需要实现一个逻辑,就是我砍一刀我刚才拿配置还没注册
  209. $data=$this->getTurnplateActivity($request);
  210. $activity=$data['activity'];
  211. $turnplate=$data['turnplate'];
  212. $user=$data['user'];
  213. $where=$data['where'];
  214. $UserID=intval($activity->UserID);
  215. $FPID=$activity->FPID;
  216. $GlobalUID=$activity->GlobalUID;
  217. if($activity->State != 0){
  218. // return apiReturnFail('invalid state');
  219. return apiReturnFail(['web.turnplate.invalid','Invalid state']);
  220. }
  221. if($activity->Created<time()-86400*3){
  222. // return apiReturnFail('expired');
  223. return apiReturnFail(['web.turnplate.expired','Activity Expired']);
  224. }
  225. $type=1;
  226. $result = 0;
  227. $money = $activity->Amount;
  228. $newTimes = $activity->NewTimes;
  229. $oldTimes = $activity->OldTimes;
  230. if($newTimes+$oldTimes<1){
  231. return apiReturnFail(['web.turnplate.notimes','No times']);
  232. }
  233. $redisKey = 'turnplate_kan_'.$UserID;
  234. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  235. if (!$res) {
  236. return apiReturnFail(['web.turnplate.toofast','Requested too frequently']);
  237. }
  238. if($activity->TotalKan == 0){
  239. $result = rand(9400,9600);
  240. $type = 2;
  241. }else{
  242. if($newTimes){
  243. if($money<=9600){
  244. $type=2;
  245. $result = rand(150,200);
  246. }elseif ($money>=9601 && $money<=9800){
  247. if(rand(0,100)>=50){
  248. $type=2;
  249. $result = rand(20,100);
  250. }else{
  251. $type=4;
  252. $result = 100;
  253. }
  254. }elseif ($money>=9801 && $money<=9950){
  255. if(rand(0,100)>=0){
  256. $type=2;
  257. $result = rand(2,12);
  258. }else{
  259. $type=1;
  260. $result = 0;
  261. }
  262. }elseif ($money>=9951 && $money<=9999){
  263. if(rand(0,100)>=0){
  264. $type=2;
  265. $result = min(rand(1,2),10000-$money);
  266. }else{
  267. $type=1;
  268. $result = 0;
  269. }
  270. }
  271. }else{
  272. if($money<=9600){
  273. $type=2;
  274. $result = rand(150,200);
  275. }elseif ($money>=9601 && $money<=9800){
  276. if(rand(0,100)>=50){
  277. $type=2;
  278. $result = rand(10,50);
  279. }else{
  280. $type=1;
  281. $result = 0;
  282. }
  283. }elseif ($money>=9801 && $money<=9950){
  284. if(rand(0,100)>=60){
  285. $type=2;
  286. $result = rand(1,2);
  287. }else{
  288. $type=1;
  289. $result = 0;
  290. }
  291. }elseif ($money>=9951 && $money<=9999){
  292. $type=1;
  293. $result = 0;
  294. }
  295. }
  296. }
  297. 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>=10000?1:0,'TotalKan' => $activity->TotalKan+1 ]);
  298. SetNXLock::release($redisKey);
  299. return apiReturnSuc(['type' => $type,'bonus' => $result,'times' => $oldTimes+$newTimes-1,'collect_amount' => intval($money+$result)]);
  300. }
  301. public function kanBonus(Request $request) {
  302. $UserID = $request->user() ?$request->user()->UserID : 0;
  303. $start = 0;
  304. $end = 0;
  305. $activity = DB::table('agent.dbo.ActivityTurnplate')
  306. ->where('UserID',$UserID)->first();
  307. if($activity->State != 1){
  308. return apiReturnFail(['web.turnplate.invalid','Invalid state']);
  309. }
  310. $redisKey = 'turnplate_bonus_'.$UserID;
  311. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  312. if (!$res) {
  313. return apiReturnFail(['web.turnplate.toofast','Requested too frequently']);
  314. }
  315. DB::connection('write')->table('agent.dbo.ActivityTurnplate')->where('UserID', $UserID)->delete();
  316. $insertData = json_decode(json_encode($activity),true);
  317. $insertData['updated'] = time();
  318. DB::connection('write')->table('agent.dbo.ActivityTurnplateHistory')->insert($insertData);
  319. //领钱
  320. DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $UserID)->increment('Score', 10000);
  321. SetNXLock::release($redisKey);
  322. return apiReturnSuc(['bonus' => 10000]);
  323. }
  324. public function kanShare(Request $request) {
  325. $user = LoginController::checkLogin($request);
  326. $UserID = @$user->UserID ?? 0;
  327. $GlobalUID = $user->GlobalUID ?? "";
  328. $FPID=$request->input("bfp","");
  329. $start = 0;
  330. $end = 0;
  331. $act = AgentService::decodeAct($request);
  332. if(is_numeric($act)) {
  333. if ($act == 0) {
  334. return apiReturnFail(['web.activity.invalid_act', 'No act found']);
  335. } else if ($act == -1) {
  336. return apiReturnFail(['web.activity.invalid_act', 'Invalid String']);
  337. }
  338. }
  339. // $httpserver=$_SERVER['HTTP_ORIGIN']??trim($_SERVER['HTTP_REFERER'],"/");
  340. // $link = $httpserver .'/?act='.$this->customEncrypt("tp|".$UserID."|".$GlobalUID);
  341. $SpreadID =$act->UserID;
  342. if(intval($SpreadID)<10000 || $UserID == $SpreadID){
  343. // var_dump($UserID,$SpreadID);
  344. return apiReturnFail(['web.activity.invalid_act_uid','Invalid UserID']);
  345. }
  346. $redisKey = 'turnplate_share_'.$UserID;
  347. $res = SetNXLock::getExclusiveLock($redisKey, 5);
  348. if (!$res) {
  349. return apiReturnFail(['web.turnplate.to_many_request','Too many request']);
  350. }
  351. $activity = DB::table('agent.dbo.ActivityTurnplate')
  352. ->where('UserID',$SpreadID)->first();
  353. if($activity){
  354. //检查是否帮助过
  355. // $where=[['HelpUserID',$SpreadID]];
  356. // $where[]=$UserID?['UserID',$UserID]:['FPID',$FPID];
  357. $findUserID=$UserID;
  358. if($UserID==0)$findUserID=999999999;
  359. $alreadyHelp=DB::table("agent.dbo.ActivityTurnplateHelpRecord")
  360. ->whereRaw("HelpUserID='$SpreadID' and (UserID=$findUserID or FPID='$FPID')")->exists();
  361. if($alreadyHelp){
  362. return apiReturnFail(['web.turnplate.already_help','Already Help']);
  363. }
  364. DB::table("agent.dbo.ActivityTurnplateHelpRecord")->insert([
  365. 'UserID' => $UserID,
  366. 'GlobalUID' => $GlobalUID,
  367. 'FPID' => $FPID,
  368. 'HelpUserID' => $SpreadID,
  369. 'HelpFPID' => $activity->FPID,
  370. 'HelpGlobalUID' => $activity->GlobalUID,
  371. ]);
  372. //给帮助的+1
  373. DB::connection('write')->table('agent.dbo.ActivityTurnplate')->where('UserID',$SpreadID)->update(['OldTimes' => $activity->OldTimes+1]);
  374. SetNXLock::release($redisKey);
  375. $helpUser=GlobalUserInfo::getGameUserInfo('GlobalUID',$activity->GlobalUID);
  376. return apiReturnSuc(['NickName'=>$helpUser->NickName,'GameID'=>$helpUser->GameID,'GlobalUID'=>$helpUser->GlobalUID],['turnplate.help_success',"Thanks for your help ,$helpUser->NickName get new chance!"]);
  377. }else{
  378. SetNXLock::release($redisKey);
  379. return apiReturnFail(['web.activity.wrong_act','Invalid act string.']);
  380. }
  381. }
  382. }