Bagikan melalui


Mengaktifkan add-on langganan untuk aplikasi Anda

Aplikasi Platform Windows Universal (UWP) Anda dapat menawarkan pembelian add-on langganan dalam aplikasi kepada pelanggan Anda. Anda dapat menggunakan langganan untuk menjual produk digital di aplikasi Anda (seperti fitur aplikasi atau konten digital) dengan periode penagihan berulang otomatis.

Catatan

Untuk mengaktifkan pembelian add-on langganan di aplikasi Anda, proyek Anda harus menargetkan Windows 10 Anniversary Edition (10.0; Build 14393) atau rilis yang lebih baru di Visual Studio (ini sesuai dengan Windows 10, versi 1607), dan harus menggunakan API di namespace Windows.Services.Store untuk mengimplementasikan pengalaman pembelian dalam aplikasi alih-alih namespace layanan Windows.ApplicationModel.Store. Untuk informasi selengkapnya tentang perbedaan antara namespace layanan ini, lihat Pembelian dan uji coba dalam aplikasi.

Sorotan fitur

Add-on langganan untuk aplikasi UWP mendukung fitur berikut:

  • Anda dapat memilih dari periode langganan 1 bulan, 3 bulan, 6 bulan, 1 tahun, atau 2 tahun.
  • Anda dapat menambahkan periode uji coba gratis 1 minggu atau 1 bulan ke langganan Anda.
  • Windows SDK menyediakan API yang dapat Anda gunakan di aplikasi Anda untuk mendapatkan info tentang add-on langganan yang tersedia untuk aplikasi dan mengaktifkan pembelian add-on langganan. Kami juga menyediakan REST API yang dapat Anda panggil dari layanan Anda untuk mengelola langganan bagi pengguna.
  • Anda dapat melihat laporan analitik yang menyediakan jumlah akuisisi langganan, pelanggan aktif, dan langganan yang dibatalkan dalam periode waktu tertentu.
  • Pelanggan dapat mengelola langganan mereka di https://account.microsoft.com/services halaman untuk akun Microsoft mereka. Pelanggan dapat menggunakan halaman ini untuk melihat semua langganan yang telah mereka peroleh, membatalkan langganan, dan mengubah bentuk pembayaran yang terkait dengan langganan mereka.

Langkah-langkah untuk mengaktifkan add-on langganan untuk aplikasi Anda

Untuk mengaktifkan pembelian add-on langganan di aplikasi Anda, ikuti langkah-langkah berikut.

  1. Buat pengiriman add-on untuk langganan Anda di Pusat Mitra dan terbitkan pengiriman. Saat Anda mengikuti proses pengiriman add-on, perhatikan dengan cermat properti berikut:

    • Jenis produk: Pastikan Anda memilih Langganan.

    • Periode langganan: Pilih periode tagihan berulang untuk langganan Anda. Anda tidak dapat mengubah periode langganan setelah menerbitkan add-on.

      Setiap add-on langganan mendukung satu periode langganan dan periode uji coba. Anda harus membuat add-on langganan yang berbeda untuk setiap jenis langganan yang ingin Anda tawarkan di aplikasi Anda. Misalnya, jika Anda ingin menawarkan langganan bulanan tanpa uji coba, langganan bulanan dengan uji coba satu bulan, langganan tahunan tanpa uji coba, dan langganan tahunan dengan uji coba satu bulan, Anda harus membuat empat add-on langganan.

    • Periode uji coba: Pertimbangkan untuk memilih periode uji coba 1 minggu atau 1 bulan untuk langganan Anda agar pengguna dapat mencoba konten langganan Anda sebelum mereka membelinya. Anda tidak dapat mengubah atau menghapus periode uji coba setelah menerbitkan add-on langganan Anda.

      Untuk memperoleh uji coba gratis langganan Anda, pengguna harus membeli langganan Anda melalui proses pembelian dalam aplikasi standar, termasuk bentuk pembayaran yang valid. Mereka tidak dikenakan biaya apa pun selama masa percobaan. Pada akhir periode uji coba, langganan secara otomatis dikonversi ke langganan lengkap dan instrumen pembayaran pengguna akan dikenakan biaya untuk periode pertama langganan berbayar. Jika pengguna memilih untuk membatalkan langganan mereka selama periode uji coba, langganan tetap aktif hingga akhir periode uji coba. Beberapa periode uji coba tidak tersedia untuk semua periode langganan.

      Catatan

      Setiap pelanggan dapat memperoleh uji coba gratis untuk add-on langganan hanya satu kali. Setelah pelanggan memperoleh uji coba gratis untuk langganan, Store mencegah pelanggan yang sama memperoleh langganan uji coba gratis yang sama lagi.

    • Visibilitas: Jika Anda membuat add-on pengujian yang hanya akan Anda gunakan untuk menguji pengalaman pembelian dalam aplikasi untuk langganan Anda, kami sarankan Anda memilih salah satu opsi Tersembunyi di Toko . Jika tidak, Anda dapat memilih opsi visibilitas terbaik untuk skenario Anda.

    • Harga: Pilih harga langganan Anda di bagian ini. Anda tidak dapat menaikkan harga langganan setelah menerbitkan add-on. Namun, Anda dapat menurunkan harga nanti.

      Penting

      Secara default, saat Anda membuat add-on apa pun, harga awalnya diatur ke Gratis. Karena Anda tidak dapat menaikkan harga add-on langganan setelah menyelesaikan pengiriman add-on, pastikan untuk memilih harga langganan Anda di sini.

  2. Di aplikasi Anda, gunakan API di namespace Windows.Services.Store untuk menentukan apakah pengguna saat ini telah memperoleh add-on langganan Anda lalu menawarkannya untuk dijual kepada pengguna sebagai pembelian dalam aplikasi. Lihat contoh kode dalam artikel ini untuk detail selengkapnya.

  3. Uji implementasi pembelian dalam aplikasi langganan Anda di aplikasi Anda. Anda harus mengunduh aplikasi sekali dari Toko ke perangkat pengembangan untuk menggunakan lisensinya untuk pengujian. Untuk informasi selengkapnya, lihat panduan pengujian kami untuk pembelian dalam aplikasi.

  4. Buat dan terbitkan pengiriman aplikasi yang menyertakan paket aplikasi yang diperbarui, termasuk kode yang diuji. Untuk informasi selengkapnya, lihat Pengiriman aplikasi.

