| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\logic\api\NewSupefinaSpeiLogic;
- use App\Http\logic\api\NewSupefinaSpeiCashierLogic;
- use App\Inter\PayMentInterFace;
- use App\Notification\TelegramBot;
- use App\Services\Aes;
- use App\Services\PayConfig;
- use App\Util;
- use App\Utility\SetNXLock;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Facades\Redis;
- class NewSupefinaSpeiController implements PayMentInterFace
- {
- private $retryTimes = 0;
- public function pay_order($userId, $payAmt, $userName, $userEmail, $userPhone, $GiftsID, $buyIP, $AdId, $eventType, $pay_method = '')
- {
- $logic = new NewSupefinaSpeiLogic();
- try {
- $res = $logic->pay_order($userId, $payAmt, $userPhone, $userEmail, $userName, $GiftsID, $buyIP, $AdId, $eventType, $pay_method);
- } catch (\Exception $exception) {
- Redis::set('PayErro_NewSupefinaSpei', 1);
- Redis::expire('PayErro_NewSupefinaSpei', 600);
- Util::WriteLog('NewSupefinaSpei_error', $exception->getMessage() . json_encode($logic->result ?? []));
- TelegramBot::getDefault()->sendProgramNotify('SupefinaSpei Except ', $exception->getMessage(), $exception);
- return apiReturnFail($logic->getError());
- }
- if (!empty($res)) {
- $content = $res['checkoutUrl'] ?? '';
- if (empty($content) && !empty($res['receiveCode'])) {
- $content = 'CLABE:' . $res['receiveCode'];
- }
- return apiReturnSuc([
- 'content' => $content,
- 'money' => $payAmt,
- 'prdOrdNo' => $res['merchantOrderNo'] ?? '',
- 'identifier' => $res['receiveCode'] ?? '',
- 'clabe' => $res['receiveCode'] ?? '',
- 'bank' => $res['bankInfo']['bankName'] ?? ''
- ]);
- }
- if ($res === false) {
- return apiReturnFail($logic->getError());
- }
- if ($this->retryTimes > 0) {
- Redis::set('PayErro_NewSupefinaSpei', 1);
- Redis::expire('PayErro_NewSupefinaSpei', 600);
- TelegramBot::getDefault()->sendProgramNotify('NewSupefinaSpei ReturnFail ', $logic->getError() . ' | ' . json_encode($res));
- return apiReturnFail($logic->getError());
- }
- $this->retryTimes++;
- return $this->pay_order($userId, $payAmt, $userName, $userEmail, $userPhone, $GiftsID, $buyIP, $AdId, $eventType, $pay_method);
- }
- /**
- * 统一回调入口:代收(01) + 代付(02),验签后按 transactionType 分发
- */
- public function notify(Request $request)
- {
- $headers = $request->headers->all();
- $payload = $request->getContent();
- $post = json_decode($payload, true);
- if (!is_array($post)) {
- $post = $request->all();
- }
- Util::WriteLog('NewSupefinaSpei', "raw notify\n" . $payload . ' ' . json_encode($headers));
- if (!isset($post['data'])) {
- Util::WriteLog('NewSupefinaSpei_error', 'empty data');
- return 'fail';
- }
- $sign = $request->header('sign');
- $logic = new NewSupefinaSpeiLogic();
- $signHeaders = [
- 'version' => $request->header('version'),
- 'merchantNo' => $request->header('merchantno'),
- 'requestId' => $request->header('requestid'),
- 'requestTime' => $request->header('requesttime'),
- ];
- $config = (new PayConfig())->getConfig('NewSupefinaSpei');
- $string = $logic->getSignString($signHeaders, $post);
- $res = $logic->verifySign($string, $sign, $config['publickey']);
- if ($res !== true) {
- Util::WriteLog('NewSupefinaSpei_error', 'notify sign invalid' . $string);
- return 'fail';
- }
- $data = Aes::decrypt($post['data'], base64_decode($config['aesKey']));
- Util::WriteLog('NewSupefinaSpei', 'decoded data'.$data);
- if (empty($data)) {
- Util::WriteLog('NewSupefinaSpei_error', 'des decrypt fail ' . $post['data']);
- return 'fail';
- }
- $data = json_decode($data, true);
- $lockKey = '';
- $orderId = $data['merchantOrderNo'];
- if ($orderId) {
- $lockKey = 'pay_notify_NewSupefinaSpei_' . $orderId;
- if (!SetNXLock::getExclusiveLock($lockKey, 60)) {
- Util::WriteLog('NewSupefinaSpei', 'notify concurrent, ignore: ' . $orderId);
- return 'SUCCESS';
- }
- }
- try {
- $res = $logic->notify($data);
- } finally {
- if ($lockKey !== '') {
- SetNXLock::release($lockKey);
- }
- }
- return $res;
- }
- /**
- * 代付回调(保留兼容,建议统一用 notify)
- */
- public function cash_notify(Request $request)
- {
- $headers = $request->headers->all();
- $payload = $request->getContent();
- $post = json_decode($payload, true);
- if (!is_array($post)) {
- $post = $request->all();
- }
- Util::WriteLog('NewSupefinaSpei', "raw payout notify\n" . $payload . json_encode($headers));
- $sign = $request->header('sign');
- $logic = new NewSupefinaSpeiLogic();
- $signHeaders = [
- 'version' => $request->header('version'),
- 'merchantNo' => $request->header('merchantno'),
- 'requestId' => $request->header('requestid'),
- 'requestTime' => $request->header('requesttime'),
- ];
- $config = (new PayConfig())->getConfig('NewSupefinaSpei');
- $string = $logic->getSignString($signHeaders, $post);
- $res = $logic->verifySign($string, $sign, $config['publickey']);
- if ($res !== true) {
- Util::WriteLog('NewSupefinaSpei_error', 'payout notify sign invalid' . $string);
- return 'fail';
- }
- $data = Aes::decrypt($post['data'], base64_decode($config['aesKey']));
- Util::WriteLog('NewSupefinaSpei', 'decoded data'.$data);
- if (empty($data)) {
- Util::WriteLog('NewSupefinaSpei_error', 'des decrypt fail ' . $post['data']);
- return 'fail';
- }
- $data = json_decode($data, true);
- $lockKey = '';
- $orderId = $data['merchantOrderNo'];
- if ($orderId) {
- $lockKey = 'payout_notify_NewSupefinaSpei_' . $orderId;
- if (!SetNXLock::getExclusiveLock($lockKey, 60)) {
- Util::WriteLog('NewSupefinaSpei', 'payout notify concurrent, ignore: ' . $orderId);
- return 'SUCCESS';
- }
- }
- try {
- $logic = new NewSupefinaSpeiLogic();
- $ret = $logic->cashNotify($data);
- } finally {
- if ($lockKey !== '') {
- SetNXLock::release($lockKey);
- }
- }
- return $ret;
- }
- }
|