영수증 검증 관련 질문

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 :
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 : NullReferenceException: Object reference not set to an instance of an object.

인앱결제 작업중 오류문의 드립니다.
구매버튼에 IAP Button 에 Get100Gold(), Get100Soul() 을 각각 할당해 주었습니다.
뒤끝에 연결전에는 테스트결제 완료후 재화가 잘들어왔지만 지금은 결제가 완료 되지만 에러메세지와 함께 재화가 지급이 안됩니다…
그리고 정상적으로 결제가 완료되면(테스트결제포함) 콘솔에서 영수증이 확인이 되는것인가요…?
작성된 코드는 아래와 같이 했습니다.

private static IStoreController storeController;
private static IExtensionProvider extensionProvider;

public BackEndGameInfo backEndGameInfo;

public const string productId1 = "100gold";
 public const string productId5 = "100soul";

void Start()
{
    if(storeController == null)
    {
        InitializePurchasing();
    }
}
private void InitializePurchasing()
{
    if (IsInitialized()) return;
    var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
    builder.AddProduct(productId1, ProductType.Consumable);
    builder.AddProduct(productId2, ProductType.Consumable);
    UnityPurchasing.Initialize((IStoreListener)this, builder);
}
private bool IsInitialized()
{
    return storeController != null && extensionProvider != null;
}

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
    /*
    뒤끝 영수증 검증 처리
    */
    BackendReturnObject validation = Backend.Receipt.IsValidateGooglePurchase(args.purchasedProduct.receipt, "receiptDescription", false);

    // 영수증 검증에 성공한 경우
    if (validation.IsSuccess())
    {
        // 구매 성공한 제품에 대한 id 체크하여 그에 맞는 보상 

        //100골드
        else if (String.Equals(args.purchasedProduct.definition.id, productId1))
        {
            Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));
            GameManager.GoldAmount += 100;
            PanelMain.Instance.UpdateCoin();
            GameManager.Instance.SavePlayerPrefs();
            backEndGameInfo.OnClickGameInfoUpdate();
            print("100골드 결제 성공");
        }
    
        //100소울
        else if (String.Equals(args.purchasedProduct.definition.id, productId5))
        {
            Debug.Log(string.Format("ProcessPurchase: PASS. Product: '{0}'", args.purchasedProduct.definition.id));
            GameManager.SoulAmount += 100;
            PanelMain.Instance.UpdateCoin();
            GameManager.Instance.SavePlayerPrefs();
            backEndGameInfo.OnClickGameInfoUpdate();
            print("100소울 결제 성공");
        }

     

    }
    // 영수증 검증에 실패한 경우 
    else
    {
        // Or ... an unknown product has been purchased by this user. Fill in additional products here....
        Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id));
    }

    // Return a flag indicating whether this product has completely been received, or if the application needs 
    // to be reminded of this purchase at next app launch. Use PurchaseProcessingResult.Pending when still 
    // saving purchased products to the cloud, and when that save is delayed. 
    return PurchaseProcessingResult.Complete;
}



public ProductCollection products => storeController.products;



//100골드
public void Get100Gold()
{
    Product p = storeController.products.WithID(productId1);
    storeController.InitiatePurchase(p);
}

//100소울
public void Get100Soul()
{
    Product p = storeController.products.WithID(productId5);
    storeController.InitiatePurchase(p);

public void Failed()
{
    print("인앱실패");
}

안녕하세요 개발자님.

코드는 정상적으로 작성된 것으로 확인이 됩니다.
하지만 뒤끝 영수증 코드를 시도했을 때 혹은 시도하기 전에 해당 에러가 발생한 것으로 확인이 되는데요.

해당 에러가 발생한 코드가 어디인지 확인해주시고 영수증 검증을 하기전에 로그인이 되어있는지 확인해주시기 바랍니다.

답변주신거 감사합니다. 지속적으로 문제가 있어 추가문의 드립니다.

//100골드
public void Get100Gold()
{
Debug.Log(“100골드구입”);
Product p = storeController.products.WithID(productId1);
storeController.InitiatePurchase(p);
Debug.Log(productId1);
Debug.Log(p);

}

위 함수에서 Debug에 "100골드구입"은 뙤지만 이후 디버그는 안되는것으로 보아
Product p = storeController.products.WithID(productId1);
storeController.InitiatePurchase(p);
이부분이 문제인거 같습니다…

100골드구입
IAPManager:Get100Gold()
UnityEngine.Events.UnityAction:Invoke()
UnityEngine.Events.UnityEvent`1:Invoke(T0)
UnityEngine.Purchasing.IAPButton:ProcessPurchase(PurchaseEventArgs)
UnityEngine.Purchasing.CodelessIAPStoreListener:ProcessPurchase(PurchaseEventArgs)
UnityEngine.Purchasing.PurchasingManager:ProcessPurchaseIfNew(Product)
System.Action:Invoke()
UnityEngine.Purchasing.Extension.UnityUtil:Update()

Logcat 에서 아래 에러 메세지가 뜹니다…

NullReferenceException: Object reference not set to an instance of an object.
at IAPManager.Get100Gold () [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Events.UnityAction.Invoke () [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Events.UnityEvent`1[T0].Invoke (T0 arg0) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Purchasing.IAPButton.ProcessPurchase (UnityEngine.Purchasing.PurchaseEventArgs e) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Purchasing.CodelessIAPStoreListener.ProcessPurchase (UnityEngine.Purchasing.PurchaseEventArgs e) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Purchasing.PurchasingManager.ProcessPurchaseIfNew (UnityEngine.Purchasing.Product product) [0x00000] in <00000000000000000000000000000000>:0
at System.Action.Invoke () [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Purchasing.Extension.UnityUtil.Update () [0x00000] in <00000000000000000000000000000000

해당 에러라면 초기화 부분에서 에러가 발생하는 것 같습니다.
아래와 같은 함수들이 적용되어 있는지 확인해주시고, 첫 호출에는 에러가 발생할 수 있으니 2,3번 더 호출하여 정상적으로 작동하는지 확인해주시기 바랍니다.

        var module = StandardPurchasingModule.Instance();

        ConfigurationBuilder builder = ConfigurationBuilder.Instance(module);

        builder.AddProduct(consumableItem, ProductType.Consumable); //, new IDs {{ removeAds, GooglePlay.Name }});

        UnityPurchasing.Initialize(this, builder);

        Product p = storeController.products.WithID(productId);

        storeController.InitiatePurchase(p);