관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 3. 인앱 결제 StoreKit 개념 - 구매 완료 검증 (appStoreReceiptURL, SKReceiptRefreshRequest) 본문

iOS 응용 (swift)

[iOS - swift] 3. 인앱 결제 StoreKit 개념 - 구매 완료 검증 (appStoreReceiptURL, SKReceiptRefreshRequest)

jake-kim 2022. 11. 17. 23:19

* 인앱 결제 포스팅 글 목차

구매 후 검증

  • 앱스토어 영수증을 가지고 앱이나 서버에 영수증 검증 코드를 추가하여 구입한 컨텐츠를 검증
    • 보안 코딩 필요

영수증 검증 2가지 방법

  • 1.로컬
    • 디바이스에서 영수증을 검증
    • IAP 영수증의 서명을 검증하기 위한 방법으로 권장
  • 2.서버
    • 서버가 AppStore를 통해 영수증 검증
    • 구매 기록을 유지하고 관리할 때 권증

AppStore 영수증 검증 플로우

  • AppStore 영수증은 애플 인증서로 서명된 암호화된 이진 파일
  • 이 암호화된 파일의 내용을 읽으려면, verifyReceipt 를 통해 읽기가 가능
    • 보통 서버 사이드에서 verifyReceipt API를 사용하여 검증
    • 앱에서 verifyReceipt API를 사용하지 않는 이유?
    • 서버 사이드에서 verifyReceipt를 이용할때 개발용 (sandbox) url이 따로 존재하여 선택하여 사용이 가능
    // Production URL
    POST <https://buy.itunes.apple.com/verifyReceipt>
    
    // Sandbox URL
    POST <https://sandbox.itunes.apple.com/verifyReceipt>
    

AppStore 영수증 검증 디테일

  • 앱에서 영수증을 획득하여 서버에 검증해달라고 요청
    • 디바이스에서 영수증 데이터를 가져오려면, Bundle에 있는 appStoreReceiptURL을 가져와서 base64로 변환한 후 이 데이터를 서버로 전송
// 영수증 가져오기
var base64Receipt: String? {
    Bundle.main.appStoreReceiptURL
      .flatMap({ try? Data(contentsOf: $0) })
      .map { $0.base64EncodedString() }
  }

// 영수증 보내기

  • 서버에서 검증 후 이 다음 동작?

새로운 영수증 요청 SKReceiptRefreshRequest

  • 영수증이 유효하지 않거나 누락된 경우 이 API 사용하여 새로운 영수증 요청
  • 이 인스턴스를 만들고, delegate를 준수한 후 start()하면 delegate에서 리프레시 확인이 가능
init(receiptProperties: [String: Any]?)

var receiptProperties: [String: Any]?
let SKReceiptPropertyIsExpired: String // 영수증이 만료되었는지 알 수 있는 키값
let SKReceiptPropertyIsRevoked: String // 영수증이 취소되었는지 알 수 있는 키값
let SKReceiptPropertyIsVolumePurchase: String // VPP 영수증인지 알 수 있는 키값

 

*참고

https://developer.apple.com/documentation/appstorereceipts/verifyreceipt

Comments