CardCompanyCode ?? $card->CardCompany ?? ''; // 카드 브랜드 (비자, 마스터카드 등) 추측 $cardBrand = guessCardTypeFromNumber($card->CardNum ?? ''); // 카드 회사명 (신한, KB 등) $cardCompanyName = !empty($card->CardCompanyName) ? $card->CardCompanyName : getCardCompanyName($cardCompanyCode); $cards[] = [ 'cardNum' => $card->CardNum ?? '', 'cardNumMasked' => maskCardNumber($card->CardNum ?? ''), 'cardCompany' => $cardCompanyCode, 'cardCompanyName' => $cardCompanyName, 'cardBrand' => $cardBrand, // 카드 브랜드 (비자, 마스터카드 등) 'alias' => $card->Alias ?? '', 'cardType' => $card->CardType ?? '', 'cardTypeName' => getCardTypeName($card->CardType ?? ''), 'status' => $card->Status ?? '', 'statusName' => getCardStatusName($card->Status ?? ''), 'collectCycle' => $card->CollectCycle ?? '', 'collectCycleName' => getCollectCycleName($card->CollectCycle ?? ''), 'lastCollectDate' => formatDate($card->LastCollectDate ?? ''), 'lastCollectResult' => $card->LastCollectResult ?? '', 'lastCollectResultName' => getCollectResultName($card->LastCollectResult ?? ''), 'nextExtendDate' => formatDate($card->NextExtendDate ?? ''), 'registDate' => formatDate($card->RegistDate ?? ''), 'webId' => $card->WebId ?? '' ]; } echo json_encode([ 'success' => true, 'cards' => $cards, 'count' => count($cards) ], JSON_UNESCAPED_UNICODE); } else { echo json_encode([ 'success' => false, 'error' => $result['error'], 'error_code' => $result['error_code'] ?? null ], JSON_UNESCAPED_UNICODE); } } catch (Exception $e) { echo json_encode([ 'success' => false, 'error' => '서버 오류: ' . $e->getMessage() ], JSON_UNESCAPED_UNICODE); } /** * 카드번호 마스킹 */ function maskCardNumber($cardNum) { if (strlen($cardNum) < 8) return $cardNum; return substr($cardNum, 0, 4) . '-****-****-' . substr($cardNum, -4); } /** * 날짜 포맷팅 */ function formatDate($date) { if (empty($date)) return ''; if (strlen($date) === 8) { return substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2); } return $date; } /** * 카드번호로 카드 종류 추측 (BIN 코드 기반) */ function guessCardTypeFromNumber($cardNum) { if (empty($cardNum) || strlen($cardNum) < 4) { return '카드'; } $bin = substr($cardNum, 0, 4); // 주요 카드사 BIN 코드 $binMappings = [ '4518' => '비자', '4092' => '비자', '4569' => '비자', '4563' => '비자', '5' => '마스터카드', // 5로 시작 '3528' => 'JCB', '3529' => 'JCB', '3' => '아멕스/다이너스', // 34, 37로 시작 '9' => '국내전용카드' ]; // 정확한 매칭 시도 if (isset($binMappings[$bin])) { return $binMappings[$bin]; } // 첫 번째 숫자로 매칭 시도 $firstDigit = substr($cardNum, 0, 1); if (isset($binMappings[$firstDigit])) { return $binMappings[$firstDigit]; } return '카드'; } /** * 카드사 코드 -> 이름 변환 * 바로빌 카드사 코드 참고 */ function getCardCompanyName($code) { $companies = [ '01' => '비씨카드', '02' => 'KB국민카드', '03' => '하나카드(외환)', '04' => '삼성카드', '06' => '신한카드', '07' => '현대카드', '08' => '롯데카드', '11' => 'NH농협카드', '12' => '수협카드', '13' => '씨티카드', '14' => '우리카드', '15' => '광주카드', '16' => '전북카드', '21' => '하나카드', '22' => '제주카드', '23' => 'SC제일카드', '25' => 'KDB산업카드', '26' => 'IBK기업카드', '27' => '새마을금고', '28' => '신협카드', '29' => '저축은행', '30' => '우체국카드', '31' => '카카오뱅크', '32' => 'K뱅크', '33' => '토스뱅크', 'BC' => '비씨카드', 'KB' => 'KB국민카드', 'HANA' => '하나카드', 'SAMSUNG' => '삼성카드', 'SHINHAN' => '신한카드', 'HYUNDAI' => '현대카드', 'LOTTE' => '롯데카드', 'NH' => 'NH농협카드', 'SUHYUP' => '수협카드', 'CITI' => '씨티카드', 'WOORI' => '우리카드', 'KJBANK' => '광주카드', 'JBBANK' => '전북카드' ]; return $companies[$code] ?? $code; } /** * 카드 종류 코드 -> 이름 변환 */ function getCardTypeName($type) { $types = [ '1' => '개인카드', '2' => '법인카드' ]; return $types[$type] ?? $type; } /** * 카드 상태 코드 -> 이름 변환 */ function getCardStatusName($status) { $statuses = [ '0' => '대기중', '1' => '정상', '2' => '해지', '3' => '수집오류', '4' => '일시중지' ]; return $statuses[$status] ?? $status; } /** * 수집주기 코드 -> 이름 변환 */ function getCollectCycleName($cycle) { $cycles = [ '1' => '1일 1회', '2' => '1일 2회', '3' => '1일 3회' ]; return $cycles[$cycle] ?? $cycle; } /** * 수집결과 코드 -> 이름 변환 */ function getCollectResultName($result) { $results = [ '0' => '대기', '1' => '성공', '2' => '실패', '3' => '진행중' ]; return $results[$result] ?? $result; } ?>