메뉴 이름은 영어 콘솔 기준입니다. 콘솔을 한국어로 쓰면 번역된 이름으로 보입니다.

RTDN의 동작 방식

실시간 개발자 알림(Real-time developer notifications, RTDN)은 Google Play의 서버 간 구매 이벤트입니다. Play가 이벤트를 Cloud Pub/Sub 주제에 게시하면, 내 코드는 Pub/Sub 구독(subscription)으로 받습니다. 메시지마다 base64로 인코딩된 data 필드가 하나 있고, 디코딩하면 DeveloperNotification이 나옵니다. packageName, eventTimeMillis, 그리고 subscriptionNotification, oneTimeProductNotification, voidedPurchaseNotification, pendingRefundReviewNotification(해결 방법을 제안할 수 있는 지불 거절 요청), testNotification 중 하나가 들어 있습니다.

Google 레퍼런스에서 기억할 문장:

“These notifications tell you only that the purchase state changed. They do not give you complete information about the purchase.”
(이 알림은 구매 상태가 바뀌었다는 사실만 알려 주며, 구매의 전체 정보를 담고 있지 않습니다.)

— Android Developers, Real-time developer notifications reference guide

받는 것은 purchaseToken(환불·무효화 알림에는 orderId도)입니다. 금액은 Google Play Developer API를 한 번 더 불러서 얻습니다(5단계).

판매에 중요한 알림 유형:

알림유형의미
subscriptionNotification(4) SUBSCRIPTION_PURCHASED새 구독 구매
(2) SUBSCRIPTION_RENEWED활성 구독 갱신
(1) SUBSCRIPTION_RECOVERED계정 보류에서 복구되었거나 일시중지에서 재개
(3) SUBSCRIPTION_CANCELED · (13) SUBSCRIPTION_EXPIRED · (12) SUBSCRIPTION_REVOKED취소, 만료, 만료 전 해지(revoke)
oneTimeProductNotification(1) ONE_TIME_PRODUCT_PURCHASED일회성 상품 구매
(2) ONE_TIME_PRODUCT_CANCELED대기 중인 일회성 구매를 사용자가 취소
voidedPurchaseNotificationproductType, refundType구매 무효화(환불·지불 거절). orderId 포함

유예 기간, 계정 보류, 일시중지, 가격 변경 등 전체 목록은 아래 레퍼런스에 있습니다.

1단계: Pub/Sub 주제 만들기

Google Cloud 콘솔에서 Pub/Sub을 열고, 내가 관리하는 아무 프로젝트에 주제를 만듭니다. 전체 이름을 적어 두세요. projects/your-project-id/topics/play-rtdn 같은 형태입니다.

2단계: Google Play에 게시 권한 주기

  1. Cloud 콘솔에서 Pub/Sub을 열고 주제를 찾습니다.
  2. 주제의 권한(permissions) 화면을 엽니다.
  3. 서비스 계정 google-play-developer-notifications@system.gserviceaccount.com을 추가하고 Pub/Sub Publisher 역할을 줍니다.
  4. Save를 누릅니다.

조직 정책으로 도메인 제한 공유(domain restricted sharing)를 쓰고 있다면, 이 Google Play 서비스 계정을 예외로 추가해야 권한을 줄 수 있다고 Google은 안내합니다.

3단계: Play Console에 주제 연결하기

  1. Google Play Console을 열고 앱을 고릅니다.
  2. Monetize › Monetization setup으로 갑니다.
  3. 페이지 맨 위의 Real-time developer notifications 섹션에서 Enable real-time notifications를 체크합니다.
  4. Topic name에 전체 주제 이름을 넣습니다: projects/{project_id}/topics/{topic_name}
  5. 받을 내용을 고릅니다. “Get notifications for subscriptions and all voided purchases”는 일회성 상품 구매가 빠집니다. 일회성 상품의 판매 알림도 받으려면 “Get all notifications for subscriptions and one-time products”를 고르세요.
  6. Save changes를 누른 뒤 Send test message를 누릅니다.

테스트 게시가 실패하면 주제 이름이 정확한지, 서비스 계정에 Pub/Sub Publisher 권한이 있는지 확인하라고 Google은 안내합니다. RTDN은 앱마다 설정하므로 앱마다 반복해야 하고, 모든 앱이 같은 주제를 가리켜도 됩니다.

4단계: 메시지 받기

주제에 구독을 붙입니다. Google Pub/Sub 문서의 설명대로 pull 구독은 “구독자 클라이언트가 Pub/Sub 서버에 메시지를 요청”하고, push 구독은 “Pub/Sub 서버가 구독자 애플리케이션에 요청을 보내 메시지를 전달”합니다. push는 내 엔드포인트가 성공 응답을 보내면 메시지가 확인(ack)되고, pull은 처리한 메시지를 직접 확인해야 다시 오지 않습니다.

Pub/Sub은 “최소 한 번 전달(at-least-once), 순서 보장 없음”이라 가끔 중복이 옵니다. Google의 RTDN 가이드도 messageId의 고유성을 확인해 중복 처리와 Developer API 할당량 낭비를 피하라고 권합니다.

// Push 엔드포인트: Pub/Sub이 {"message": {"data": "<base64>", "messageId": "…"}, "subscription": "…"}를 POST합니다
export async function onPush(request) {
  const { message } = await request.json();
  if (await alreadySeen(message.messageId)) return new Response(null, { status: 204 });
  const note = JSON.parse(atob(message.data)); // DeveloperNotification
  if (note.testNotification) return new Response(null, { status: 204 });
  await enqueueLookup(note.packageName, note.subscriptionNotification ?? note.oneTimeProductNotification ?? note.voidedPurchaseNotification);
  return new Response(null, { status: 204 }); // 2xx 응답이 메시지 확인(ack)
}

공개된 push 엔드포인트라면 push 구독 인증도 켜서 Pub/Sub이 보낸 요청이 아니면 거부하세요.

5단계: 구매 조회하기

앱에 접근할 수 있는 자격 증명(Play Console에 추가한 서비스 계정, 또는 androidpublisher 범위의 OAuth 토큰)으로 Google Play Developer API를 부릅니다.

금액을 얻었으면 Slack, 푸시 알림, 메뉴바 앱 등 원하는 곳으로 알림을 보내면 됩니다.

Cloud 프로젝트를 운영하고 싶지 않다면

RevBell이 주제와 수신 서버를 대신 운영합니다. 주제를 직접 만드는 대신 Play Console에 RevBell 주제 projects/reviewbell-play-production/topics/reviewbell-rtdn을 붙여 넣으면 됩니다.

자주 묻는 질문

알림에 가격이 들어 있나요?

아니요. 구매 토큰만 있고, 금액은 Developer API로 조회합니다(5단계).

여러 앱이 주제 하나를 같이 써도 되나요?

네. 알림마다 packageName이 있어서 주제 하나와 수신 서버 하나로 모든 앱을 처리할 수 있습니다.

일회성 상품 구매도 오나요?

3단계에서 “Get all notifications for subscriptions and one-time products”를 골랐을 때만 옵니다.

얼마나 빠른가요?

Google은 RTDN의 전달 시간을 공개하지 않습니다. RevBell 주제를 거쳐 Mac까지 오는 판매 알림은 보통 1–2분 안에 도착합니다.