PgSoftController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. namespace App\Http\Controllers\Game;
  3. use App\Facade\TableName;
  4. use App\Game\BetBy\ErrorItem;
  5. use App\Game\GameCard;
  6. use App\Game\GlobalUserInfo;
  7. use App\Game\LogGamecardClick;
  8. use App\Game\Services\OuroGameService;
  9. use App\Game\Services\PgSoftService;
  10. use App\Game\Services\PlatformService;
  11. use App\Game\Services\ServerService;
  12. use App\Http\helper\NumConfig;
  13. use App\Models\AccountsInfo;
  14. use App\Notification\TelegramBot;
  15. use App\Util;
  16. use App\Utility\SetNXLock;
  17. use GuzzleHttp\Client;
  18. use GuzzleHttp\Exception\RequestException;
  19. use Illuminate\Http\Request;
  20. use Illuminate\Routing\Controller;
  21. use Illuminate\Support\Facades\DB;
  22. use Illuminate\Support\Facades\Redis;
  23. class PgSoftController extends Controller
  24. {
  25. protected $pgSoftService;
  26. protected $client;
  27. protected $Currency;
  28. public function __construct(PgSoftService $pgSoftService)
  29. {
  30. $this->client = new Client();
  31. $this->pgSoftService = $pgSoftService;
  32. $this->Currency=env('CONFIG_24680_CURRENCY');
  33. }
  34. private function handleRequestException(\Exception $e)
  35. {
  36. TelegramBot::getDefault()->sendMsgWithEnv($e->getMessage().$e->getTraceAsString());
  37. }
  38. private function callSubApi($ext_player_id,$method,$request)
  39. {
  40. $apiurl=ServerService::GetApiByGUID($ext_player_id);
  41. try {
  42. // 获取当前请求的 GET 和 POST 数据
  43. $getData = $request->query(); // 获取 GET 数据
  44. $postData = $request->post(); // 获取 POST 数据
  45. $response = $this->client->post( $apiurl . '/game/pgpro/'.$method, [
  46. 'verify'=>false,
  47. 'query' => $getData, // 传递 GET 数据
  48. 'form_params' => $postData, // 传递 POST 数据
  49. ]);
  50. $res=json_decode($response->getBody(),true);
  51. Util::WriteLog('pgsub',$res);
  52. return $res;
  53. } catch (RequestException $e) {
  54. return $this->handleRequestException($e);
  55. }
  56. }
  57. public function gameLunch(Request $request)
  58. {
  59. $gid=$request->input('gid');
  60. $user = $request->user();
  61. $userid=$user->UserID;
  62. if($user->Channel!=99&&$user->Channel!=44){
  63. if(in_array($gid,PgSimController::$readyGames)){
  64. $existOne=GameCard::where('gid',$gid)->where('brand','PGSoft')->first();
  65. if($existOne){
  66. return (new PgSimController())->gameLunch($request);
  67. }
  68. }
  69. http_response_code(404);
  70. exit();
  71. }
  72. GameCard::$enableStateCheck=false;
  73. $gamecard=GameCard::where('gid',$gid)->first();
  74. $in_gameid=OuroGameService::getUserInGame($userid,$user->GlobalUID);
  75. if($in_gameid!=intval($gamecard->id)){
  76. Util::WriteLog('24680game',compact('in_gameid','gamecard','user'));
  77. // die;
  78. }
  79. $gamecard=GameCard::where('gid',$gid)->where('brand','PG')->first();
  80. $gamecard->increment('play_num',1);
  81. //$this->logGameClick($gamecard->id,$userid);
  82. LogGamecardClick::recordClick($gamecard->id,$userid);
  83. $lang=GlobalUserInfo::getLocale();
  84. $supportLang = ['en','da','de','es','fi','fr','id','it','ja','ko','nl','no','pl','pt','ro','ru','sv','th','tr','vi','zh','my'];
  85. if(!in_array($lang,$supportLang)){
  86. $lang = 'en';
  87. }
  88. echo "<script>
  89. parent.postMessage({cmd:\"closeLoading\"},\"*\");
  90. </script>";
  91. header("Cache-Control: no-cache, no-store, must-revalidate");
  92. //header("Pragma: no-cache"); // HTTP 1.0
  93. header("Expires: 0"); // 禁止客户端缓存
  94. $res=null;
  95. while(!is_string($res)){
  96. $res=$this->pgSoftService->getLaunchURLHTML($gid,$user->GlobalUID,$request->ip(),$lang);
  97. if(!is_string($res))sleep(1);
  98. }
  99. return $res;
  100. }
  101. public function gameList()
  102. {
  103. $response = $this->pgSoftService->getGamesList();
  104. return response()->json($response);
  105. }
  106. public function VerifySession(Request $request)
  107. {
  108. $post = $request->all();
  109. Util::WriteLog('pg_token',$post);
  110. if(!$this->pgSoftService->VerifySession(@$post['operator_token'], @$post['secret_key'])){
  111. return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  112. }
  113. $playerId = @$post['operator_player_session'];
  114. if(!ServerService::IsLocalUser($playerId)) {
  115. return $this->callSubApi($playerId,'VerifySession',$request);
  116. }
  117. $user = GlobalUserInfo::getGameUserInfo('GlobalUID', $playerId);
  118. if(!$user) return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  119. Util::WriteLog('pg_token',$user);
  120. Util::WriteLog('pg_token',['data' => ['player_name' => $playerId,'nickname' => $user->NickName,'currency' => $this->Currency],'error' => null]);
  121. return response()->json(['data' => ['player_name' => $playerId,'nickname' => $user->NickName,'currency' => $this->Currency],'error' => null]);
  122. }
  123. public function balance(Request $request)
  124. {
  125. ///ff
  126. ///
  127. // Route::any('/pgsub/game_list', 'Game\PgSoftController@gameList');
  128. // Route::any('/pgsub/VerifySession', 'Game\PgSoftController@VerifySession');
  129. // Route::any('/pgsub/Cash/Get', 'Game\PgSoftController@balance');
  130. $post = $request->all();
  131. Util::WriteLog('pg_balance',$post);
  132. if(!$this->pgSoftService->VerifySession(@$post['operator_token'], @$post['secret_key'])){
  133. return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  134. }
  135. $playerId = @$post['player_name'];
  136. if(!ServerService::IsLocalUser($playerId)) {
  137. return $this->callSubApi($playerId,'Cash/Get',$request);
  138. }
  139. $user = GlobalUserInfo::getGameUserInfo('GlobalUID', $playerId);
  140. if (!$user) return response()->json(['data' => null, 'error' => ['code' => 1034, 'message' => 'invalid session']]);
  141. $score = GlobalUserInfo::getScoreByUserID($user->UserID);
  142. Util::WriteLog('pg_balance', ['data' => ['currency_code' => $this->Currency, 'balance_amount' => $score, 'updated_time' => Util::getUnixTimestampMillis()], 'error' => null]);
  143. return response()->json(['data' => ['currency_code' => $this->Currency, 'balance_amount' => $score, 'updated_time' => Util::getUnixTimestampMillis()], 'error' => null]);
  144. }
  145. // Route::any('/pgsub/Cash/TransferInOut', 'Game\PgSoftController@cashTransferInOut');
  146. public function cashTransferInOut(Request $request)
  147. {
  148. $post = $request->all();
  149. Util::WriteLog('pg_inout',$post);
  150. if(!$this->pgSoftService->VerifySession(@$post['operator_token'], @$post['secret_key'])){
  151. return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  152. }
  153. $playerId = @$post['player_name'];
  154. if(!ServerService::IsLocalUser($playerId)) {
  155. return $this->callSubApi($playerId,'Cash/TransferInOut',$request);
  156. }
  157. $user = GlobalUserInfo::getGameUserInfo('GlobalUID', $playerId);
  158. if(!$user) return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  159. Util::WriteLog('pg_inout',$user);
  160. if(@$post['currency_code'] != $this->Currency){
  161. return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  162. }
  163. $transactionId = $post['transaction_id'];
  164. $score = GlobalUserInfo::getScoreByUserID($user->UserID);
  165. $isBet = @$post['is_wager'];
  166. $bet = $post['bet_amount'];
  167. $win = $post['win_amount'];
  168. $transfer = $post['transfer_amount'];
  169. if(round($transfer,2) != round($win - $bet,2)){
  170. Util::WriteLog('pg_inout',['transfer_error' => 1, 'data' => ['transfer_amount' => $transfer,'win' => $win,'bet' => $bet],'error' => null]);
  171. return response()->json(['data' => null,'error' => ['code' => 3073,'message' => 'BetFailedException']]);
  172. }
  173. if(isset($post['real_transfer_amount'])){
  174. if($transfer != $post['real_transfer_amount']){
  175. return response()->json(['data' => null,'error' => ['code' => 3107,'message' => 'BetFailedException']]);
  176. }
  177. }
  178. $exists = Redis::exists('pg_inout_'.$transactionId);
  179. if ($exists) {
  180. Util::WriteLog('pg_inout',Redis::get('pg_inout_'.$transactionId));
  181. return response()->json(json_decode(Redis::get('pg_inout_'.$transactionId),true));
  182. //return response()->json(['data' => ['currency_code' => $this->Currency,'balance_amount' => $score,'updated_time' => (int)$post['updated_time']],'error' => null]);
  183. }
  184. if($bet>0){
  185. if($score<$bet){
  186. Util::WriteLog('pg_inout',['yichu' => 1,'data' => ['currency_code' => $this->Currency,'balance_amount' => $score,'updated_time' => (int)$post['updated_time']],'error' => null]);
  187. Redis::setex('pg_inout_'.$transactionId,300,json_encode(['data' => null,'error' => ['code' => 3202,'message' => 'NotEnoughBalanceException']]));
  188. return response()->json(['data' => null,'error' => ['code' => 3202,'message' => 'NotEnoughBalanceException']]);
  189. }
  190. PlatformService::platformBet('pg',@$post['game_id'],intval($bet*NumConfig::NUM_VALUE),$user->UserID);
  191. }
  192. if($transfer){
  193. if($transfer+$score<0){
  194. $transfer = -$score;
  195. }
  196. DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user->UserID)->increment('Score', $transfer*NumConfig::NUM_VALUE);
  197. $score = round($score + $transfer,2);
  198. }
  199. PlatformService::platformWin($user->UserID,'pg',@$post['game_id'],intval($win*NumConfig::NUM_VALUE),intval($bet*NumConfig::NUM_VALUE),intval($score*NumConfig::NUM_VALUE),false);
  200. if(isset($post['real_transfer_amount'])){
  201. $output = ['data' => ['currency_code' => $this->Currency,'balance_amount' => $score,'updated_time' => (int)$post['updated_time'],'real_transfer_amount' => round($post['real_transfer_amount'],2)],'error' => null];
  202. }else{
  203. $output = ['data' => ['currency_code' => $this->Currency,'balance_amount' => $score,'updated_time' => (int)$post['updated_time']],'error' => null];
  204. }
  205. Redis::setex('pg_inout_'.$transactionId,88600,json_encode($output));
  206. Util::WriteLog('pg_inout',$output);
  207. return response()->json($output);
  208. }
  209. // Route::any('/pgsub/Cash/Adjustment', 'Game\PgSoftController@cashAdjustment');
  210. // Route::any('/pgsub/Cash/UpdateBetDetail', 'Game\PgSoftController@cashUpdateBetDetail');
  211. public function cashAdjustment(Request $request)
  212. {
  213. $post = $request->all();
  214. Util::WriteLog('pg_adjust',$post);
  215. if(!$this->pgSoftService->VerifySession(@$post['operator_token'], @$post['secret_key'])){
  216. return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  217. }
  218. $playerId = @$post['player_name'];
  219. if(!ServerService::IsLocalUser($playerId)) {
  220. return $this->callSubApi($playerId,'Cash/Adjustment',$request);
  221. }
  222. $user = GlobalUserInfo::getGameUserInfo('GlobalUID', $playerId);
  223. if(!$user) return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  224. Util::WriteLog('pg_adjust',$user);
  225. if(@$post['currency_code'] != $this->Currency){
  226. return response()->json(['data' => null,'error' => ['code' => 1034,'message' => 'invalid session']]);
  227. }
  228. $transactionId = $post['adjustment_transaction_id'];
  229. $score = GlobalUserInfo::getScoreByUserID($user->UserID);
  230. $transfer = $post['transfer_amount'];
  231. if($transfer+$score<0){
  232. return response()->json(['data' => null,'error' => ['code' => 3202,'message' => 'BetFailedException']]);
  233. }
  234. if(isset($post['real_transfer_amount'])){
  235. if($transfer != $post['real_transfer_amount']){
  236. return response()->json(['data' => null,'error' => ['code' => 3107,'message' => 'BetFailedException']]);
  237. }
  238. }
  239. $exists = Redis::exists('pg_adjust_'.$transactionId);
  240. if ($exists) {
  241. return response()->json(json_decode(Redis::get('pg_adjust_'.$transactionId),true));
  242. }
  243. if($transfer){
  244. DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user->UserID)->increment('Score', $transfer*NumConfig::NUM_VALUE);
  245. }
  246. $output = ['data' => ['currency_code' => $this->Currency, 'adjust_amount' => $transfer, 'balance_before' => $score, 'balance_after' => round($transfer+$score,2), 'updated_time' => (int)$post['adjustment_time']],'error' => null];
  247. if(isset($post['real_transfer_amount'])){
  248. $output['data']['real_transfer_amount'] = round($post['real_transfer_amount'],2);
  249. }
  250. Redis::setex('pg_adjust_'.$transactionId,88600,json_encode($output));
  251. return response()->json($output);
  252. }
  253. public function cashUpdateBetDetail()
  254. {
  255. return response()->json(['data' => ['is_success' => 1],'error' => null]);
  256. }
  257. }