找回密码
 立即注册
查看: 528|回复: 0

Unity 接 iOS 内购(Unity内置IAP)

[复制链接]
发表于 2021-3-24 21:07 | 显示全部楼层 |阅读模式
Author :JerryYang
Create by 2021.03.24

环境:
Unity:2020.3.0f1c1
一、后台商品配置

    进入苹果开发者后台,填写税务信息,银行信息(不填会出现购买失败);选择你要添加内购的应用,找到 In-App Purchases 选项,点击 Manage
    选择你要添加内购的应用


    点击添加商品,然后完善商品信息;
注意:这里要填写所以信息,包括截图,直到状态为 Ready to Submit  为止,不然也会出现购买失败
添加商品


二、unity API接入


    点击 manage service 打开services面板;

    Services


    选择一个组织,没有的话创建一个;
    根据提示打开Purchasing,导入包,如果需要更新,请点击update;

    导入



    购买功能可以通过unity提供的组件实现,也可以用代码实现,我们选择用代码实现。

    Unity IAP


三、代码部分

using UnityEngine;using UnityEngine.Purchasing;using System;public class PurchasingManager : IStoreListener{    public static readonly PurchasingManager Instance = new PurchasingManager();    private IStoreController storeController;    private static IExtensionProvider extensionProvider;    private static IAppleExtensions appleExtension;    //private static IGooglePlayStoreExtensions googleExtension;    private Action<string> failedCallback;    private Action<Product> successedCallback;    PurchasingManager()    {            }    /// <summary>    /// 初始化商品    /// 建议在游戏初始化完成的时候就去初始化商品    /// </summary>    public void InitProduct()    {        if (IsInitialized()) return;        var module = StandardPurchasingModule.Instance();        ConfigurationBuilder builder = ConfigurationBuilder.Instance(module);        builder.AddProduct("goods_coins100", ProductType.Consumable);        builder.AddProduct("goods_vip7days", ProductType.NonConsumable);        UnityPurchasing.Initialize(this, builder);    }    /// <summary>    /// 发起内购    /// </summary>    /// <param name="_productId">要购买的商品ID</param>    /// <param name="_successedCallback">购买成功回调</param>    /// <param name="_failedCallback">购买失败回调</param>    public void Purchase(string _productId, Action<Product> _successedCallback, Action<string> _failedCallback)    {        failedCallback = _failedCallback;        successedCallback = _successedCallback;        if (!IsInitialized())        {            OnFailedCallback("Not initialized.");            return;        }        var product = storeController.products.WithID(_productId);        if (product == null || !product.availableToPurchase)        {            OnFailedCallback("Either is not found or is not available for purchase");            return;        }        Debug.Log($"Inicializando compra del producto {product.metadata.localizedTitle} en la tienda.");        storeController.InitiatePurchase(product);    }    /// <summary>    /// IOS恢复内购    /// Google会在删除应用后,第一次安装是自动恢复    /// </summary>    /// <param name="restoreCallback">恢复回调</param>    public void IosRestore(Action<bool> restoreCallback)    {        if (appleExtension != null)        {            appleExtension.RestoreTransactions(restoreCallback);        }        else        {            Debug.LogWarning("IAppleExtensions is null");            restoreCallback(false);        }    }    //======================================分割线=========================================    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)    {        storeController = controller;        extensionProvider = extensions;        appleExtension = extensions.GetExtension<IAppleExtensions>();        //googleExtension = extensions.GetExtension<IGooglePlayStoreExtensions>();    }    public void OnInitializeFailed(InitializationFailureReason error)    {        Debug.LogWarning("OnInitializeFailed Reason:" + error);    }    public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)    {        Debug.LogWarning("OnPurchaseFailedproduct:"+ product.transactionID + "  failureReason:"+ failureReason);    }    public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs purchaseEvent)    {        if (successedCallback != null)        {            successedCallback(purchaseEvent.purchasedProduct);        }        return PurchaseProcessingResult.Complete;    }    private bool IsInitialized()    {        return storeController != null && extensionProvider != null;    }    private void OnFailedCallback(string _reason)    {        if (failedCallback != null)        {            failedCallback(_reason);        }    }}四、打包测试


    包名一定和你后台的包名对应;

    商品ID和类型也要和后台对应;

    在苹果开发者后台的用户和访问菜单中找到沙盒,添加沙盒测试人员;

    添加测试员



    在App Store登陆该测试账号;

    点击要购买的商品,输入密码,弹出以下弹窗的时候说明购买成功了

    购买成功



走到这里说明你接成功了,恭喜你。

暂时写这么多,有不懂的或者需要补充的请私信我。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 15:26 , Processed in 0.094658 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表