오늘은 짧게 IAP 사용을하다가 발생한 이슈에 대해서 정리해보았다.
https://victorygamestudio.tistory.com/16
[유니티] 구글 인앱 결제(IAP) 사용하기
오늘은 구글 인앱 결제(IAP) 를 설정해보도록 하겠다. 간단한 게임이라도 수익을 내기 위해서는 인앱 결제는 필수다. 특히, 광고 제거 기능이나, 가챠 상품은 우리가 만드는 게임 수익의 대부분일
victorygamestudio.tistory.com
위 링크는 IAP 를 진행하는 과정을 정리하였는데, 구현 방식은 결국에는 코드리스로 결말을 맞이하였던 글이다...
하지만, 오늘에서야 코드를 통해 IAP 를 구현할 수 있었다.
1. 에러
NoProductsAvailable 이라는 에러 메세지를 받을 수 있다.
public void OnInitializeFailed(InitializationFailureReason error)
{
Debug.Log("초기화 실패 : " + error);
}
즉... 초기화가 되지 않아서 아무것도 할 수 없는 상태다..
일단, IAP Catalog 와 IAP Button 을 이용하면 분명 잘 되기는 하는데... 영수증 검증 서버 구현 과정에서 굉장한 문제가 발생할 수 있다..
기본적으로 검증을 하기 위해서는 '보류' 과정을 거쳐야한다.
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
#if UNITY_EDITOR
productCompleteDic[args.purchasedProduct.definition.id]?.Invoke(true);
return PurchaseProcessingResult.Complete;
#elif UNITY_ANDROID
if (IsRegisteredProduct(args.purchasedProduct.definition.id) == false)
{
return PurchaseProcessingResult.Pending;
}
RequestVerifyReceipt(args.purchasedProduct, productCompleteDic[args.purchasedProduct.definition.id]);
return PurchaseProcessingResult.Pending;
#endif
}
안드로이드 코드를 보면, RequestVerifyRecipt 메서드에서 영수증 검증을 하고, 영수증 검증의 경우 웹서버에서 구글 결제 서버로 검증 과정이 2중으로 연속된다. 따라서 결제 시간 소요로 인해 Pending 을 반환하여 보류한 뒤, 결제 완료를 날려줘야 한다.
결제 완료의 경우,
m_StoreController.ConfirmPendingPurchase(product);
를 사용하게 되는데, 초기화 실패 시, m_StoreContoroller 의 객체 초기화도 실패되어 사용 불가해진다..
물론, 코드리스의 경우 코드리스 코드로 유사한 메서드를 호출할 수 있긴하다..
CodelessIAPStoreListener.Instance.StoreController.ConfirmPendingPurchase(product);
위 처럼 사용할 경우, 같은 동작을 하는 것 같다. ( 사실 정확하진 않은데... 코드리스의 경우 방법이 없다 --;;)
하지만, 이렇게 보류되는 경우.. 앱이 시작되면서 자동으로 보류된 결제 작업 로직을 처리하게 되는데..
코드리스의 경우, 버튼 컴포넌트가 들어가는 타이밍과 영수증 검증 코드의 타이밍이 맞지 않으면 말도 안되는 에러가 계속 발생해서 처리가 불가능하다.
한마디로 코드리스로는 Pending 을 사용하지 못한다;; 결국 영수증 검증도 못한다는 소리임
여튼.. 짧게 얘기해서 코드리스는 영수증 검증이 안된다.. 된다하더라도 엄청나게 험난한 길이 될 것이다..
결국 NoProductsAvailable 에러만 해결할 수 있으면, 코드로 영수증 검증 처리가 가능해진다.
그게 필요없고 그냥 결제 시스템만 이용한다면 코드리스로도 충분하다.
2. 해결 방법
IAP 초기화하는 코드가 잘못됬었다..
기존에는 제품 ID 와 상품 이름 두 개를 코드로 입력해주어야 했는데.. 버전 업이 되면서 바뀌었던 것..
기존 코드를 계속하니 원인을 몰랐다. 해결 방법은 아래 링크에 정리해두었다.
https://victorygamestudio.tistory.com/28
[유니티] 구글 인앱 결제 unavailable product 에러
인앱 결제 관련해서 오랜만에 하다보니.. unavailable product 를 마주하게 되었다. 이게 예전에는 상품을 등록할 때, '제품 ID' 하고, '상품 이름' 이 필요했던 것으로 기억하고 있었는데.. 따라서 계속
victorygamestudio.tistory.com
별의별 짓을 다해본 결과로는 구글 상품 등록이 잘못된 것이었다;;
왜인지는 정말 이유를 아직도 모르겠고.. 과거에는 잘만 사용했던 방식이 문제가 됬다.
과거에는 상품 이름과 제품 ID 를 넣어서 잘만 사용했음..
(물론, 그림이 짤렸지만 제품 ID 는 패키지명.deleteads 처럼 독립적인 키임)
현재는 위 처럼 사용하면 절대 안 된다..
혹시나해서 상품 이름과 제품 ID 를 똑같이해보니 초기화가 잘되면서 NoProductsAvailable 에러가 발생을 안 한다.. 하..
엥 뭐지 싶어서 testw 와 test 로 상품 이름과 제품 ID 를 다르게 했더니 정말로 다시 안 되버리는 기적이 발생했다..
뭔진 모르겠지만.. 나와 같은 에러가 발생한다면.. 상품 이름과 제품 ID 를 동일하게 적어보자.. 해결될지도 모른다..
'유니티' 카테고리의 다른 글
[유니티3D] 3D 애니메이션 방향이 이상할 때 (0) | 2023.09.15 |
---|---|
[유니티] IAP 검증 서버 이슈 (4) | 2022.12.16 |
개인정보처리 방침 (0) | 2022.11.29 |
[유니티] Reset 함수 사용하기 (3) | 2022.11.05 |
[유니티] Localization 다중언어 대응 (4) | 2022.11.04 |