정기 결제 및 일회성 구매 관리하기

일상적인 비즈니스에서 정기 결제 또는 일회성 구매에 대한 관리 작업을 해야 할 수 있습니다. 예를 들어 고객 서비스에서 사용자에게 전액 또는 부분 환불을 처리해야 할 수 있으며, 특정 경우에는 권한을 취소해야 할 수도 있습니다. Play Console에서 주문을 관리하거나 자체 시스템에서 주문을 관리하려면 Google Play Developer API를 사용하면 됩니다.

구독 취소

정기 결제 취소는 사용자 또는 개발자가 시작할 수 있습니다.

사용자가 시작한 취소

사용자는 Play 스토어를 사용하여 언제든지 Google Play 정기 결제를 취소할 수 있습니다. 해당하는 경우 사용자가 앱과 웹사이트에서 정기 결제를 취소할 수 있는 옵션도 제공해야 합니다.

사용자가 자발적으로 취소할 수 있도록 하는 가장 쉬운 방법은 앱에서 Play 스토어로 연결되는 딥 링크를 제공하는 것입니다 . 사용자는 Play 스토어에서 정기 결제를 보고 관리할 수 있습니다.

개발자가 시작한 취소

개발자는 백엔드에서 취소를 트리거해야 할 수도 있습니다. purchases.subscriptions.cancel API를 사용하면 정기 결제 구매를 취소할 수 있습니다. 예를 들어 이 메서드를 사용하여 기존 서비스를 거부할 수 있습니다. 정기 결제를 취소해도 환불이 처리되지 않으며 사용자는 현재 결제 기간이 끝날 때까지 액세스 권한을 유지합니다.

이 메서드를 사용하면 cancellationType 요청 본문 매개변수에서 다음과 같은 취소 유형을 지정할 수 있습니다.

  • USER_REQUESTED_STOP_RENEWALS: 사용자가 Play 스토어에서 취소한 것처럼 정기 결제를 취소합니다. 할부 결제는 현재 약정 기간의 남은 기간 동안 계속됩니다. Play 스토어에서 사용자는 만료되기 전에 정기 결제를 복원하거나 기본 요금제에 사용 설정된 경우 만료된 후에 재신청할 수 있습니다.

  • DEVELOPER_REQUESTED_STOP_PAYMENTS: 정기 결제를 취소하고 추가 결제를 방지합니다. 사용자는 Play 스토어에서 정기 결제를 복원하거나 재신청할 수 없지만 앱 내에서 다시 신청할 수 있도록 허용할 수 있습니다.

사용자가 만료되지 않은 정기 결제를 복원하도록 허용

일부 시나리오에서는 개발자가 취소를 트리거한 후 사용자가 Play 정기 결제 센터에서 만료되지 않은 정기 결제를 복원하도록 허용하는 것이 유용할 수 있습니다. 예를 들어 맞춤 인앱 취소 흐름을 제공할 수 있습니다. 비즈니스 로직에 따라 백엔드에서 트리거된 취소 중 사용자가 복원할 수 있는 취소를 결정할 수 있습니다.

사용자가 취소를 복원할 수 있음을 나타내려면 purchases.subscriptions.cancel API에 POST 요청 을 실행하고 cancellationType 요청 매개변수를 USER_REQUESTED_STOP_RENEWALS 값으로 설정합니다.

예:

  • 정기 결제 1a2b3c4d5e6f7g8h9i0j의 구매 토큰
  • 애플리케이션 패키지 이름 com.your.app
  • 정기 결제 ID your-subscription-product

HTTP POST 요청:

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.your.app/purchases/subscriptions/your-subscription-product/tokens/1a2b3c4d5e6f7g8h9i0j:cancel

요청 본문:

{
  "cancellationType": "USER_REQUESTED_STOP_RENEWALS"
}

사용자가 만료된 정기 결제를 재신청하도록 허용