Contoh kode

Contoh kode di bagian ini menunjukkan cara menggunakan API di namespace Windows.Services.Store untuk mendapatkan info tentang add-on langganan untuk aplikasi saat ini dan meminta pembelian add-on langganan atas nama pengguna saat ini.

Contoh-contoh ini memiliki prasyarat berikut:

  • Proyek Visual Studio untuk aplikasi Platform Windows Universal (UWP) yang menargetkan Windows 10 Anniversary Edition (10.0; Build 14393) atau rilis yang lebih baru.
  • Anda telah membuat pengiriman aplikasi di Pusat Mitra dan aplikasi ini diterbitkan di Toko. Anda dapat secara opsional mengonfigurasi aplikasi sehingga tidak dapat ditemukan di Store saat Anda mengujinya. Untuk informasi selengkapnya, lihat panduan pengujian.
  • Anda telah membuat add-on langganan untuk aplikasi di Pusat Mitra.

Kode dalam contoh ini mengasumsikan:

  • File kode telah menggunakan pernyataan untuk namespace layanan Windows.Services.Store dan System.Threading.Tasks .
  • Aplikasi ini adalah aplikasi pengguna tunggal yang hanya berjalan dalam konteks pengguna yang meluncurkan aplikasi. Untuk informasi selengkapnya, lihat Pembelian dan uji coba dalam aplikasi.

Catatan

Jika Anda memiliki aplikasi desktop yang menggunakan Desktop Bridge, Anda mungkin perlu menambahkan kode tambahan yang tidak ditampilkan dalam contoh ini untuk mengonfigurasi objek StoreContext . Untuk informasi selengkapnya, lihat Menggunakan kelas StoreContext di aplikasi desktop yang menggunakan Desktop Bridge.

Membeli add-on langganan

Contoh ini menunjukkan cara meminta pembelian add-on langganan yang diketahui untuk aplikasi Anda atas nama pelanggan saat ini. Contoh ini juga menunjukkan cara menangani kasus di mana langganan memiliki periode percobaan.

  1. Kode pertama-tama menentukan apakah pelanggan sudah memiliki lisensi aktif untuk langganan. Jika pelanggan sudah memiliki lisensi aktif, kode Anda harus membuka fitur langganan seperlunya (karena ini milik aplikasi Anda, ini diidentifikasi dengan komentar dalam contoh).
  2. Selanjutnya, kode mendapatkan objek StoreProduct yang mewakili langganan yang ingin Anda beli atas nama pelanggan. Kode mengasumsikan bahwa Anda sudah mengetahui ID Toko add-on langganan yang ingin Anda beli, dan bahwa Anda telah menetapkan nilai ini ke variabel subscriptionStoreId .
  3. Kode kemudian menentukan apakah uji coba tersedia untuk langganan. Secara opsional, aplikasi Anda dapat menggunakan informasi ini untuk menampilkan detail tentang uji coba atau langganan lengkap yang tersedia kepada pelanggan.
  4. Terakhir, kode memanggil metode RequestPurchaseAsync untuk meminta pembelian langganan. Jika uji coba tersedia untuk langganan, uji coba akan ditawarkan kepada pelanggan untuk dibeli. Jika tidak, langganan lengkap akan ditawarkan untuk pembelian.
