[Unity] IAP内购:NullReceiptException: Exception of type

一、问题

  1. 环境

Unity 2020.1.14f1
IAP 3.0.1

  1. 发生场景用户点击恢复交易后,执行RestoreTransactions()方法,在回调中处理恢复订阅(注意:回调函数返回Ture仅代表方法执行成功并不意味着恢复成功),如何处理呢?

(1)首先本地拿到GP后台配置的商品sku,调用StoreController.products.WithID(sku)判断后台是否相应的内购商品,然后获取方法返回的Product;
(2)一般来说订阅只能购买一次,所以只需要遍历到一个Product即可
,执行SubscriptionManager subscriptionManager = new SubscriptionManager(Product,"商品信息,可以为Null");,再执行subscriptionManager.getSubscriptionInfo()获取详细的信息,详细的代码下面会给出,此处只讲流程。
(3)也就是在获取订阅信息的时候,抛了异常信息,错误代码:
E/Unity: NullReceiptException: Exception of type 'UnityEngine.Purchasing.NullReceiptException' was thrown.
在这里插入图片描述

二、原因

说白了,就是你传入的订阅商品的ID,玩家没有买,所以返回的收据为空,按理来说玩家没有够,可以将SubscriptionInfo.isSubscribed()返回Result.False,但是官方并没有这样做,害

三、解决

在获取订阅信息那块代码加上异常处理即可

Product item = m_StoreController.products.WithID(m_SubscriptionProductIDs[index]);
   if (item != null)
   {
    
    
       //收据为空时,抛异常
       try
       {
    
    
          SubscriptionManager subscriptionManager = new SubscriptionManager(item, null);
          SubscriptionInfo info = subscriptionManager.getSubscriptionInfo();
          Debug.Log(m_LogHeader + "是否已过期?" + info.isExpired().ToString());
          Debug.Log(m_LogHeader + "是否已订阅?" + info.isSubscribed().ToString());
          if (info.isSubscribed() == Result.True && info.isExpired() == Result.False)
          {
    
    
             m_SubscribedProducts.Add(item);
             break;
          }
     }
     catch (Exception e)
     {
    
    
            Debug.Log(m_LogHeader + "用户没有订阅:" + item.definition.id);
     }
}

猜你喜欢

转载自blog.csdn.net/weixin_42186644/article/details/123734195