계좌 이체가 발생하면 자동으로 디스코드 봇의 잔액을 충전하는 시스템을 구현하는 방법을 정리한다. 은행/결제사 API를 통한 웹훅 처리와, 외부 알림(예: Pushbullet)을 이용한 대안까지 실제 적용할 수 있는 절차와 코드 예제를 포함한다.
증상
디스코드에서 제공하는 자판기 기능이나 포인트 충전 기능을 운영할 때, 이용자가 은행 이체로 입금하면 수동 확인 없이 자동으로 봇 내 잔액에 반영되길 원한다. 하지만 입금 확인이 사람 손을 타면 응답 속도가 느리고 오류가 발생하기 쉽다.
원인
자동충전이 불가능한 주요 원인은 다음과 같다.
- 은행/결제사에서 입금 이벤트를 실시간으로 알려주는 API 혹은 가상계좌/입금메모 기능을 사용하지 않음.
- 입금자 식별 방법(가상계좌, 고유 메모, 고유 금액 등)이 마련되어 있지 않아 어떤 계정에 충전할지 매칭할 수 없음.
- 웹훅 수신용 HTTPS 엔드포인트가 없거나 보안 검증을 하지 않아 자동 처리에 신뢰성이 부족함.
- 일부 결제/은행 API는 사업자 등록 혹은 성인 계정이 필요해 접근이 제한될 수 있음.
해결 방법
1단계: 입금 식별 방식 설계 (가상계좌 또는 고유 메모)
- 가상계좌 기능 사용 가능하면 각 충전 요청마다
virtual_account를 발급하고, 입금이 해당 계좌로 확인되면 바로 해당 멤버에게 충전한다. - 가상계좌가 불가한 경우, 충전 요청 시 고유한
참조코드(예: 10자리)를 생성해 입금 메모에 기입하도록 안내한다. 은행 이체 화면의입금자명또는메모에 이 코드를 넣게 한다. - 고유 금액 방식(예: 기본금액 + 37원)도 보조 수단으로 사용할 수 있다.
2단계: 결제사/은행 API 연동(권장)
- 가능한 경우 Toss, 은행 오픈API 등에서 제공하는 웹훅/알림 기능을 활용한다. 사업자 인증이 필요할 수 있으니 서비스 계정으로 등록한다.
- 웹훅을 받는 엔드포인트는 반드시
HTTPS로 구성하고, 결제사에서 제공하는 시크릿으로 서명 검증을 수행한다. - 웹훅 수신 시 처리 흐름:
- 요청의 서명/헤더로 출처 검증.
- 이벤트 타입(입금, 가상계좌 충전 등) 확인.
- 페이로드에서 입금자 정보(가상계좌 ID 또는 참조코드, 금액) 추출.
- DB에서 충전 요청과 매칭 후 잔액 업데이트.
- 디스코드 봇으로 충전 완료 메시지 전송(혹은 DM/채널 알림).
예시: Node.js(Express) 웹훅 골격
// nodejs + express 예제
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
const SECRET = process.env.PAYMENT_SECRET;
function verifySignature(body, signature) {
const computed = crypto.createHmac('sha256', SECRET).update(JSON.stringify(body)).digest('hex');
return computed === signature;
}
app.post('/webhook/payment', (req, res) => {
const signature = req.headers['x-payment-signature'];
if (!verifySignature(req.body, signature)) return res.status(400).send('invalid signature');
const event = req.body.event; // 예: "deposit.completed"
if (event === 'deposit.completed') {
const ref = req.body.data.reference; // 가상계좌 ID 또는 참조코드
const amount = req.body.data.amount;
// DB 매칭, 잔액 업데이트 로직
// 디스코드 봇 알림 전송
}
res.status(200).send('ok');
});
app.listen(3000);
3단계: 알림 기반 대안(웹훅 불가 시)
- 은행 API 접근이 불가능하거나 개인 계정 제약(미성년자 등)으로 웹훅을 쓸 수 없으면, 스마트폰 알림을 서버로 전달하는 방식이 대안이 된다.
- Pushbullet, Pushover 같은 서비스로 스마트폰의 입금 알림을 중계하고, 서버에서 알림 텍스트를 파싱해 입금 이벤트를 식별한다.
- 이 방식은 결제사 웹훅보다 신뢰도·보안성이 낮으므로, 반드시 다음을 지킨다:
- 입금 메모/참조코드 방식 병행.
- 알림 원문 파싱 규칙을 엄격히 고정.
- 가능한 경우 수동 확인 절차(2중 체크) 포함.
Pushbullet을 이용한 간단 흐름:
- 스마트폰에서 은행 앱 알림이 Pushbullet으로 전송됨.
- 서버가 Pushbullet의 실시간 스트림 혹은 받는 메일/웹훅을 파싱.
- 메모/금액으로 DB 매칭 후 충전 처리.
4단계: 디스코드 봇 연동 및 호스팅 고려사항
- 디스코드 봇은 충전 완료 알림과 잔액 반영을 담당한다.
discord.js나 웹훅을 사용해 알림을 보낸다. - 웹훅 엔드포인트와 봇 토큰은 비밀로 관리하고, 환경변수나 시크릿 매니저 사용.
- 호스팅: 안정성과 TLS가 필수이므로 VPS, 클라우드 인스턴스 또는 디스호스트 같은 관리형 호스팅을 사용한다. 디스호스트에서 호스팅하면 SSL 설정과 프로세스 관리가 편리하다.
- 장애 대비로 로그, 재시도 로직, idempotency 키(중복 웹훅 방지)를 구현한다.
마무리
가장 안정적인 방법은 결제사/은행의 공식 API(웹훅/가상계좌)를 활용해 입금 이벤트를 실시간으로 처리하는 것이다. 웹훅을 받을 수 없을 때는 Pushbullet 등 알림 중계 방식을 보조 수단으로 사용하되, 보안과 매칭 정확성을 최우선으로 설계하라. 디스코드 봇과 호스팅(예: 디스호스트)을 적절히 구성하면 자동충전 시스템을 안전하게 운영할 수 있다.