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) && isset($res['checkoutUrl'])) { $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'] ?? '', ]); } 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; } }