Penerimaan Pembelian
Ekstensi Toko

Validasi penerimaan

Validasi penerimaan membantu Anda mencegah pengguna mengakses konten yang belum dibeli.

Titik validasi

Praktik terbaik untuk memvalidasi tanda terima pada titik di mana konten aplikasi Anda didistribusikan.

  • Sitemap Untuk konten sisi klien, di mana semua konten terkandung dalam aplikasi dan diaktifkan sekali dibeli, validasi harus terjadi pada perangkat target, tanpa perlu terhubung ke server jarak jauh. Unity IAP dirancang untuk mendukung validasi lokal dalam aplikasi Anda. Lihat Local validation: di bawah untuk informasi lebih lanjut.Local validation below for more information.
  • Sitemap Untuk konten sisi server, di mana konten diunduh setelah dibeli, validasi harus terjadi pada server sebelum konten dirilis. Unity tidak menawarkan dukungan untuk validasi sisi server; namun, solusi pihak ketiga tersedia, seperti Remote validation: Nobuyori Takahashi.Proyek IAP.

Validasi Lokal

Important: Meskipun Unity IAP menyediakan metode validasi lokal, validasi lokal lebih rentan terhadap penipuan. Mengvalidasi server transaksi sensitif di mana mungkin dianggap praktik terbaik. Untuk informasi lebih lanjut, silakan lihat dokumentasi Apple dan Android tentang pencegahan penipuan.

Jika konten bahwa pengguna sudah membeli ada di perangkat, aplikasi hanya perlu membuat keputusan tentang apakah membukanya.

Unity IAP menyediakan alat untuk membantu Anda menyembunyikan konten dan untuk memvalidasi dan mengumpulkan tanda terima melalui Google Play dan toko Apple.

Membatalkan kunci enkripsi

Validasi penerimaan dilakukan menggunakan kunci enkripsi yang diketahui. Untuk aplikasi Anda, ini adalah kunci publik Google Play terenkripsi, dan / atau sertifikat akar Apple.

Jika pengguna dapat mengganti ini, mereka dapat mengalahkan cek validasi penerimaan Anda, sehingga penting untuk membuat sulit bagi pengguna untuk dengan mudah menemukan dan memodifikasi kunci ini.

Unity IAP menyediakan alat yang dapat membantu Anda menggali kunci enkripsi Anda dalam Aplikasi Anda. Ini membingungkan atau merakit kunci sehingga jauh lebih sulit bagi pengguna untuk mengumpulkannya. Di bar menu Unity, pergi ke Window > Unity IAPUnity In App Purchase
Lihat di Glossary
> IAP Receipt Validation Obfuscator.

The Obfuscator window
Jendela Obfuscator

Jendela ini mengkodekan sertifikat akar Apple (yang dibundel dengan Unity IAP) dan kunci publik Google Play Anda (dari halaman Layanan & API Google Play Developer Console aplikasi) menjadi dua file C # yang berbeda: AppleTangle dan GooglePlayTangle. Ini ditambahkan ke proyek Anda untuk digunakan di bagian berikutnya.

Perhatikan bahwa Anda tidak perlu memberikan kunci publik Google Play jika Anda hanya menargetkan toko Apple, dan sebaliknya.

Validasi tanda terima

Gunakan kelas CrossPlatformValidator untuk validasi di semua toko Google Play dan Apple.

Anda harus menyediakan kelas ini dengan baik Login Bermain kunci publik atau sertifikat akar Apple, atau keduanya jika Anda ingin memvalidasi di kedua platform.

CrossPlatformValidator melakukan dua cek:

  • Keaslian penerimaan diperiksa melalui validasi tanda tangan.
  • Pengidentifikasi bundel aplikasi pada tanda terima dibandingkan dengan satu dalam aplikasi Anda. Pengecualian InvalidBundleId dibuang jika tidak cocok.

Perhatikan bahwa validator hanya memvalidasi tanda terima yang dihasilkan pada platform Google Play dan Apple. Penerimaan yang dihasilkan pada platform lain, termasuk palsu yang dihasilkan dalam Editor, membuang IAPSecurityException.

