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