RTDN(Real Time Developer Notifications)用于把 Google Play 的订阅与内购状态变更在数秒内推送到你的后端,应作为权益更新的主要信号,轮询 Play Developer API 只作补充。
用途与原理:Google Play 在订阅或一次性商品状态变化(续订、取消、退款、保留、暂停、撤销、价格变更确认等)时,向你自己拥有的 Cloud Pub/Sub 主题发布消息。消息是 DeveloperNotification JSON,含 packageName、eventTimeMillis,以及 subscriptionNotification、oneTimeProductNotification、voidedPurchaseNotification、testNotification 之一。它只带 purchaseToken 和类型码,不含完整购买状态。Pub/Sub 至少投递一次且不保证顺序,重复与乱序属正常。核心规则:通知只是信号,不是事实来源,收到后必须调用 purchases.subscriptionsv2.get 或 purchases.products.get,以 API 返回更新权益。
配置流程:创建主题(如 gcloud pubsub topics create play-billing-notifications),给 serviceAccount:google-play-developer-notifications@system.gserviceaccount.com 授予 roles/pubsub.publisher(漏掉此绑定是收不到消息的最常见原因),再建推送或拉取订阅,push 示例:gcloud pubsub subscriptions create play-billing-sub --topic=play-billing-notifications --push-endpoint=https://api.yourapp.com/billing/rtdn --ack-deadline=60。之后在 Play Console 的 Monetization setup 填入 projects/YOUR_PROJECT_ID/topics/play-billing-notifications 并发测试通知。
处理要点:push 消息体是 Pub/Sub 信封,data 为 base64 编码 JSON,需先解码再解析为 DeveloperNotification,按存在的子对象分发。处理必须先按 messageId 去重(保存已处理 ID,TTL 24–48 小时),再做 API 调用与幂等 upsert(以 purchaseToken 为键)。在 ack 截止前返回 2xx 才算确认;5xx 触发重传,4xx 可能丢消息,需慎重选择状态码。常需处理的订阅类型包括 RECOVERED(1) 恢复访问、RENEWED(2) 延长到期、CANCELED(3) 到期前保留访问、ON_HOLD(5) 撤销访问、IN_GRACE_PERIOD(6) 保留访问并提示更新支付、REVOKED(12) 立即撤销、EXPIRED(13) 终止等。
验证与限制:用测试通知、沙箱购买取消、重复 messageId、乱序通知、临时 500 观察重传等验证;另需监控未确认消息数与最老未确认时长,并定期对账抽样订阅。资料未提供收费、价格或具体平台支持范围。