Masalah instalasi lintas toko dengan toko pembelian di aplikasi Android
Windows Server

iOS & Mac Appstore

Fungsi tambahan

Membaca Penerimaan Aplikasi

Sebuah App Receipt disimpan pada penyimpanan lokal perangkat dan dapat dibaca sebagai berikut:

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
string receipt = builder.Configure<IAppleConfiguration>().appReceipt;

Memeriksa pembatasan pembayaran

Dalam Pembelian Aplikasi dapat dibatasi dalam pengaturan perangkat, yang dapat diperiksa sebagai berikut:

var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
bool canMakePayments = builder.Configure<IAppleConfiguration>().canMakePayments;

Transaksi pemulihan

Di platform Apple pengguna harus memasukkan kata sandi mereka untuk mengambil transaksi sebelumnya sehingga aplikasi Anda harus memberikan pengguna dengan tombol membiarkan mereka melakukannya. Selama proses ini metode ProcessPurchase dari IStoreListener Anda akan diinvoked untuk setiap item pengguna sudah memiliki.

/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    extensions.GetExtension<IAppleExtensions> ().RestoreTransactions (result => {
        if (result) {
            // This does not mean anything was restored,
            // merely that the restoration process succeeded.
        } else {
            // Restoration failed.
        }
    });
}

Menyegarkan Penerimaan Aplikasi

Apple menyediakan mekanisme untuk mengambil Penerimaan Aplikasi baru dari server mereka, biasanya digunakan ketika tidak ada tanda terima saat ini tersimpan dalam penyimpanan lokal; SKReceiptRefreshRequest.

Perhatikan bahwa ini akan meminta pengguna untuk kata sandi mereka.

Unity IAP membuat metode ini tersedia sebagai berikut:

/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    extensions.GetExtension<IAppleExtensions> ().RefreshAppReceipt (receipt => {
        // This handler is invoked if the request is successful.
        // Receipt will be the latest app receipt.
        Console.WriteLine(receipt);
    },
    () => {
        // This handler will be invoked if the request fails,
        // such as if the network is unavailable or the user
        // enters the wrong password.
    });
}

Minta Beli

iOS 8 memperkenalkan fitur kontrol orang tua baru yang disebut Minta Beli.

Meminta untuk membeli defer untuk persetujuan orang tua. Ketika ini terjadi, Unity IAPUnity In App Purchase
Lihat di Glossary
mengirimkan aplikasi Anda sebagai berikut:

/// This is called when Unity IAP has finished initialising.
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
    extensions.GetExtension<IAppleExtensions>().RegisterPurchaseDeferredListener(product => {
        Console.WriteLine(product.definition.id);
    });
}

Simulasi “Ask-to-Buy” di Sandbox App Store

Kelas sampel di bawah ini menunjukkan cara mengakses IAppleExtensions untuk mengaktifkan simulasi Ask-to-Buy di Sandbox App Store:

using UnityEngine;
using UnityEngine.Purchasing;

public class AppleSimulateAskToBuy : MonoBehaviour {
    public void SetSimulateAskToBuy(bool shouldSimulateAskToBuy) {
        if (Application.platform == RuntimePlatform.IPhonePlayer) {
            IAppleExtensions extensions = IAPButton.IAPButtonStoreManager.Instance.ExtensionProvider.GetExtension<IAppleExtensions>();
            extensions.simulateAskToBuy = shouldSimulateAskToBuy;
        }
    }
}

Ketika pembelian disetujui atau ditolak, metode pendengar toko normal ProcessPurchase atau OnPurchaseFailed divoked.

Penerimaan Transaksi

Kadang-kadang habis Minta Membeli pembelian tidak muncul di Penerimaan Aplikasi, dalam hal mana Anda tidak dapat memvalidasi mereka menggunakan tanda terima itu. Namun, iOS menyediakan Penerimaan Transaksi yang berisi semua pembelian, termasuk Tanya untuk Beli. Akses string Penerima Transaksi terbaru untuk Product yang diberikan menggunakan IAppleExtensions.

Note: Penerimaan Transaksi tidak tersedia untuk pembangunan Mac. Meminta Penerima Transaksi pada hasil pembangunan Mac dalam string kosong.

#if UNITY_PURCHASING

using System;
using UnityEngine;
using UnityEngine.Purchasing;

public class AskToBuy : MonoBehaviour, IStoreListener
{
    // Unity IAP objects
    private IStoreController m_Controller;
    private IAppleExtensions m_AppleExtensions;

    public AskToBuy ()
    {
        var builder = ConfigurationBuilder.Instance (StandardPurchasingModule.Instance ());
        builder.AddProduct ("100_gold_coins", ProductType.Consumable, new IDs {
            { "100_gold_coins_google", GooglePlay.Name },
            { "100_gold_coins_mac", MacAppStore.Name }
        });

        UnityPurchasing.Initialize (this, builder);
    }

