一、问题
- 环境
Unity 2020.1.14f1
IAP 3.0.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);
}
}