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

Author :JerryYang
Create by 2021.03.24

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


一秽荞、后臺(tái)商品配置

  1. 進(jìn)入蘋果開發(fā)者后臺(tái)扬跋,填寫稅務(wù)信息钦听,銀行信息(不填會(huì)出現(xiàn)購(gòu)買失斊由稀)卒煞;
  2. 選擇你要添加內(nèi)購(gòu)的應(yīng)用畔裕,找到 In-App Purchases 選項(xiàng)扮饶,點(diǎn)擊 Manage
    選擇你要添加內(nèi)購(gòu)的應(yīng)用
  3. 點(diǎn)擊添加商品靠粪,然后完善商品信息;

注意:這里要填寫所以信息昔善,包括截圖畔乙,直到狀態(tài)為 Ready to Submit 為止牲距,不然也會(huì)出現(xiàn)購(gòu)買失敗

添加商品

二牍鞠、unity API接入

  1. 點(diǎn)擊 manage service 打開services面板萤晴;


    Services
  2. 選擇一個(gè)組織店读,沒(méi)有的話創(chuàng)建一個(gè)屯断;
  3. 根據(jù)提示打開Purchasing殖演,導(dǎo)入包紧武,如果需要更新阻星,請(qǐng)點(diǎn)擊update妥箕;


    導(dǎo)入
  4. 購(gòu)買功能可以通過(guò)unity提供的組件實(shí)現(xiàn),也可以用代碼實(shí)現(xiàn)缆蝉,我們選擇用代碼實(shí)現(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>
    /// 初始化商品
    /// 建議在游戲初始化完成的時(shí)候就去初始化商品
    /// </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)購(gòu)
    /// </summary>
    /// <param name="_productId">要購(gòu)買的商品ID</param>
    /// <param name="_successedCallback">購(gòu)買成功回調(diào)</param>
    /// <param name="_failedCallback">購(gòu)買失敗回調(diào)</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恢復(fù)內(nèi)購(gòu)
    /// Google會(huì)在刪除應(yīng)用后,第一次安裝是自動(dòng)恢復(fù)
    /// </summary>
    /// <param name="restoreCallback">恢復(fù)回調(diào)</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);
        }
    }
}

四、打包測(cè)試

  1. 包名一定和你后臺(tái)的包名對(duì)應(yīng)仲闽;

  2. 商品ID和類型也要和后臺(tái)對(duì)應(yīng)蔼囊;

  3. 在蘋果開發(fā)者后臺(tái)的用戶和訪問(wèn)菜單中找到沙盒畏鼓,添加沙盒測(cè)試人員壶谒;


    添加測(cè)試員
  4. 在App Store登陸該測(cè)試賬號(hào)让禀;

  5. 點(diǎn)擊要購(gòu)買的商品巡揍,輸入密碼腮敌,彈出以下彈窗的時(shí)候說(shuō)明購(gòu)買成功了


    購(gòu)買成功

走到這里說(shuō)明你接成功了糜工,恭喜你捌木。


暫時(shí)寫這么多刨裆,有不懂的或者需要補(bǔ)充的請(qǐng)私信我。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拆魏,隨后出現(xiàn)的幾起案子渤刃,更是在濱河造成了極大的恐慌贴膘,老刑警劉巖洋闽,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫舅,死亡現(xiàn)場(chǎng)離奇詭異宫患,居然都是意外死亡刊懈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門娃闲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)虚汛,“玉大人,你說(shuō)我怎么就攤上這事皇帮【砹ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵属拾,是天一觀的道長(zhǎng)将谊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捌年,這世上最難降的妖魔是什么瓢娜? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任托酸,我火速辦了婚禮谷丸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己迎卤,他們只是感情好八堡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布溶耘。 她就那樣靜靜地躺著,像睡著了一般饭望。 火紅的嫁衣襯著肌膚如雪萨醒。 梳的紋絲不亂的頭發(fā)上旨椒,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天示惊,我揣著相機(jī)與錄音,去河邊找鬼。 笑死糊肠,一個(gè)胖子當(dāng)著我的面吹牛精偿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拯田,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刻剥,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挟裂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狐肢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丧没,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妻顶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叛氨,我是刑警寧澤仁连,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布裁厅,位于F島的核電站袋励,受9級(jí)特大地震影響才睹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一仙辟、第九天 我趴在偏房一處隱蔽的房頂上張望讹挎。 院中可真熱鬧浑测,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至踢涌,卻和暖如春背苦,著一層夾襖步出監(jiān)牢的瞬間腌巾,已是汗流浹背澈蝙。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工漏麦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人食侮。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓袱蜡,卻偏偏與公主長(zhǎng)得像巫橄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茵典,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容