    /// <summary>
    /// This will be called when Unity IAP has finished initialising.
    /// </summary>
    public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
    {
        m_Controller = controller;
        m_AppleExtensions = extensions.GetExtension<IAppleExtensions> ();

        // On Apple platforms we need to handle deferred purchases caused by Apple's Ask to Buy feature.
        // On non-Apple platforms this will have no effect; OnDeferred will never be called.
        m_AppleExtensions.RegisterPurchaseDeferredListener (OnDeferred);
    }

    /// <summary>
    /// This will be called when a purchase completes.
    /// </summary>
    public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer ||
            Application.platform == RuntimePlatform.tvOS) {
            string transactionReceipt = m_AppleExtensions.GetTransactionReceiptForProduct (e.purchasedProduct);
            Console.WriteLine (transactionReceipt);
            // Send transaction receipt to server for validation
        }    
        return PurchaseProcessingResult.Complete;
    }

    /// <summary>
    /// Called when Unity IAP encounters an unrecoverable initialization error.
    ///
    /// Note that this will not be called if Internet is unavailable; Unity IAP
    /// will attempt initialization until it becomes available.
    /// </summary>
    public void OnInitializeFailed (InitializationFailureReason error)
    {
    }

    /// <summary>
    /// Called when a purchase fails.
    /// </summary>
    public void OnPurchaseFailed (Product i, PurchaseFailureReason p)
    {
    }

    /// <summary>
    /// iOS Specific.
    /// This is called as part of Apple's 'Ask to buy' functionality,
    /// when a purchase is requested by a minor and referred to a parent
    /// for approval.
    ///
    /// When the purchase is approved or rejected, the normal purchase events
    /// will fire.
    /// </summary>
    /// <param name="item">Item.</param>
    private void OnDeferred (Product item)
    {
        Debug.Log ("Purchase deferred: " + item.definition.id);
    }
}

#endif // UNITY_PURCHASING

Tidak seperti Penerimaan Aplikasi, Anda tidak dapat memvalidasi Penerimaan Transaksi secara lokal. Sebagai gantinya, Anda harus mengirim string penerimaan ke server jarak jauh untuk validasi. Jika Anda sudah menggunakan server jarak jauh untuk memvalidasi Penerimaan Aplikasi, kirim Penerima Transaksi ke endpoint Apple yang sama, untuk menerima respons JSON.

Contoh tanggapan JSON:

{
    "receipt": {
        "original_purchase_date_pst": "2017-11-15 15:25:20 America/Los_Angeles",
        "purchase_date_ms": "1510788320209",
        "unique_identifier": "0ea7808637555b2c633eb07aa1cb0894c821a6f9",
        "original_transaction_id": "1000000352597239",
        "bvrs": "0",
        "transaction_id": "1000000352597239",
        "quantity": "1",
        "unique_vendor_identifier": "01B57C2E-9E91-42FF-9B0D-4983175D6694",
        "item_id": "1141751870",
        "original_purchase_date": "2017-11-15 23:25:20 Etc/GMT",
        "product_id": "100.gold.coins",
        "purchase_date": "2017-11-15 23:25:20 Etc/GMT",
        "is_trial_period": "false",
        "purchase_date_pst": "2017-11-15 15:25:20 America/Los_Angeles",
        "bid": "com.unity3d.unityiap.demo",
        "original_purchase_date_ms": "1510788320209"
    },
    "status": 0
}

Intercepting Pembelian promosi Apple

Apple memungkinkan Anda untuk mempromosikan pembelian dalam game melalui halaman produk aplikasi Anda. Tidak seperti pembelian dalam aplikasi konvensional, pembelian promosi Apple memulai langsung dari App Store di iOS dan tvOS. App Store kemudian meluncurkan aplikasi Anda untuk menyelesaikan transaksi, atau meminta pengguna untuk mengunduh aplikasi jika tidak diinstal.

Metode callback IAppleConfiguration SetApplePromotionalPurchaseInterceptor intercepts Pembelian promosi Apple. Gunakan callback ini untuk menyajikan gerbang parental, kirim peristiwa analyticsUnity Analytics
Lihat di Glossary
, atau melakukan fungsi lain sebelum mengirim pembelian ke Apple. Callback menggunakan Product bahwa pengguna mencoba untuk membeli. Anda harus memanggil IAppleExtensions.ContinuePromotionalPurchases() untuk melanjutkan pembelian promosi. Ini akan memulai pembayaran queued-up.

