디스코드 계좌 자동충전 구현 가이드

2025년 12월 20일·9개 메시지

계좌 이체가 발생하면 자동으로 디스코드 봇의 잔액을 충전하는 시스템을 구현하는 방법을 정리한다. 은행/결제사 API를 통한 웹훅 처리와, 외부 알림(예: Pushbullet)을 이용한 대안까지 실제 적용할 수 있는 절차와 코드 예제를 포함한다.

증상

디스코드에서 제공하는 자판기 기능이나 포인트 충전 기능을 운영할 때, 이용자가 은행 이체로 입금하면 수동 확인 없이 자동으로 봇 내 잔액에 반영되길 원한다. 하지만 입금 확인이 사람 손을 타면 응답 속도가 느리고 오류가 발생하기 쉽다.

원인

자동충전이 불가능한 주요 원인은 다음과 같다.

  • 은행/결제사에서 입금 이벤트를 실시간으로 알려주는 API 혹은 가상계좌/입금메모 기능을 사용하지 않음.
  • 입금자 식별 방법(가상계좌, 고유 메모, 고유 금액 등)이 마련되어 있지 않아 어떤 계정에 충전할지 매칭할 수 없음.
  • 웹훅 수신용 HTTPS 엔드포인트가 없거나 보안 검증을 하지 않아 자동 처리에 신뢰성이 부족함.
  • 일부 결제/은행 API는 사업자 등록 혹은 성인 계정이 필요해 접근이 제한될 수 있음.

해결 방법

1단계: 입금 식별 방식 설계 (가상계좌 또는 고유 메모)

  • 가상계좌 기능 사용 가능하면 각 충전 요청마다 virtual_account를 발급하고, 입금이 해당 계좌로 확인되면 바로 해당 멤버에게 충전한다.
  • 가상계좌가 불가한 경우, 충전 요청 시 고유한 참조코드(예: 10자리)를 생성해 입금 메모에 기입하도록 안내한다. 은행 이체 화면의 입금자명 또는 메모에 이 코드를 넣게 한다.
  • 고유 금액 방식(예: 기본금액 + 37원)도 보조 수단으로 사용할 수 있다.

2단계: 결제사/은행 API 연동(권장)

  • 가능한 경우 Toss, 은행 오픈API 등에서 제공하는 웹훅/알림 기능을 활용한다. 사업자 인증이 필요할 수 있으니 서비스 계정으로 등록한다.
  • 웹훅을 받는 엔드포인트는 반드시 HTTPS로 구성하고, 결제사에서 제공하는 시크릿으로 서명 검증을 수행한다.
  • 웹훅 수신 시 처리 흐름:
    1. 요청의 서명/헤더로 출처 검증.
    2. 이벤트 타입(입금, 가상계좌 충전 등) 확인.
    3. 페이로드에서 입금자 정보(가상계좌 ID 또는 참조코드, 금액) 추출.
    4. DB에서 충전 요청과 매칭 후 잔액 업데이트.
    5. 디스코드 봇으로 충전 완료 메시지 전송(혹은 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을 이용한 간단 흐름:

  1. 스마트폰에서 은행 앱 알림이 Pushbullet으로 전송됨.
  2. 서버가 Pushbullet의 실시간 스트림 혹은 받는 메일/웹훅을 파싱.
  3. 메모/금액으로 DB 매칭 후 충전 처리.

4단계: 디스코드 봇 연동 및 호스팅 고려사항

  • 디스코드 봇은 충전 완료 알림과 잔액 반영을 담당한다. discord.js나 웹훅을 사용해 알림을 보낸다.
  • 웹훅 엔드포인트와 봇 토큰은 비밀로 관리하고, 환경변수나 시크릿 매니저 사용.
  • 호스팅: 안정성과 TLS가 필수이므로 VPS, 클라우드 인스턴스 또는 디스호스트 같은 관리형 호스팅을 사용한다. 디스호스트에서 호스팅하면 SSL 설정과 프로세스 관리가 편리하다.
  • 장애 대비로 로그, 재시도 로직, idempotency 키(중복 웹훅 방지)를 구현한다.

마무리

가장 안정적인 방법은 결제사/은행의 공식 API(웹훅/가상계좌)를 활용해 입금 이벤트를 실시간으로 처리하는 것이다. 웹훅을 받을 수 없을 때는 Pushbullet 등 알림 중계 방식을 보조 수단으로 사용하되, 보안과 매칭 정확성을 최우선으로 설계하라. 디스코드 봇과 호스팅(예: 디스호스트)을 적절히 구성하면 자동충전 시스템을 안전하게 운영할 수 있다.