1. 무통장입금의 문제점
소규모 쇼핑몰이나 스타트업에서 가장 많이 사용하는 결제 방식은 무통장입금입니다. 신용카드 결제 수수료(2.5~3.5%)가 부담스러울 때 무통장입금은 좋은 대안입니다. 하지만 큰 문제가 있습니다.
수동 확인의 불편함
- 관리자가 매번 은행 앱에 접속해서 거래내역을 확인해야 합니다
- 입금자 이름과 주문자 이름이 다르면 매칭이 어렵습니다
- 하루에 수십 건의 주문이 들어오면 확인 작업이 매우 번거롭습니다
- 입금 확인이 늦어지면 고객 불만이 발생합니다
인건비와 시간 낭비
하루 30건의 무통장입금을 수동으로 확인한다면, 1건당 2분씩 총 60분이 소요됩니다. 월 22일 근무 기준으로 매월 22시간을 입금 확인에 사용하게 됩니다. 이는 막대한 인건비 낭비입니다.
해결책: 계좌조회api
계좌조회api의 자동 입금확인 API를 사용하면 이 모든 문제를 해결할 수 있습니다. 계좌조회api를 통해 거래내역을 자동으로 조회하고, 주문 금액과 매칭하여 입금을 자동으로 확인할 수 있습니다.
2. 자동 입금확인 API로 해결
계좌조회api를 사용한 자동 입금확인 API 시스템의 장점은 다음과 같습니다:
완전 자동화
5분마다 계좌조회api를 호출하여 신규 입금을 자동으로 확인합니다. 관리자는 더 이상 은행 앱에 접속할 필요가 없습니다.
즉시 처리
입금이 확인되면 즉시 주문 상태가 변경되고, 고객에게 입금 확인 알림이 발송됩니다. 배송 준비도 바로 시작할 수 있습니다.
비용 절감
계좌조회api는 완전 무료이며 앞으로도 유료화 계획이 없습니다. 월간 호출 건수 상한도 없습니다. 다만 같은 계좌는 5분에 1회만 조회되므로, 5분마다 1회 호출하는 것으로 충분합니다.
정확성 향상
계좌조회api는 은행에서 직접 거래내역을 가져오므로 100% 정확합니다. 수동 확인 시 발생하는 실수를 완전히 방지할 수 있습니다.
3. 시스템 아키텍처
자동 입금확인 API 시스템의 구조는 다음과 같습니다:
고객 → 무통장입금 주문 생성
↓
[주문 DB]
↓
[Cron Job] 5분마다 실행
↓
[계좌조회api] 거래내역 조회
↓
[입금 매칭 로직]
↓
[주문 상태 업데이트]
↓
[고객 알림 발송]
필요한 정보
- 주문 정보: 주문번호, 주문 금액, 주문일시
- 계좌 정보: 은행 코드, 계좌번호
- 계좌조회api 인증: API Key, Secret Key
4. 실전 구현 (Node.js)
계좌조회api를 사용하여 Node.js로 자동 입금확인 API를 구현해보겠습니다.
Step 1: 환경 변수 설정
# .env
BANK_API_KEY=pk_live_xxxxx
BANK_API_SECRET=sk_live_xxxxx
BANK_CODE=NH
ACCOUNT_NUMBER=123456789012
Step 2: 계좌조회api 호출 함수
// api/bankApi.js
const fetch = require('node-fetch');
async function getTransactions() {
const apiKey = process.env.BANK_API_KEY;
const secretKey = process.env.BANK_API_SECRET;
const today = new Date().toISOString().slice(0, 10).replace(/-/g, ''); // "20260117"
const response = await fetch('https://api.bankapi.co.kr/v1/transactions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}:${secretKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
bankCode: process.env.BANK_CODE,
accountNumber: process.env.ACCOUNT_NUMBER,
accountPassword: process.env.ACCOUNT_PASSWORD, // 계좌 비밀번호(4자리)
residentNumber: process.env.RESIDENT_NUMBER, // 주민번호 앞 6자리
startDate: today,
endDate: today
})
});
const data = await response.json();
if (!data.success) {
throw new Error(`계좌조회api 오류: ${data.error}`);
}
return data.transactions; // 응답: { success, transactions, accountInfo }
}
module.exports = { getTransactions };
Step 3: 입금 매칭 로직
// services/depositChecker.js
const { getTransactions } = require('../api/bankApi');
const Order = require('../models/Order');
async function checkNewDeposits() {
try {
// 1. 계좌조회api로 오늘 거래내역 조회 (getTransactions가 오늘 범위로 조회)
const transactions = await getTransactions();
// 2. 입금 거래만 필터링 (type은 'deposit' 또는 'withdrawal')
const todayDeposits = transactions.filter(tx => tx.type === 'deposit');
// 3. 대기 중인 무통장입금 주문 조회
const pendingOrders = await Order.find({
paymentMethod: 'bank_transfer',
status: 'pending',
createdAt: { $gte: new Date(new Date().toISOString().split('T')[0]) }
});
// 4. 입금과 주문 매칭
for (const order of pendingOrders) {
const matchedDeposit = todayDeposits.find(deposit =>
deposit.amount === order.totalAmount &&
!deposit.matched // 이미 매칭된 입금은 제외
);
if (matchedDeposit) {
// 5. 주문 상태 업데이트
await Order.updateOne(
{ _id: order._id },
{
status: 'paid',
paidAt: new Date(),
depositInfo: {
depositor: matchedDeposit.counterparty, // 입금자명(의뢰인)
depositTime: matchedDeposit.time
}
}
);
// 6. 고객에게 알림 발송
await sendPaymentConfirmation(order);
// 7. 입금을 매칭됨으로 표시
matchedDeposit.matched = true;
console.log(`✅ 주문 ${order.orderNumber} 입금 확인 완료`);
}
}
return {
checked: pendingOrders.length,
matched: todayDeposits.filter(d => d.matched).length
};
} catch (error) {
console.error('❌ 계좌조회api 호출 실패:', error);
throw error;
}
}
module.exports = { checkNewDeposits };
Step 4: Cron Job 설정
// jobs/depositCheckJob.js
const cron = require('node-cron');
const { checkNewDeposits } = require('../services/depositChecker');
// 영업시간(09:00~18:00) 내 5분마다 실행
cron.schedule('*/10 9-18 * * *', async () => {
console.log('🔍 자동 입금확인 API 실행...');
try {
const result = await checkNewDeposits();
console.log(`✅ ${result.checked}건 확인, ${result.matched}건 매칭`);
} catch (error) {
console.error('❌ 자동 입금확인 실패:', error);
}
});
console.log('✅ 계좌조회api 자동 입금확인 Cron Job 시작');
Step 5: Express 서버에 통합
// server.js
const express = require('express');
require('./jobs/depositCheckJob'); // Cron Job 시작
const app = express();
app.get('/api/deposit-check', async (req, res) => {
// 수동으로 입금 확인 트리거
const result = await checkNewDeposits();
res.json(result);
});
app.listen(3000, () => {
console.log('✅ 서버 시작 - 계좌조회api 자동 입금확인 활성화');
});
5. Python으로 구현하기
Python으로도 계좌조회api의 자동 입금확인 API를 쉽게 구현할 수 있습니다.
Python 예제
# deposit_checker.py
import requests
import os
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def get_transactions():
"""계좌조회api로 거래내역 조회"""
api_key = os.getenv('BANK_API_KEY')
secret_key = os.getenv('BANK_API_SECRET')
today = datetime.now().strftime('%Y%m%d') # "20260117"
response = requests.post(
'https://api.bankapi.co.kr/v1/transactions',
headers={
'Authorization': f'Bearer {api_key}:{secret_key}',
'Content-Type': 'application/json'
},
json={
'bankCode': os.getenv('BANK_CODE'),
'accountNumber': os.getenv('ACCOUNT_NUMBER'),
'accountPassword': os.getenv('ACCOUNT_PASSWORD'), # 계좌 비밀번호(4자리)
'residentNumber': os.getenv('RESIDENT_NUMBER'), # 주민번호 앞 6자리
'startDate': today,
'endDate': today
}
)
data = response.json()
if not data.get('success'):
raise Exception(data.get('error'))
return data['transactions'] # 응답: { success, transactions, accountInfo }
def check_new_deposits():
"""자동 입금확인"""
try:
# 계좌조회api 호출 (오늘 범위로 조회됨)
transactions = get_transactions()
# 입금 거래만 필터링 (type은 'deposit' 또는 'withdrawal')
deposits = [tx for tx in transactions if tx['type'] == 'deposit']
# 대기 중인 주문 조회
pending_orders = get_pending_orders()
matched = 0
for order in pending_orders:
# 금액이 일치하는 입금 찾기
matching_deposit = next(
(d for d in deposits if d['amount'] == order['amount']),
None
)
if matching_deposit:
# 주문 상태 업데이트
update_order_status(order['id'], 'paid')
send_notification(order)
matched += 1
print(f"✅ 주문 {order['number']} 입금 확인 완료")
print(f"🔍 {len(pending_orders)}건 확인, {matched}건 매칭")
except Exception as e:
print(f"❌ 계좌조회api 호출 실패: {e}")
# 10분마다 실행 (같은 계좌는 5분에 1회만 조회되므로 주기는 5분 이상 권장)
scheduler = BlockingScheduler()
scheduler.add_job(check_new_deposits, 'interval', minutes=10)
print("✅ 계좌조회api 자동 입금확인 시작")
scheduler.start()
6. 고급 기능
1. 중복 처리 방지
같은 입금을 여러 번 처리하지 않도록 Redis에 처리된 거래 ID를 캐싱하세요.
const redis = require('redis');
const client = redis.createClient();
async function isAlreadyProcessed(transactionId) {
return await client.exists(`tx:${transactionId}`);
}
async function markAsProcessed(transactionId) {
await client.setex(`tx:${transactionId}`, 86400, '1'); // 24시간
}
2. 입금자 이름 매칭
주문자 이름과 입금자 이름이 다를 수 있습니다. 주문 시 입금자 이름을 받아서 매칭 정확도를 높이세요.
const matchedDeposit = deposits.find(d =>
d.amount === order.amount &&
d.counterparty.includes(order.depositorName) // counterparty = 입금자명(의뢰인)
);
3. Webhook 알림
입금이 확인되면 즉시 Webhook을 발송하여 다른 시스템과 연동하세요.
async function notifyWebhook(order) {
await fetch(order.webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event: 'payment.confirmed',
orderId: order.id,
amount: order.amount
})
});
}
7. 프로덕션 체크리스트
보안
- ✅ API Key와 Secret Key를 환경 변수로 관리
- ✅ GitHub에 .env 파일 커밋 금지
- ✅ HTTPS 필수 사용
에러 처리
- ✅ 계좌조회api 호출 실패 시 재시도 로직
- ✅ 관리자에게 에러 알림 (Slack, Email)
- ✅ 로그 기록 및 모니터링
성능
- ✅ Rate Limit 준수 (같은 계좌는 5분에 1회, 30분당 최대 30회 성공/60회 요청)
- ✅ 데이터베이스 인덱스 최적화
- ✅ Redis 캐싱 활용
테스트
- ✅ API 테스트 페이지에서 미리 테스트
- ✅ 소액 테스트 입금으로 검증
- ✅ 다양한 시나리오 테스트 (동일 금액 중복 입금 등)
마치며
계좌조회api의 자동 입금확인 API를 사용하면 쇼핑몰 무통장입금 처리를 완전히 자동화할 수 있습니다. 수동 확인에 소요되던 시간과 인건비를 절감하고, 고객에게는 더 빠른 서비스를 제공할 수 있습니다.
계좌조회api는 완전 무료이며 앞으로도 유료화 계획이 없으므로, 소규모 쇼핑몰에서 부담 없이 시작할 수 있습니다. 계좌 거래내역 조회 API를 활용하여 비즈니스를 한 단계 업그레이드하세요.
🚀 지금 바로 시작하기
계좌조회api 무료 회원가입 ·
API 문서 ·
API 테스트