Unity 接 iOS 內(nèi)購(Unity內(nèi)置IAP)

Author :JerryYang
Create by 2021.03.24

環(huán)境:
Unity:2020.3.0f1c1


一、后臺商品配置

  1. 進入蘋果開發(fā)者后臺,填寫稅務信息,銀行信息(不填會出現(xiàn)購買失?。?;
  2. 選擇你要添加內(nèi)購的應用,找到 In-App Purchases 選項,點擊 Manage;
    選擇你要添加內(nèi)購的應用
  3. 點擊添加商品,然后完善商品信息;

注意:這里要填寫所以信息,包括截圖,直到狀態(tài)為 Ready to Submit 為止,不然也會出現(xiàn)購買失敗

添加商品

二、unity API接入

  1. 點擊 manage service 打開services面板;


    Services
  2. 選擇一個組織,沒有的話創(chuàng)建一個;
  3. 根據(jù)提示打開Purchasing,導入包,如果需要更新,請點擊update;


    導入
  4. 購買功能可以通過unity提供的組件實現(xiàn),也可以用代碼實現(xiàn),我們選擇用代碼實現(xiàn)。


    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>
    /// 發(fā)起內(nèi)購
    /// </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恢復內(nèi)購
    /// 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);
        }
    }
}

四、打包測試

  1. 包名一定和你后臺的包名對應;

  2. 商品ID和類型也要和后臺對應;

  3. 在蘋果開發(fā)者后臺的用戶和訪問菜單中找到沙盒,添加沙盒測試人員;


    添加測試員
  4. 在App Store登陸該測試賬號;

  5. 點擊要購買的商品,輸入密碼,彈出以下彈窗的時候說明購買成功了


    購買成功

走到這里說明你接成功了,恭喜你。


暫時寫這么多,有不懂的或者需要補充的請私信我。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容