Unity IAP的简单使用

本文介绍如何在Unity中使用内购系统(IAP)进行产品购买及恢复购买的功能实现。通过示例代码展示了初始化购买系统、购买商品、恢复交易及验证回执单的过程。

这里我只贴出如何用代码进行购买和恢复购买并拿出订单号的方法(AppStore需要先去iTunes Connect设置商品id)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Security;

public class Test : MonoBehaviour, IStoreListener
{

    private IStoreController mStoreController;
    private IExtensionProvider mExtensionProvider;
    ConfigurationBuilder builder;

    private string consumeable = "product1";


    void Start()
    {
        if (mStoreController == null)
        {
            InitPurchasing();
        }
    }


    //初始化
    public void InitPurchasing()
    {
        if (IsInitialized())
        {
            return;
        }

        builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); 
        builder.AddProduct(consumeable, ProductType.NonConsumable);
        UnityPurchasing.Initialize(this, builder);
    }


    //购买
    public void BuyProduct()
    {
        if (IsInitialized())
        {
            Product produdt = mStoreController.products.WithID(consumeable);
            if (produdt != null && produdt.availableToPurchase)
            {
                mStoreController.InitiatePurchase(produdt);

                Debug.Log(produdt.metadata.localizedPrice);
            }
            else
            {
                Debug.Log("fail");
            }
        }
    }

    //恢复购买
    public void ReSotre()
    {
        if (!IsInitialized())
        {
            return;
        }

        if (mExtensionProvider != null
            && (Application.platform == RuntimePlatform.IPhonePlayer 
                || Application.platform == RuntimePlatform.OSXPlayer)) {
            var apple = mExtensionProvider.GetExtension<IAppleExtensions>();
            apple.RestoreTransactions((result) => {
                // Restore purchases initiated. See ProcessPurchase for any restored transacitons.
            });
        }
    }

    private bool IsInitialized()
    {
        return mStoreController != null && mExtensionProvider != null;
    }


    //---------------IStoreListener的四个接口的实现-----------

    //初始化成功
    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    {
        mStoreController = controller;
        mExtensionProvider = extensions;

    }

    //初始化失败
    public void OnInitializeFailed(InitializationFailureReason error)
    {
        Debug.Log("初始化失败了:" + error);
    }

    //购买失败
    public void OnPurchaseFailed(Product i, PurchaseFailureReason p)
    {
        Debug.Log(i.definition.id + "\n" + p);
    }


    //购买成功和恢复成功的回调,可以根据id的不同进行不同的操作
    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)
    {
        if (string.Equals(e.purchasedProduct.definition.id, consumeable, System.StringComparison.Ordinal))
        {   
            //获取商品的描述信息,标题,价格,带单位的(¥,$等等)
            //这一步一般可以放在初始化完成的回调里,用于刷新你的相关UI
            Debug.Log("price:" + e.purchasedProduct.metadata.localizedPriceString); 
            Debug.Log(e.purchasedProduct.metadata.localizedTitle + e.purchasedProduct.metadata.localizedDescription);

            //交易号
            Debug.Log("storeSpecificId:" + e.purchasedProduct.definition.storeSpecificId);     

            //回执单  
            Debug.Log("receipt:" + e.purchasedProduct.receipt);                                

            //商品的id号
            Debug.Log("transactionID:" + e.purchasedProduct.transactionID);                    

            Debug.Log("成功了!!!!");


            //这里是获取订单号,用于存储到自己的服务器,以及恢复购买时的对比
            #if UNITY_ANDROID || UNITY_IOS || UNITY_STANDALONE_OSX
            // Get a reference to IAppleConfiguration during IAP initialization.
            var appleConfig = builder.Configure<IAppleConfiguration>();
            var receiptData = System.Convert.FromBase64String(appleConfig.appReceipt);
            AppleReceipt receipt = new AppleValidator(AppleTangle.Data()).Validate(receiptData);

            Debug.Log(receipt.bundleID);
            Debug.Log(receipt.receiptCreationDate);
            foreach (AppleInAppPurchaseReceipt productReceipt in receipt.inAppPurchaseReceipts) 
            {
                Debug.Log("订单号:" +  productReceipt.originalTransactionIdentifier);
            }
            #endif

        }
        return PurchaseProcessingResult.Complete;

    }
}
### ### 更新 Unity IAP 模块的操作流程 在 Unity 项目中更新 In-App Purchase (IAP) 模块是确保应用内支付功能兼容性与合规性的关键步骤,特别是在 Google Play 和 Apple App Store 不断更新其结算机制的背景下。Unity 提供了官方支持的 IAP 插件,开发者可通过 Unity Package Manager 进行升级以适配最新的结算库版本。 Unity IAP 插件的版本更新通常会引入对平台结算库的支持。例如,在 Unity IAP 4.3 版本中,支持的是 Google Play Billing Library v3,而在 Unity IAP 5.0 版本中则升级为支持 Billing v6。Google 对结算库的版本有明确要求,应用若使用过时的结算库将无法通过审核,甚至可能被下架[^1]。因此,开发者需要持续跟进 Unity IAP 的更新,以保持与 Google Play 的节奏一致。 ### ### 使用 Unity Package Manager 升级 IAP 插件 Unity 提供了内置的 Package Manager 工具,用于管理项目中使用的官方插件,包括 In-App Purchasing 模块。通过 Package Manager 可以直接更新 IAP 插件到最新版本,确保获得最新的功能支持和安全修复。操作步骤如下: - 打开 Unity Editor,进入 `Window > Package Manager` - 在搜索栏输入 `In App Purchasing`,找到该插件 - 点击 `Update` 按钮,插件将自动下载并应用最新版本[^2] 该方式适用于 Unity 2021 及更高版本的项目。对于使用 Unity 2020.3.38 的项目,同样可以使用 Package Manager 更新 IAP 插件,但需注意 Unity 版本与 IAP 插件的兼容性问题。部分新版本 IAP 插件可能不支持较旧的 Unity 版本,因此在更新前应查阅官方文档确认兼容性。 ### ### 升级后的兼容性与功能支持 升级 Unity IAP 插件后,需检查项目中的购买逻辑是否与新版本兼容。例如,新版本可能引入了新的 API、废弃了旧方法,或改变了配置方式。Unity IAP 5.0 支持 Google Play Billing v6,这意味着结算库的升级将有助于通过 Google 的审核要求[^1]。同时,新版本可能还增强了对订阅型商品、服务器到服务器通知(如 Apple 的 S2S 通知)的支持,开发者应根据项目需求进行适配。 ### ### 示例代码:IAP 初始化流程 以下是一个 Unity IAP 初始化的基本代码示例,适用于 Unity IAP 5.0 及以上版本。该代码实现了 IStoreListener 接口,并使用 StandardPurchasingModule 进行初始化: ```csharp using UnityEngine; using UnityEngine.Purchasing; public class IAPManager : MonoBehaviour, IStoreListener { private IStoreController storeController; private IExtensionProvider extensionProvider; private void Start() { InitializePurchasing(); } public void InitializePurchasing() { if (IsInitialized()) return; var module = StandardPurchasingModule.Instance(); module.useFakeStoreUIMode = FakeStoreUIMode.StandardUser; var builder = ConfigurationBuilder.Instance(module); ProductCatalog catalog = ProductCatalog.LoadDefaultCatalog(); IAPConfigurationHelper.PopulateConfigurationBuilder(ref builder, catalog); UnityPurchasing.Initialize(this, builder); } private bool IsInitialized() { return storeController != null && extensionProvider != null; } public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { storeController = controller; extensionProvider = extensions; } public void OnInitializeFailed(InitializationFailureReason error) { Debug.LogError($"IAP 初始化失败: {error}"); } public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason) { Debug.LogError($"购买失败: {product.definition.id}, 原因: {failureReason}"); } } ``` ### ### 相关问题 1. Unity IAP 插件如何处理跨平台的内购验证? 2. 如何在 Unity 中实现订阅型商品的自动续费与取消处理? 3. Unity IAP 的恢复购买功能在 iOS 和 Android 上有何不同? 4. 如何在 Unity 中实现内购商品的服务器端验证? 5. Unity 内购系统如何处理用户退款事件?
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值