All checks were successful
Deploy api / deploy (push) Successful in 22s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
83 lines
2.5 KiB
PHP
83 lines
2.5 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Api;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use App\Models\PaymentTransaction;
|
||
use Illuminate\Http\JsonResponse;
|
||
use Illuminate\Http\Request;
|
||
|
||
/**
|
||
* 決済ステータス取得コントローラ(API 4)
|
||
*/
|
||
class PaymentStatusController extends Controller
|
||
{
|
||
/**
|
||
* 決済ステータス取得
|
||
*
|
||
* GET /api/newwipe/status?SyunoRecvNum=...
|
||
*/
|
||
public function show(Request $request): JsonResponse
|
||
{
|
||
$syunoRecvNum = $request->query('SyunoRecvNum');
|
||
|
||
if (empty($syunoRecvNum)) {
|
||
return response()->json([
|
||
'error' => [
|
||
'code' => 'INVALID_REQUEST',
|
||
'message' => 'SyunoRecvNumは必須です。',
|
||
]
|
||
], 400);
|
||
}
|
||
if (!preg_match('/^[a-zA-Z0-9]{1,20}$/', (string) $syunoRecvNum)) {
|
||
return response()->json([
|
||
'error' => [
|
||
'code' => 'INVALID_REQUEST',
|
||
'message' => 'SyunoRecvNumの形式が不正です。',
|
||
]
|
||
], 400);
|
||
}
|
||
|
||
$transaction = PaymentTransaction::where('syuno_recv_num', $syunoRecvNum)->first();
|
||
|
||
if (!$transaction) {
|
||
return response()->json([
|
||
'error' => [
|
||
'code' => 'DATA_NOT_FOUND',
|
||
'message' => '指定された受付番号のデータが見つかりません。',
|
||
]
|
||
], 404);
|
||
}
|
||
|
||
// レスポンス構築
|
||
$response = [
|
||
'SyunoRecvNum' => $transaction->syuno_recv_num,
|
||
'status' => $transaction->status,
|
||
'amount' => $transaction->amount,
|
||
'payLimit' => $transaction->pay_limit ? $transaction->pay_limit->toIso8601String() : null,
|
||
];
|
||
|
||
// 入金済みの場合は追加情報
|
||
if ($transaction->status === '入金済み') {
|
||
$response['paidDateTime'] = $transaction->paid_datetime
|
||
? $transaction->paid_datetime->toIso8601String()
|
||
: null;
|
||
$response['storeCode'] = $transaction->store_code;
|
||
$response['storeName'] = $this->getStoreName($transaction->store_code);
|
||
}
|
||
|
||
return response()->json($response);
|
||
}
|
||
|
||
/**
|
||
* 店舗コードから店舗名を取得
|
||
*/
|
||
private function getStoreName(?string $storeCode): ?string
|
||
{
|
||
if (empty($storeCode)) {
|
||
return null;
|
||
}
|
||
return config('wellnet.store_codes.' . $storeCode);
|
||
}
|
||
}
|