Uygulamanız için abonelik eklentilerini etkinleştirme
Evrensel Windows Platformu (UWP) uygulamanız, müşterilerinize uygulama içi abonelik eklenti satın almaları sunabilir. Otomatik yinelenen faturalama dönemleriyle uygulamanızdaki dijital ürünleri (uygulama özellikleri veya dijital içerik gibi) satmak için abonelikleri kullanabilirsiniz.
Not
Uygulamanızda abonelik eklentilerinin satın alınabilmesi için projenizin Windows 10 Yıldönümü Sürümü (10.0; Derleme 14393) veya Visual Studio'daki sonraki bir sürümünü hedeflemesi gerekir (bu, Windows 10, sürüm 1607'ye karşılık gelir) ve uygulama içi satın alma deneyimini uygulamak için Windows.ApplicationModel.Store ad alanı yerine Windows.Services.Store ad alanındaki API'leri kullanması gerekir. Bu ad alanları arasındaki farklar hakkında daha fazla bilgi için bkz. uygulama içi satın almalar ve denemeler.
UWP uygulamaları için abonelik eklentileri aşağıdaki özellikleri destekler:
- 1 ay, 3 ay, 6 ay, 1 yıl veya 2 yıllık abonelik dönemleri arasından seçim yapabilirsiniz.
- Aboneliğinize 1 haftalık veya 1 aylık ücretsiz deneme süreleri ekleyebilirsiniz.
- Windows SDK , uygulama için kullanılabilir abonelik eklentileri hakkında bilgi almak ve abonelik eklentisi satın almayı etkinleştirmek için uygulamanızda kullanabileceğiniz API'ler sağlar. Ayrıca, bir kullanıcının aboneliklerini yönetmekiçin hizmetlerinizden çağırabileceğiniz REST API'leri de sağlıyoruz.
- Belirli bir zaman aralığında abonelik alımlarının, etkin abonelerin ve iptal edilen aboneliklerin sayısını sağlayan analiz raporlarını görüntüleyebilirsiniz.
- Müşteriler aboneliklerini Microsoft hesabı için https://account.microsoft.com/services sayfasından yönetebilir. Müşteriler edindikleri tüm abonelikleri görüntülemek, aboneliği iptal etmek ve abonelikleriyle ilişkili ödeme biçimini değiştirmek için bu sayfayı kullanabilir.
Uygulamanızda abonelik eklentileri satın alma işlemini etkinleştirmek için şu adımları izleyin.
İş Ortağı Merkezi'nde aboneliğiniz için bir eklenti gönderimi oluşturun ve gönderimi yayımlayın. Eklenti gönderim sürecini takip ettikçe aşağıdaki özelliklere dikkat edin:
Ürün türü: Abonelikseçtiğinizden emin olun.
Abonelik dönemi: Aboneliğiniz için yinelenen faturalama dönemini seçin. Eklentinizi yayımladıktan sonra abonelik süresini değiştiremezsiniz.
Her abonelik eklentisi tek bir abonelik süresini ve deneme süresini destekler. Uygulamanızda sunmak istediğiniz her abonelik türü için farklı bir abonelik eklentisi oluşturmanız gerekir. Örneğin, deneme sürümü olmayan aylık abonelik, bir aylık deneme sürümüne sahip aylık abonelik, deneme sürümü olmayan yıllık abonelik ve bir aylık deneme sürümüne sahip yıllık abonelik sunmak istiyorsanız dört abonelik eklentisi oluşturmanız gerekir.
Deneme süresi: Kullanıcıların abonelik içeriğinizi satın almadan önce denemesini sağlamak için aboneliğiniz için 1 hafta veya 1 aylık bir deneme süresi seçmeyi göz önünde bulundurun. Abonelik eklentinizi yayımladıktan sonra deneme süresini değiştiremez veya kaldıramazsınız.
Aboneliğinizin ücretsiz deneme sürümünü edinmek için, kullanıcının geçerli bir ödeme biçimi de dahil olmak üzere standart uygulama içi satın alma işlemi aracılığıyla aboneliğinizi satın alması gerekir. Deneme süresi boyunca herhangi bir ücret alınmaz. Deneme süresinin sonunda abonelik otomatik olarak tam aboneliğe dönüştürülür ve kullanıcının ödeme aracı ücretli aboneliğin ilk dönemi için ücretlendirilir. Kullanıcı deneme süresi boyunca aboneliğini iptal etmeyi seçerse, abonelik deneme süresinin sonuna kadar etkin kalır. Bazı deneme süreleri tüm abonelik dönemleri için kullanılamaz.
Not
Her müşteri bir abonelik eklentisi için yalnızca bir kez ücretsiz deneme alabilir. Bir müşteri bir abonelik için ücretsiz deneme sürümünü aldıktan sonra, Mağaza aynı müşterinin aynı ücretsiz deneme aboneliğini tekrar almasını engeller.
Görünürlük: Yalnızca aboneliğinizin uygulama içi satın alma deneyimini test etmek amacıyla kullanacağınız bir test eklentisi oluşturuyorsanız, Mağazadaki Gizli seçeneklerinden birini seçmenizi öneririz. Aksi takdirde senaryonuz için en iyi görünürlük seçeneğini belirleyebilirsiniz.
fiyatlandırma : Bu bölümde aboneliğinizin fiyatını seçin. Eklentiyi yayımladıktan sonra aboneliğin fiyatını yükseltemezsiniz. Ancak, daha sonra fiyatı düşürebilirsiniz.
Önemli
Varsayılan olarak, herhangi bir eklenti oluşturduğunuzda fiyat başlangıçta ücretsiz olarak ayarlanır. Eklenti gönderimini tamamladıktan sonra abonelik eklentisinin fiyatını yükseltemediğinizden, burada aboneliğinizin fiyatını seçtiğinizden emin olun.
Uygulamanızda, geçerli kullanıcının abonelik eklentinizi zaten edinip edinmediğini belirlemek için Windows.Services.Store ad alanında API'leri kullanın ve ardından uygulama içi satın alma olarak kullanıcıya satışa sunun. Daha fazla ayrıntı için bu makaledeki kod örneklerine bakın.
Uygulamanızda aboneliğinizin uygulama içi satın alma uygulamasını test edin. Test için lisansını kullanmak için uygulamanızı Mağaza'dan geliştirme cihazınıza bir kez indirmeniz gerekir. Daha fazla bilgi için bkz. Uygulama içi satın almalar için test kılavuzu.
Test edilen kodunuz da dahil olmak üzere güncelleştirilmiş uygulama paketinizi içeren bir uygulama gönderimi oluşturun ve yayımlayın. Daha fazla bilgi için bkz. Uygulama gönderimleri.
Bu bölümdeki kod örneklerinde, geçerli uygulamanın abonelik eklentileri hakkında bilgi almak ve geçerli kullanıcı adına abonelik eklentisi satın alma isteğinde bulunmak için Windows.Services.Store ad alanında API'lerin nasıl kullanılacağı gösterilmektedir.
Bu örneklerin önkoşulları şunlardır:
- Windows 10 Yıldönümü Sürümü (10.0; Derleme 14393) hedefleyen Evrensel Windows Platformu (UWP) uygulaması için Visual Studio projesi veya daha sonraki bir sürüm.
- İş Ortağı Merkezi'nde bir uygulama başvurusu oluşturdunuz ve bu uygulama Mağaza'da yayımlandı. İsteğe bağlı olarak uygulamayı, test ederken Mağaza'da bulunamaz şekilde yapılandırabilirsiniz. Daha fazla bilgi için test kılavuzuna bakın.
- İş Ortağı Merkezi'nde uygulama için bir abonelik eklentisi oluşturdunuz.
Bu örneklerdeki kodda şunlar varsayılır:
- Kod dosyasında Windows.Services.Store ve System.Threading.Tasks ad alanları için deyimlerini kullanan vardır.
- Uygulama, yalnızca uygulamayı başlatan kullanıcı bağlamında çalışan tek kullanıcılı bir uygulamadır. Daha fazla bilgi için bkz. uygulama içi satın almalar ve denemeler.
Not
Masaüstü Köprüsükullanan bir masaüstü uygulamanız varsa, StoreContext nesnesini yapılandırmak için bu örneklerde gösterilmeyen ek kod eklemeniz gerekebilir. Daha fazla bilgi için bkz. Desktop Bridgekullanan bir masaüstü uygulamasında StoreContext sınıfını kullanma.
Bu örnekte, geçerli müşteri adına uygulamanız için bilinen bir abonelik eklentisi satın alma isteğinde bulunma işlemi gösterilmektedir. Bu örnekte ayrıca aboneliğin deneme süresi olduğu durumların nasıl ele alınacağı gösterilmektedir.
- Kod ilk olarak müşterinin abonelik için etkin bir lisansı olup olmadığını belirler. Müşterinin zaten etkin bir lisansı varsa, kodunuzun abonelik özelliklerinin kilidini gerektiği şekilde açması gerekir (bu uygulamanıza özel olduğundan, bu örnekteki bir açıklamayla tanımlanır).
- Ardından kod, müşteri adına satın almak istediğiniz aboneliği temsil eden StoreProduct nesnesini alır. Kodda, satın almak istediğiniz abonelik eklentisinin Store Kimliği zaten bildiğiniz ve bu değeri subscriptionStoreId değişkenine atadığınız varsayılır.
- Kod daha sonra abonelik için bir deneme sürümü olup olmadığını belirler. İsteğe bağlı olarak, uygulamanız kullanılabilir deneme sürümü veya müşteriye yönelik tam abonelik hakkındaki ayrıntıları görüntülemek için bu bilgileri kullanabilir.
- Son olarak kod, aboneliğin satın alımını istemek için requestPurchaseAsyncyönteminiçağırır. Abonelik için bir deneme sürümü varsa, deneme sürümü müşteriye satın alma için sunulur. Aksi takdirde, tam abonelik satın alma için sunulur.
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;
}
}
Bu kod örneği, uygulamanızda kullanılabilen tüm abonelik eklentileri için nasıl bilgi alındığını gösterir. Bu bilgileri almak için önce GetAssociatedStoreProductsAsync yöntemini kullanarak uygulama için kullanılabilir eklentilerin her birini temsil eden StoreProduct nesnelerinin koleksiyonunu alın. Ardından, her ürün için StoreSku alın ve abonelik bilgilerine erişmek için IsSubscription ve SubscriptionInfo özelliklerini kullanın.
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;
}
}
}
}
Güncelleştirilmiş uygulamanız Mağaza'da olduktan ve müşteriler abonelik eklentinizi satın alabildikten sonra, bir müşterinin aboneliğini yönetmeniz gereken senaryolar olabilir. Aşağıdaki abonelik yönetimi görevlerini gerçekleştirmek için hizmetlerinizden çağırabileceğiniz REST API'leri sağlıyoruz:
Kullanıcınınkullanma yetkisine sahip olduğu abonelikleri alın. Aboneliğiniz platformlar arası bir hizmetin parçasıysa, belirtilen kullanıcının aboneliğiniz için bir yetkilendirmeye sahip olup olmadığını ve UWP uygulamanız bağlamında aboneliğinin durumunu belirlemek için bu API'yi çağırabilirsiniz. Daha sonra hizmetinizin desteklediği diğer platformlarda aboneliğin durumunu güncelleştirmek için bu bilgileri kullanabilirsiniz.
Belirli bir kullanıcıiçin aboneliğin faturalama durumunu değiştirme. Bir abonelik için otomatik yenilemeyi iptal etmek, genişletmek veya devre dışı bırakmak için bu API'yi kullanın.
Müşteriler, edindikleri tüm abonelikleri görüntülemek, aboneliği iptal etmek ve abonelikleriyle ilişkili ödeme biçimini değiştirmek için Microsoft hesapları için https://account.microsoft.com/services sayfasını kullanabilir. Müşteri bu sayfayı kullanarak aboneliği iptal ettiğinde, geçerli faturalama dönemi boyunca aboneliğe erişmeye devam eder. Geçerli faturalama döneminin herhangi bir bölümü için para iadesi alamazlar. Geçerli faturalama döneminin sonunda abonelikleri devre dışı bırakılır.
Ayrıca, belirli bir kullanıcı aboneliğin faturalama durumunu değiştirmekiçin REST API'mizi kullanarak bir kullanıcı adına aboneliği iptal edebilirsiniz.
Her faturalama döneminde bir noktada, bir sonraki faturalama dönemi için müşterinin kredi kartından ücret tahsil etmeye çalışacağız. Ücret alınamazsa, müşterinin aboneliği durumuna girer. Bu, aboneliklerinin geçerli faturalama döneminin geri kalanında hala etkin olduğu anlamına gelir, ancak aboneliği otomatik olarak yenilemek için düzenli aralıklarla kredi kartından ücret almaya çalışacağız. Bu durum, geçerli faturalama döneminin sonuna ve sonraki faturalama döneminin yenileme tarihine kadar iki haftaya kadar sürebilir.
Abonelik faturalandırmasında taviz süresi sunmuyoruz. Geçerli faturalama döneminin sonuna kadar müşterinin kredi kartından başarılı bir şekilde ücret alamazsak abonelik iptal edilir ve müşterinin geçerli faturalama döneminden sonra aboneliğe erişimi olmaz.
Aşağıdaki senaryolar şu anda abonelik eklentileri için desteklenmemektedir.
- Müşterilere doğrudan Mağaza üzerinden abonelik satışı şu anda desteklenmemektedir. Abonelikler yalnızca dijital ürünlerin uygulama içi satın alımlarında kullanılabilir.
- Müşteriler, Microsoft hesapları için https://account.microsoft.com/services sayfasını kullanarak abonelik dönemleri arasında geçiş yapamaz. Farklı bir abonelik dönemine geçmek için müşterilerin geçerli aboneliklerini iptal etmesi ve ardından uygulamanızdan farklı bir abonelik dönemine sahip bir abonelik satın alması gerekir.
- Katman değiştirme şu anda abonelik eklentileri için desteklenmemektedir (örneğin, müşteriyi temel abonelikten daha fazla özelliğe sahip premium aboneliğe geçirme).
- Satış ve promosyon kodları şu anda abonelik eklentileri için desteklenmemektedir.
- Abonelik eklentinizin görünürlüğünü Alma işlemini durdurolarak ayarladıktan sonra mevcut aboneliklerinizi yenileyin. Daha fazla bilgi için Eklenti fiyatları ve kullanılabilirliği hakkında bilgi bölümüne bakın.