애플 인앱 결제 (Apple In App purchase) 개념, 결제, 환불 플로우

나른한 개발자·2023년 2월 7일
5

인앱 결제란?

애플리케이션 내에서 결제하는 것으로, 애플의 경우 앱스토어에 등록해놓은 결제 수단으로 결제하는 것을 의미한다. 애플 정책에 따르면 앱 내의 모든 디지털 컨텐츠에 대해서는 인앱 결제를 통해야 한다.


컨텐츠 구매 구현 방식

컨텐츠 구매를 제공하는 방식에는 아래의 경우가 있다. 서비스의 특성에 따라 적합한 방식으로 구현하면 된다.

  1. 각각의 컨텐츠를 In App Purchase 개별 상품으로 추가
  2. 금액권을 In App Purchase 상품으로 등록
  3. 포인트와 같은 모바일 캐시 제도 사용

Product Type

애플에서는 결제의 지속성, 재구매 가능 여부 등에 따라 아래와 같이 상품 타입을 나누고 있다.

  • 소모품 (Consumables): 게임 아이템과 같이 한번 사용 시 마다 소모가 되는 유형
  • 비소모품 (Non-Consumables): 광고해제, 잠금해제와 같이 구매 후 만료되지 않는 상품
  • 자동 갱신 구독 (Auto-renewable subscriptions): 구매 후 사용자가 해지할 때까지 자동 갱신되는 상품
  • 수동 구독 상품 (None-renewing subscriptions): 자동 갱신 되지 않는 상품

결제 플로우

결제는 크게 세가지 단계로 진행된다.

  1. 상품 정보 조회
  2. 결제 요청
  3. 구매한 상품 인도

1. 상품 정보 조회
App Store Connect에서 판매 상품을 등록하면 각 상품은 고유한 id를 갖는다. 결제를 하기 전에 우선 상품 정보를 조회하여 product id가 유효한지 확인 후 상품 가격과 같은 정보를 UI로 사용자에게 표시해야한다. product id를 얻는 것은 client, server 양쪽 어디에서든 가능하지만 클라이언트 사이드에서 해결할 경우에는 product id를 고정시켜놔야하기 때문에 product를 추가하거나 id가 변경될 경우에는 앱을 업데이트 해줘야한다. 따라서 상품 정보가 자주 업데이트되는 경우에는 애플리케이션 서버를 거치는 것이 더 낫다.

서버 사이드에서 Product id를 조회하하는 경우, 애플에서는 product id 리스트가 담긴 JSON 파일을 생성하여 관리하도록 제안하고 있다.

2. 결제 요청
유저가 구매 상품을 골랐다면 클라이언트에서 애플 서버로 결제 요청을 보낸다. 결제가 완료되면 결제한 건에 대해서 영수증 검증을 해야한다. 영수증 검증은 서버 사이드에서 해결하도록 권고하고 있다. 구현에 관한 자세한 설명은 Validating receipts with the App Store 참고.


환불 플로우

애플 인앱 결제 중 가장 난감했던 것이 환불이었다. 애플 14 이하 버전의 경우 사용자가 애플리케이션 UI에서 환불 요청을 할 수 없고, 애플 측에 직접 요청하여야만 환불이 가능했다. 요청 후엔 애플에서 자체적으로 환불하고 애플리케이션 서버에 notification 을 주는 형태였는데, 애플 15버전부터 사용자가 애플리케이션 내에서 환불을 요청할수 있도록 지원이 된다.


ios 클라이언트에서 환불 요청 메서드를 호출하면 환불 요청 버튼이 있는 바텀시트를 OS에서 보여주고, 환불 버튼에 대한 처리도 OS에서 처리한다. 이후, 환불 요청이 성공했을 때와 환불이 완전히 처리되었을 때 두번에 거쳐서 애플 서버에서 애플리케이션 서버로 notification을 준다. notification을 받기 위해서는 먼저 애플리케이션 서버의 HTTPS URL을 설정해주어야하는데, 그 절차는 이곳에서 확인할수 있다.

+) 추가
소모품의 경우 CONSUMTION_REQUEST 알림없이 바로 환불처리 후 REFUND 알림만 온다고 한다. product type에 따라 알림이 어떻게 오는지 확인해보는 것이 좋겠다.

환불 플로우를 정리하자면, 클라이언트에서 애플 서버로 환불 요청을 하고 요청이 성공적으로 접수되었다면 앱 서버로 알림을 준다. 이때 notification_typeCONSUMPTION_REQUEST이다. 환불 요청 접수에 대한 알림을 받은 후에는 원활한 환불 처리를 위해 결제 정보를 애플 서버로 보내야 한다고 한다. 이 과정이 필수인지는 모르겠고 이 부분은 더 서치를 해봐야겠다. 결제 정보를 전송한 후에는 애플 측에서 최대 48시간 이내로 환불을 처리해주며, 완전히 처리된 후 notification_type: REFUND 으로 앱 서버에 한번 더 알림이 온다. 환불 처리 날짜, 사유 등의 데이터를 함께 전달해주니 이 중 필요한 것만 골라 활용하면 된다.

애플에서 알림이 온 후 바로 DB 업데이트를 해줄 수 도 있겠지만 외부에서 온 알림이 유효한 지를 판단하기 위해 결제 히스토리를 조회하는 API로 상태 변경이 되었는지 등을 확인하고 유효한 알림이라고 판단 될 경우에 DB에 업데이트 해주는 플로우로 짰다. 이것은 어디까지나 하나의 예시이기 때문에 각 서비스에 적합하게끔 플로우를 짜면 되겠다.

정산

거래 완료된 회계 월의 마지막날로부터 45일 이내에 은행 계좌로 입금



애플 인앱결제 전체적인 개념과 플로우에 대해서 정리해보았다. 상세 내용은 아직 정해지지 않은 상태로 조사한거라 다르게 진행되는 것들도 있을 것 같다. 업데이트 사항이 있으면 내용을 추가하도록 하겠당




참고
Apple developers
[iOS - swift] 1. StoreKit - IAP (In App Purchases 인앱 결제), 구독 구현 방법 (Sandbox, 인앱 결제 앱 등록)
인앱결제 개발 가이드

profile
Start fast to fail fast

3개의 댓글

comment-user-thumbnail
2023년 2월 24일

저도 지금 인앱결제 구현하고 있는데 이 글 덕분에 큰 도움이 되었습니다ㅜㅜ!
블로그에 다른 글들도 봤는데 참고할게 많더라고요 종종 보러 오겠습니다. 감사합니다 :)

1개의 답글
comment-user-thumbnail
2024년 1월 21일

인앱구현하는 초보입니다~ 글 너무 감사합니다: 여기 쓰인대로 하면 인앱결제 취소 시 사용자 앱의인앱 상품의 컨텐츠 접근을 제한 할 수 있나요?

답글 달기