만료된 정기 결제를 재신청할 수 있도록 하려면 정기 결제의 기본 요금제에서 정기 결제 재신청 옵션을 사용 설정한 다음 cancellationType 매개변수를 USER_REQUESTED_STOP_RENEWALS 값으로 설정하여 정기 결제를 취소해야 합니다.

사용자가 애플리케이션에서만 정기 결제 재신청하도록 허용

cancellationType 매개변수를 DEVELOPER_REQUESTED_STOP_PAYMENTS로 설정했거나 cancellationType 매개변수를 설정하지 않은 경우 사용자는 Play 정기 결제 센터에서 정기 결제를 복원할 수 없습니다. 하지만 필요한 경우 사용자는 앱을 통해 정기 결제를 다시 신청할 수 있습니다.

이 작업을 실행하면 SUBSCRIPTION_CANCELED 실시간 개발자 알림이 트리거됩니다. 이러한 취소는 취소에 설명된 대로 처리합니다.

결제 연기

정기 결제의 권한 기간을 연장하려면 subscriptionsv2.defer 메서드를 사용하세요. 부가기능이 포함된 정기 결제를 연기하면 정기 결제의 모든 항목이 동일한 기간 동안 연기됩니다. 연기 기간 동안 사용자는 콘텐츠의 정기 결제를 유지하지만 추가 시간에 대한 요금이 청구되지 않습니다. 정기 결제의 결제를 연기하면 상태 정보가 그에 따라 업데이트되고 구매 상태 정보의 expiryTime 필드에 반영됩니다.

  • 활성 반복 정기 결제의 경우 결제 연기로 다음 갱신일이 연장됩니다.
  • 선불 요금제의 경우 결제 연기로 만료 시간이 연장됩니다.

결제 연기를 사용할 수 있는 몇 가지 예는 다음과 같습니다.

  • 사용자에게 특별 이벤트로 무료 액세스 권한을 부여합니다. 예를 들어 기존 정기 결제 사용자에게 의견 설문조사를 작성하면 1주일 무료 혜택을 제공합니다.
  • 고객 관리 작업으로 고객에게 무료 액세스 권한을 부여합니다. 예를 들어 서비스 사용에 영향을 미칠 수 있는 장기간의 서비스 중단 후입니다.

결제는 API 호출당 최소 하루, 최대 1년까지 연기할 수 있습니다. 권한 종료를 더 연기하려면 새 만료일이 도래하기 전에 API를 다시 호출하세요.

이 작업을 실행하면 SUBSCRIPTION_DEFERRED 실시간 개발자 알림이 트리거됩니다. 이러한 이벤트를 처리하는 방법은 정기 결제 정보정기 결제 사용자의 결제 연기를 참고하세요.

예:

  1. FitnessGoals 스트리밍 서비스는 2월에 규칙적인 운동을 장려하는 프로모션을 진행하려고 합니다.

  2. 2월 한 달 동안 FitnessGoals로 10회 이상 운동하는 모든 정기 결제 사용자에게 1개월의 서비스를 추가로 제공하기로 합니다.

  3. 이들은 챌린지 결과를 추적하고 3월 1일에 2월에 챌린지를 완료한 사용자의 모든 활성 정기 결제 구매에 대해 subscriptionsv2.defer 메서드를 호출합니다.

  4. 이러한 사용자는 1개월의 정기 운동 동영상을 무료로 이용할 수 있으며, 사용자는 FitnessGoals가 건강을 유지하는 데 어떻게 도움이 되는지 모든 친구에게 알립니다.

환불 및 취소 처리

정기 결제 또는 일회성 구매에 대한 환불을 처리하거나 액세스 권한을 취소해야 하는 상황이 많습니다.

주문 ID별로 주문 전액 환불

orders.refund API를 사용하면 구매 후 3년 이내에 모든 주문에 대해 전액 환불을 처리할 수 있습니다. orders.refund 메서드는 환불을 제공하는 것 외에도 액세스 권한을 취소해야 하는지 여부를 나타내는 취소 매개변수를 수신합니다.

