애플 구독 인앱 결제 구현기 - 1

Adam·2024년 7월 9일
1

개발일지

목록 보기
1/15

이직을 하고 맡은 첫 업무는 회사 신규 프로젝트를 위해 인앱 결제를 구현하는 업무이다.
이 프로젝트를 진행하면서 배우는 것이나 어려움에 직면한 것들을 기록해보려고 한다.

난관 1 - 공식 도큐멘테이션

개발을 위해서는 필연적으로 도큐멘테이션을 읽으면서 어떤 정보들이 필요하고 어떤 방식으로 해당 정보들을 전달해야 되는지 이해를 한 후에 개발을 진행해야 한다.

하지만 애플의 도큐멘테이션은 참... 할말하않이다....
구글의 경우 정말 개발자 친화적으로 어떤 엔드포인트로 어떤 방식의 JSON을 보내면 어떤식의 응답을 줄것이다와 같이 정말 친절하게 스탭 바이 스탭으로 작성이 되어 있고, JSON의 예시도 매우 직관적이고 해당 정보가 무엇을 나타내는지 설명이 잘되어 있다.
하지만 애플의 경우는 JSON안에 들어가야 될 정보도 매우 불친절하게 글형태로 나열을 했고, 예시로 만든 JSON도 찾아볼 수 없으며, 해당 정보들이 어떤것인지에 대한 설명도 매우 부족하다고 느꼈다.

그래서 공식 도큐멘테이션도 봤지만 다른 사람들이 구현을 한 다른 예시들을 찾아보면서 회사 상황에 맞게 커스텀을 해 나아가는 방식으로 구현을 하려고 하였다.
대략적인 구독 신청/갱신/취소에 해당하는 시나리오를 구상하고 이에 맞는 API에 해당하는 문서 작업을 먼저 작성을 해 나아가던 도중 두번째 문제에 부딛혔다.

난관 2 - StoreKit 2

우선 기본적인 인앱 구독 결제를 위한 프로세스는 다음과 같다.

1. 클라이언트가 결제 정보를 전달
2. 서버가 애플에 해당 정보에 대해서 영수증을 요청한다
3. 애플 서버는 영수증을 전달한다
4. 서버는 해당 영수증을 검증하고 구독 처리를 한다

여기서 대부분의 블로그글은 StoreKit 2 이전 버전의 방식으로 인증을 진행하는 것을 예시로 했고, 공식 문서에 deprecated라는 표기가 있긴 했지만 이게 일반적인 방법이라고 생각했고 이런 방식으로 작성을 했다.
간단히 StoreKit 2 이전의 방식에 대해서 설명하자면 다음과 같다

운영 검증 시 https://buy.itunes.apple.com/verifyReceipt
테스트 검증 시 https://sandbox.itunes.apple.com/verifyReceipt
위 주소로 base64로 인코딩 된 "receipt_data"와 애플 개발자 페이지에서 발급 받을 수 있는 password를 JSON body에 담아서 post request를 보낸다.
응답에서 status가 0이면 성공, 그 이외의 값이면 결제가 성공을 한 것이었다.

하지만, 해당 API도 아직 사용이 가능하지만 ios 18 이후 부터는 기존의 방식은 새로운 기능을 전혀 지원하지 않을 것이고, 궁극적으로 해당 방법을 폐기하는 쪽으로 간다고 한다.

StoreKit 2 API

해당 방식으로 구현 된 예시가 부족하고 공식 도큐멘테이션이 모호했기 때문에, API를 구현하기 전에 애플에서 제공한 WWDC에서 업데이트 된 StoreKit 2 API를 설명하는 영상을 참고했다.

우선 인증을 하는 방식이 바뀌었다

영수증을 보내야 하는 URI가 변경이 되었고, StoreKit 2 이전에는 receipt_data와 password를 보냈던 반면 변경 된 API에서는 쿼리 파라미터로 original_transaction_id를 보내주면 된다.

이때 응답이 JWS 형식으로 오는데 이를 디크립트를 하면 notification_type 정보가 들어오게 되는데 신경 써야 하는 항목들은 다음과 같다.

여기서 해당 항목들은 다음과 같다.

Subscribed: 신규 구독

DID_RENEW: 구독 연장됨

DID_FAIl_TO_RENEW: 카드 decline돼 구독 연장 실패할때

EXPIRED: 구독이 만료가 됐을때

추가 고려 사항

하나의 시나리오에서 사용자가 구독 취소를 했을 때 어떤 식으로 처리를 해야하는지 고민했었다.
하지만 WWDC영상에 이에 대한 시나리오도 상세하게 설명을 해준다.

위 스크린샷에서철 구독자가 취소를 하면 AUTO_RENEW_DISABLE상태로 웹훅이 날라오게 되는데 이 영수증을 서버에서 처리하여 DB에서 유저의 만료날짜를 업데이트 하고, 배치로 해당 구독을 종료하는 방식으로 가야될 것 같다.

추가적으로 애플에서 이렇게 취소한 유저들을 어떤 식으로 재구독하게 할 수 있는 방식에 대해서도 예시를 주는데, 이러한 웹훅을 받으면 아래와 같이 앱쪽에서 프로모션 같은 것을 띄우는 것을 고려해보라 하는데 이도 기획쪽에서 도입을 할지 추가적으로 논의를 해봐야할 것 같다.

느낀점

도큐멘테이션 좀 개발자 친화적으로 만들어 주면 안되겠니??... ㅠㅠ

profile
Keep going하는 개발자

0개의 댓글