🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
253 lines
7.9 KiB
PHP
253 lines
7.9 KiB
PHP
<?php
|
|
/**
|
|
* 등록된 카드 목록 조회 API (GetCardEx2)
|
|
* API 레퍼런스: https://dev.barobill.co.kr/docs/references/카드조회-API#GetCardEx2
|
|
*
|
|
* ============================================================================
|
|
* 데이터 흐름
|
|
* ============================================================================
|
|
*
|
|
* [호출 경로]
|
|
* 화면(ecard/index.php) → 이 API(cards.php) → barobill_card_config.php::getCardList()
|
|
* → 바로빌 SOAP API(GetCardEx2) → 바로빌 서버
|
|
*
|
|
* [카드 정보 출처]
|
|
* - 카드 정보는 바로빌 웹사이트(https://www.barobill.co.kr)에서 등록된 정보
|
|
* - 카드번호, 카드사, Web ID, Web 비밀번호 등은 바로빌에 저장되어 있음
|
|
* - 이 API는 바로빌 서버에서 등록된 카드 목록을 조회만 수행
|
|
*
|
|
* [반환 데이터]
|
|
* - cardNum: 카드번호 (전체)
|
|
* - cardNumMasked: 카드번호 (마스킹 처리, 예: "1234-****-****-5678")
|
|
* - cardCompany: 카드사 코드 (예: "04", "06", "02")
|
|
* - cardCompanyName: 카드사 이름 (예: "삼성카드", "신한카드", "KB국민카드")
|
|
* - cardBrand: 카드 브랜드 (예: "비자", "마스터카드", "카드")
|
|
* - alias: 카드 별칭
|
|
* - webId: 카드사 웹 ID (카드사 홈페이지 로그인 ID)
|
|
* - status: 카드 상태 (0=대기중, 1=정상, 2=해지, 3=수집오류, 4=일시중지)
|
|
*
|
|
* [주의사항]
|
|
* - Web 비밀번호는 보안상 반환하지 않음
|
|
* - 카드 등록/수정/삭제는 바로빌 웹사이트에서 직접 해야 함
|
|
*/
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
|
|
require_once('barobill_card_config.php');
|
|
|
|
try {
|
|
$availOnly = isset($_GET['availOnly']) ? intval($_GET['availOnly']) : 0;
|
|
|
|
$result = getCardList($availOnly);
|
|
|
|
if ($result['success']) {
|
|
$cards = [];
|
|
foreach ($result['data'] as $card) {
|
|
// GetCardEx2 응답 필드 매핑
|
|
// CardCompanyCode (등록 시), CardCompanyName (조회 시)
|
|
$cardCompanyCode = $card->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;
|
|
}
|
|
?>
|
|
|