105 lines
2.8 KiB
PHP
105 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Endpoint\Callback\Http\Controllers;
|
|
|
|
use App\Enums\WalletToBankLogStatus;
|
|
use App\Models\WalletToBankLog;
|
|
use App\Services\YeePayService;
|
|
use Exception;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
class YeePayNotifyController extends Controller
|
|
{
|
|
public function __invoke(Request $request)
|
|
{
|
|
$this->info('request parameters', $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('context'), true);
|
|
$contextType = Arr::get($context, 'type');
|
|
|
|
if ($contextType === 'wallet_to_bank') {
|
|
$log = WalletToBankLog::where('pay_sn', $orderNo)->first();
|
|
|
|
if ($log === null) {
|
|
return;
|
|
}
|
|
|
|
if ($log->status !== WalletToBankLogStatus::Paying) {
|
|
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 Exception('签名错误');
|
|
}
|
|
|
|
protected function info($message, array $context = [])
|
|
{
|
|
logger()->build([
|
|
'driver' => 'daily',
|
|
'path' => storage_path('logs/yeepay-notify.log'),
|
|
])->info('yeepay notify', $context);
|
|
}
|
|
}
|