PayRechargeController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <?php
  2. namespace App\Http\Controllers\Game;
  3. use App\Facade\TableName;
  4. use App\Game\Services\OuroGameService;
  5. use App\Http\Controllers\Controller;
  6. use App\Http\helper\NumConfig;
  7. use App\Models\Order;
  8. use App\Services\OrderServices;
  9. use App\Utility\SetNXLock;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Redis;
  13. class PayRechargeController extends Controller
  14. {
  15. // 充值记录
  16. public function orderList(Request $request)
  17. {
  18. $user_id = (int)$request->globalUser->UserID;//$request->get('user_id', 1);
  19. $page = $request->get('page', 1);
  20. $pageSize = $request->get('pageSize', 7);
  21. $redisKey = 'PayRecharge_orderList_'.$user_id;
  22. if (!SetNXLock::getExclusiveLock($redisKey)) {
  23. return apiReturnFail(['web.withdraw.try_again_later','Tente novamente mais tarde']);
  24. }
  25. $where[] = ['user_id', $user_id];
  26. $where[] = ['pay_status', 1];
  27. $cacheTime = 60 * rand(1, 2);
  28. // $list = cache()->remember($user_id . '_order_list', $cacheTime, function () use ($where, $pageSize) {
  29. //
  30. // return Order::where($where)
  31. // ->orderBy('finished_at', 'desc')
  32. // ->selectRaw('amount,payment_code,order_sn as payment_sn,finished_at,created_at,pay_status')
  33. // ->paginate(15,['*'],'page',1);
  34. // });
  35. $list = Order::query()->where($where)
  36. ->orderBy('finished_at', 'desc')
  37. ->selectRaw('amount,payment_code,order_sn as payment_sn,finished_at,created_at,pay_status')
  38. ->paginate($pageSize);
  39. // ->paginate(15,['*'],'page',1);
  40. foreach ($list as &$val) {
  41. $val->amount = number_format($val->amount, 2, '.', '');
  42. }
  43. SetNXLock::release($redisKey);
  44. return apiReturnSuc($list);
  45. }
  46. // 首充
  47. public function firstPay(Request $request)
  48. {
  49. $user = $request->user();
  50. $user_recharge = DB::table(TableName::QPAccountsDB() . 'YN_VIPAccount')
  51. ->where('UserID', $user->UserID)
  52. ->value('Recharge') ?: 0;
  53. if($user_recharge)return apiReturnSuc();
  54. $firstPayGift = DB::table('agent.dbo.recharge_gift')
  55. ->where('gift_id', 301)->first();
  56. if(!$firstPayGift) return apiReturnFail();
  57. $names = DB::table('agent.dbo.admin_configs')
  58. ->where([
  59. 'type' => 'pay_method',
  60. 'status' => 1,
  61. ])
  62. ->selectRaw('id, name, status, new_pay_type as type')
  63. ->orderByDesc('sort')->get()->toArray();
  64. $list = DB::table('agent.dbo.recharge_gear')
  65. ->select('id','money','favorable_price','give')
  66. ->orderBy('money', 'asc')->where('status', 1)->get();
  67. $gear=\GuzzleHttp\json_encode($names);
  68. foreach ($list as &$val) {
  69. $val->favorable_price = $val->favorable_price + $val->give;
  70. $val->gear = $gear;
  71. $val->recommend = 0;
  72. if($val->money == $firstPayGift->recommend){
  73. $val->recommend = 1;
  74. }
  75. }
  76. return apiReturnSuc(compact('list', 'firstPayGift'));
  77. }
  78. // 首充礼包(带倒计时逻辑)
  79. public function firstPayGift(Request $request)
  80. {
  81. $user = $request->user();
  82. // 检查用户是否已充值
  83. $user_recharge = DB::table(TableName::QPAccountsDB() . 'YN_VIPAccount')
  84. ->where('UserID', $user->UserID)
  85. ->value('Recharge') ?: 0;
  86. if ($user_recharge) {
  87. return apiReturnSuc([]); // 已充值用户返回空
  88. }
  89. // 获取首充礼包配置
  90. $firstPayGift = DB::table('agent.dbo.recharge_gift')
  91. ->where('gift_id', 301)
  92. ->first();
  93. if (!$firstPayGift) {
  94. return apiReturnFail('礼包配置不存在');
  95. }
  96. $redisKey = "first_pay_gift_timer_{$user->UserID}";
  97. $currentTime = time();
  98. // 检查Redis中的倒计时状态
  99. $timerData = Redis::get($redisKey);
  100. if ($timerData) {
  101. $timerData = json_decode($timerData, true);
  102. $firstRequestTime = $timerData['first_request_time'];
  103. $phase = $timerData['phase']; // 'first' 或 'daily'
  104. $lastExpireTime = $timerData['last_expire_time'] ?? 0;
  105. // 第一阶段:valid_h 倒计时
  106. if ($phase === 'first') {
  107. $expireTime = $firstRequestTime + ($firstPayGift->valid_h * 3600);
  108. // 检查是否在过期当天
  109. if ($currentTime >= $expireTime) {
  110. $expireDate = date('Y-m-d', $expireTime);
  111. $currentDate = date('Y-m-d', $currentTime);
  112. if ($expireDate === $currentDate) {
  113. // 过期当天返回空
  114. return apiReturnSuc([]);
  115. } else {
  116. // 进入第二阶段(每日循环)
  117. $nextDayStart = strtotime($expireDate . ' +1 day 00:00:00');
  118. $newExpireTime = $nextDayStart + ($firstPayGift->valid_h_2 * 3600);
  119. // 更新Redis状态为每日循环
  120. $newTimerData = [
  121. 'first_request_time' => $firstRequestTime,
  122. 'phase' => 'daily',
  123. 'current_cycle_start' => $nextDayStart,
  124. 'last_expire_time' => $newExpireTime
  125. ];
  126. Redis::set($redisKey, json_encode($newTimerData));
  127. // 检查是否在新的过期时间之前
  128. if ($currentTime < $newExpireTime) {
  129. return $this->getFirstPayGiftData($firstPayGift, $newExpireTime - $currentTime);
  130. } else {
  131. // 检查是否在过期当天
  132. $newExpireDate = date('Y-m-d', $newExpireTime);
  133. if ($newExpireDate === $currentDate) {
  134. return apiReturnSuc([]);
  135. }
  136. }
  137. }
  138. } else {
  139. // 第一阶段倒计时未结束,返回礼包数据
  140. return $this->getFirstPayGiftData($firstPayGift, $expireTime - $currentTime);
  141. }
  142. }
  143. // 第二阶段:每日循环 valid_h_2
  144. if ($phase === 'daily') {
  145. $currentCycleStart = $timerData['current_cycle_start'];
  146. $expireTime = $currentCycleStart + ($firstPayGift->valid_h_2 * 3600);
  147. // 检查是否已过期
  148. if ($currentTime >= $expireTime) {
  149. $expireDate = date('Y-m-d', $expireTime);
  150. $currentDate = date('Y-m-d', $currentTime);
  151. if ($expireDate === $currentDate) {
  152. // 过期当天返回空
  153. return apiReturnSuc([]);
  154. } else {
  155. // 计算新的一天的倒计时
  156. $todayStart = strtotime($currentDate . ' 00:00:00');
  157. $newExpireTime = $todayStart + ($firstPayGift->valid_h_2 * 3600);
  158. // 更新Redis
  159. $newTimerData = [
  160. 'first_request_time' => $firstRequestTime,
  161. 'phase' => 'daily',
  162. 'current_cycle_start' => $todayStart,
  163. 'last_expire_time' => $newExpireTime
  164. ];
  165. Redis::set($redisKey, json_encode($newTimerData));
  166. // 检查今天是否还在有效期内
  167. if ($currentTime < $newExpireTime) {
  168. return $this->getFirstPayGiftData($firstPayGift, $newExpireTime - $currentTime);
  169. } else {
  170. // 今天也已过期,返回空
  171. $newExpireDate = date('Y-m-d', $newExpireTime);
  172. if ($newExpireDate === $currentDate) {
  173. return apiReturnSuc([]);
  174. }
  175. }
  176. }
  177. } else {
  178. // 当前周期未过期,返回礼包数据
  179. return $this->getFirstPayGiftData($firstPayGift, $expireTime - $currentTime);
  180. }
  181. }
  182. }
  183. // 首次请求,初始化倒计时
  184. $expireTime = $currentTime + ($firstPayGift->valid_h * 3600);
  185. $timerData = [
  186. 'first_request_time' => $currentTime,
  187. 'phase' => 'first',
  188. 'last_expire_time' => $expireTime
  189. ];
  190. Redis::set($redisKey, json_encode($timerData));
  191. return $this->getFirstPayGiftData($firstPayGift, $firstPayGift->valid_h * 3600);
  192. }
  193. /**
  194. * 获取首充礼包数据(包含充值档位列表)
  195. * @param $firstPayGift 礼包配置
  196. * @param $timeLeft 剩余秒数(已经是用户实际剩余时间)
  197. */
  198. private function getFirstPayGiftData($firstPayGift, $timeLeft)
  199. {
  200. // 获取支付方式
  201. $names = DB::table('agent.dbo.admin_configs')
  202. ->where([
  203. 'type' => 'pay_method',
  204. 'status' => 1,
  205. ])
  206. ->selectRaw('id, name, status, new_pay_type as type')
  207. ->orderByDesc('sort')
  208. ->get()
  209. ->toArray();
  210. // 获取充值档位
  211. $list = DB::table('agent.dbo.recharge_gear')
  212. ->select('money', 'favorable_price', 'give')
  213. ->orderBy('money', 'asc')
  214. ->where('status', 1)
  215. ->get();
  216. $gear = \GuzzleHttp\json_encode($names);
  217. foreach ($list as &$val) {
  218. $val->favorable_price = $val->favorable_price + $val->give;
  219. $val->gear = $gear;
  220. $val->recommend = 0;
  221. if ($val->money == $firstPayGift->recommend) {
  222. $val->recommend = 1;
  223. }
  224. }
  225. return apiReturnSuc([
  226. 'list' => $list,
  227. 'gift_info' => [
  228. 'gift_id' => $firstPayGift->gift_id,
  229. 'gift_name' => $firstPayGift->gift_name,
  230. 'total_bonus' => $firstPayGift->total_bonus,
  231. 'bonus_instantly' => $firstPayGift->bonus_instantly,
  232. 'day_rewards' => $firstPayGift->day_rewards?json_decode($firstPayGift->day_rewards):'',
  233. 'betting_bonus' => $firstPayGift->betting_bonus?json_decode($firstPayGift->betting_bonus):'',
  234. 'betting_task' => $firstPayGift->betting_task?json_decode($firstPayGift->betting_task):'',
  235. ],
  236. 'time_left' => $timeLeft, // 剩余秒数
  237. 'expire_at' => time() + $timeLeft // 过期时间戳
  238. ]);
  239. }
  240. public function firstPayMulti(Request $request)
  241. {
  242. $user = LoginController::checkLogin($request);
  243. if($user){
  244. if(env('CONFIG_24680_NFTD_99',0)==0)if($user->Channel==99)return apiReturnFail();
  245. $fpkey='Firstpay_'.$user->UserID;
  246. if(Redis::exists($fpkey)){
  247. $data=Redis::get($fpkey);
  248. $data=json_decode($data,true);
  249. $data['timeleft']=86400-(time()-$data['buytime']);
  250. return apiReturnSuc(['leftitem'=>$data]);
  251. }
  252. $user_recharge = DB::table(TableName::QPAccountsDB() . 'YN_VIPAccount')
  253. ->where('UserID', $user->UserID)
  254. ->value('Recharge') ?: 0;
  255. if($user_recharge)return apiReturnFail();
  256. }
  257. $items=DB::table('agent.dbo.recharge_gear')
  258. ->where('status',1)
  259. ->where('second_give','>',0)
  260. ->where('first_pay','>=', 1)
  261. ->select('gift_id','money','give','favorable_price','second_give')->get()->each(function($item){
  262. $item->id=28;
  263. })->toArray();
  264. $default=count($items)-1;
  265. return apiReturnSuc(compact('items','default'));
  266. }
  267. public function getSecondGive(Request $request)
  268. {
  269. $user = $request->user();
  270. $fpkey='Firstpay_'.$user->UserID;
  271. if(Redis::exists($fpkey)){
  272. $data=Redis::get($fpkey);
  273. $data=json_decode($data,true);
  274. $data['timeleft']=86400-(time()-$data['buytime']);
  275. if($data['timeleft']<=0) {
  276. Redis::del($fpkey);
  277. //加钱
  278. if($data['second_give']){
  279. $czReason=$data['czReason'];
  280. $cjReason=$data['cjReason'];
  281. [$OrgScore,$NowScore]=OuroGameService::AddScore($user->UserID,$data['second_give']*NumConfig::NUM_VALUE,$cjReason);
  282. //更新二次领钱记录
  283. DB::table(TableName::agent() . 'guide_payment')->where('UserID',$user->UserID)->update([
  284. 'GetSecondTime' => now(),
  285. 'SecondScoreNum'=>$data['second_give']*NumConfig::NUM_VALUE
  286. ]);
  287. return apiReturnSuc(compact('OrgScore','NowScore'));
  288. }
  289. return apiReturnSuc();
  290. }
  291. }
  292. return apiReturnFail(['web.withdraw.try_again_later','Tente novamente mais tarde']);
  293. }
  294. }