[IAP] 결제 시스템

비비빅·2024년 5월 5일
post-thumbnail

Google

Google Play 결제 시스템은 Android 앱에서 디지털 제품 및 콘텐츠를 판매할 수 있게 해주는 서비스이다.

인앱 결제 flow

  1. 유저가 앱에서 상품 구매
  2. 앱에서 개발자 백엔드 서버로 정보 전달
  3. 백엔드 서버는 앱에서 받은 정보를 토대로 구글 서버에 결제 검증을 요청
  4. 정상적으로 결제완료된 건이라면 유저에게 상품 지급

일회성 구매


소모성 consumable, 비소모성 non-consumable 상품 해당
Google Play에서 OneTimeProductNotification 메시지를 전송

  • 완료된 거래 처리: ONE_TIME_PRODUCT_PURCHASED 전송
  • 취소된 거래 처리 : ONE_TIME_PRODUCT_CANCELED 전송

정기 결제

정기 결제 상태

  • 활성: 사용자가 콘텐츠 사용에 문제없이 정기 결제에 액세스 가능
  • 취소됨: 사용자가 정기 결제를 취소했지만 만료 시까지 계속 액세스할 수 있음
  • 유예 기간 중: 결제 문제 발생, Google에서 결제 수단을 다시 시도하는 동안 사용자는 계속 액세스할 수 있음
  • 보류 중: 결제 문제가 발생, Google에서 결제 수단을 다시 시도하는 동안 사용자가 더 이상 액세스할 수 없음
  • 일시중지됨: 사용자가 액세스를 일시중지시킴, 다시 시작할 때까지 액세스할 수 없음.
  • 만료됨: 사용자가 정기 결제를 취소, 정기 결제 액세스 권한없음

정기 결제 수명 주기

구독상품 구매 SUBSCRIPTION_PURCHASED

정기 결제 갱신 SUBSCRIPTION_RENEWED

새로운 expiryTime으로 정기 결제 상태를 업데이트

유예 기간 SUBSCRIPTION_IN_GRACE_PERIOD

사용자가 정기 결제를 취소하거나 유예 기간의 최대 길이에 도달할 때까지 사용권한은 지속됨, Google Play는 유예 기간이 만료될 때까지 expiryTime 값을 동적으로 연장, Play에서는 사용자에게 결제가 거부되었음을 알리고 결제 수단을 수정하라는 메시지를 표시
결제 수단을 수정하는 즉시 정기 결제가 원래 갱신일로 갱신됨
유예 기간 중에 결제 수단을 수정하지 않으면 계정 보류 상태로 전환되고 사용자는 권한을 잃게 됨

  • 자동 유예 기간
    유예 기간 0일로 설정 가능 but, Play에서는 결제 재시도를 위한 충분한 시간을 확보하기 위해 최소 1일을 기다림

계정 보류 SUBSCRIPTION_ON_HOLD

유예 기간이 종료되면 계정 보류 기간이 시작, 사용자 정기 결제 사용 권한 없음
사용자는 정기 결제 취소, 복원, 재구매할 수 있음
Play에서 사용자에게 결제 거부 사실을 알리고 앱에서도 결제 수단을 수정하라는 메시지를 표시함
계정 보류 상태에서 정기 결제가 복구되면 갱신일이 초기화됨

만료 SUBSCRIPTION_EXPIRED

사용자는 정기 결제 권한 없어짐

취소 SUBSCRIPTION_CANCELED

사용자가 정기 결제를 자발적으로 취소 또는 계정 보류 상태에서 복구하지 않음
정기 결제가 취소되더라도 현재 결제 주기가 끝날 때까지 사용권한을 가지고 있음

해지 SUBSCRIPTION_REVOKED

정기 결제를 해지하거나 구매 지불을 거절하는 등의 사유로 즉시 사용자의 사용 권한을 취소

지연된 정기 결제 SUBSCRIPTION_DEFERRED

