본문 바로가기
개발

IAP 이슈) 카드 결제 정보가 유효하지 않은 경우 두가지 값이 넘어옴..

by 꼬마상어 2018. 8. 21.
반응형

IAP 이슈 정리

* 발생 현상

  • 카드 결제 정보가 유효하지 않은 경우 IAP 시도시, 사용자는 카드 결제 정보를 Appstore를 통해 이동하여 입력 후 해당 IAP 프로세스를 진행함.

  • 앱내에서는 PaymentCanceled 값이 Delegate를 통해 전달되어 개발자측에서는 Fail로 판단.

    • PaymentCanceled 값은 IAP 프로세스를 사용자의 의도에 의해 취소하였는지에 대한 enum값입니다.
    • 개발자측의 자체 트랜젝션 내에서는 IAP에 대한 값을 Delegate에 의존하고 있으므로 CS를 받았을 때, 사용자 취소로 인하여 충전이 안되었다고 판단할 수 밖에 없습니다.
    • (카드 결제 정보 입력후 결제가 실제로 되었는지 여부를 판단하기 위해 결제 영수증을 받아보는법, 혹은 결제 승인 문자를 캡쳐하는 수밖에는 방법이 없는걸까요..?)

 

* Apple측의 입장

  • iOS 9부터 해당 이슈 시작 (2015년도)

  • 불완전한 IAP 프로세스에 대하여 paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])0 (PaymentCanceled)가 전달됩니다.

  • 이 불완전한 프로세스의 특이점은 하나의 IAP 트랜젝션에 대하여 2가지의 값이 전달된다는 것입니다.

    • 카드 결제 정보가 유효하지 않은 상태에서 IAP 프로세스 진행시 처음에는 결제가 유효하지 않으므로 PaymentCanceled 값이 전달됩니다. (즉, 실패이죠)
    • 카드 결제가 유효하지 않으니 입력을 해야한다는 팝업이 뜨고, 그 뒤에 앱을 벗어나 AppStore로 진입하여 결제 정보를 입력케 합니다.
    • 카드 정보를 입력 후 설정이 완료되며 구매가 진행됩니다.
    • 앱스토어에서 자동적으로 앱으로 진입하지 않고, 사용자가 지정하여 앱으로 진입하였을때 Observer를 통해 purchased 값이 전달됩니다.
    • 또한, 이 시점에서 영수증을 갱신하면 성공적으로 결제된 영수증이 보여집니다.
  • 현재 Fix되지 않은 버그이며 이 상황에 대하여 아래와 같은 임시조치를 취하고 있습니다.

    • 결제 정보를 입력 후 결제를 진행하는 등의 불완전한 트랜젝션에 대해 Non-Consumable 상품과 동일한 복원절차를 진행합니다.

      • 원래 Consumable 상품에 대하여 복원절차는 진행하지 않아야 올바른 프로세스 입니다.
    • 인앱 프로세스 중 purchased 값이 전달되는 시점에서 실패 영수증을 갱신하면 성공적으로 결제된 영수증으로 업데이트 되어 보여집니다.

 

* 다른 개발자들은 어떻게 하고 있나..

  1. 앱 시작시 진행하는 미충전 인앱 결제 복원 프로세스를 진행함.
  • 앱에서 카드 결제 정보를 입력하러 갈 때, 앱은 Background 상태가 됩니다.
  • 그리고 카드 결제 정보를 입력 후 앱으로 진입 시 Foreground 상태가 됩니다.
  • didFinishLaunchingWithOptions 에서만 진행했던 인앱 복원 절차를 Background -> Foreground 로 변화할때도 진행합니다.

 

  1. FinishTransaction을 Delay 합니다.
  • Background에서 Foreground로 될 때 까지 트랜젝션을 끝내는 FinishTrasnsaction을 Delay 합니다.
  • 첫번째로 넘어오는 PaymentCancel값을 무시하고 두번째로 받는 purchased, failed 값만을 처리합니다.

 

* 참고 및 Apple Staff의 답변

반응형

댓글