2
0

NewSupefinaSpeiController.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\logic\api\NewSupefinaSpeiLogic;
  4. use App\Http\logic\api\NewSupefinaSpeiCashierLogic;
  5. use App\Inter\PayMentInterFace;
  6. use App\Notification\TelegramBot;
  7. use App\Services\Aes;
  8. use App\Services\PayConfig;
  9. use App\Util;
  10. use App\Utility\SetNXLock;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\Log;
  13. use Illuminate\Support\Facades\Redis;
  14. class NewSupefinaSpeiController implements PayMentInterFace
  15. {
  16. private $retryTimes = 0;
  17. public function pay_order($userId, $payAmt, $userName, $userEmail, $userPhone, $GiftsID, $buyIP, $AdId, $eventType, $pay_method = '')
  18. {
  19. $logic = new NewSupefinaSpeiLogic();
  20. try {
  21. $res = $logic->pay_order($userId, $payAmt, $userPhone, $userEmail, $userName, $GiftsID, $buyIP, $AdId, $eventType, $pay_method);
  22. } catch (\Exception $exception) {
  23. Redis::set('PayErro_NewSupefinaSpei', 1);
  24. Redis::expire('PayErro_NewSupefinaSpei', 600);
  25. Util::WriteLog('NewSupefinaSpei_error', $exception->getMessage() . json_encode($logic->result ?? []));
  26. TelegramBot::getDefault()->sendProgramNotify('SupefinaSpei Except ', $exception->getMessage(), $exception);
  27. return apiReturnFail($logic->getError());
  28. }
  29. if (!empty($res) && isset($res['checkoutUrl'])) {
  30. $content = $res['checkoutUrl'] ?? '';
  31. if (empty($content) && !empty($res['receiveCode'])) {
  32. $content = 'CLABE:' . $res['receiveCode'];
  33. }
  34. return apiReturnSuc([
  35. 'content' => $content,
  36. 'money' => $payAmt,
  37. 'prdOrdNo' => $res['merchantOrderNo'] ?? '',
  38. 'identifier' => $res['receiveCode'] ?? '',
  39. ]);
  40. }
  41. if ($res === false) {
  42. return apiReturnFail($logic->getError());
  43. }
  44. if ($this->retryTimes > 0) {
  45. Redis::set('PayErro_NewSupefinaSpei', 1);
  46. Redis::expire('PayErro_NewSupefinaSpei', 600);
  47. TelegramBot::getDefault()->sendProgramNotify('NewSupefinaSpei ReturnFail ', $logic->getError() . ' | ' . json_encode($res));
  48. return apiReturnFail($logic->getError());
  49. }
  50. $this->retryTimes++;
  51. return $this->pay_order($userId, $payAmt, $userName, $userEmail, $userPhone, $GiftsID, $buyIP, $AdId, $eventType, $pay_method);
  52. }
  53. /**
  54. * 统一回调入口:代收(01) + 代付(02),验签后按 transactionType 分发
  55. */
  56. public function notify(Request $request)
  57. {
  58. $headers = $request->headers->all();
  59. $payload = $request->getContent();
  60. $post = json_decode($payload, true);
  61. if (!is_array($post)) {
  62. $post = $request->all();
  63. }
  64. Util::WriteLog('NewSupefinaSpei', "raw notify\n" . $payload . ' ' . json_encode($headers));
  65. if (!isset($post['data'])) {
  66. Util::WriteLog('NewSupefinaSpei_error', 'empty data');
  67. return 'fail';
  68. }
  69. $sign = $request->header('sign');
  70. $logic = new NewSupefinaSpeiLogic();
  71. $signHeaders = [
  72. 'version' => $request->header('version'),
  73. 'merchantNo' => $request->header('merchantno'),
  74. 'requestId' => $request->header('requestid'),
  75. 'requestTime' => $request->header('requesttime'),
  76. ];
  77. $config = (new PayConfig())->getConfig('NewSupefinaSpei');
  78. $string = $logic->getSignString($signHeaders, $post);
  79. $res = $logic->verifySign($string, $sign, $config['publickey']);
  80. if ($res !== true) {
  81. Util::WriteLog('NewSupefinaSpei_error', 'notify sign invalid' . $string);
  82. return 'fail';
  83. }
  84. $data = Aes::decrypt($post['data'], base64_decode($config['aesKey']));
  85. Util::WriteLog('NewSupefinaSpei', 'decoded data'.$data);
  86. if (empty($data)) {
  87. Util::WriteLog('NewSupefinaSpei_error', 'des decrypt fail ' . $post['data']);
  88. return 'fail';
  89. }
  90. $data = json_decode($data, true);
  91. $lockKey = '';
  92. $orderId = $data['merchantOrderNo'];
  93. if ($orderId) {
  94. $lockKey = 'pay_notify_NewSupefinaSpei_' . $orderId;
  95. if (!SetNXLock::getExclusiveLock($lockKey, 60)) {
  96. Util::WriteLog('NewSupefinaSpei', 'notify concurrent, ignore: ' . $orderId);
  97. return 'SUCCESS';
  98. }
  99. }
  100. try {
  101. $res = $logic->notify($data);
  102. } finally {
  103. if ($lockKey !== '') {
  104. SetNXLock::release($lockKey);
  105. }
  106. }
  107. return $res;
  108. }
  109. /**
  110. * 代付回调(保留兼容,建议统一用 notify)
  111. */
  112. public function cash_notify(Request $request)
  113. {
  114. $headers = $request->headers->all();
  115. $payload = $request->getContent();
  116. $post = json_decode($payload, true);
  117. if (!is_array($post)) {
  118. $post = $request->all();
  119. }
  120. Util::WriteLog('NewSupefinaSpei', "raw payout notify\n" . $payload . json_encode($headers));
  121. $sign = $request->header('sign');
  122. $logic = new NewSupefinaSpeiLogic();
  123. $signHeaders = [
  124. 'version' => $request->header('version'),
  125. 'merchantNo' => $request->header('merchantno'),
  126. 'requestId' => $request->header('requestid'),
  127. 'requestTime' => $request->header('requesttime'),
  128. ];
  129. $config = (new PayConfig())->getConfig('NewSupefinaSpei');
  130. $string = $logic->getSignString($signHeaders, $post);
  131. $res = $logic->verifySign($string, $sign, $config['publickey']);
  132. if ($res !== true) {
  133. Util::WriteLog('NewSupefinaSpei_error', 'payout notify sign invalid' . $string);
  134. return 'fail';
  135. }
  136. $data = Aes::decrypt($post['data'], base64_decode($config['aesKey']));
  137. Util::WriteLog('NewSupefinaSpei', 'decoded data'.$data);
  138. if (empty($data)) {
  139. Util::WriteLog('NewSupefinaSpei_error', 'des decrypt fail ' . $post['data']);
  140. return 'fail';
  141. }
  142. $data = json_decode($data, true);
  143. $lockKey = '';
  144. $orderId = $data['merchantOrderNo'];
  145. if ($orderId) {
  146. $lockKey = 'payout_notify_NewSupefinaSpei_' . $orderId;
  147. if (!SetNXLock::getExclusiveLock($lockKey, 60)) {
  148. Util::WriteLog('NewSupefinaSpei', 'payout notify concurrent, ignore: ' . $orderId);
  149. return 'SUCCESS';
  150. }
  151. }
  152. try {
  153. $logic = new NewSupefinaSpeiLogic();
  154. $ret = $logic->cashNotify($data);
  155. } finally {
  156. if ($lockKey !== '') {
  157. SetNXLock::release($lockKey);
  158. }
  159. }
  160. return $ret;
  161. }
  162. }