Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Als u een gerichte aanbieding maakt op de Engage > Targeted offers pagina voor uw app in Partnercentrum, gebruikt u de API voor gerichte aanbiedingen van de Microsoft Store in de code van uw app om de in-app-ervaring voor de gerichte aanbieding te implementeren. Zie Gerichte aanbiedingen gebruiken om betrokkenheid en conversies te maximaliseren voor meer informatie over gerichte aanbiedingen en hoe u deze kunt maken in het dashboard.
De api voor gerichte aanbiedingen is een eenvoudige REST API die u kunt gebruiken om de doelaanbiedingen op te halen die beschikbaar zijn voor de huidige gebruiker, op basis van of de gebruiker deel uitmaakt van het klantsegment voor de doelaanbieding. Volg deze stappen om deze API te gebruiken in de code van uw app:
- Haal een Microsoft-accounttoken op voor de huidige aangemelde gebruiker van uw app.
- Haal de beoogde aanbiedingen voor de huidige gebruiker op.
- Implementeer de in-app-aankoopervaring voor de invoegtoepassing die is gekoppeld aan een van de beoogde aanbiedingen. Zie dit artikel voor meer informatie over het implementeren van in-app-aankopen.
Zie het code voorbeeld
Een Microsoft-accounttoken ophalen voor de huidige gebruiker
Haal in de code van uw app een MSA-token (Microsoft-account) op voor de huidige aangemelde gebruiker. Je moet deze token doorgeven in de Authorization
verzoekheader voor de gerichte aanbiedingen API van de Microsoft Store. Dit token wordt door de Store gebruikt om de doelaanbiedingen op te halen die beschikbaar zijn voor de huidige gebruiker.
Als u het MSA-token wilt ophalen, gebruikt u de klasse WebAuthenticationCoreManager om een token aan te vragen met behulp van het bereik devcenter_implicit.basic,wl.basic
. In het volgende voorbeeld ziet u hoe u dit doet. Dit voorbeeld is een fragment uit het volledige voorbeeld. Hiervoor moeten instructies worden gebruikt die in het volledige voorbeeld zijn opgegeven.
private async Task<string> GetMicrosoftAccountTokenAsync()
{
var msaProvider = await WebAuthenticationCoreManager.FindAccountProviderAsync(
"https://login.microsoft.com", "consumers");
WebTokenRequest request = new WebTokenRequest(msaProvider, "devcenter_implicit.basic,wl.basic");
WebTokenRequestResult result = await WebAuthenticationCoreManager.RequestTokenAsync(request);
if (result.ResponseStatus == WebTokenRequestStatus.Success)
{
return result.ResponseData[0].Token;
}
else
{
return string.Empty;
}
}
Zie Webaccountmanager voor meer informatie over het ophalen van MSA-tokens.
Haal gerichte aanbiedingen op voor de huidige gebruiker
Nadat u een MSA-token voor de huidige gebruiker hebt, roept u de GET-methode van de https://manage.devcenter.microsoft.com/v2.0/my/storeoffers/user
URI aan om de beschikbare gerichte aanbiedingen voor de huidige gebruiker op te halen. Zie Get targeted offers voor meer informatie over deze REST-methode.
Deze methode retourneert de product-id's van de invoegtoepassingen die zijn gekoppeld aan de beoogde aanbiedingen die beschikbaar zijn voor de huidige gebruiker. Met deze informatie kunt u een of meer van de gerichte aanbiedingen aanbieden als een in-app-aankoop aan de gebruiker.
In het volgende voorbeeld ziet u hoe u de beoogde aanbiedingen voor de huidige gebruiker kunt ophalen. Dit voorbeeld is een fragment uit het volledige voorbeeld. Hiervoor is de Json.NET-bibliotheek van Newtonsoft en extra klassen en het gebruik van instructies vereist die in het volledige voorbeeld worden gegeven.
private async Task<List<TargetedOfferData>> GetTargetedOffersForUserAsync(string msaToken)
{
if (string.IsNullOrEmpty(msaToken))
{
System.Diagnostics.Debug.WriteLine("Microsoft Account token is null or empty.");
return null;
}
HttpClient httpClientGetOffers = new HttpClient();
httpClientGetOffers.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", msaToken);
List<TargetedOfferData> availableOfferData = null;
try
{
string getOffersResponse = await httpClientGetOffers.GetStringAsync(new Uri(storeOffersUri));
availableOfferData =
Newtonsoft.Json.JsonConvert.DeserializeObject<List<TargetedOfferData>>(getOffersResponse);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
return availableOfferData;
}
Voorbeeld van volledige code
In het volgende codevoorbeeld ziet u de volgende taken:
- Haal een MSA-token op voor de huidige gebruiker.
- Haal alle gerichte aanbiedingen voor de huidige gebruiker op met behulp van de methode Get targeted offers .
- Koop de invoegtoepassing die is gekoppeld aan een gerichte aanbieding.
Voor dit voorbeeld is de Json.NET-bibliotheek van Newtonsoft vereist. In het voorbeeld wordt deze bibliotheek gebruikt om geserialiseerde JSON-gegevens te serialiseren en deserialiseren.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Windows.Services.Store;
using Windows.Security.Authentication.Web.Core;
namespace DocumenationExamples
{
public class TargetedOffersExample
{
private const string storeOffersUri = "https://manage.devcenter.microsoft.com/v2.0/my/storeoffers/user";
private const string jsonMediaType = "application/json";
private static string[] productKinds = { "Durable", "Consumable", "UnmanagedConsumable" };
private static StoreContext storeContext = StoreContext.GetDefault();
public async void DemonstrateTargetedOffers()
{
// Get the Microsoft Account token for the current user.
string msaToken = await GetMicrosoftAccountTokenAsync();
if (string.IsNullOrEmpty(msaToken))
{
System.Diagnostics.Debug.WriteLine("Microsoft Account token could not be retrieved.");
return;
}
// Get the targeted Store offers for the current user.
List<TargetedOfferData> availableOfferData =
await GetTargetedOffersForUserAsync(msaToken);
if (availableOfferData == null || availableOfferData.Count == 0)
{
System.Diagnostics.Debug.WriteLine("There was an error retrieving targeted offers," +
"or there are no targeted offers available for the current user.");
return;
}
// Get the product ID of the add-on that is associated with the first available offer
// in the response data.
TargetedOfferData offerData = availableOfferData[0];
string productId = offerData.Offers[0];
// Get the Store ID of the add-on that has the matching product ID, and then purchase the add-on.
List<String> filterList = new List<string>(productKinds);
StoreProductQueryResult queryResult = await storeContext.GetAssociatedStoreProductsAsync(filterList);
foreach (KeyValuePair<string, StoreProduct> result in queryResult.Products)
{
if (result.Value.InAppOfferToken == productId)
{
await PurchaseOfferAsync(result.Value.StoreId);
return;
}
}
System.Diagnostics.Debug.WriteLine("No add-on with the specified product ID could be found " +
"for the current app.");
return;
}
private async Task<string> GetMicrosoftAccountTokenAsync()
{
var msaProvider = await WebAuthenticationCoreManager.FindAccountProviderAsync(
"https://login.microsoft.com", "consumers");
WebTokenRequest request = new WebTokenRequest(msaProvider, "devcenter_implicit.basic,wl.basic");
WebTokenRequestResult result = await WebAuthenticationCoreManager.RequestTokenAsync(request);
if (result.ResponseStatus == WebTokenRequestStatus.Success)
{
return result.ResponseData[0].Token;
}
else
{
return string.Empty;
}
}
private async Task<List<TargetedOfferData>> GetTargetedOffersForUserAsync(string msaToken)
{
if (string.IsNullOrEmpty(msaToken))
{
System.Diagnostics.Debug.WriteLine("Microsoft Account token is null or empty.");
return null;
}
HttpClient httpClientGetOffers = new HttpClient();
httpClientGetOffers.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", msaToken);
List<TargetedOfferData> availableOfferData = null;
try
{
string getOffersResponse = await httpClientGetOffers.GetStringAsync(new Uri(storeOffersUri));
availableOfferData =
Newtonsoft.Json.JsonConvert.DeserializeObject<List<TargetedOfferData>>(getOffersResponse);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
return availableOfferData;
}
private async Task PurchaseOfferAsync(string storeId)
{
if (string.IsNullOrEmpty(storeId))
{
System.Diagnostics.Debug.WriteLine("storeId is null or empty.");
return;
}
// Purchase the add-on for the current user. Typically, a game or app would first show
// a UI that prompts the user to buy the add-on; for simplicity, this example
// simply purchases the add-on.
StorePurchaseResult result = await storeContext.RequestPurchaseAsync(storeId);
// Capture the error message for the purchase operation, if any.
string extendedError = string.Empty;
if (result.ExtendedError != null)
{
extendedError = result.ExtendedError.Message;
}
switch (result.Status)
{
case StorePurchaseStatus.AlreadyPurchased:
System.Diagnostics.Debug.WriteLine("The user has already purchased the product.");
break;
case StorePurchaseStatus.Succeeded:
System.Diagnostics.Debug.WriteLine("The purchase was successful.");
break;
case StorePurchaseStatus.NotPurchased:
System.Diagnostics.Debug.WriteLine("The purchase did not complete. " +
"The user may have cancelled the purchase. ExtendedError: " + extendedError);
break;
case StorePurchaseStatus.NetworkError:
System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to a network error. " +
"ExtendedError: " + extendedError);
break;
case StorePurchaseStatus.ServerError:
System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to a server error. " +
"ExtendedError: " + extendedError);
break;
default:
System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to an unknown error. " +
"ExtendedError: " + extendedError);
break;
}
}
}
public class TargetedOfferData
{
[JsonProperty(PropertyName = "offers")]
public IList<string> Offers { get; } = new List<string>();
[JsonProperty(PropertyName = "trackingId")]
public string TrackingId { get; set; }
}
}