[Unity] 使用 Prime31 IAP, IAB

您好?

这次我使用了 Unity 框架之一的 Prime31 来添加应用内购买相关功能。

Prime31 分别有 StoreKit 和 Google IAB 两个管理器。

我们通过

#if UNITY_IOS || UNITY_IPHONE

#elif UNITY_ANDROID

#endif

构建了一个统一的管理器,通过签发相同的商品密钥来控制相关商品的购买。

顺序如下。

1. 导入 Prime31 ( Android : ver. 2.10 , iOS : ver 2.15 )

Prime31 的 iPhone 和 Android 插件版本有所不同。

2. 测试 IAP

var listProducts = new string[2];
listProducts[0] = "com.test.crystal100";
listProducts[1] = "com.test.crystal200";
StoreKitManager.productListReceivedEvent += ProductListReceived;
//listen for purchase
StoreKitManager.purchaseSuccessfulEvent += PurchaseSuccessful;
StoreKitManager.purchaseFailedEvent += PurchaseFail;
StoreKitManager.purchaseCancelledEvent += PurchaseCancelled;
//Request product list
StoreKitBinding.requestProductData(listProducts);

简单解释一下代码。

listProducts 是在 iTunes 中注册的产品 ID。执行 requestProductData 后,系统会检查并确认这些产品是否存在。

在 ProductListReceived 回调中设置数据即可。

Purchase 函数部分已将 IAB 和 IAP 统一。

3. 测试 IAB

GoogleIAB.init( key ); GoogleIAB.setAutoVerifySignatures (true); GoogleIABManager.billingSupportedEvent += billingSupportedEvent; GoogleIABManager.billingNotSupportedEvent += billingNotSupportedEvent; GoogleIABManager.queryInventorySucceededEvent += queryInventorySucceededEvent; GoogleIABManager.queryInventoryFailedEvent += queryInventoryFailedEvent; GoogleIABManager.purchaseCompleteAwaitingVerificationEvent += purchaseCompleteAwaitingVerificationEvent; GoogleIABManager.purchaseSucceededEvent += purchaseSucceededEvent; GoogleIABManager.purchaseFailedEvent += purchaseFailedEvent; GoogleIABManager.consumePurchaseSucceededEvent += consumePurchaseSucceededEvent; GoogleIABManager.consumePurchaseFailedEvent += consumePurchaseFailedEvent;

4. 新建类 IAPManager -> 包含 "GoogleIAB" , "StoreKitManager"

利用以下指令进行了分支处理。

#if UNITY_IOS

#elif UNITY_ANDROID

#endif

之后,purchase 部分使用通用代码进行了处理。

如果 Android 和 iOS 的产品 ID 一致,管理起来会很方便。

product_id 建议不要创建太多,按种类(级别)创建几个即可,然后在自己的数据库中复用。

5. 实现收据验证服务器

使用了 PHP 进行处理。iOS 的情况只需接收 transaction id 即可验证,而 Google 的情况必须使用 API,因此需要 client-id、secret-key 和 token。(准备工作较多,且需要一定时间。)

6. 结论

如果说在进行过程中耗时最长的部分:

Error

The item you requested is not available for purchase

这是一个报错。

查看 queryInventorySucceededEvent,我注册的商品列表都能正常获取,看来应用和开发者控制台(Developer Console)之间的连接是正常的。但该错误一直出现。

为了解决这个问题,我尝试了以下应对措施:

1. 检查 APK 的 version code 和 version name(Manifest 内的 version code 和 version name 必须一致)。

2. 权限设置(Permission Setting)。

最终解决了问题。

首先,为了判断测试失败的原因,必须确保可以通过链接下载。如果点击链接时出现 404 not found,说明还没准备好。(此时似乎还不是 enable 状态)。我的情况是链接激活后一切正常。链接激活大约花了一天时间。

AD