Files
sam-api/app/Services/Barobill/BarobillFakeSoapService.php
김보곤 7726b81933 feat: [barobill] Fake SOAP 서비스 + 경동 단가 테이블 모델/시더
- BarobillFakeSoapService: SOAP 호출 없이 샘플 데이터 반환 (46개 메서드)
- AppServiceProvider: BAROBILL_FAKE_MODE 시 자동 바인딩 전환
- services.php: fake_mode 설정 추가
- KdPriceTable 모델 + KdPriceTableSeeder (5130 레거시 마이그레이션)
2026-03-22 22:04:14 +09:00

534 lines
17 KiB
PHP

<?php
namespace App\Services\Barobill;
use App\Models\Barobill\BarobillMember;
use Illuminate\Support\Str;
/**
* 바로빌 Fake SOAP 서비스
*
* 실제 SOAP 호출 없이 현실적인 샘플 데이터를 반환한다.
* .env에서 BAROBILL_FAKE_MODE=true 설정 시 자동 전환.
*
* 용도:
* - 바로빌 계정/인증서 없이 전체 API 흐름 테스트
* - React 프론트엔드 독립 개발
* - 데모 테넌트 시연
* - 자동화 테스트
*/
class BarobillFakeSoapService extends BarobillSoapService
{
private bool $initialized = false;
private string $fakeCorpNum = '6648603713';
private string $fakeBizNo = '6648603713';
// ─── 설정 관련 (오버라이드) ───
public function switchServerMode(bool $isTestMode): self
{
$this->initialized = true;
return $this;
}
public function setServerMode(string $mode): self
{
$this->initialized = true;
return $this;
}
public function getServerMode(): string
{
return 'test';
}
public function checkConfiguration(): array
{
return [
'cert_key_set' => true,
'corp_num_set' => true,
'test_mode' => true,
'mode_label' => 'FAKE 모드 (테스트용)',
'soap_url' => 'fake://localhost',
'config_source' => 'fake',
'fake_mode' => true,
];
}
public function initForMember(BarobillMember $member): self
{
$this->fakeCorpNum = $member->biz_no ?? $this->fakeCorpNum;
$this->initialized = true;
return $this;
}
// ─── 핵심 SOAP 호출 (가짜 응답) ───
public function call(string $service, string $method, array $params = []): array
{
// Fake 모드에서는 모든 call()을 성공으로 반환
return ['success' => true, 'data' => 0];
}
// ─── 회원관리 (CORPSTATE) ───
public function registCorp(array $data): array
{
return $this->ok(1);
}
public function updateCorpInfo(array $data): array
{
return $this->ok(1);
}
public function getCorpState(string $corpNum): array
{
return $this->ok(1); // 1 = 활성 회원
}
// ─── 계좌조회 (BANKACCOUNT) ───
public function getBankAccounts(string $corpNum, bool $availOnly = true): array
{
return $this->ok([
(object) [
'BankAccountNum' => '110-123-456789',
'BankCode' => '088',
'BankName' => '신한은행',
'BankAccountType' => '보통예금',
'State' => 1,
],
(object) [
'BankAccountNum' => '123-45-6789012',
'BankCode' => '004',
'BankName' => '국민은행',
'BankAccountType' => '보통예금',
'State' => 1,
],
]);
}
public function getPeriodBankAccountTransLog(
string $corpNum, string $id, string $bankAccountNum,
string $startDate, string $endDate,
int $countPerPage = 1000, int $currentPage = 1
): array {
$transactions = [];
$balance = 50000000;
$days = max(1, (int) ((strtotime($endDate) - strtotime($startDate)) / 86400));
for ($i = 0; $i < min($days, 15); $i++) {
$date = date('Ymd', strtotime($startDate) + $i * 86400);
$isDeposit = $i % 3 !== 0;
$amount = rand(100000, 5000000);
$balance += $isDeposit ? $amount : -$amount;
$transactions[] = (object) [
'TransDT' => $date.'120000',
'TransDate' => $date,
'TransTime' => '120000',
'Deposit' => $isDeposit ? $amount : 0,
'Withdraw' => $isDeposit ? 0 : $amount,
'Balance' => max(0, $balance),
'Summary' => $isDeposit ? '입금' : '출금',
'Cast' => $this->fakeName(),
'Memo' => '',
'TransOffice' => $this->fakeCompany(),
];
}
return $this->ok($transactions);
}
public function getDailyBankAccountTransLog(
string $corpNum, string $id, string $bankAccountNum,
string $baseDate, string $transDirection = '',
int $countPerPage = 20, int $currentPage = 1
): array {
return $this->getPeriodBankAccountTransLog($corpNum, $id, $bankAccountNum, $baseDate, $baseDate);
}
public function getMonthlyBankAccountTransLog(
string $corpNum, string $id, string $bankAccountNum,
string $baseMonth, string $transDirection = '',
int $countPerPage = 20, int $currentPage = 1
): array {
$start = $baseMonth.'01';
$end = date('Ymt', strtotime($start));
return $this->getPeriodBankAccountTransLog($corpNum, $id, $bankAccountNum, $start, $end);
}
public function getBankAccountScrapRequestUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/bank-scrap?corp='.$corpNum);
}
public function getCertificateRegistUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/cert-regist?corp='.$corpNum);
}
public function checkCertificateValid(string $corpNum): array
{
return $this->ok(1); // 1 = 유효
}
public function getCertificateExpireDate(string $corpNum): array
{
return $this->ok(date('Ymd', strtotime('+1 year')));
}
public function getCertificateRegistDate(string $corpNum): array
{
return $this->ok(date('Ymd', strtotime('-6 months')));
}
public function getBalanceCostAmount(string $corpNum): array
{
return $this->ok(85000); // 충전잔액 85,000원
}
public function getCashChargeUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/cash-charge?corp='.$corpNum);
}
public function getBankAccountManagementUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/bank-manage?corp='.$corpNum);
}
public function getBankAccountLogUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/bank-log?corp='.$corpNum);
}
public function getBarobillUrl(string $corpNum, string $userId, string $userPwd, string $togo = ''): array
{
return $this->ok('https://testws.baroservice.com/fake/main?corp='.$corpNum);
}
// ─── 카드조회 (CARD) ───
public function getCards(string $corpNum, bool $availOnly = true): array
{
return $this->ok([
(object) [
'CardNum' => '5365-12**-****-1234',
'CardCompany' => '02',
'CardCompanyName' => '삼성카드',
'CardType' => '법인',
'State' => 1,
],
(object) [
'CardNum' => '4567-89**-****-5678',
'CardCompany' => '04',
'CardCompanyName' => '현대카드',
'CardType' => '법인',
'State' => 1,
],
]);
}
public function registCard(string $corpNum, array $cardData): array
{
return $this->ok(1);
}
public function updateCard(string $corpNum, array $cardData): array
{
return $this->ok(1);
}
public function stopCard(string $corpNum, string $cardNum): array
{
return $this->ok(1);
}
public function cancelStopCard(string $corpNum, string $cardNum): array
{
return $this->ok(1);
}
public function getPeriodCardLog(
string $corpNum, string $id, string $cardNum,
string $startDate, string $endDate,
int $countPerPage = 1000, int $currentPage = 1
): array {
$transactions = [];
$merchants = ['스타벅스 강남점', '이마트 역삼점', 'GS25 편의점', '교보문고', '쿠팡', '배달의민족', '카카오택시', '주유소'];
$days = max(1, (int) ((strtotime($endDate) - strtotime($startDate)) / 86400));
for ($i = 0; $i < min($days * 2, 20); $i++) {
$date = date('Ymd', strtotime($startDate) + intdiv($i, 2) * 86400);
$amount = rand(5000, 500000);
$supply = (int) round($amount / 1.1);
$tax = $amount - $supply;
$transactions[] = (object) [
'UseDT' => $date.sprintf('%02d%02d00', rand(8, 22), rand(0, 59)),
'UseDate' => $date,
'UseTime' => sprintf('%02d%02d00', rand(8, 22), rand(0, 59)),
'ApprovalNum' => sprintf('%08d', rand(10000000, 99999999)),
'ApprovalType' => '승인',
'ApprovalAmount' => $amount,
'Tax' => $tax,
'ServiceCharge' => 0,
'PaymentPlan' => '일시불',
'CurrencyCode' => 'KRW',
'MerchantName' => $merchants[array_rand($merchants)],
'MerchantBizNum' => sprintf('%010d', rand(1000000000, 9999999999)),
'MerchantAddr' => '서울시 강남구',
'UseKey' => $cardNum.'|'.$date.'|'.rand(1000, 9999),
];
}
return $this->ok($transactions);
}
public function getDailyCardLog(
string $corpNum, string $id, string $cardNum,
string $baseDate, int $countPerPage = 20, int $currentPage = 1
): array {
return $this->getPeriodCardLog($corpNum, $id, $cardNum, $baseDate, $baseDate);
}
public function getMonthlyCardLog(
string $corpNum, string $id, string $cardNum,
string $baseMonth, int $countPerPage = 20, int $currentPage = 1
): array {
$start = $baseMonth.'01';
$end = date('Ymt', strtotime($start));
return $this->getPeriodCardLog($corpNum, $id, $cardNum, $start, $end);
}
public function getCardScrapRequestUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/card-scrap?corp='.$corpNum);
}
public function getCardManagementUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/card-manage?corp='.$corpNum);
}
public function getCardLogUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/card-log?corp='.$corpNum);
}
// ─── 홈택스 (TI) ───
public function getHomeTaxUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/hometax?corp='.$corpNum);
}
public function getTaxInvoiceIssueUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/tax-invoice-issue?corp='.$corpNum);
}
public function getTaxInvoiceListUrl(string $corpNum, string $userId, string $userPwd): array
{
return $this->ok('https://testws.baroservice.com/fake/tax-invoice-list?corp='.$corpNum);
}
// ─── 카카오톡 (KAKAOTALK) ───
public function getKakaotalkChannels(string $corpNum): array
{
return $this->ok([
(object) [
'ChannelId' => '@sam-test',
'ChannelName' => 'SAM 테스트 채널',
'SearchId' => '@sam-test',
'CategoryCode' => 'BIZ',
],
]);
}
public function getKakaotalkChannelManagementUrl(string $corpNum, string $id): array
{
return $this->ok('https://testws.baroservice.com/fake/kakao-channel?corp='.$corpNum);
}
public function getKakaotalkTemplates(string $corpNum, string $channelId): array
{
return $this->ok([
(object) [
'TemplateName' => '주문확인',
'TemplateCode' => 'TPL001',
'TemplateContent' => '#{고객명}님, 주문이 확인되었습니다.',
'Status' => 'A',
],
(object) [
'TemplateName' => '발송완료',
'TemplateCode' => 'TPL002',
'TemplateContent' => '#{고객명}님, 상품이 발송되었습니다.',
'Status' => 'A',
],
]);
}
public function getKakaotalkTemplateManagementUrl(string $corpNum, string $id): array
{
return $this->ok('https://testws.baroservice.com/fake/kakao-template?corp='.$corpNum);
}
public function sendATKakaotalk(
string $corpNum, string $senderId, string $yellowId,
string $templateName, string $receiverName, string $receiverNum,
string $title, string $message,
string $smsMessage = '', string $smsSubject = '',
string $smsSenderNum = '', string $reserveDT = ''
): array {
return $this->ok('FAKE-KKO-'.Str::random(12));
}
public function sendATKakaotalkEx(
string $corpNum, string $senderId, string $yellowId,
string $templateName, string $receiverName, string $receiverNum,
string $title, string $message, array $buttons = [],
string $smsMessage = '', string $smsSubject = '',
string $smsSenderNum = '', string $reserveDT = ''
): array {
return $this->ok('FAKE-KKO-'.Str::random(12));
}
public function sendATKakaotalks(
string $corpNum, string $senderId, string $yellowId,
string $templateName, array $messages, string $reserveDT = ''
): array {
return $this->ok('FAKE-KKO-BULK-'.Str::random(8));
}
public function sendFTKakaotalk(
string $corpNum, string $senderId, string $channelId,
string $receiverName, string $receiverNum, string $message,
array $buttons = [], string $smsMessage = '', string $smsSubject = '',
bool $adYn = false, string $reserveDT = ''
): array {
return $this->ok('FAKE-FT-'.Str::random(12));
}
public function sendFTKakaotalks(
string $corpNum, string $senderId, string $channelId,
array $messages, bool $adYn = false, string $reserveDT = ''
): array {
return $this->ok('FAKE-FT-BULK-'.Str::random(8));
}
public function sendFIKakaotalk(
string $corpNum, string $senderId, string $channelId,
string $receiverName, string $receiverNum, string $message,
string $imageUrl, array $buttons = [],
string $smsMessage = '', string $smsSubject = '',
bool $adYn = false, string $reserveDT = ''
): array {
return $this->ok('FAKE-FI-'.Str::random(12));
}
public function sendFWKakaotalk(
string $corpNum, string $senderId, string $channelId,
string $receiverName, string $receiverNum, string $message,
string $imageUrl, array $buttons = [],
string $smsMessage = '', string $smsSubject = '',
bool $adYn = false, string $reserveDT = ''
): array {
return $this->ok('FAKE-FW-'.Str::random(12));
}
public function getSendKakaotalk(string $corpNum, string $sendKey): array
{
return $this->ok((object) [
'SendKey' => $sendKey,
'SendState' => 3, // 전송 성공
'SendStateName' => '전송성공',
'SendDT' => now()->format('YmdHis'),
'ResultDT' => now()->format('YmdHis'),
]);
}
public function getSendKakaotalks(string $corpNum, array $sendKeyList): array
{
$results = [];
foreach ($sendKeyList as $key) {
$results[] = (object) [
'SendKey' => $key,
'SendState' => 3,
'SendStateName' => '전송성공',
];
}
return $this->ok($results);
}
public function cancelReservedKakaotalk(string $corpNum, string $sendKey): array
{
return $this->ok(1);
}
// ─── SMS ───
public function sendSMSMessage(
string $corpNum, string $senderId, string $fromNumber,
string $toName, string $toNumber, string $contents,
string $sendDT = '', string $refKey = ''
): array {
return $this->ok('FAKE-SMS-'.Str::random(12));
}
public function checkSMSFromNumber(string $corpNum, string $fromNumber): array
{
return $this->ok(1); // 등록된 번호
}
public function getSMSFromNumbers(string $corpNum): array
{
return $this->ok([
(object) ['FromNumber' => '02-1234-5678', 'State' => 1],
(object) ['FromNumber' => '010-9876-5432', 'State' => 1],
]);
}
public function getSMSSendState(string $corpNum, string $sendKey): array
{
return $this->ok((object) [
'SendKey' => $sendKey,
'SendState' => 3,
'SendStateName' => '전송성공',
'SendDT' => now()->format('YmdHis'),
]);
}
// ─── 헬퍼 ───
private function ok(mixed $data): array
{
return ['success' => true, 'data' => $data];
}
private function fakeName(): string
{
$names = ['홍길동', '김영수', '이미영', '박지훈', '최서연', '정태우', '강민지'];
return $names[array_rand($names)];
}
private function fakeCompany(): string
{
$companies = ['(주)한국전력', '삼성전자', 'LG화학', '현대건설', '롯데마트', 'CJ물류', 'SKT', '네이버'];
return $companies[array_rand($companies)];
}
}