123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993
  1. <?php
  2. namespace App\Http\Controllers\Web;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\Http\Services\Web\Api2021Service;
  6. use App\Http\Services\CheckParamService;
  7. use Illuminate\Support\Facades\Validator;
  8. use App\Http\Services\ConstDef\GeneralConst;
  9. use Illuminate\Support\Facades\Redis;
  10. use App\Http\Services\Backend\DataManagement\SettingManagementService;
  11. use Illuminate\Support\Facades\Cookie;
  12. class Api2021Controller extends Controller
  13. {
  14. private $aSv;
  15. private $cSv;
  16. protected $sisLog;
  17. protected $redis;
  18. private $settingManagementSv;
  19. public function __construct()
  20. {
  21. $this->aSv = new Api2021Service();
  22. $this->cSv = new CheckParamService();
  23. $this->settingManagementSv = new SettingManagementService();
  24. $this->sisLog = [
  25. 'type' => GeneralConst::LOG_USER,
  26. 'cdate' => date("Y-m-d H:i:s"),
  27. ];
  28. }
  29. public function __destruct()
  30. {
  31. // $this->aSv->syslog($this->sisLog);
  32. }
  33. // 申報系統(已廢棄)
  34. public function getinfo($hash)
  35. {
  36. // 業務驗證(解析HASH/是否封存/是否上架中)
  37. $hash = $this->aSv->hashParse($hash);
  38. if (!$this->aSv->hashCheck($hash)) return response()->json(["succ" => false, "err" => '代碼錯誤']);
  39. // 取得渲染用資訊
  40. $info = $this->aSv->getinfo($hash);
  41. // 返回
  42. return response()->json(["succ" => true, "err" => '', "info" => $info]);
  43. }
  44. public function saveimg($hash, Request $request)
  45. {
  46. // 參數驗證
  47. $messages = [
  48. 'type.required' => 'type 必填',
  49. 'type.regex' => 'type 格式錯誤',
  50. ];
  51. $validate = Validator::make($request->all(), [
  52. 'type' => ['required', 'regex:/^(' . implode('|', GeneralConst::$appendixValidateMap) . ')$/'],
  53. ], $messages);
  54. if ($validate->fails()) {
  55. $err = $validate->errors();
  56. $err_msg = "";
  57. foreach ($err->all() as $item) {
  58. $err_msg .= $item . "\n";
  59. }
  60. return response()->json(["succ" => false, "err" => $err_msg]);
  61. } else {
  62. $type = $request->input('type', '');
  63. }
  64. // 業務驗證(解析HASH/是否封存/是否上架中)
  65. $hash = $this->aSv->hashParse($hash);
  66. if (!$this->aSv->hashCheck($hash)) return response()->json(["succ" => false, "err" => '代碼錯誤']);
  67. // 路徑命名
  68. $dirname = 'material';
  69. $date = date("Ymd");
  70. if (!file_exists($dirname)) mkdir($dirname, 0777, true);
  71. if (!file_exists($dirname . '/' . GeneralConst::$appendixMap[ $type ]['web_path'])) mkdir($dirname . '/' . GeneralConst::$appendixMap[ $type ]['web_path'], 0777, true);
  72. if (!file_exists($dirname . '/' . GeneralConst::$appendixMap[ $type ]['web_path'] . '/' . $date)) mkdir($dirname . '/' . GeneralConst::$appendixMap[ $type ]['web_path'] . '/' . $date, 0777, true);
  73. $basepath = $dirname . '/' . GeneralConst::$appendixMap[ $type ]['web_path'] . '/' . $date . '/';
  74. // 保存圖片
  75. $time = md5(bcrypt(microtime()));
  76. $err = '';
  77. $url = '';
  78. if ($request->hasFile('img')) {
  79. if ($request->file('img')->isValid()) {
  80. if (!in_array($request->file('img')->getMimeType(), ['image/jpeg'])) $err = '只接受 jpg 圖片';
  81. if ($request->file('img')->getSize() > 5242880) $err = '圖片檔案太大'; // 5MB
  82. if ($err == '') {
  83. $request->file('img')->move($basepath, $time . GeneralConst::$appendixMap[ $type ]['ext']);
  84. $url = $basepath . $time . GeneralConst::$appendixMap[ $type ]['ext'];
  85. }
  86. } else {
  87. $err = '圖片格式有誤';
  88. }
  89. } else {
  90. $err = '圖片檔案太大';
  91. }
  92. if ($err != '') return response()->json(["succ" => false, "err" => $err]);
  93. // 返回
  94. return response()->json(["succ" => true, "err" => '', "url" => $url]);
  95. }
  96. public function savedata($hash, Request $request)
  97. {
  98. // 參數驗證
  99. $messages = [
  100. 'name.required' => '姓名必填',
  101. 'name.min' => '姓名字數限制為1-50',
  102. 'name.max' => '姓名字數限制為1-50',
  103. 'identity.required' => '身分證號必填',
  104. 'identity.min' => '身分證號格式錯誤',
  105. 'identity.max' => '身分證號格式錯誤',
  106. 'add_host.required' => '戶籍地址必填',
  107. 'add_host.min' => '戶籍地址字數限制為1-200',
  108. 'add_host.max' => '戶籍地址字數限制為1-200',
  109. 'add_contact.required' => '通訊地址必填',
  110. 'add_contact.min' => '通訊地址字數限制為1-200',
  111. 'add_contact.max' => '通訊地址字數限制為1-200',
  112. 'tel.required' => '電話必填',
  113. 'tel.min' => '電話字數限制為1-20',
  114. 'tel.max' => '電話字數限制為1-20',
  115. ];
  116. $validate = Validator::make($request->all(), [
  117. 'name' => 'required|min:1|max:50',
  118. 'identity' => 'required|min:10|max:10',
  119. 'add_host' => 'required|min:1|max:200',
  120. 'add_contact' => 'required|min:1|max:200',
  121. 'tel' => 'required|min:1|max:20',
  122. ], $messages);
  123. if ($validate->fails()) {
  124. $err = $validate->errors();
  125. $err_msg = "";
  126. foreach ($err->all() as $item) {
  127. $err_msg .= $item . "\n";
  128. }
  129. return response()->json(["succ" => false, "err" => $err_msg]);
  130. } else {
  131. $name = $request->input('name', '');
  132. $identity = $request->input('identity', '');
  133. $add_host = $request->input('add_host', '');
  134. $add_contact = $request->input('add_contact', '');
  135. $tel = $request->input('tel', '');
  136. }
  137. // 業務驗證(解析HASH/是否封存/是否上架中)
  138. $hash = $this->aSv->hashParse($hash);
  139. if (!$this->aSv->hashCheck($hash)) return response()->json(["succ" => false, "err" => '代碼錯誤']);
  140. // 業務驗證(身分證字號)
  141. if (!$this->cSv->isIdentity($identity)) return response()->json(["succ" => false, "err" => '身分證格式有誤']);
  142. // 業務驗證(是否有本獎項需要的素材)
  143. $info = $this->aSv->getinfo($hash);
  144. ${GeneralConst::APPENDIX_IDENTITY_FRONT} = '';
  145. ${GeneralConst::APPENDIX_IDENTITY_BACK} = '';
  146. ${GeneralConst::APPENDIX_PASSBOOK} = '';
  147. if ($info['is_ide'] == GeneralConst::PHOTO_YES) {
  148. ${GeneralConst::APPENDIX_IDENTITY_FRONT} = $request->input(GeneralConst::APPENDIX_IDENTITY_FRONT, '');
  149. ${GeneralConst::APPENDIX_IDENTITY_BACK} = $request->input(GeneralConst::APPENDIX_IDENTITY_BACK, '');
  150. if (!file_exists(${GeneralConst::APPENDIX_IDENTITY_FRONT})) {
  151. return response()->json(["succ" => false, "err" => '請重新上傳身分證正面']);
  152. } else {
  153. if (!preg_match('/^material\/' . GeneralConst::$appendixMap[ GeneralConst::APPENDIX_IDENTITY_FRONT ]['web_path'] . '\/[0-9]{8}\/[a-zA-Z0-9]{32}' . GeneralConst::$appendixMap[ GeneralConst::APPENDIX_IDENTITY_FRONT ]['ext'] . '$/', ${GeneralConst::APPENDIX_IDENTITY_FRONT})) {
  154. return response()->json(["succ" => false, "err" => '身分證正面路徑有問題']);
  155. }
  156. }
  157. if (!file_exists(${GeneralConst::APPENDIX_IDENTITY_BACK})) {
  158. return response()->json(["succ" => false, "err" => '請重新上傳身分證背面']);
  159. } else {
  160. if (!preg_match('/^material\/' . GeneralConst::$appendixMap[ GeneralConst::APPENDIX_IDENTITY_BACK ]['web_path'] . '\/[0-9]{8}\/[a-zA-Z0-9]{32}' . GeneralConst::$appendixMap[ GeneralConst::APPENDIX_IDENTITY_BACK ]['ext'] . '$/', ${GeneralConst::APPENDIX_IDENTITY_BACK})) {
  161. return response()->json(["succ" => false, "err" => '身分證背面路徑有問題']);
  162. }
  163. }
  164. }
  165. if ($info['id_acc'] == GeneralConst::PHOTO_YES) {
  166. ${GeneralConst::APPENDIX_PASSBOOK} = $request->input(GeneralConst::APPENDIX_PASSBOOK, '');
  167. if (!file_exists(${GeneralConst::APPENDIX_PASSBOOK})) {
  168. return response()->json(["succ" => false, "err" => '請重新上傳存摺']);
  169. } else {
  170. if (!preg_match('/^material\/' . GeneralConst::$appendixMap[ GeneralConst::APPENDIX_PASSBOOK ]['web_path'] . '\/[0-9]{8}\/[a-zA-Z0-9]{32}' . GeneralConst::$appendixMap[ GeneralConst::APPENDIX_PASSBOOK ]['ext'] . '$/', ${GeneralConst::APPENDIX_PASSBOOK})) {
  171. return response()->json(["succ" => false, "err" => '存摺路徑有問題']);
  172. }
  173. }
  174. }
  175. // 業務邏輯(製作PDF)
  176. $pdf_path = $this->aSv->makePDF($info, $name, $identity, $add_host, $add_contact, $tel, ${GeneralConst::APPENDIX_IDENTITY_FRONT}, ${GeneralConst::APPENDIX_IDENTITY_BACK}, ${GeneralConst::APPENDIX_PASSBOOK});
  177. // 業務邏輯(存入資料庫)
  178. $this->aSv->savedata($hash[1], $name, $identity, $add_host, $add_contact, $tel, ${GeneralConst::APPENDIX_IDENTITY_FRONT}, ${GeneralConst::APPENDIX_IDENTITY_BACK}, ${GeneralConst::APPENDIX_PASSBOOK}, $pdf_path);
  179. // 返回
  180. return response()->json(["succ" => true, "err" => '', "url" => $pdf_path]);
  181. }
  182. // 小遊戲 0518
  183. public function info($lineId)
  184. {
  185. // testonly 等待 N 秒
  186. // $now = time();
  187. // while(time() - $now < 6) {}
  188. // return response()->json(["succ" => true, "err" => '', "info" => []]);
  189. // testonly
  190. // $this->aSv->debuglog('server', [
  191. // 'SERVER_ADDR' => $_SERVER['SERVER_ADDR'],
  192. // 'lineUserId' => $lineId,
  193. // ]);
  194. $this->sisLog['func'] = __FUNCTION__;
  195. $this->sisLog['k'] = $lineId;
  196. $this->sisLog['memoIn'] = '';
  197. $this->sisLog['memoOut'] = '';
  198. // testonly
  199. // $this->aSv->debuglog([
  200. // 'hashLineId' => $hashLineId,
  201. // 'cookieGamecc' => Cookie::get('gamecc')
  202. // ]);
  203. // 業務驗證(是否加入LINE帳號的好友) [不存在 cookie 的時候就要進直通查詢,造成每天只要最多一次查詢就好]
  204. if (!Cookie::get('gamecc')) {
  205. // if (!$this->aSv->isAuthUserExists($lineId)) { // 用資料庫檢查
  206. if (!$this->aSv->lineFriendCheck($lineId)) {
  207. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  208. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  209. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  210. }
  211. // else {
  212. // $this->aSv->addAuthUser($lineId);
  213. // }
  214. }
  215. // 業務邏輯(檢查有無本地資料,沒有就新增,順便取得個人資訊包含吉點)
  216. $playerinfo = $this->aSv->playerinfo($lineId);
  217. // 業務邏輯(取得當天所屬於的回合日期資訊,包含回合起訖日、本回合簽到狀態)
  218. // 業務邏輯(取得當回合的兌獎狀態,包含所有獎項以及可換與否)
  219. $roundinfo = $this->aSv->roundinfo($lineId);
  220. $goodinfo = $this->aSv->goodinfo($lineId);
  221. if (!$roundinfo && !$goodinfo) {
  222. // 遊戲時間已過 && 兌獎時間已過
  223. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  224. $this->sisLog['memoOut'] = json_encode(['msg' => '活動已結束'], JSON_UNESCAPED_UNICODE);
  225. return response()->json(["succ" => false, "err" => '活動已結束']);
  226. } else {
  227. // 要嘛都在期限內,要嘛一定至少兌獎在期限內因為他的時間範圍較大,這時候就要把回合簽到資訊清空
  228. if (!$roundinfo) $roundinfo = [];
  229. }
  230. // 業務邏輯(整理實際可兌換的獎項)
  231. foreach ($goodinfo as &$g) if ($playerinfo['gp'] < $g['gp']) $g['canuse'] = false;
  232. // 資料整理
  233. $info = [
  234. 'playerinfo' => $playerinfo,
  235. 'roundinfo' => $roundinfo,
  236. 'goodinfo' => $goodinfo,
  237. ];
  238. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  239. $this->sisLog['memoOut'] = json_encode(['info' => $info], JSON_UNESCAPED_UNICODE);
  240. // 返回
  241. if (Cookie::get('gamecc')) {
  242. return response()->json(["succ" => true, "err" => '', "info" => $info]);
  243. } else {
  244. return response()->json(["succ" => true, "err" => '', "info" => $info])->cookie('gamecc', time(), 1440);
  245. }
  246. }
  247. public function game($lineId, Request $request)
  248. {
  249. // testonly 等待 N 秒
  250. // $now = time();
  251. // while(time() - $now < 6) {}
  252. $this->sisLog['func'] = __FUNCTION__;
  253. $this->sisLog['k'] = $lineId;
  254. $this->sisLog['memoIn'] = '';
  255. $this->sisLog['memoOut'] = '';
  256. // 業務驗證(是否加入LINE帳號的好友) [不存在 cookie 的時候就要進直通查詢,造成每天只要最多一次查詢就好]
  257. if (false) { // testonly
  258. // if (!Cookie::get('gamecc')) {
  259. if (!$this->aSv->lineFriendCheck($lineId)) {
  260. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  261. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  262. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  263. }
  264. }
  265. // 業務驗證(是否在本地有資料)
  266. if (!$this->aSv->isPlayer($lineId)) {
  267. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  268. $this->sisLog['memoOut'] = json_encode(['msg' => '請從首頁進入'], JSON_UNESCAPED_UNICODE);
  269. return response()->json(["succ" => false, "err" => '請從首頁進入']);
  270. }
  271. // 業務驗證(是否今日已玩過遊戲與簽到)
  272. // if (false) { // testonly for 壓測
  273. if ($lineId != 'Ud2534d6e1eed9cee2c919a993443352b') {
  274. if (!$this->aSv->canPlay($lineId)) {
  275. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  276. $this->sisLog['memoOut'] = json_encode(['msg' => '今日已玩過遊戲或者活動結束'], JSON_UNESCAPED_UNICODE);
  277. return response()->json(["succ" => false, "err" => '今日已玩過遊戲或者活動結束']);
  278. }
  279. }
  280. // 參數驗證
  281. $name = '';
  282. $messages = [
  283. 'name.required' => '姓名必填',
  284. 'name.max' => '姓名最多100字',
  285. ];
  286. $validate = Validator::make($request->all(), [
  287. 'name' => 'required|max:100',
  288. ], $messages);
  289. if ($validate->fails()) {
  290. $err = $validate->errors();
  291. $err_msg = "";
  292. foreach ($err->all() as $item) {
  293. $err_msg .= $item . "\n";
  294. }
  295. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  296. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  297. return response()->json(["succ" => false, "err" => $err_msg]);
  298. } else {
  299. $name = $request->input('name', '');
  300. }
  301. // 業務邏輯(玩遊戲簽到)
  302. $res = $this->aSv->playGameAndCheckin($lineId, $name);
  303. // 資料整理
  304. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  305. $this->sisLog['memoOut'] = json_encode(['res' => $res], JSON_UNESCAPED_UNICODE);
  306. // 返回
  307. if (Cookie::get('gamecc')) {
  308. return response()->json(["succ" => true, "err" => '', "currentGameGp" => $res['currentGameGp'], "currentCheckinGp" => $res['currentCheckinGp'], "gpAll" => $res['gp']]);
  309. } else {
  310. return response()->json(["succ" => true, "err" => '', "currentGameGp" => $res['currentGameGp'], "currentCheckinGp" => $res['currentCheckinGp'], "gpAll" => $res['gp']])->cookie('gamecc', time(), 1440);
  311. }
  312. }
  313. public function redeem($lineId, $gid, Request $request)
  314. {
  315. $this->sisLog['func'] = __FUNCTION__;
  316. $this->sisLog['k'] = $lineId;
  317. $this->sisLog['memoIn'] = '';
  318. $this->sisLog['memoOut'] = '';
  319. // 打點數量限制
  320. // 作用範圍: ALL
  321. $redis = new Redis();
  322. $redis::connect('localhost', 6379);
  323. $rlimitkey = $this->settingManagementSv->getSetting()['GAME_ESI_TEST_EVENT_KEY'];
  324. if (!$redis::exists($rlimitkey)) {
  325. $redis::set($rlimitkey, 1);
  326. } else {
  327. $redis::incr($rlimitkey);
  328. }
  329. if ($redis::get($rlimitkey) > $this->settingManagementSv->getSetting()['GAME_ESI_TEST_EVENT_LIMIT']) {
  330. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  331. $this->sisLog['memoOut'] = json_encode(['msg' => '測試點數不能再打了'], JSON_UNESCAPED_UNICODE);
  332. return response()->json(["succ" => false, "err" => '測試點數不能再打了']);
  333. }
  334. // 業務驗證(防重)
  335. // 作用範圍: 以人為單位
  336. $rkey = $this->settingManagementSv->getSetting()['GAME_ESI_TEST_EVENT_LIMIT'] . '_' . $lineId;
  337. if (!$redis::setnx($rkey, 'true')) {
  338. $redis::expire($rkey, 15); // 15 秒防重(這樣就算業務在其他地方掛了,他也會自動失效)
  339. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  340. $this->sisLog['memoOut'] = json_encode(['msg' => '您操作過快,請稍後再試'], JSON_UNESCAPED_UNICODE);
  341. return response()->json(["succ" => false, "err" => '您操作過快,請稍後再試']);
  342. }
  343. // 業務驗證(是否加入LINE帳號的好友)
  344. if (!$this->aSv->lineFriendCheck($lineId)) {
  345. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  346. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  347. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  348. }
  349. // 業務驗證(是否在本地有資料)
  350. if (!$this->aSv->isPlayer($lineId)) {
  351. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  352. $this->sisLog['memoOut'] = json_encode(['msg' => '請從首頁進入'], JSON_UNESCAPED_UNICODE);
  353. return response()->json(["succ" => false, "err" => '請從首頁進入']);
  354. }
  355. // 業務驗證(取得當回合的兌獎狀態,包含所有獎項以及可換與否,拿來比對驗證)
  356. $canuse = false;
  357. foreach ($this->aSv->goodinfo($lineId) as $g) if ($g['id'] == $gid) if ($g['canuse'] == true) $canuse = true;
  358. if (!$canuse) {
  359. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  360. $this->sisLog['memoOut'] = json_encode(['msg' => '獎項不存在或沒有兌獎所需吉點'], JSON_UNESCAPED_UNICODE);
  361. return response()->json(["succ" => false, "err" => '獎項不存在或沒有兌獎所需吉點']);
  362. }
  363. // 參數驗證
  364. $name = '';
  365. $messages = [
  366. 'name.required' => '姓名必填',
  367. 'name.max' => '姓名最多100字',
  368. ];
  369. $validate = Validator::make($request->all(), [
  370. 'name' => 'required|max:100',
  371. ], $messages);
  372. if ($validate->fails()) {
  373. $err = $validate->errors();
  374. $err_msg = "";
  375. foreach ($err->all() as $item) {
  376. $err_msg .= $item . "\n";
  377. }
  378. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  379. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  380. return response()->json(["succ" => false, "err" => $err_msg]);
  381. } else {
  382. $name = $request->input('name', '');
  383. }
  384. // 業務邏輯(兌點)
  385. $redeeminfo = $this->aSv->redeemGood($lineId, $gid, $name);
  386. if (!$redeeminfo) {
  387. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  388. $this->sisLog['memoOut'] = json_encode(['msg' => '兌換失敗'], JSON_UNESCAPED_UNICODE);
  389. return response()->json(["succ" => false, "err" => '兌換失敗']);
  390. }
  391. // 資料整理
  392. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId, 'gid' => $gid], JSON_UNESCAPED_UNICODE);
  393. $this->sisLog['memoOut'] = json_encode(['redeeminfo' => $redeeminfo], JSON_UNESCAPED_UNICODE);
  394. // 防重解鎖
  395. $redis::del($rkey);
  396. return response()->json(["succ" => true, "err" => '']);
  397. }
  398. public function test()
  399. {
  400. // if (Cookie::get('ttcc')) {
  401. // return response()->json(["succ" => true, "err" => '', "info" => 'I have cookie: ' . Cookie::get('ttcc')]);
  402. // } else {
  403. // return response()->json(["succ" => true, "err" => '', "info" => 'no cookie'])->cookie('ttcc', '123', 1440);
  404. // }
  405. return true;
  406. // return $this->aSv->esiFlowBak();
  407. //return $_SERVER['SERVER_ADDR'] ?? 'no';
  408. }
  409. // 類發票
  410. public function friendchk($lineId)
  411. {
  412. $this->sisLog['func'] = __FUNCTION__;
  413. $this->sisLog['k'] = $lineId;
  414. $this->sisLog['kk'] = 'activity';
  415. $this->sisLog['memoIn'] = '';
  416. $this->sisLog['memoOut'] = '';
  417. // 業務驗證(是否加入LINE帳號的好友)
  418. if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  419. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  420. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  421. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  422. }
  423. // 資料整理
  424. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  425. $this->sisLog['memoOut'] = json_encode(['res' => ''], JSON_UNESCAPED_UNICODE);
  426. // 返回
  427. return response()->json(["succ" => true, "err" => '']);
  428. }
  429. public function activities($lineId)
  430. {
  431. $this->sisLog['func'] = __FUNCTION__;
  432. $this->sisLog['k'] = $lineId;
  433. $this->sisLog['kk'] = 'activity';
  434. $this->sisLog['memoIn'] = '';
  435. $this->sisLog['memoOut'] = '';
  436. // 業務驗證(是否加入LINE帳號的好友)
  437. if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  438. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  439. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  440. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  441. }
  442. // 業務邏輯(取得活動時間資訊)
  443. $activities = $this->aSv->activities();
  444. // 資料整理
  445. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  446. $this->sisLog['memoOut'] = json_encode(['res' => $activities], JSON_UNESCAPED_UNICODE);
  447. // 返回
  448. return response()->json(["succ" => true, "err" => '', "data" => $activities]);
  449. }
  450. public function setdoc($lineId, Request $request)
  451. {
  452. $this->sisLog['func'] = __FUNCTION__;
  453. $this->sisLog['k'] = $lineId;
  454. $this->sisLog['kk'] = 'activity';
  455. $this->sisLog['memoIn'] = '';
  456. $this->sisLog['memoOut'] = '';
  457. // 業務驗證(是否加入LINE帳號的好友)
  458. // if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  459. // $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  460. // $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  461. //
  462. // return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  463. // }
  464. // 參數驗證
  465. $messages = [
  466. 'doc.required' => '圖片必填',
  467. ];
  468. $validate = Validator::make($request->all(), [
  469. 'doc' => 'required',
  470. ], $messages);
  471. if ($validate->fails()) {
  472. $err = $validate->errors();
  473. $err_msg = "";
  474. foreach ($err->all() as $item) {
  475. $err_msg .= $item . "\n";
  476. }
  477. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  478. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  479. return response()->json(["succ" => false, "err" => $err_msg]);
  480. } else {
  481. $doc = $request->input('doc', '');
  482. $doc = explode(',', $doc);
  483. $doc = base64_decode($doc[1]);
  484. }
  485. // 業務邏輯(圖片辨識)
  486. $data = $this->aSv->setdoc($doc);
  487. // 資料整理
  488. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  489. $this->sisLog['memoOut'] = json_encode(['res' => $data], JSON_UNESCAPED_UNICODE);
  490. // 返回
  491. return response()->json(["succ" => true, "err" => '', "data" => $data]);
  492. }
  493. public function reqreceipt($lineId, Request $request)
  494. {
  495. $this->sisLog['func'] = __FUNCTION__;
  496. $this->sisLog['k'] = $lineId;
  497. $this->sisLog['kk'] = 'activity';
  498. $this->sisLog['memoIn'] = '';
  499. $this->sisLog['memoOut'] = '';
  500. // 業務驗證(是否加入LINE帳號的好友)
  501. if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  502. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  503. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  504. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  505. }
  506. // 參數驗證
  507. $messages = [
  508. 'name.required' => '姓名必填',
  509. 'name.max' => '姓名最多64字',
  510. 'order_date.required' => '登錄日期必填',
  511. 'order_date.date_format' => '登錄日期格式錯誤',
  512. 'account_bank.required' => '銀行代碼必填',
  513. 'account_bank.regex' => '銀行代碼格式錯誤',
  514. 'account_no.required' => '銀行帳號必填',
  515. 'account_no.regex' => '銀行帳號格式錯誤',
  516. 'order_no.required' => '訂單編號必填',
  517. 'order_no.regex' => '訂單編號格式錯誤',
  518. ];
  519. $validate = Validator::make($request->all(), [
  520. 'name' => 'required|max:64',
  521. 'order_date' => 'required|date_format:Y-m-d',
  522. 'account_bank' => ['required', 'regex:/^[0-9]{1,10}$/'],
  523. 'account_no' => ['required', 'regex:/^[0-9]{1,30}$/'],
  524. 'order_no' => ['required', 'regex:/^[A-Za-z0-9]{1,30}$/'],
  525. ], $messages);
  526. if ($validate->fails()) {
  527. $err = $validate->errors();
  528. $err_msg = "";
  529. foreach ($err->all() as $item) {
  530. $err_msg .= $item . "\n";
  531. }
  532. $this->sisLog['memoIn'] = json_encode(['error' => 'logical', 'param' => $_POST], JSON_UNESCAPED_UNICODE);
  533. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  534. return response()->json(["succ" => false, "err" => $err_msg]);
  535. } else {
  536. $info = [
  537. 'name' => $request->input('name', ''),
  538. 'order_date' => $request->input('order_date', ''),
  539. 'account_bank' => $request->input('account_bank', ''),
  540. 'account_no' => $request->input('account_no', ''),
  541. 'order_no' => $request->input('order_no', ''),
  542. ];
  543. }
  544. // 業務驗證(取得當前的登錄區間)
  545. $activityinfo = $this->aSv->activityinfo();
  546. if (!$activityinfo) {
  547. // 尚未到達登錄時間
  548. $this->sisLog['memoIn'] = json_encode(['error' => 'logical', 'param' => $_POST], JSON_UNESCAPED_UNICODE);
  549. $this->sisLog['memoOut'] = json_encode(['msg' => '尚未到達登錄時間'], JSON_UNESCAPED_UNICODE);
  550. return response()->json(["succ" => false, "err" => '尚未到達登錄時間']);
  551. }
  552. // 業務驗證(收據時間也要在活動時間內)
  553. if ($activityinfo[0]['reqTimeBegin'] > $info['order_date'] || $activityinfo[0]['reqTimeFinal'] < $info['order_date']) {
  554. // 尚未到達登錄時間
  555. $this->sisLog['memoIn'] = json_encode(['error' => 'logical', 'param' => $_POST], JSON_UNESCAPED_UNICODE);
  556. $this->sisLog['memoOut'] = json_encode(['msg' => '收據日期錯誤'], JSON_UNESCAPED_UNICODE);
  557. return response()->json(["succ" => false, "err" => '收據日期錯誤']);
  558. }
  559. // 業務邏輯(登錄)
  560. $info['lineId'] = $lineId;
  561. $info['aid'] = $activityinfo[0]['id'];
  562. $id = $this->aSv->reqreceipt($info);
  563. if ($id == 0) {
  564. // 完全相同的資料不能登錄
  565. $this->sisLog['memoIn'] = json_encode(['error' => 'logical', 'param' => $_POST], JSON_UNESCAPED_UNICODE);
  566. $this->sisLog['memoOut'] = json_encode(['msg' => '您已登錄過這筆資料'], JSON_UNESCAPED_UNICODE);
  567. return response()->json(["succ" => false, "err" => '您已登錄過這筆資料']);
  568. }
  569. // 資料整理
  570. $this->sisLog['memoIn'] = json_encode(['info' => $info], JSON_UNESCAPED_UNICODE);
  571. $this->sisLog['memoOut'] = json_encode(['res' => $id], JSON_UNESCAPED_UNICODE);
  572. // 返回
  573. return response()->json(["succ" => true, "err" => '']);
  574. }
  575. public function lstreceipt($lineId)
  576. {
  577. $this->sisLog['func'] = __FUNCTION__;
  578. $this->sisLog['k'] = $lineId;
  579. $this->sisLog['kk'] = 'activity';
  580. $this->sisLog['memoIn'] = '';
  581. $this->sisLog['memoOut'] = '';
  582. // 業務驗證(是否加入LINE帳號的好友)
  583. if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  584. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  585. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  586. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  587. }
  588. // 業務邏輯(取得列表)
  589. $data = $this->aSv->lstreceipt($lineId);
  590. // 資料整理
  591. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  592. $this->sisLog['memoOut'] = json_encode(['res' => $data], JSON_UNESCAPED_UNICODE);
  593. // 返回
  594. return response()->json(["succ" => true, "err" => '', "data" => $data]);
  595. }
  596. public function redeemreceipt($lineId, $rid, Request $request)
  597. {
  598. $this->sisLog['func'] = __FUNCTION__;
  599. $this->sisLog['k'] = $lineId;
  600. $this->sisLog['kk'] = 'activity';
  601. $this->sisLog['memoIn'] = '';
  602. $this->sisLog['memoOut'] = '';
  603. // 業務驗證(是否加入LINE帳號的好友)
  604. if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  605. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  606. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  607. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  608. }
  609. // 業務驗證(該紀錄狀態是否可執行本動作/該紀錄的所屬活動是否在登錄的時間範圍內)
  610. if (!$this->aSv->redeemCheck($lineId, (integer)$rid)) {
  611. $this->sisLog['memoIn'] = json_encode(['error' => 'logical', 'rid' => $rid], JSON_UNESCAPED_UNICODE);
  612. $this->sisLog['memoOut'] = json_encode(['msg' => '權限錯誤'], JSON_UNESCAPED_UNICODE);
  613. return response()->json(["succ" => false, "err" => '權限錯誤']);
  614. }
  615. // 業務邏輯(更改狀態)
  616. $this->aSv->redeemExecute($lineId, (integer)$rid);
  617. // 資料整理
  618. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  619. $this->sisLog['memoOut'] = json_encode(['res' => ''], JSON_UNESCAPED_UNICODE);
  620. // 返回
  621. return response()->json(["succ" => true, "err" => '']);
  622. }
  623. public function getreceipt($lineId, $rid, Request $request)
  624. {
  625. $this->sisLog['func'] = __FUNCTION__;
  626. $this->sisLog['k'] = $lineId;
  627. $this->sisLog['kk'] = 'activity';
  628. $this->sisLog['memoIn'] = '';
  629. $this->sisLog['memoOut'] = '';
  630. // 業務驗證(防重)
  631. // 作用範圍: 以人為單位
  632. $redis = new Redis();
  633. $redis::connect('localhost', 6379);
  634. $rkey = $this->settingManagementSv->getSetting()['RECEIPT_ESI_TEST_EVENT_KEY'] . '_' . $lineId;
  635. if (!$redis::setnx($rkey, 'true')) {
  636. $redis::expire($rkey, 15); // 15 秒防重(這樣就算業務在其他地方掛了,他也會自動失效)
  637. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  638. $this->sisLog['memoOut'] = json_encode(['msg' => '您操作過快,請稍後再試'], JSON_UNESCAPED_UNICODE);
  639. return response()->json(["succ" => false, "err" => '您操作過快,請稍後再試']);
  640. }
  641. // 業務驗證(是否加入LINE帳號的好友)
  642. if (!$this->aSv->lineFriendCheck($lineId, 'activity')) {
  643. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  644. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  645. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  646. }
  647. // 業務驗證(該紀錄狀態是否可執行本動作/該紀錄的所屬活動是否在登錄的時間範圍內)
  648. if (!$this->aSv->getCheck($lineId, (integer)$rid)) {
  649. $this->sisLog['memoIn'] = json_encode(['error' => 'logical', 'rid' => $rid], JSON_UNESCAPED_UNICODE);
  650. $this->sisLog['memoOut'] = json_encode(['msg' => '權限錯誤'], JSON_UNESCAPED_UNICODE);
  651. return response()->json(["succ" => false, "err" => '權限錯誤']);
  652. }
  653. // 業務邏輯(更改狀態)
  654. $getinfo = $this->aSv->getExecute($lineId, (integer)$rid);
  655. if (!$getinfo) {
  656. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  657. $this->sisLog['memoOut'] = json_encode(['msg' => '兌換失敗'], JSON_UNESCAPED_UNICODE);
  658. return response()->json(["succ" => false, "err" => '兌換失敗']);
  659. }
  660. // 資料整理
  661. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  662. $this->sisLog['memoOut'] = json_encode(['res' => ''], JSON_UNESCAPED_UNICODE);
  663. // 防重解鎖
  664. $redis::del($rkey);
  665. // 返回
  666. return response()->json(["succ" => true, "err" => '']);
  667. }
  668. // 串門子
  669. public function tinfo($lineId, Request $request)
  670. {
  671. $this->sisLog['func'] = __FUNCTION__;
  672. $this->sisLog['k'] = $lineId;
  673. $this->sisLog['kk'] = 'tmz';
  674. $this->sisLog['memoIn'] = '';
  675. $this->sisLog['memoOut'] = '';
  676. // 業務驗證(是否加入LINE帳號的好友) [不存在 cookie 的時候就要進直通查詢,造成每天只要最多一次查詢就好]
  677. if (!Cookie::get('tgamecc')) {
  678. if (!$this->aSv->lineFriendCheck($lineId, 'tmz')) {
  679. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  680. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  681. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  682. }
  683. }
  684. // 業務邏輯(檢查有無本地資料,沒有就新增,順便取得個人資訊包含吉點)
  685. $playerinfo = $this->aSv->tplayerinfo($lineId);
  686. // 參數驗證
  687. $name = '';
  688. $messages = [
  689. 'name.required' => '姓名必填',
  690. 'name.max' => '姓名最多100字',
  691. ];
  692. $validate = Validator::make($request->all(), [
  693. 'name' => 'required|max:100',
  694. ], $messages);
  695. if ($validate->fails()) {
  696. $err = $validate->errors();
  697. $err_msg = "";
  698. foreach ($err->all() as $item) {
  699. $err_msg .= $item . "\n";
  700. }
  701. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  702. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  703. return response()->json(["succ" => false, "err" => $err_msg]);
  704. } else {
  705. $name = $request->input('name', '');
  706. }
  707. // 業務邏輯(今日簽到)
  708. $this->aSv->tcheckin($lineId, $name);
  709. // 業務邏輯(取得當天所屬於的回合日期資訊,包含回合起訖日、本回合簽到狀態)
  710. $roundinfo = $this->aSv->troundinfo($lineId);
  711. if (!$roundinfo) {
  712. // 遊戲時間已過 && 兌獎時間已過
  713. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  714. $this->sisLog['memoOut'] = json_encode(['msg' => '活動已結束'], JSON_UNESCAPED_UNICODE);
  715. return response()->json(["succ" => false, "err" => '活動已結束']);
  716. } else {
  717. // 要嘛都在期限內,要嘛一定至少兌獎在期限內因為他的時間範圍較大,這時候就要把回合簽到資訊清空
  718. if (!$roundinfo) $roundinfo = [];
  719. }
  720. // 業務邏輯(取得是否可以轉蛋的資格)
  721. $redeeminfo = $this->aSv->tredeeminfo($lineId);
  722. // 資料整理
  723. $info = [
  724. 'playerinfo' => $playerinfo,
  725. 'roundinfo' => $roundinfo,
  726. 'redeeminfo' => $redeeminfo,
  727. ];
  728. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  729. $this->sisLog['memoOut'] = json_encode(['info' => $info], JSON_UNESCAPED_UNICODE);
  730. // 返回
  731. if (Cookie::get('tgamecc')) {
  732. return response()->json(["succ" => true, "err" => '', "info" => $info]);
  733. } else {
  734. return response()->json(["succ" => true, "err" => '', "info" => $info])->cookie('tgamecc', time(), 1440);
  735. }
  736. }
  737. public function tgame($lineId, Request $request)
  738. {
  739. $this->sisLog['func'] = __FUNCTION__;
  740. $this->sisLog['k'] = $lineId;
  741. $this->sisLog['kk'] = 'tmz';
  742. $this->sisLog['memoIn'] = '';
  743. $this->sisLog['memoOut'] = '';
  744. // 業務驗證(是否加入LINE帳號的好友) [不存在 cookie 的時候就要進直通查詢,造成每天只要最多一次查詢就好]
  745. if (!Cookie::get('tgamecc')) {
  746. if (!$this->aSv->lineFriendCheck($lineId, 'tmz')) {
  747. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  748. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  749. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  750. }
  751. }
  752. // 業務驗證(是否在本地有資料)
  753. if (!$this->aSv->isTPlayer($lineId)) {
  754. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  755. $this->sisLog['memoOut'] = json_encode(['msg' => '請從首頁進入'], JSON_UNESCAPED_UNICODE);
  756. return response()->json(["succ" => false, "err" => '請從首頁進入']);
  757. }
  758. // 參數驗證
  759. $name = '';
  760. $c = 0;
  761. $messages = [
  762. 'name.required' => '姓名必填',
  763. 'name.max' => '姓名最多100字',
  764. 'c.required' => '九宮格必填',
  765. ];
  766. $validate = Validator::make($request->all(), [
  767. 'name' => 'required|max:100',
  768. 'c' => 'required|numeric|min:1|max:9',
  769. ], $messages);
  770. if ($validate->fails()) {
  771. $err = $validate->errors();
  772. $err_msg = "";
  773. foreach ($err->all() as $item) {
  774. $err_msg .= $item . "\n";
  775. }
  776. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  777. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  778. return response()->json(["succ" => false, "err" => $err_msg]);
  779. } else {
  780. $name = $request->input('name', '');
  781. $c = $request->input('c', 0);
  782. }
  783. // 業務邏輯(玩遊戲)
  784. $res = $this->aSv->playTGame($lineId, $name, $c);
  785. if (!$res) {
  786. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  787. $this->sisLog['memoOut'] = json_encode(['msg' => '已回答過囉'], JSON_UNESCAPED_UNICODE);
  788. return response()->json(["succ" => false, "err" => '已回答過囉']);
  789. }
  790. // 資料整理
  791. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId, 'c' => $c], JSON_UNESCAPED_UNICODE);
  792. $this->sisLog['memoOut'] = json_encode(['res' => $res], JSON_UNESCAPED_UNICODE);
  793. // 返回
  794. if (Cookie::get('tgamecc')) {
  795. return response()->json(["succ" => true, "err" => '', "currentGameGp" => $res['currentGameGp'], "playerinfo" => $res['gp']]);
  796. } else {
  797. return response()->json(["succ" => true, "err" => '', "currentGameGp" => $res['currentGameGp'], "playerinfo" => $res['gp']])->cookie('tgamecc', time(), 1440);
  798. }
  799. }
  800. public function tredeem($lineId, Request $request)
  801. {
  802. $this->sisLog['func'] = __FUNCTION__;
  803. $this->sisLog['k'] = $lineId;
  804. $this->sisLog['kk'] = 'tmz';
  805. $this->sisLog['memoIn'] = '';
  806. $this->sisLog['memoOut'] = '';
  807. // 打點數量限制
  808. // 作用範圍: ALL
  809. $redis = new Redis();
  810. $redis::connect('localhost', 6379);
  811. $rlimitkey = $this->settingManagementSv->getSetting()['TMZ_ESI_TEST_EVENT_KEY'];
  812. if (!$redis::exists($rlimitkey)) {
  813. $redis::set($rlimitkey, 1);
  814. } else {
  815. $redis::incr($rlimitkey);
  816. }
  817. if ($redis::get($rlimitkey) > $this->settingManagementSv->getSetting()['TMZ_ESI_TEST_EVENT_LIMIT']) {
  818. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  819. $this->sisLog['memoOut'] = json_encode(['msg' => '測試點數不能再打了'], JSON_UNESCAPED_UNICODE);
  820. return response()->json(["succ" => false, "err" => '測試點數不能再打了']);
  821. }
  822. // 業務驗證(防重)
  823. // 作用範圍: 以人為單位
  824. $rkey = $this->settingManagementSv->getSetting()['TMZ_ESI_TEST_EVENT_LIMIT'] . '_' . $lineId;
  825. if (!$redis::setnx($rkey, 'true')) {
  826. $redis::expire($rkey, 15); // 15 秒防重(這樣就算業務在其他地方掛了,他也會自動失效)
  827. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  828. $this->sisLog['memoOut'] = json_encode(['msg' => '您操作過快,請稍後再試'], JSON_UNESCAPED_UNICODE);
  829. return response()->json(["succ" => false, "err" => '您操作過快,請稍後再試']);
  830. }
  831. // 業務驗證(是否加入LINE帳號的好友)
  832. if (!$this->aSv->lineFriendCheck($lineId, 'tmz')) {
  833. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  834. $this->sisLog['memoOut'] = json_encode(['msg' => '請先加入 LINE 好友'], JSON_UNESCAPED_UNICODE);
  835. return response()->json(["succ" => false, "err" => '請先加入 LINE 好友']);
  836. }
  837. // 業務驗證(是否在本地有資料)
  838. if (!$this->aSv->isTPlayer($lineId)) {
  839. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  840. $this->sisLog['memoOut'] = json_encode(['msg' => '請從首頁進入'], JSON_UNESCAPED_UNICODE);
  841. return response()->json(["succ" => false, "err" => '請從首頁進入']);
  842. }
  843. // 參數驗證
  844. $name = '';
  845. $messages = [
  846. 'name.required' => '姓名必填',
  847. 'name.max' => '姓名最多100字',
  848. ];
  849. $validate = Validator::make($request->all(), [
  850. 'name' => 'required|max:100',
  851. ], $messages);
  852. if ($validate->fails()) {
  853. $err = $validate->errors();
  854. $err_msg = "";
  855. foreach ($err->all() as $item) {
  856. $err_msg .= $item . "\n";
  857. }
  858. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  859. $this->sisLog['memoOut'] = json_encode(['msg' => $err_msg], JSON_UNESCAPED_UNICODE);
  860. return response()->json(["succ" => false, "err" => $err_msg]);
  861. } else {
  862. $name = $request->input('name', '');
  863. }
  864. // 業務邏輯(可否轉蛋再次確認)
  865. if (!$this->aSv->tredeeminfo($lineId)) {
  866. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  867. $this->sisLog['memoOut'] = json_encode(['msg' => '吉點不夠不能轉蛋'], JSON_UNESCAPED_UNICODE);
  868. return response()->json(["succ" => false, "err" => '吉點不夠不能轉蛋']);
  869. }
  870. // 業務邏輯(轉蛋兌點)
  871. $redeeminfo = $this->aSv->redeemTGood($lineId, $name);
  872. if (!$redeeminfo) {
  873. $this->sisLog['memoIn'] = json_encode(['error' => 'logical'], JSON_UNESCAPED_UNICODE);
  874. $this->sisLog['memoOut'] = json_encode(['msg' => '銘謝惠顧'], JSON_UNESCAPED_UNICODE);
  875. return response()->json(["succ" => false, "err" => '銘謝惠顧']);
  876. }
  877. // 資料整理
  878. $this->sisLog['memoIn'] = json_encode(['lineId' => $lineId], JSON_UNESCAPED_UNICODE);
  879. $this->sisLog['memoOut'] = json_encode(['redeeminfo' => $redeeminfo], JSON_UNESCAPED_UNICODE);
  880. unset($redeeminfo['playerinfo']['lineId']);
  881. unset($redeeminfo['redeeminfo']['fromIssuedQty']);
  882. unset($redeeminfo['redeeminfo']['toIssuedQty']);
  883. unset($redeeminfo['session']);
  884. // 防重解鎖
  885. $redis::del($rkey);
  886. return response()->json(["succ" => true, "err" => '', 'info' => $redeeminfo]);
  887. }
  888. }