일회성 구매 수명 주기

일회성 구매 제품은 정기 결제 제품보다 간단한 수명 주기를 갖긴 하나, 백엔드에서 올바르게 처리해야 하는 상태와 전환 이벤트가 여러 개 있습니다.

그림 1 일회성 구매의 수명 주기 상태 및 전환 이벤트

새로운 일회성 제품 구매

사용자가 결제 흐름을 완료하면 앱은 다음 방법 중 하나로 새로운 구매에 관한 정보를 볼 수 있습니다.

새로운 구매를 수신한 후에는 getPurchaseState 메서드나 purchases.products.get in Play Developer API를 사용하여 새 구매의 결제 상태를 확인합니다.

실시간 개발자 알림

사용자가 일회성 제품을 구매하거나 구매를 취소하면 Google Play에서 OneTimeProductNotification 메시지를 전송합니다. 백엔드 구매 상태를 업데이트하려면 OneTimeProductNotification 객체에 제공된 구매 토큰을 사용하여 purchases.products.get 메서드를 호출합니다. 이 메서드는 구매 토큰의 최근 구매 및 소비 상태를 제공합니다.

거래 관련 RTDN은 보안 백엔드에서 처리해야 합니다.

완료된 거래 처리

사용자가 일회성 제품 구매를 완료하면 Google Play에서 유형이 ONE_TIME_PRODUCT_PURCHASEDOneTimeProductNotification 메시지를 전송합니다. 이 RTDN을 수신하면 백엔드에서 일회성 제품 구매 처리에 설명된 대로 구매를 처리합니다.

취소된 거래 처리

일회성 제품 구매가 취소되면 실시간 개발자 알림을 수신하도록 구성한 경우 Google Play에서 유형이 ONE_TIME_PRODUCT_CANCELEDOneTimeProductNotification 메시지를 전송합니다. 예를 들어 사용자가 필요한 기간 내에 결제를 완료하지 않거나 개발자 또는 고객 요청에 의해 구매가 취소된 경우 이러한 상황이 발생할 수 있습니다. 백엔드 서버에서 이 알림을 수신하면 purchases.products.get 메서드를 호출하여 최신 구매 상태를 가져온 다음 이에 따라 사용자 사용 권한을 포함하여 백엔드를 업데이트합니다.

Purchased 상태의 일회성 제품 구매가 환불되는 경우 Voided Purchases API를 통해서도 확인할 수 있습니다.

백엔드에서 일회성 제품 구매 처리

ONE_TIME_PRODUCT_PURCHASED RTDN을 통해 새로운 구매를 감지한 경우, 또는 PurchasesUpdatedListener를 통해서나 앱의 onResume() 메서드에서 구매를 수동으로 가져와서 앱 내에서 새로운 구매에 대해 알게 된 경우, 새로운 구매를 처리해야 합니다. 보안을 강화하기 위해 구매 처리를 백엔드에서 처리하는 것이 권장됩니다.

새로운 일회성 구매를 처리하려면 다음 단계를 따르세요.

  1. purchases.products.get 엔드포인트를 쿼리하여 최신 일회성 제품 구매 상태를 확인합니다. 구매에 대해 이 메서드를 호출하려면 이에 상응하는 앱 또는 ONE_TIME_PRODUCT_PURCHASED RTDN의 purchaseToken이 필요합니다.
  2. getPurchaseState()를 호출하고 구매 상태가 PURCHASED인지 확인합니다.
  3. 구매를 인증합니다.
  4. 사용자에게 콘텐츠 액세스 권한을 부여합니다. 구매와 연결된 사용자 계정은 구매가 이뤄질 때 setObfuscatedAccountId()를 사용하여 purchases.products.getobfuscatedExternalAccountId 필드가 설정된 경우 이 필드에서 확인할 수 있습니다.
    1. 비소비성 제품 구매의 경우 purchases.products.acknowledge 메서드를 호출하여 콘텐츠 전송을 확인합니다. acknowledgementState 필드를 확인하여 구매가 이전에 확인되지 않았는지 검사합니다.
    2. 소비성 제품인 경우 사용자가 제품을 소비한 후에 다시 구매할 수 있도록 purchases.products.consume 메서드를 호출하여 제품을 소비됨으로 표시합니다. 이 메서드는 구매도 확인합니다.

Play 결제 라이브러리에는 앱에서 구매를 처리할 수 있게 해 주는 구매 확인 및 소비 메서드도 있긴 하나, 백엔드에 보안 구현을 위한 처리 방법이 있는 경우 백엔드에서 처리를 진행하는 것을 권장합니다.