김재현Hammer Turtle
프로젝트 목록

NEON 지급거절(Chargeback) 검토 자동화

네오위즈 글로벌 게임 플랫폼 NEON에서 Google·Apple의 환불 검토 요청에 게임 사용 증거를 모아 기한 안에 자동 회신하는 결제 기능

배경 및 목표

① Google 정책 변경: Google Play가 2026년 8월 3일 주문부터 chargeback 비용을 개발사에 부담시키기로 하면서 검토 요청에 24시간 안에 사용 증거로 회신해야 방어할 수 있게 됐는데, 네오위즈 글로벌 게임 플랫폼 NEON의 결제 서버에는 회신 경로가 없었음.

② 조용히 실패하던 Apple 알림: Apple 환불 알림 수신 경로가 라이브에서 전건 파싱에 실패하는데도 HTTP 200을 응답해 Apple이 재시도하지 않았고, 알림이 유실되는 줄 아무도 몰랐음.

→ Apple 수신 파이프라인을 다시 세우고 그 위에 두 스토어 공통의 검토 흐름(수신 → 게임 증거 조회 → 마켓 규격 변환 → 제출)을 만들어 기한 안에 자동으로 회신하게 함.

역할

설계 및 주도적 개발 (장애 분석 · 설계 · 결제 서버 · 어드민 · HOP 적용 · 게임 연동 가이드)

주요 업무 및 성과

① 라이브 Apple 알림 장애 복구

  • 원인 추적 로그와 코드를 따라가 수동 JWT 디코드와 엄격한 JSON 매핑이 Apple 신규 필드에서 실패하는데, 예외를 삼키는 catch와 상태 코드를 본문으로 돌려주는 컨트롤러가 이 실패를 200으로 가린 것을 밝혀냄.
  • 수신 재작성 서명 검증과 디코드는 Apple 공식 라이브러리에 맡기고 위조·손상은 4xx, 서버 오류는 5xx로 응답해 Apple의 재시도가 다시 동작하게 함.
  • 무중단 전환 새 경로를 만들지 않고 라이브 게임이 쓰는 기존 엔드포인트에 통합해 환불 처리는 그대로 둔 채 검토 기능만 얹음.

② Google·Apple 지급거절 검토 자동 회신

  • 수신과 기한 Google RTDN과 Apple CONSUMPTION_REQUEST를 검토 건으로 저장하고 스토어별 회신 기한(24시간, 12시간)을 함께 기록함.
  • 자동 제출 비동기로 게임 증거를 받아 Google reviewRefund, Apple Send Consumption Information V2 규격으로 바꿔 제출하고 실패 건은 수동 대기로 돌려 어드민에서 기한 안에 직접 제출하게 함.
  • 중복 방어 알림 UUID를 유니크 키로 잡아 5xx 뒤 재시도로 같은 알림이 다시 와도 한 번만 처리되게 함.

③ 게임 연동 계약 단일화

  • 단일 엔드포인트 게임 서버는 증거 API 하나만 구현하고 마켓 구분은 store 파라미터로 받게 해서 Apple을 추가할 때도 게임 응답 계약을 바꾸지 않음.
  • 규격 흡수 게임은 환불 의견과 사용률만 답하고, 스토어별 값 변환(사용률 단위 환산, 의견 매핑, 지급 상태 판정)은 플랫폼이 맡음.
  • 문서화 JWT 인증 규격, OpenAPI 명세, 연동 가이드를 게임팀에 제공함.

결과

① 2026년 8월 라이브 반영: Google·Apple 지급거절 검토 요청에 게임 증거를 근거로 자동 회신하고 Apple 환불 알림 수신 경로를 복구함.

② HOP 확장: 같은 흐름을 포커 게임 하우스 오브 포커(HOP)의 제재 서비스에도 적용해 Google 검토 요청 수신과 회신을 구현함.

회고

장애 분석에서 가장 위험했던 건 에러가 아니라 200이었다. 실패를 성공으로 응답하니 Apple은 재시도하지 않았고 모니터링도 조용했다. 웹훅 수신부는 실패를 정직하게 돌려줘야 상대 시스템의 재시도가 안전망이 된다는 걸 배웠다. → 두 번째 스토어를 붙일 때는 게임 쪽 계약부터 고정했다. 스토어 규격 차이를 플랫폼 안에서 흡수하니 Apple이 추가돼도 게임 서버는 store 값 하나만 더 읽으면 됐다.