정기 결제 구매에 대한 환불 호출로 취소를 처리하면 정기 결제가 즉시 종료되고 SUBSCRIPTION_REVOKED 실시간 개발자 알림이 트리거됩니다. 이러한 이벤트를 처리하는 방법은 정기 결제 수명 주기 관리 가이드 취소 섹션 을 참고하세요.

예:

  1. 새 월드컵 시작을 기념하기 위해 e스포츠 앱 Football-Not-Soccer는 처음 24시간 동안 새 팀 키트를 구매하는 모든 사용자에게 무료 가상 유니폼을 추첨하기로 합니다.

  2. Football-Not-Soccer는 취소 매개변수를 전달하지 않고 orders.refund API를 사용하여 당첨자에게 유니폼 구매 금액을 환불합니다.

구매 토큰으로 정기 결제 취소 및 환불

특정 사용 사례에서는 사용자의 정기 결제에 대한 액세스 권한을 취소하고 환불을 제공해야 할 수 있습니다. Play 결제는 전액 환불 및 일할 계산 환불을 비롯한 취소 메서드를 subscriptionsv2.revoke API를 통해 제공합니다. 이 엔드포인트를 사용하면 revocationContext 를 지정하여 환불 계산 방법을 결정할 수 있습니다.

이 작업을 실행하면 SUBSCRIPTION_REVOKED 실시간 개발자 알림이 트리거됩니다. 앱은 해지에 설명된 대로 이러한 취소를 처리해야 합니다.

예:

  • 구매 토큰 1a2b3c4d5e6f7g8h9i0j으로 구매
  • 패키지 이름이 com.your.app인 애플리케이션
  • 일할 계산 환불 처리 의도

HTTP POST 요청:

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.your.app/purchases/subscriptionsv2/tokens/1a2b3c4d5e6f7g8h9i0j:revoke

요청 본문:

{
  "revocationContext": {
    "proratedRefund": {}
  }
}

전액 환불

정기 결제를 종료하고 현재 결제 기간의 전액을 환불해야 하는 경우 전액 환불을 처리합니다. purchases.subscriptionsv2.revoke 함수를 사용하고 "fullRefund": {}를 환불 유형으로 설정합니다.

예:

  1. 마리아는 SuperMovies 스트리밍 월간 요금제의 자동 갱신 30일 정기 결제를 보유하고 있습니다. 마리아는 콘텐츠에 액세스할 수 없는 기술적 문제를 겪었습니다. 마리아는 결제 주기의 3일째에 정기 결제에 액세스할 수 없었다고 고객 서비스에 문의합니다.

  2. 고객 서비스는 시스템에서 마리아의 정기 결제 구매 세부정보를 찾고 전액 환불을 요청하는 purchases.subscriptionsv2.revoke 호출을 트리거합니다.

  3. 고객 서비스는 마리아에게 정기 결제 가격의 100% 를 환불받을 수 있으며 더 이상 요금제를 정기 결제하지 않는다고 안내합니다.

일할 계산 환불

정기 결제를 종료하고 남은 권한 시간을 부분적으로 환불해야 하는 경우 일할 계산 환불을 처리합니다. purchases.subscriptionsv2.revoke 함수를 사용하고 환불 유형으로 "proratedRefund": {}를 설정합니다.

예:

  1. 마리아는 SuperMovies 스트리밍 월간 요금제의 자동 갱신 30일 정기 결제를 보유하고 있습니다. 마리아는 한동안 서비스를 즐겁게 사용했습니다. 마리아는 결제 주기의 15일째에 해외로 이주하여 다음 날부터 더 이상 서비스를 사용할 수 없다고 고객 서비스에 문의합니다.

  2. 고객 서비스는 시스템에서 마리아의 정기 결제 구매 세부정보를 찾고 일할 계산 환불을 요청하는 purchases.subscriptionsv2.revoke 호출을 트리거합니다.

  3. 고객 서비스는 마리아에게 정기 결제 가격의 약 50% 를 환불받을 수 있으며 서비스에 대한 액세스 권한이 즉시 종료된다고 안내합니다.