[Swift] 인앱 결제 구현

EmilY
7 min readMar 11, 2021

안녕하세요 에밀리 입니다

인앱 결제는 영어로는 In-App Purchase(IAP)라고 하구요. 특정 기능이나 컨텐츠에 요금을 부과할 때 사용합니다. 이렇게 생긴 화면 다들 보셨죠.

그럼 인앱 결제 구현하는 법 정리해보겠습니다.

작성 시 해당 자료를 많이 참고하였습니다.

‼️준비물

인앱결제를 구현하기 앞서 애플 개발자 계정이 반드시 등록되어있고 결제를 테스트할 앱이 등록되어 있어야 합니다.

또한 계약, 세금 및 금융거래에서 유료 앱 계약을 맺은 상태여야 합니다.

위 사진을 보면 빨간 박스가 있는데요. 계약, 세금 및 금융거래에서 진행 상태가 반드시 ‘활성’ 상태여야 합니다. 만약 아래 X 표시가 있는 사용자 정보 대기 중 상태면 안됩니다. 제대로 거래 값이 넘어오지 않습니다. 따라서 꼭 확인 후 진행해주세요.

상태 확인을 마쳤다면 이제 인앱결제를 구현할 준비가 완료되었습니다.

Certificates, Identifiers & Profiles에서 App ID 추가하기

이제 Apple Developer에서 Certificates, Identifiers & Profiles의 Identifiers 메뉴로 들어갑니다. 하단 스크린 캡처의 빨간 네모 안 버튼을 눌러 새로운 Identifier를 추가해주세요.

Continue 누르기
Continue 누르기
빨간 박스를 채워주세요

Description에는 해당 Identifier 설명을 채워주시고 Bundle ID에는 프로젝트 번들ID를 넣어주면 됩니다. 이 화면에서 하단 In-App Purchase가 체크되어있는지 확인하시구요. (저는 이미 등록된 Identifier라 아래 캡처처럼 나오네요)

App Store Connect 나의 앱에서 앱 내 구입 만들기

위 과정이 끝났다면 App Store Connect의 ‘나의 앱’ 메뉴로 돌아갑니다.

좌측에 빨간 네모 안 앱 내 구입 > 관리 메뉴를 눌러주세요. 앱 내 구입의 +버튼을 눌러 앱 내 구입을 추가합니다. 추가하는 앱 내 구입이 코드에서 product라고 불리는 인앱결제 상품입니다.

버튼을 누르면 다음과 같은 타입들이 나오는데요. 타입에 대한 설명은 아래에 링크를 걸게요. 참고 후 나의 앱에 맞는 상품을 고르세요!

앱 내 구입 타입 설명 👉 여기

새로운 앱 내 구입을 만들면 위와 같은 화면이 나옵니다.

  • 식별 정보 : App Store에서 식별하는 IAP 이름으로 앱에서 보여질 일은 없습니다.
  • 제품 ID: IAP를 식별하는 유니크 문자열인데 번들ID 뒤에 유니크한 이름을 넣는 게 보통입니다. 예를들어 com.myprojectname.name.(유니크한 이름) 이런 식으로요.
  • 사용 가능 여부: 인앱 결제를 사용할지 말지를 체크합니다.
  • 가격: 인앱 결제의 가격이겠죠?
  • App Store 정보: 현지화는 대부분 한국어로 할 것 같아요. 우리는 한국인 이니까… 🇰🇷 표시 이름설명에 식별 정보를 넣어주고 저장을 누릅니다.

더 하단에 있는 App Store 프로모션과 심사 정보는 선택사항인 것 같기 때문에 넘어갑니다.

프로젝트 Capabilities 설정

앱 스토어에 올릴 프로젝트 Target > Signing & Capabilities에서 In-App Purchase라는 Capability를 추가해줍니다.

이제 코드 구현하고 테스트만 하면 되겠네요…!

인앱 코드 구현하기

먼저 InAppProducts 라는 struct을 만들어줍니다. 4번째 줄 product에 제품 ID 넣어주세요. 앱 내 구입 상품이 여러개일 때를 대비하여 productIdentifiers가 문자열 Set으로 되어있습니다.

이제 인앱 초기화, 결제하기, 내역 복원하기 등의 기능은 IAPHelper를 통해 구현합니다.

StoreKit을 import 해주시구요 init, requestProducts, buyProducts, restorePurchase를 만들어줍니다. 상품 구매, 복원을 요청하는 기능들입니다.

위에 requestProducts에서 delegate를 선언해주어서 SKProductsRequestDelegate를 구현해줄게요. App Store에 만들어둔 product 리스트를 가져오고, 실패시 수행되는 delegate들입니다.

SKPaymentTransactionObserver도 만들어주어야 합니다. product을 결제했을때나 결제에 실패했을 경우 App Store응답을 처리하는 Observer죠.

구매 이력을 검증하는 코드도 있습니다. App Store에서 구매 이력 영수증을 가져오는 코드인데요. 만일 자체 서버가 있다면 서버로 암호화된 영수증 string을 보내서 검증합니다. 앱 자체에서 검증을 할 수도 있지만 보안에 취약하기 때문에 권장하진 않네요.

저는 결제 요청 > 결제 요청 성공 > 서버 검증 > 검증 끝 의 과정을 거치면 Notification을 보내 ViewController에 다음과 같이 Alert를 띄워주었습니다. 적절하게 Notification을 post하여 처리를 종료시키도록 합니다.

이제 정말정말 끝입니다..! 기능을 만들었으니 테스트를 해봐야겠죠?

테스트하기

다시 App Store Connect로 돌아가 테스터를 만들어줍니다. 이 테스터는 진짜 계정 대신 테스트를 진행해주는 가상의 존재입니다.

SandBox 테스터 만들기

App Store Connect의 사용자 및 액세스 > Sandbox > 테스터 메뉴로 들어가 + 버튼을 눌러주세요.

여기에 신규 테스터 정보를 넣어주면 되는데 대충 가상의 이름과 가상의 이메일을 넣으면 됩니다. 기존에 있는 App Store ID는 넣지 않도록 합니다!

테스트하기

이제 테스트할 폰의 App Store로 들어가서 계정 로그아웃을 해줍니다. ‼️그러지 않으면 인앱결제할 때 실계정으로 결제가 됩니다. 😇

또는 설정 > App Store 들어가 맨 하단에 ‘샌드 박스 계정’이 로그아웃 되어있으면 됩니다!

그리고 다시 앱으로 돌아가 인앱 결제 버튼을 누르면 계정 로그인 창이 뜨는데요. 이때 우리가 위에서 생성해준 가상의 계정으로 로그인을 하면 자동으로 테스트 모드로 결제가 됩니다. (이건 캡처를 못했네요😭)

추후에 다시 구현하면 캡처를 추가하겠습니다.

그럼 여기까지 인앱 결제 구현하기 였습니다.

끝.

--

--