Webhook 설정
- 수신 주소 입력: DGrid의 Webhook 설정에 기술팀 또는 직접 준비한 공개 HTTPS URL을 입력하고 저장하세요.
- Webhook 활성화.
- Signing Secret 가져오기: Rotate Secret을 클릭하고 생성된 시크릿을 안전하게 복사하여 수신 서버 설정에 추가하세요. 교체할 때마다 새 시크릿이 생성됩니다. 대기 중인 전달이 끝날 때까지 이전 검증 키도 보관하세요.
- 이벤트 선택: 받을 알림 유형을 활성화하세요.
- 알림 테스트: 수신 서버가 알림을 받아 서명을 검증하는지 확인하세요.
사용 가능한 이벤트
다음 6개 이벤트는 모두 Webhook 설정에서 사용할 수 있습니다. 수신 서버는 JSON 최상위eventType으로 이벤트를 식별합니다. 대소문자, 마침표, 밑줄을 정확히 유지하세요.
충전 잔액과 구독 잔액은 별개입니다. 구독 잔액 부족 알림은 구독별 UTC 월에 최대 한 번 전송되며 별도의 구독 잔액 소진 이벤트는 없습니다. Auto Deposit 실패는 실제 시도의 실패이며 시도가 생성되기 전의 자금 또는 승인 경고를 의미하지 않습니다.
수신 요청
DGrid는 저장된 URL에Content-Type: application/json으로 HTTP POST 요청을 보냅니다. 모든 알림은 같은 외부 JSON 구조를 사용합니다.
이벤트 데이터
다음 예시는 공통 구조의data만 대체합니다. ID, 시각, 잔액은 예시 값입니다.
충전 잔액 부족: balance.low
충전 잔액 소진: balance.depleted
eventType은 문자열이고 test는 불리언입니다. balance는 USD 단위의 부호 있는 십진수 문자열이며 0이나 음수일 수 있습니다. 구독 잔액을 제외한 충전 잔액입니다. 정밀도를 유지하고 부동소수점으로 변환하거나 이메일 표시용 반올림 또는 자르기 규칙을 적용하지 마세요.
Auto Deposit 완료: auto_recharge.succeeded
Auto Deposit 실패: auto_recharge.failed
attemptId는 자동 충전 시도 ID이고 state는 각각 confirmed 또는 failed로 고정됩니다. occurredAt은 UTC RFC 3339 이벤트 시각이며 소수점 이하 초를 포함할 수 있습니다. 데이터에는 이 세 필드만 있습니다. 내부 eventType, test, 금액, 거래 해시, 지갑, 실패 사유는 없습니다.
구독 활성화: subscription.activated
sourceId는 구독 UUID입니다.
구독 잔액 부족: subscription.balance_low
sourceId는 구독 UUID와 UTC 월을 <subscription UUID>:YYYY-MM 형식으로 결합합니다. 구독 이벤트의 세 필드는 모두 문자열이며 occurredAt은 UTC RFC 3339 타임스탬프입니다. 요금제 이름, 구독 날짜, 할당량, 비율, 지갑은 포함되지 않습니다. 이메일에 표시된 정보가 모두 포함된다고 가정하지 마세요.
테스트 알림
테스트 알림은 최상위test가 true입니다. 모든 이벤트는 같은 세 필드의 테스트 data를 사용하며 data.eventType은 선택한 이벤트와 최상위 eventType과 일치합니다. Auto Deposit 완료를 선택하면 다음과 같습니다.
test를 확인하세요. 테스트에는 attemptId, sourceId 같은 실제 필드가 없으며 빈 balance는 0을 의미하지 않습니다. 테스트로 잔액을 변경하거나 충전을 기록하거나 구독을 활성화하지 마세요.
서명 검증
요청에는 네 개의 관련 헤더가 포함됩니다.
헤더 이름은 대소문자를 구분하지 않습니다. 별도의 서명 키 버전 헤더는 없습니다.
Rotate Secret에 표시되는 Signing Secret은 32바이트 키의 패딩 없는 base64url 인코딩입니다. HMAC 계산 전에 바이트로 디코딩하세요. 표시된 시크릿 텍스트를 키로 직접 사용하지 마세요.
DGrid-Signature를 상수 시간 비교로 확인하고 버전 v1을 요구하세요. 재전송 공격을 제한하려면 5분의 타임스탬프 허용 범위를 권장합니다. 수신 서버의 시계를 동기화하세요. 검증 후 JSON을 파싱하고 DGrid-Event-Id와 id가 일치하는지 확인하세요.
전달에 응답하기
검증된 알림을 영구 저장한 후 5초 이내에 HTTP2xx를 반환하세요. 예를 들어 영구 큐에 저장한 다음 다음 응답을 반환합니다.
200의 JSON 본문이 오류를 표시해도 수락으로 간주합니다.
2xx가 아닌 응답, 네트워크 실패, 시간 초과는 재시도를 유발합니다. 최초 시도를 포함하여 총 최대 5회입니다. 리디렉션은 따라가지 않습니다. 오래 걸리는 업무 처리는 알림을 영구 저장한 후 진행하세요.
전달은 중복될 수 있으며 순서를 보장하지 않습니다. 재시도 시 유지되는 최상위 id로 중복을 제거하세요. 이미 수락한 중복 요청에도 2xx를 반환하고 업무 처리를 반복하지 마세요. 재시도 시 타임스탬프, 서명, 원본 바이트는 달라질 수 있습니다. 이 값이나 createdAt을 중복 제거 또는 이벤트 순서 판단에 사용하지 마세요.