private StoreContext context = null;
StoreProduct subscriptionStoreProduct;

// Assign this variable to the Store ID of your subscription add-on.
private string subscriptionStoreId = "";  

// This is the entry point method for the example.
public async Task SetupSubscriptionInfoAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    bool userOwnsSubscription = await CheckIfUserHasSubscriptionAsync();
    if (userOwnsSubscription)
    {
        // Unlock all the subscription add-on features here.
        return;
    }

    // Get the StoreProduct that represents the subscription add-on.
    subscriptionStoreProduct = await GetSubscriptionProductAsync();
    if (subscriptionStoreProduct == null)
    {
        return;
    }

    // Check if the first SKU is a trial and notify the customer that a trial is available.
    // If a trial is available, the Skus array will always have 2 purchasable SKUs and the
    // first one is the trial. Otherwise, this array will only have one SKU.
    StoreSku sku = subscriptionStoreProduct.Skus[0];
    if (sku.SubscriptionInfo.HasTrialPeriod)
    {
        // You can display the subscription trial info to the customer here. You can use 
        // sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit 
        // to get the trial details.
    }
    else
    {
        // You can display the subscription purchase info to the customer here. You can use 
        // sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
        // to provide the renewal details.
    }

    // Prompt the customer to purchase the subscription.
    await PromptUserToPurchaseAsync();
}

private async Task<bool> CheckIfUserHasSubscriptionAsync()
{
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    // Check if the customer has the rights to the subscription.
    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;
        if (license.SkuStoreId.StartsWith(subscriptionStoreId))
        {
            if (license.IsActive)
            {
                // The expiration date is available in the license.ExpirationDate property.
                return true;
            }
        }
    }

    // The customer does not have a license to the subscription.
    return false;
}

private async Task<StoreProduct> GetSubscriptionProductAsync()
{
    // Load the sellable add-ons for this app and check if the trial is still 
    // available for this customer. If they previously acquired a trial they won't 
    // be able to get a trial again, and the StoreProduct.Skus property will 
    // only contain one SKU.
    StoreProductQueryResult result =
        await context.GetAssociatedStoreProductsAsync(new string[] { "Durable" });

    if (result.ExtendedError != null)
    {
        System.Diagnostics.Debug.WriteLine("Something went wrong while getting the add-ons. " +
            "ExtendedError:" + result.ExtendedError);
        return null;
    }

    // Look for the product that represents the subscription.
    foreach (var item in result.Products)
    {
        StoreProduct product = item.Value;
        if (product.StoreId == subscriptionStoreId)
        {
            return product;
        }
    }

    System.Diagnostics.Debug.WriteLine("The subscription was not found.");
    return null;
}

