serviceKey = config('services.nts.service_key', 'EFI7Fchltxh8LNyMu%2BUE9GSklj4ZsJqpL1UAYP6S0ci9D7fqJA98RRdxJos8KxwwEr6L9GAuAEB6E9IA1v1j2Q%3D%3D'); } /** * 사업자등록 상태 조회 * * @param string $businessNumber 사업자등록번호 (10자리, 하이픈 없이) * @return array */ public function getBusinessStatus(string $businessNumber): array { // 사업자번호에서 숫자만 추출 $bizNo = preg_replace('/[^0-9]/', '', $businessNumber); if (strlen($bizNo) !== 10) { return [ 'success' => false, 'error' => '사업자등록번호는 10자리여야 합니다.', 'code' => 'INVALID_FORMAT', ]; } $url = self::API_URL . '?serviceKey=' . $this->serviceKey; Log::info('국세청 사업자등록 상태 조회', [ 'biz_no' => $bizNo, ]); try { $response = Http::timeout(30) ->withHeaders([ 'Content-Type' => 'application/json', 'Accept' => 'application/json', ]) ->post($url, [ 'b_no' => [$bizNo], ]); $result = $response->json(); Log::info('국세청 API 응답', [ 'biz_no' => $bizNo, 'match_cnt' => $result['match_cnt'] ?? 0, 'status_code' => $response->status(), ]); if (!$response->successful()) { return [ 'success' => false, 'error' => 'HTTP 오류: ' . $response->status(), 'code' => 'HTTP_ERROR', 'http_status' => $response->status(), ]; } $matchCnt = $result['match_cnt'] ?? 0; if ($matchCnt >= 1 && isset($result['data'][0])) { $data = $result['data'][0]; return [ 'success' => true, 'data' => [ 'b_no' => $data['b_no'] ?? $bizNo, 'b_stt' => $data['b_stt'] ?? '', // 상태 (영업, 휴업, 폐업) 'b_stt_cd' => $data['b_stt_cd'] ?? '', // 상태코드 (01: 계속사업자, 02: 휴업자, 03: 폐업자) 'tax_type' => $data['tax_type'] ?? '', // 과세유형 'tax_type_cd' => $data['tax_type_cd'] ?? '', // 과세유형코드 'end_dt' => $data['end_dt'] ?? '', // 폐업일 'utcc_yn' => $data['utcc_yn'] ?? '', // 단위과세전환여부 'tax_type_change_dt' => $data['tax_type_change_dt'] ?? '', // 과세유형전환일 'invoice_apply_dt' => $data['invoice_apply_dt'] ?? '', // 세금계산서적용일 'rbf_tax_type' => $data['rbf_tax_type'] ?? '', // 직전과세유형 'rbf_tax_type_cd' => $data['rbf_tax_type_cd'] ?? '', // 직전과세유형코드 ], 'raw' => $result, ]; } // 조회 실패 (국세청에 등록되지 않은 사업자번호) $errorMsg = $result['data'][0]['tax_type'] ?? '조회된 결과가 없습니다.'; return [ 'success' => false, 'error' => $errorMsg, 'code' => 'NOT_FOUND', 'raw' => $result, ]; } catch (\Exception $e) { Log::error('국세청 API 호출 실패', [ 'biz_no' => $bizNo, 'error' => $e->getMessage(), ]); return [ 'success' => false, 'error' => '국세청 API 호출 중 오류가 발생했습니다: ' . $e->getMessage(), 'code' => 'EXCEPTION', ]; } } /** * 여러 사업자번호 일괄 상태 조회 * * @param array $businessNumbers 사업자등록번호 배열 * @return array */ public function getBusinessStatusBulk(array $businessNumbers): array { $bizNos = array_map(function ($num) { return preg_replace('/[^0-9]/', '', $num); }, $businessNumbers); // 유효하지 않은 번호 필터링 $validBizNos = array_filter($bizNos, fn($num) => strlen($num) === 10); if (empty($validBizNos)) { return [ 'success' => false, 'error' => '유효한 사업자등록번호가 없습니다.', 'code' => 'INVALID_FORMAT', ]; } $url = self::API_URL . '?serviceKey=' . $this->serviceKey; try { $response = Http::timeout(30) ->withHeaders([ 'Content-Type' => 'application/json', 'Accept' => 'application/json', ]) ->post($url, [ 'b_no' => array_values($validBizNos), ]); $result = $response->json(); if (!$response->successful()) { return [ 'success' => false, 'error' => 'HTTP 오류: ' . $response->status(), 'code' => 'HTTP_ERROR', ]; } return [ 'success' => true, 'data' => $result['data'] ?? [], 'match_cnt' => $result['match_cnt'] ?? 0, 'raw' => $result, ]; } catch (\Exception $e) { return [ 'success' => false, 'error' => '국세청 API 호출 중 오류가 발생했습니다: ' . $e->getMessage(), 'code' => 'EXCEPTION', ]; } } /** * 사업자 상태 코드를 한글로 변환 */ public static function getStatusLabel(string $statusCode): string { return match ($statusCode) { '01' => '계속사업자', '02' => '휴업자', '03' => '폐업자', default => '알 수 없음', }; } /** * 사업자 상태가 정상(영업중)인지 확인 */ public static function isActiveStatus(string $statusCode): bool { return $statusCode === '01'; } }