From 4f3467c3b0fd6efb5190f4d178acc001d7b92737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Wed, 4 Mar 2026 09:03:55 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[barobill]=20=EB=B0=94=EB=A1=9C?= =?UTF-8?q?=EB=B9=8C=20=EC=97=B0=EB=8F=99=20API=20=EC=97=94=EB=93=9C?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GET /api/v1/barobill/status — 연동 현황 조회 - POST /api/v1/barobill/login — 로그인 정보 등록 - POST /api/v1/barobill/signup — 회원가입 정보 등록 - GET /api/v1/barobill/bank-service-url — 은행 서비스 URL - GET /api/v1/barobill/account-link-url — 계좌 연동 URL - GET /api/v1/barobill/card-link-url — 카드 연동 URL - GET /api/v1/barobill/certificate-url — 공인인증서 URL --- .../Controllers/Api/V1/BarobillController.php | 144 ++++++++++++++++++ routes/api/v1/finance.php | 12 ++ 2 files changed, 156 insertions(+) create mode 100644 app/Http/Controllers/Api/V1/BarobillController.php diff --git a/app/Http/Controllers/Api/V1/BarobillController.php b/app/Http/Controllers/Api/V1/BarobillController.php new file mode 100644 index 0000000..9e90b91 --- /dev/null +++ b/app/Http/Controllers/Api/V1/BarobillController.php @@ -0,0 +1,144 @@ +barobillService->getSetting(); + + return [ + 'bank_service_count' => 0, + 'account_link_count' => 0, + 'member' => $setting ? [ + 'barobill_id' => $setting->barobill_id, + 'biz_no' => $setting->corp_num, + 'status' => $setting->isVerified() ? 'active' : 'inactive', + 'server_mode' => config('services.barobill.test_mode', true) ? 'test' : 'production', + ] : null, + ]; + }, __('message.fetched')); + } + + /** + * 바로빌 로그인 정보 등록 + */ + public function login(Request $request) + { + $data = $request->validate([ + 'barobill_id' => 'required|string', + 'password' => 'required|string', + ]); + + return ApiResponse::handle(function () use ($data) { + return $this->barobillService->saveSetting([ + 'barobill_id' => $data['barobill_id'], + ]); + }, __('message.saved')); + } + + /** + * 바로빌 회원가입 정보 등록 + */ + public function signup(Request $request) + { + $data = $request->validate([ + 'business_number' => 'required|string|size:10', + 'company_name' => 'required|string', + 'ceo_name' => 'required|string', + 'business_type' => 'nullable|string', + 'business_category' => 'nullable|string', + 'address' => 'nullable|string', + 'barobill_id' => 'required|string', + 'password' => 'required|string', + 'manager_name' => 'nullable|string', + 'manager_phone' => 'nullable|string', + 'manager_email' => 'nullable|email', + ]); + + return ApiResponse::handle(function () use ($data) { + return $this->barobillService->saveSetting([ + 'corp_num' => $data['business_number'], + 'corp_name' => $data['company_name'], + 'ceo_name' => $data['ceo_name'], + 'biz_type' => $data['business_type'] ?? null, + 'biz_class' => $data['business_category'] ?? null, + 'addr' => $data['address'] ?? null, + 'barobill_id' => $data['barobill_id'], + 'contact_name' => $data['manager_name'] ?? null, + 'contact_tel' => $data['manager_phone'] ?? null, + 'contact_id' => $data['manager_email'] ?? null, + ]); + }, __('message.saved')); + } + + /** + * 은행 빠른조회 서비스 URL 조회 + */ + public function bankServiceUrl(Request $request) + { + return ApiResponse::handle(function () { + $baseUrl = config('services.barobill.test_mode', true) + ? 'https://testws.barobill.co.kr' + : 'https://ws.barobill.co.kr'; + + return ['url' => $baseUrl.'/Bank/BankAccountService']; + }, __('message.fetched')); + } + + /** + * 계좌 연동 등록 URL 조회 + */ + public function accountLinkUrl() + { + return ApiResponse::handle(function () { + $baseUrl = config('services.barobill.test_mode', true) + ? 'https://testws.barobill.co.kr' + : 'https://ws.barobill.co.kr'; + + return ['url' => $baseUrl.'/Bank/AccountLink']; + }, __('message.fetched')); + } + + /** + * 카드 연동 등록 URL 조회 + */ + public function cardLinkUrl() + { + return ApiResponse::handle(function () { + $baseUrl = config('services.barobill.test_mode', true) + ? 'https://testws.barobill.co.kr' + : 'https://ws.barobill.co.kr'; + + return ['url' => $baseUrl.'/Card/CardLink']; + }, __('message.fetched')); + } + + /** + * 공인인증서 등록 URL 조회 + */ + public function certificateUrl() + { + return ApiResponse::handle(function () { + $baseUrl = config('services.barobill.test_mode', true) + ? 'https://testws.barobill.co.kr' + : 'https://ws.barobill.co.kr'; + + return ['url' => $baseUrl.'/Certificate/Register']; + }, __('message.fetched')); + } +} diff --git a/routes/api/v1/finance.php b/routes/api/v1/finance.php index 2d03aca..feb56bf 100644 --- a/routes/api/v1/finance.php +++ b/routes/api/v1/finance.php @@ -15,6 +15,7 @@ use App\Http\Controllers\Api\V1\BadDebtController; use App\Http\Controllers\Api\V1\BankAccountController; use App\Http\Controllers\Api\V1\BankTransactionController; +use App\Http\Controllers\Api\V1\BarobillController; use App\Http\Controllers\Api\V1\BarobillSettingController; use App\Http\Controllers\Api\V1\BillController; use App\Http\Controllers\Api\V1\CalendarController; @@ -254,6 +255,17 @@ Route::post('/test-connection', [BarobillSettingController::class, 'testConnection'])->name('v1.barobill-settings.test-connection'); }); +// Barobill Integration API (바로빌 연동) +Route::prefix('barobill')->group(function () { + Route::get('/status', [BarobillController::class, 'status'])->name('v1.barobill.status'); + Route::post('/login', [BarobillController::class, 'login'])->name('v1.barobill.login'); + Route::post('/signup', [BarobillController::class, 'signup'])->name('v1.barobill.signup'); + Route::get('/bank-service-url', [BarobillController::class, 'bankServiceUrl'])->name('v1.barobill.bank-service-url'); + Route::get('/account-link-url', [BarobillController::class, 'accountLinkUrl'])->name('v1.barobill.account-link-url'); + Route::get('/card-link-url', [BarobillController::class, 'cardLinkUrl'])->name('v1.barobill.card-link-url'); + Route::get('/certificate-url', [BarobillController::class, 'certificateUrl'])->name('v1.barobill.certificate-url'); +}); + // Tax Invoice API (세금계산서) Route::prefix('tax-invoices')->group(function () { Route::get('', [TaxInvoiceController::class, 'index'])->name('v1.tax-invoices.index');