private async Task PromptUserToPurchaseAsync()
{
    // Request a purchase of the subscription product. If a trial is available it will be offered 
    // to the customer. Otherwise, the non-trial SKU will be offered.
    StorePurchaseResult result = await subscriptionStoreProduct.RequestPurchaseAsync();

    // Capture the error message for the operation, if any.
    string extendedError = string.Empty;
    if (result.ExtendedError != null)
    {
        extendedError = result.ExtendedError.Message;
    }

    switch (result.Status)
    {
        case StorePurchaseStatus.Succeeded:
            // Show a UI to acknowledge that the customer has purchased your subscription 
            // and unlock the features of the subscription. 
            break;

        case StorePurchaseStatus.NotPurchased:
            System.Diagnostics.Debug.WriteLine("The purchase did not complete. " +
                "The customer may have cancelled the purchase. ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.ServerError:
        case StorePurchaseStatus.NetworkError:
            System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to a server or network error. " +
                "ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.AlreadyPurchased:
            System.Diagnostics.Debug.WriteLine("The customer already owns this subscription." +
                    "ExtendedError: " + extendedError);
            break;
    }
}

Mendapatkan info tentang add-on langganan untuk aplikasi saat ini

Contoh kode ini menunjukkan cara mendapatkan info untuk semua add-on langganan yang tersedia di aplikasi Anda. Untuk mendapatkan info ini, pertama-tama gunakan metode GetAssociatedStoreProductsAsync untuk mendapatkan koleksi objek StoreProduct yang mewakili masing-masing add-on yang tersedia untuk aplikasi. Kemudian, dapatkan StoreSku untuk setiap produk dan gunakan properti IsSubscription dan SubscriptionInfo untuk mengakses info langganan.

private StoreContext context = null;

public async Task GetSubscriptionsInfo()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    // Subscription add-ons are Durable products.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    StoreProductQueryResult queryResult =
        await context.GetAssociatedStoreProductsAsync(productKinds);

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        System.Diagnostics.Debug.WriteLine($"ExtendedError: {queryResult.ExtendedError.Message}");
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store product info for the add-on.
        StoreProduct product = item.Value;

        // For each add-on, the subscription info is available in the SKU objects in the add-on. 
        foreach (StoreSku sku in product.Skus)
        {
            if (sku.IsSubscription)
            {
                // Use the sku.SubscriptionInfo property to get info about the subscription. 
                // For example, the following code gets the units and duration of the 
                // subscription billing period.
                StoreDurationUnit billingPeriodUnit = sku.SubscriptionInfo.BillingPeriodUnit;
                uint billingPeriod = sku.SubscriptionInfo.BillingPeriod;
            }
        }
    }
}

Mengelola langganan dari layanan Anda

Setelah aplikasi yang diperbarui berada di Toko dan pelanggan dapat membeli add-on langganan, Anda mungkin memiliki skenario di mana Anda perlu mengelola langganan untuk pelanggan. Kami menyediakan REST API yang dapat Anda panggil dari layanan Anda untuk melakukan tugas manajemen langganan berikut:

Pembatalan

Pelanggan dapat menggunakan https://account.microsoft.com/services halaman untuk akun Microsoft mereka untuk melihat semua langganan yang telah mereka peroleh, membatalkan langganan, dan mengubah bentuk pembayaran yang terkait dengan langganan mereka. Saat pelanggan membatalkan langganan menggunakan halaman ini, mereka terus memiliki akses ke langganan selama periode penagihan saat ini. Mereka tidak mendapatkan pengembalian dana untuk bagian mana pun dari periode penagihan saat ini. Pada akhir periode penagihan saat ini, langganan mereka dinonaktifkan.

Anda juga dapat membatalkan langganan atas nama pengguna dengan menggunakan REST API kami untuk mengubah status penagihan langganan untuk pengguna tertentu.

Perpanjangan langganan dan masa tenggang

Pada titik tertentu selama setiap periode penagihan, kami akan mencoba menagih kartu kredit pelanggan untuk periode penagihan berikutnya. Jika biaya gagal, langganan pelanggan memasuki status dunning . Ini berarti bahwa langganan mereka masih aktif selama sisa periode penagihan saat ini, tetapi kami akan secara berkala mencoba menagih kartu kredit mereka untuk memperbarui langganan secara otomatis. Status ini dapat berlangsung hingga dua minggu, hingga akhir periode penagihan saat ini dan tanggal perpanjangan untuk periode penagihan berikutnya.

Kami tidak menawarkan masa tenggang untuk penagihan langganan. Jika kami tidak berhasil menagih kartu kredit pelanggan pada akhir periode penagihan saat ini, langganan akan dibatalkan dan pelanggan tidak akan lagi memiliki akses ke langganan setelah periode penagihan saat ini.

Skenario yang tidak didukung

Skenario berikut saat ini tidak didukung untuk add-on langganan.

  • Menjual langganan kepada pelanggan secara langsung melalui Store tidak didukung saat ini. Langganan hanya tersedia untuk pembelian produk digital dalam aplikasi.
  • Pelanggan tidak dapat mengalihkan https://account.microsoft.com/services periode langganan menggunakan halaman untuk akun Microsoft mereka. Untuk beralih ke periode langganan yang berbeda, pelanggan harus membatalkan langganan mereka saat ini lalu membeli langganan dengan periode langganan yang berbeda dari aplikasi Anda.
  • Pengalihan tingkat saat ini tidak didukung untuk add-on langganan (misalnya, mengalihkan pelanggan dari langganan dasar ke langganan premium dengan lebih banyak fitur).
  • Kode penjualan dan promosi saat ini tidak didukung untuk add-on langganan.
  • Memperbarui langganan yang sudah ada setelah mengatur visibilitas add-on langganan Anda ke Hentikan akuisisi. Lihat Mengatur harga dan ketersediaan add-on untuk detail selengkapnya.