From 051c2452a1cdd71d1771ddcae7485d3d9695b439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Tue, 12 Apr 2022 16:25:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E4=BB=98=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/YeePayNotifyController.php | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/app/Endpoint/Callback/Http/Controllers/YeePayNotifyController.php b/app/Endpoint/Callback/Http/Controllers/YeePayNotifyController.php index d5e81843..a12e96e7 100644 --- a/app/Endpoint/Callback/Http/Controllers/YeePayNotifyController.php +++ b/app/Endpoint/Callback/Http/Controllers/YeePayNotifyController.php @@ -2,12 +2,89 @@ namespace App\Endpoint\Callback\Http\Controllers; +use App\Enums\WalletToBankLogStatus; +use App\Exceptions\BizException; +use App\Models\WalletToBankLog; +use App\Services\YeePayService; use Illuminate\Http\Request; +use Illuminate\Support\Arr; +use Illuminate\Support\Carbon; class YeePayNotifyController extends Controller { public function __invoke(Request $request) { logger()->debug('yeepay notify', $request->input()); + + $this->validateSign($request); + + switch ($request->input('service')) { + case 'accountpay.behalf.Pay': + $this->handleBehalfPayNotify($request); + break; + } + + return 'success'; + } + + /** + * 处理代付回调 + * + * @param \Illuminate\Http\Request $request + * @return void + * + * @throws \App\Exceptions\BizException + */ + protected function handleBehalfPayNotify(Request $request) + { + $resultCode = $request->input('resultCode'); + + if ($resultCode === 'EXECUTE_PROCESSING') { + return; + } + + $orderNo = $request->input('merchOrderNo'); + $orderStatus = $request->input('orderStatus'); + $context = (array) json_decode($request->input('contxt'), true); + + if (Arr::get($context, 'type') === 'wallet_to_bank') { + $log = WalletToBankLog::where('pay_sn', $orderNo)->first(); + + if ($log === null) { + return; + } + + if ($orderStatus === 'SUCCESS') { + $log->update([ + 'status' => WalletToBankLogStatus::Success, + 'pay_at' => Carbon::parse($request->input('finishTime')), + 'failed_reason' => null, + ]); + } elseif ($orderStatus === 'FAIL') { + $log->update([ + 'status' => WalletToBankLogStatus::Failed, + 'failed_reason' => $request->input('resultMessage').'#'.$resultCode, + ]); + } + } + } + + /** + * 校验签名 + * + * @param \Illuminate\Http\Request $request + * @return void + * + * @throws \App\Exceptions\BizException + */ + protected function validateSign(Request $request) + { + $yeePayService = new YeePayService(config('services.yeepay')); + + if ($request->input('sign') === $yeePayService->sign($request->input())) { + return; + } + + throw new BizException('签名错误'); } }