초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경 - DB 연결 하드코딩 → .env 기반으로 변경 - MySQL strict mode DATE 오류 수정
This commit is contained in:
252
ecard/api/cards.php
Normal file
252
ecard/api/cards.php
Normal file
@@ -0,0 +1,252 @@
|
||||
<?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;
|
||||
}
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user