【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);
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity IAP中,恢复购买流程需要以下几个步骤: 1. 在代码中实现恢复购买功能。在Unity中,你可以使用IAPManager类在代码中实现恢复购买功能。以下是一个示例: ```csharp using UnityEngine; using UnityEngine.Purchasing; public class IAPManager : MonoBehaviour, IStoreListener { private IStoreController m_Controller; void Start() { var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); builder.AddProduct("TestProduct", ProductType.Consumable); UnityPurchasing.Initialize(this, builder); } public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { m_Controller = controller; } public void OnInitializeFailed(InitializationFailureReason error) { Debug.Log("IAP initialization failed: " + error); } public void OnPurchaseFailed(Product item, PurchaseFailureReason error) { Debug.Log("IAP purchase failed: " + error); } public void OnPurchaseComplete(Product item, PurchaseEventArgs args) { Debug.Log("IAP purchase complete: " + item.definition.id); } public void Purchase(string productId) { if (m_Controller != null) { var product = m_Controller.products.WithID(productId); if (product != null && product.availableToPurchase) { m_Controller.InitiatePurchase(product); } else { Debug.Log("IAP product not available: " + productId); } } } public void RestorePurchases() { if (m_Controller != null) { m_Controller.RestoreTransactions(); } } } ``` 在上面的代码中,我们添加了一个RestorePurchases方法,该方法调用m_Controller.RestoreTransactions()方法来恢复购买。 2. 在iOS项目中配置恢复购买功能。要在iOS上启用恢复购买功能,你需要在Apple开发者中心中创建一个新的IAP项目,并将其添加到Xcode项目中。在Xcode中,你需要设置应用程序的IAP权限,并添加IAP产品的标识符。 3. 在Unity中测试恢复购买功能。在Unity中,你可以使用IAPManager中的RestorePurchases方法测试恢复购买功能。在调用RestorePurchases方法之前,请确保你已经在Unity IAP控制台中创建了一个有效的产品,并在iOS项目中正确配置了IAP。 以上就是Unity IAP恢复购买流程的实现步骤。请注意,在实际发布应用程序之前,请确保你已经按照苹果的要求正确实现了恢复购买功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值