Jika Anda mencoba untuk memvalidasi tanda terima untuk platform yang belum Anda berikan kunci rahasia untuk, MissingStoreSecretException dibuang.

public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
{
    bool validPurchase = true; // Presume valid for platforms with no R.V.

    // Unity IAP's validation logic is only included on these platforms.
#if UNITY_ANDROID || UNITY_IOS || UNITY_STANDALONE_OSX
    // Prepare the validator with the secrets we prepared in the Editor
    // obfuscation window.
    var validator = new CrossPlatformValidator(GooglePlayTangle.Data(),
        AppleTangle.Data(), Application.bundleIdentifier);

    try {
        // On Google Play, result has a single product ID.
        // On Apple stores, receipts contain multiple products.
        var result = validator.Validate(e.purchasedProduct.receipt);
        // For informational purposes, we list the receipt(s)
        Debug.Log("Receipt is valid. Contents:");
        foreach (IPurchaseReceipt productReceipt in result) {
            Debug.Log(productReceipt.productID);
            Debug.Log(productReceipt.purchaseDate);
            Debug.Log(productReceipt.transactionID);
        }
    } catch (IAPSecurityException) {
        Debug.Log("Invalid receipt, not unlocking content");
        validPurchase = false;
    }
#endif

    if (validPurchase) {
        // Unlock the appropriate content here.
    }

    return PurchaseProcessingResult.Complete;
}

Penting untuk Anda periksa tidak hanya bahwa tanda terima valid, tetapi juga informasi apa yang mengandung. Teknik umum oleh pengguna yang mencoba mengakses konten tanpa pembelian adalah untuk memasok penerimaan dari produk atau aplikasi lainnya. Penerimaan ini asli dan melakukan validasi lulus, sehingga Anda harus membuat keputusan berdasarkan ID produk yang diserang oleh CrossPlatformValidator.

Rincian spesifik toko

Toko yang berbeda memiliki bidang yang berbeda dalam tanda terima pembelian mereka. Untuk mengakses bidang spesifik toko, IPurchaseReceipt dapat downcast ke dua subtipe yang berbeda: GooglePlayReceipt dan AppleInAppPurchaseReceipt.

var result = validator.Validate(e.purchasedProduct.receipt);
Debug.Log("Receipt is valid. Contents:");
foreach (IPurchaseReceipt productReceipt in result) {
    Debug.Log(productReceipt.productID);
    Debug.Log(productReceipt.purchaseDate);
    Debug.Log(productReceipt.transactionID);

    GooglePlayReceipt google = productReceipt as GooglePlayReceipt;
    if (null != google) {
        // This is Google's Order ID.
        // Note that it is null when testing in the sandbox
        // because Google's sandbox does not provide Order IDs.
        Debug.Log(google.transactionID);
        Debug.Log(google.purchaseState);
        Debug.Log(google.purchaseToken);
    }

    AppleInAppPurchaseReceipt apple = productReceipt as AppleInAppPurchaseReceipt;
    if (null != apple) {
        Debug.Log(apple.originalTransactionIdentifier);
        Debug.Log(apple.subscriptionExpirationDate);
        Debug.Log(apple.cancellationDate);
        Debug.Log(apple.quantity);
    }
}

Login Penerimaan apel

Gunakan kelas AppleValidator untuk mengekstrak informasi rinci tentang tanda terima Apple. Perhatikan bahwa kelas ini hanya bekerja dengan tanda terima aplikasi iOS dari versi 7.0 di atasnya, bukan tanda terima transaksi yang telah ditentukan Apple.

#if UNITY_ANDROID || UNITY_IOS || UNITY_STANDALONE_OSX
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
// 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.transactionIdentifier);
    Debug.Log(productReceipt.productIdentifier);
}
#endif

Model tipe AppleReceipt format penerimaan ASN1 Apple. Lihat Dokumentasi Apple untuk penjelasan bidangnya.

Penerimaan Pembelian
Ekstensi Toko