일상적인 비즈니스의 일환으로 정기 결제 또는 일회성 구매에 대한 관리 작업을 수행해야 할 수 있습니다. 예를 들어 고객 서비스에서 사용자에게 전액 또는 부분 환불을 해야 할 수도 있고, 특정 경우에 권한을 취소해야 할 수도 있습니다. 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_RENEWAL 값으로 설정합니다.
예:
- 정기 결제 상품
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_RENEWAL"
}
사용자가 만료된 정기 결제를 다시 신청할 수 있도록 지원
만료된 정기 결제의 재신청을 허용하려면 정기 결제의 기본 요금제에서 재신청 옵션을 사용 설정한 다음 cancellationType 매개변수를 USER_REQUESTED_STOP_RENEWAL 값으로 설정하여 정기 결제를 취소해야 합니다.
애플리케이션에서만 사용자가 재신청할 수 있도록 허용
cancellationType 매개변수를 DEVELOPER_REQUESTED_STOP
_PAYMENTS로 설정했거나 cancellationType 매개변수를 설정하지 않은 경우 사용자는 Play 요금제 센터에서 요금제를 복원할 수 없습니다. 하지만 사용자는 필요한 경우 앱을 통해 정기 결제를 다시 신청할 수 있습니다.
이 작업을 실행하면 SUBSCRIPTION_CANCELED 실시간 개발자 알림이 트리거됩니다. 취소에 설명된 대로 이러한 취소를 처리합니다.
결제 연기
subscriptionsv2.defer 메서드를 사용하여 정기 결제의 사용 권한 기간을 연장할 수 있습니다. 부가기능이 포함된 정기 결제를 연기하면 정기 결제의 모든 항목이 동일한 기간만큼 연기됩니다. 연기 기간 동안 사용자는 콘텐츠를 계속 구독하지만 추가 기간에 대한 요금은 청구되지 않습니다. 정기 결제의 결제를 연기하면 상태 정보가 그에 따라 업데이트되며 구매 상태 정보의 expiryTime 필드에 반영됩니다.
- 활성 상태의 반복 정기 결제의 경우 결제 연기로 다음 갱신일이 연장됩니다.
- 선불 요금제의 경우 청구 연기를 통해 만료 시간이 연장됩니다.
지연된 청구를 사용할 수 있는 몇 가지 예는 다음과 같습니다.
- 기존 구독자가 의견 설문조사를 작성하는 경우 1주일 무료 혜택을 제공하는 등 특별 이벤트로 사용자에게 무료 액세스 권한을 부여합니다.
- 고객이 서비스를 사용하지 못하게 했을 수 있는 장기간의 서비스 중단 후와 같은 고객 지원 조치로 고객에게 무료 액세스 권한을 부여합니다.
결제는 API 호출당 최소 하루, 최대 1년까지 연기할 수 있습니다. 사용 권한 종료일을 훨씬 더 연기하려면 새 만료일이 도래하기 전에 API를 다시 호출하면 됩니다.
이 작업을 실행하면 SUBSCRIPTION_DEFERRED 실시간 개발자 알림이 트리거됩니다. 이러한 이벤트를 처리하는 방법은 요금제 정보의 구독자 결제 연기를 참고하세요.
예:
FitnessGoals 스트리밍 서비스에서 2월에 정기적인 운동을 장려하는 프로모션을 진행하려고 합니다.
2월 한 달 동안 FitnessGoals를 10회 이상 사용하는 구독자에게 1개월의 서비스를 추가로 제공하기로 결정합니다.
이들은 챌린지의 결과를 추적하고 3월 1일에 2월에 챌린지를 완료한 사용자의 모든 활성 정기 결제 구매에 대해 subscriptionsv2.defer 메서드를 호출합니다.
이러한 사용자는 추가로 한 달 동안 일반 운동 동영상을 무료로 이용할 수 있으며, FitnessGoals가 건강을 유지하는 데 얼마나 도움이 되는지 친구들에게 모두 알립니다.
환불 및 취소 처리
정기 결제 또는 일회성 구매를 환불하거나 액세스 권한을 취소해야 하는 상황이 많습니다.
주문 ID로 주문을 전액 환불
orders.refund API를 사용하면 구매 후 3년 이내에 모든 주문에 대해 전액 환불을 처리할 수 있습니다.
orders.refund 메서드는 환불을 제공하는 것 외에도 액세스를 취소해야 하는지 여부를 나타내는 revoke 매개변수를 수신합니다.
정기 결제 구매에 대한 환불 호출과 함께 취소를 발행하면 정기 결제가 즉시 종료되고 SUBSCRIPTION_REVOKED 실시간 개발자 알림이 트리거됩니다. 이러한 이벤트를 처리하는 방법을 알아보려면 정기 결제 수명 주기 관리 가이드의 취소 섹션을 참고하세요.
예:
새 월드컵의 시작을 기념하기 위해 e스포츠 앱 Football-Not-Soccer는 처음 24시간 동안 새 팀 키트를 구매하는 모든 사용자에게 무료 가상 유니폼을 추첨하기로 결정합니다.
Football-Not-Soccer는 취소 매개변수를 전달하지 않고
orders.refundAPI를 사용하여 우승자에게 유니폼 구매를 환불합니다.
구매 토큰으로 정기 결제 취소 및 환불
특정 사용 사례에서는 사용자의 정기 결제에 대한 액세스 권한을 취소하고 환불을 제공해야 할 수 있습니다. 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": {}을 환불 유형으로 설정합니다.
예:
마리아는 SuperMovies 스트리밍 월간 요금제에 대한 30일 자동 갱신 정기 결제를 보유하고 있습니다. 마리아는 콘텐츠에 액세스할 수 없는 기술적 문제를 겪고 있습니다. 그녀는 결제 주기의 3일째에 고객 서비스에 연락하여 정기 결제에 액세스한 적이 없다고 말합니다.
고객 서비스팀은 시스템에서 마리아의 구독 구매 세부정보를 찾아
purchases.subscriptionsv2.revoke에 전액 환불을 요청하는 전화를 겁니다.고객 서비스에서는 Maria에게 구독 가격의 100% 가 환불되며 더 이상 요금제를 구독하지 않는다고 안내합니다.
일할 계산 환불
정기 결제를 종료하고 남은 혜택 기간을 부분적으로 환불해야 하는 경우 일할 계산된 환불을 처리하세요. purchases.subscriptionsv2.revoke 함수를 사용하고 "proratedRefund": {}을 환불 유형으로 설정합니다.
예:
마리아는 SuperMovies 스트리밍 월간 요금제에 대한 30일 자동 갱신 정기 결제를 보유하고 있습니다. 그녀는 한동안 이 서비스를 즐겁게 사용했습니다. 마리아는 결제 주기의 15일째에 고객 서비스에 연락하여 해외로 이사하며 다음 날부터 서비스를 더 이상 사용할 수 없다고 말합니다.
고객 서비스팀은 시스템에서 마리아의 구독 구매 세부정보를 찾고
purchases.subscriptionsv2.revoke에 전화를 걸어 일할 계산된 환불을 요청합니다.고객 서비스에서는 마리아에게 구독 가격의 약 50% 가 환불되며 서비스 액세스가 즉시 종료된다고 안내합니다.