Files
sam-sales/barobill/ecard/api/cards.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;
}
?>