무료 액세스 권한을 제공, 정기 결제의 다음 결제일을 미룰 수 있음
사용자의 권한 연장, 요금은 청구되지 않음, 정기 결제 갱신일은 새로운 날짜를 반영

일시중지 SUBSCRIPTION_PAUSED

현재 결제 기간이 종료되어야만 적용됨
일시중지된 동안 사용자 권한없고 갱신 요금을 지불하지도 않음
사용자가 정기 결제를 수동으로 재개하면 결제일이 수동 재개 날짜로 변경됨

구독변경(업그레이드/다운그레이드)

이전 정기 결제는 무효화 , 새로운 정기 결제가 새로운 구매 토큰을 사용하여 생성

상황:
1. 기본' 및 '프리미엄' 정기 결제와 같은 여러 정기 결제 등급을 판매하는 경우
2. 사용자가 월간 요금제에서 연간 요금제로 전환하는 경우
3. 사용자가 자동 갱신 요금제와 선불 요금제 간에 전환하는 경우

대체모드:
개발자는 현재 유료 결제 기간의 일할 계산된 금액이 적용되는 방식과 사용 권한이 변경되는 시기를 결정하는 대체 모드를 지정

정기 결제 재신청

Google Play 스토어에 정기 결제 재신청 버튼이 표시됨

만료 전 복원 SUBSCRIPTION_RESTARTED

복원된 정기 결제는 취소되지 않았던 것처럼 계속 갱신됨

만료 후 정기 결제 재신청 SUBSCRIPTION_PURCHASED

신규 구매와 동일

  • 정기 결제 만료 전 - 앱 내에서
    취소되었지만 아직 만료되지 않은 경우, 새 정기 결제와 동일한 인앱 상품 구매 흐름 적용
    새 정기 결제는 이전 정기 결제를 대체하고 동일한 만료일에 갱신됨

  • 정기 결제 만료 전 - Play 스토어에서
    취소되었지만 아직 활성 상태인 동안 <정기 결제 재신청>을 클릭해 Google Play 정기 결제 센터에서 정기 결제를 복원
    동일한 정기 결제 및 구매 토큰이 유지됨

  • 정기 결제 만료 후 - 앱 내에서
    새 정기 결제와 동일한 인앱 상품 구매 흐름 적용

  • 정기 결제 만료 후 - Play 스토어에서
    Google Play 정기 결제 센터에서 <정기 결제 재신청>을 클릭, 만료 후 최대 1년 동안 동일한 SKU의 정기 결제를 다시 신청할 수 있음
    새 정기 결제 및 구매 토큰이 생성
    정기 결제 재신청은 앱 외부 구매로 간주됨

참고문서: https://developer.android.com/distribute/play-billing?hl=ko

APPLE

인앱 결제 flow


1. 유저 앱에서 구매
2. StoreKit 프레임워크는 앱을 대신하여 App Store에 연결, 결제 요청 및 처리
3. 프레임워크 앱에 알림
4. 구매 확인시 App Store 또는 기기에서 서버의 영수증을 확인

앱 내 구매 유형

  1. 소모품
  2. 비소모품
  3. 자동 갱신 구독
  4. 비자동 갱신 구독

정기 결제

구독 그룹: 구독 제품 세트, 사용자는 그룹당 한 번에 하나의 구독 상품을 구독할 수 있음

구독 수준: 업그레이드, 다운그레이드 및 크로스그레이드를 결정하는 구독 그룹 내 구독 순위 시스템

구독 서비스를 활성화:

구독 옵션을 변경:

프로모션 쿠폰이나 구독 쿠폰 코드를 사용:

청구 이벤트:

구독 가격을 인상:

환불을 요청하거나 가족 공유를 취소:

구독 갱신 날짜 연장을 요청:

참고문서: https://developer.apple.com/documentation/appstoreservernotifications

0개의 댓글