Bagikan melalui


Mengaktifkan pembelian produk dalam aplikasi yang dapat dikonsumsi

Menawarkan produk dalam aplikasi yang dapat dikonsumsi—item yang dapat dibeli, digunakan, dan dibeli lagi—melalui platform perdagangan Toko untuk memberi pelanggan Anda pengalaman pembelian yang kuat dan andal. Ini sangat berguna untuk hal-hal seperti mata uang dalam game (emas, koin, dll.) yang dapat dibeli dan kemudian digunakan untuk membeli power-up tertentu.

Penting

Artikel ini menunjukkan cara menggunakan anggota namespace layanan Windows.ApplicationModel.Store untuk mengaktifkan pembelian produk dalam aplikasi yang dapat dikonsumsi. Namespace layanan ini tidak lagi diperbarui dengan fitur baru, dan kami sarankan Anda menggunakan namespace Windows.Services.Store sebagai gantinya. Namespace Windows.Services.Store mendukung jenis add-on terbaru, seperti add-on dan langganan yang dapat dikonsumsi yang dikelola Store, dan dirancang agar kompatibel dengan jenis produk dan fitur mendatang yang didukung oleh Pusat Mitra dan Toko. Namespace Windows.Services.Store diperkenalkan di Windows 10, versi 1607, dan hanya dapat digunakan dalam proyek yang menargetkan Windows 10 Anniversary Edition (10.0; Build 14393) atau rilis yang lebih baru di Visual Studio. Untuk informasi selengkapnya tentang mengaktifkan pembelian produk dalam aplikasi yang dapat digunakan menggunakan namespace Windows.Services.Store , lihat artikel ini.

Prasyarat

  • Topik ini mencakup pelaporan pembelian dan pemenuhan produk dalam aplikasi yang dapat dikonsumsi. Jika Anda tidak terbiasa dengan produk dalam aplikasi, silakan tinjau Mengaktifkan pembelian produk dalam aplikasi untuk mempelajari tentang informasi lisensi, dan cara mencantumkan produk dalam aplikasi dengan benar di Toko.
  • Saat Anda membuat kode dan menguji produk dalam aplikasi baru untuk pertama kalinya, Anda harus menggunakan objek CurrentAppSimulator alih-alih objek CurrentApp . Dengan cara ini Anda dapat memverifikasi logika lisensi Anda menggunakan panggilan simulasi ke server lisensi alih-alih memanggil server langsung. Untuk melakukan ini, Anda perlu menyesuaikan file bernama WindowsStoreProxy.xml di %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData. Simulator Microsoft Visual Studio membuat file ini saat Anda menjalankan aplikasi untuk pertama kalinya—atau Anda juga dapat memuat file kustom saat runtime. Untuk informasi selengkapnya, lihat Menggunakan file WindowsStoreProxy.xml dengan CurrentAppSimulator.
  • Topik ini juga mereferensikan contoh kode yang disediakan dalam sampel Store. Sampel ini adalah cara yang bagus untuk mendapatkan pengalaman langsung dengan berbagai opsi monetisasi yang disediakan untuk aplikasi Platform Windows Universal (UWP).

Langkah 1: Membuat permintaan pembelian

Permintaan pembelian awal dibuat dengan RequestProductPurchaseAsync seperti pembelian lain yang dilakukan melalui Store. Perbedaan untuk produk dalam aplikasi yang dapat dikonsumsi adalah bahwa setelah pembelian berhasil, pelanggan tidak dapat membeli produk yang sama lagi sampai aplikasi telah memberi tahu Store bahwa pembelian sebelumnya berhasil dipenuhi. Aplikasi Anda bertanggung jawab untuk memenuhi barang habis pakai yang dibeli dan memberi tahu Store tentang pemenuhan.

Contoh berikut menunjukkan permintaan pembelian produk dalam aplikasi yang dapat dikonsumsi. Anda akan melihat komentar kode yang menunjukkan kapan aplikasi Anda harus melakukan pemenuhan lokal produk dalam aplikasi yang dapat dikonsumsi untuk dua skenario berbeda—ketika permintaan berhasil, dan ketika permintaan tidak berhasil karena pembelian produk yang sama yang tidak terpenuhi.

PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync("product1");
switch (purchaseResults.Status)
{
    case ProductPurchaseStatus.Succeeded:
        product1TempTransactionId = purchaseResults.TransactionId;

        // Grant the user their purchase here, and then pass the product ID and transaction ID to
        // CurrentAppSimulator.ReportConsumableFulfillment to indicate local fulfillment to the
        // Windows Store.
        break;

    case ProductPurchaseStatus.NotFulfilled:
        product1TempTransactionId = purchaseResults.TransactionId;

        // First check for unfulfilled purchases and grant any unfulfilled purchases from an
        // earlier transaction. Once products are fulfilled pass the product ID and transaction ID
        // to CurrentAppSimulator.ReportConsumableFulfillment to indicate local fulfillment to the
        // Windows Store.
        break;
}

Langkah 2: Melacak pemenuhan lokal yang dapat dikonsumsi

Saat memberikan akses pelanggan Anda ke produk dalam aplikasi yang dapat dikonsumsi, penting untuk melacak produk mana yang terpenuhi (productId), dan transaksi mana yang terkait dengan pemenuhan (transactionId).

Penting

Aplikasi Anda bertanggung jawab atas pemenuhan pelaporan yang akurat ke Toko. Langkah ini sangat penting untuk mempertahankan pengalaman pembelian yang adil dan andal bagi pelanggan Anda.

Contoh berikut menunjukkan penggunaan properti PurchaseResults dari panggilan RequestProductPurchaseAsync pada langkah sebelumnya untuk mengidentifikasi produk yang dibeli untuk pemenuhan. Koleksi digunakan untuk menyimpan informasi produk di lokasi yang nantinya dapat dirujuk untuk mengonfirmasi bahwa pemenuhan lokal berhasil.

private void GrantFeatureLocally(string productId, Guid transactionId)
{
    if (!grantedConsumableTransactionIds.ContainsKey(productId))
    {
        grantedConsumableTransactionIds.Add(productId, new List<Guid>());
    }
    grantedConsumableTransactionIds[productId].Add(transactionId);

    // Grant the user their content. You will likely increase some kind of gold/coins/some other asset count.
}

Contoh berikutnya ini menunjukkan cara menggunakan array dari contoh sebelumnya untuk mengakses pasangan ID produk/ID transaksi yang nantinya digunakan saat melaporkan pemenuhan ke Store.

Penting

Metodologi apa pun yang digunakan aplikasi Anda untuk melacak dan mengonfirmasi pemenuhan, aplikasi Anda harus menunjukkan uji tuntas untuk memastikan bahwa pelanggan Anda tidak dikenakan biaya untuk item yang belum mereka terima.

private Boolean IsLocallyFulfilled(string productId, Guid transactionId)
{
    return grantedConsumableTransactionIds.ContainsKey(productId) &&
        grantedConsumableTransactionIds[productId].Contains(transactionId);
}

Langkah 3: Melaporkan pemenuhan produk ke Toko

Setelah pemenuhan lokal selesai, aplikasi Anda harus melakukan panggilan ReportConsumableFulfillmentAsync yang menyertakan productId dan transaksi tempat pembelian produk disertakan.

Penting

Kegagalan untuk melaporkan produk dalam aplikasi yang terpenuhi yang dapat dikonsumsi ke Toko akan mengakibatkan pengguna tidak dapat membeli produk tersebut lagi sampai pemenuhan untuk pembelian sebelumnya dilaporkan.

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(
    "product2", product2TempTransactionId);

Langkah 4: Mengidentifikasi pembelian yang tidak terpenuhi

Aplikasi Anda dapat menggunakan metode GetUnfulfilledConsumablesAsync untuk memeriksa produk dalam aplikasi yang tidak terpenuhi yang dapat dikonsumsi kapan saja. Metode ini harus dipanggil secara teratur untuk memeriksa penggunaan yang tidak terpenuhi yang ada karena peristiwa aplikasi yang tidak diantisipasi seperti gangguan dalam konektivitas jaringan atau penghentian aplikasi.

Contoh berikut menunjukkan bagaimana GetUnfulfilledConsumablesAsync dapat digunakan untuk menghitung barang habis pakai yang tidak terpenuhi, dan bagaimana aplikasi Anda dapat melakukan iterasi melalui daftar ini untuk menyelesaikan pemenuhan lokal.

private async void GetUnfulfilledConsumables()
{
    products = await CurrentApp.GetUnfulfilledConsumablesAsync();

    foreach (UnfulfilledConsumable product in products)
    {
        logMessage += "\nProduct Id: " + product.ProductId + " Transaction Id: " + product.TransactionId;
        // This is where you would pass the product ID and transaction ID to
        // currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to the Windows Store.
    }
}