Jika Anda tidak mengatur callback, pembelian promosi melalui segera dan memanggil ProcessPurchase dengan hasilnya.

Note: Menelepon API ini di platform lain tidak berpengaruh.

private IAppleExtensions m_AppleExtensions;

public void Awake() {
    var module = StandardPurchasingModule.Instance();
    var builder = ConfigurationBuilder.Instance(module);
        // On iOS and tvOS we can intercept promotional purchases that come directly from
        // the App Store.
        // On other platforms this will have no effect; OnPromotionalPurchase will never be
        // called.
    builder.Configure<IAppleConfiguration>().
     SetApplePromotionalPurchaseInterceptorCallback(OnPromotionalPurchase);
    Debug.Log("Setting Apple promotional purchase interceptor callback");
}

public void OnInitialized(IStoreController controller, IExtensionProvider extensions) {
    m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();
    foreach (var item in controller.products.all) {
        if (item.availableToPurchase) {                
            // Set all these products to be visible in the user's App Store
            m_AppleExtensions.SetStorePromotionVisibility(item, AppleStorePromotionVisibility.Show);
        }
    }
}

private void OnPromotionalPurchase(Product item) {
    Debug.Log("Attempted promotional purchase: " + item.definition.id);
    // Promotional purchase has been detected. 
    // Handle this event by, e.g. presenting a parental gate.
    // Here, for demonstration purposes only, we will wait five seconds before continuing 
    // the purchase.
    StartCoroutine(ContinuePromotionalPurchases());
}

private IEnumerator ContinuePromotionalPurchases() {
    Debug.Log("Continuing promotional purchases in 5 seconds");
    yield return new WaitForSeconds(5);
    Debug.Log("Continuing promotional purchases now");
    m_AppleExtensions.ContinuePromotionalPurchases (); // iOS and tvOS only
}

Testing

Untuk menguji di toko Apple Anda harus menggunakan akun uji terhubung iTunes, yang dapat dibuat di terhubung iTunes.

Daftar Toko Aplikasi di perangkat iOS atau laptop, meluncurkan aplikasi Anda dan Anda akan diminta untuk masuk ketika Anda mencoba pembelian atau mengembalikan transaksi.

Jika Anda menerima kegagalan awalisasi dengan alasan NoProductsAvailable, ikuti daftar periksa ini:

  • Pengidentifikasi produk iTunes Connect harus tepatnya sesuai dengan pengidentifikasi produk yang disediakan untuk Unity IAP
  • Pembelian In-App harus diaktifkan untuk aplikasi Anda di iTunes Connect
  • Produk harus dibersihkan untuk dijual di iTunes Connect
  • Ini mungkin memakan banyak jam untuk produk iTunes Connect baru yang akan tersedia untuk pembelian
  • Anda harus menyetujui perjanjian pengembang iTunes Connect terbaru dan memiliki rincian bank aktif

Toko Aplikasi Mac

Ketika membangun desktop Mac membangun Anda harus memilih pengaturan build Mac App Store validation dalam pengaturan build Unity.

Setelah Anda telah membangun Aplikasi Anda, Anda harus memperbarui file info.plist dengan identifier dan string versi Anda. Klik kanan pada file .app dan klik show package contents, cari file info.plist dan memperbarui string CFBundleIdentifier ke pengidentifikasi bundel aplikasi Anda.

Anda harus kemudian menandatangani, paket dan menginstal aplikasi Anda. Anda harus menjalankan perintah berikut dari terminal OSX:

codesign -f --deep -s "3rd Party Mac Developer Application: " your.app/Contents/Plugins/unitypurchasing.bundle
codesign -f --deep -s "3rd Party Mac Developer Application: " your.app
productbuild --component your.app /Applications --sign "3rd Party Mac Developer Installer: " your.pkg

Untuk menandatangani bundel, Anda mungkin perlu terlebih dahulu untuk menghapus Konten. meta file jika ada: your.app/Contents/Plugins/unitypurchasing.bundle/Contents.meta

Untuk menginstal paket dengan benar Anda harus menghapus file .app yang belum dikemas sebelum menjalankan paket yang baru dibuat.

Anda harus kemudian meluncurkan Aplikasi Anda dari folder Aplikasi. Pertama kali Anda melakukannya, Anda akan diminta untuk memasukkan rincian akun iTunes Anda, yang harus Anda masukkan login akun pengguna uji iTunes Connect Anda. Anda kemudian akan dapat melakukan pembelian tes terhadap lingkungan kotak pasir.


  • 2018–05–30 Sitemap
  • Minta Beli, Penerima Transaksi, dan Penerimaan Intercepting ditambahkan dalam NewIn20173
Masalah instalasi lintas toko dengan toko pembelian di aplikasi Android
Windows Server