Validasi penerimaan membantu Anda mencegah pengguna mengakses konten yang belum dibeli.
Praktik terbaik untuk memvalidasi tanda terima pada titik di mana konten aplikasi Anda didistribusikan.
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.
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.
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.
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:
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.
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);
}
}
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.