Dokončanje registracije za plačane dogodke
opomba,
1. septembra 2023 bosta Dynamics 365 Marketing in Dynamics 365 Customer Insights na prodaj skupaj v okviru ene inventarne enote izdelka, imenovane Dynamics 365 Customer Insights. Posamezni aplikaciji bosta preimenovani v Dynamics 365 Customer Insights – Dejavnosti oziroma Dynamics 365 Customer Insights – Podatki. Več informacij je v pogostih vprašanjih za Dynamics 365 Customer Insights
Poleg tega bodo 1. septembra 2023 novi uporabniki storitve Dynamics 365 Marketing prejeli samo funkcije sprotnega trženja. Več informacij je v razdelku Privzeta namestitev sprotnega trženja. Številne strani z dokumentacijo se trenutno nanašajo na odhodne funkcije, ki v sprotnem trženju morda niso na voljo ali delujejo drugače. Vsebina dokumentacije bo posodobljena septembra, da bo razvidno, ali se nanaša na sprotno ali odhodno trženje.
Ta tema vas vodi skozi postopek razvoja aplikacije .NET Core, ki preverja pristnost proti Dynamics 365 Customer Insights - Potovanja in sproži dejanje po meri, ki zaključi postopek registracije za plačane dogodke. Preden preberete tema, se prepričajte, da ste prebrali in razumeli Nastavitev spletnih plačil za dogodke.
V tem tema uporabljamo OAuth kot mehanizem za preverjanje pristnosti in Dynamics 365 Web API za sprožitev dejanja po meri. Ta pristop deluje univerzalno z večino programskih jezikov in ogrodij, kar pomeni, da niste prisiljeni uporabljati C# ali .NET Core za gradnjo storitve, ki dokonča plačane registracije.
opomba,
Če se odločite za uporabo .NET Framework za razvoj svoje storitve, lahko uporabite knjižnico orodij XRM za preverjanje pristnosti in povezavo s storitvijo organizacije. Ta knjižnica omogoča bolj priročno komunikacijo z Dynamics 365 Customer Insights - Journeys. Več informacij: Preverjanje pristnosti z aplikacijami .NET Framework
Zahteve
Ustvarite projekt .NET Core CLI.
Namestite vse zahtevane odvisnosti.
Namestite naslednji NuGet paket:
- Newtonsoft.Json se uporablja za serializacijo in deserializacijo podatkov.
Če uporabljate Azure AD Authentication Library (ADAL), sledite vodniku za selitev za nadgradnjo na Microsoft Authentication Library (MSAL).
Pomembno
Paket Microsoft.IdentityModel.Clients.ActiveDirectory NuGet paket in Azure AD Authentication Library (ADAL) sta bila opuščena. Od 30. junija 2020 ni bila dodana nobena nova funkcija. Močno vam priporočamo, da nadgradite, glejte vodnik za selitev za več podrobnosti.
1. korak: Registrirajte svojo prijavo
Preden začnemo preverjati pristnost proti Dynamics 365 Customer Insights - Journeys, moramo registrirati aplikacijo v Azure Active Directory za pridobitev poverilnic za preverjanje pristnosti. Več informacij: Kako registrirati aplikacijo v Azure Active Directory
Sledite tem korakom, da registrirate svojo prijavo:
Pomaknite se do Microsoft 365 Skrbniškega središča tako, da razširite zavihek Skrbniški centri v levem podoknu za krmarjenje in izberite Azure Active Directory.
Pomaknite se do Azure Active Directory, izberite Registracije aplikacij in nato izberite Nova registracija.
Vnesite ime za svojo aplikacijo. Izberite možnost Računi v katerem koli organizacijskem imeniku v razdelku Podprte vrste računov . Ni vam treba dodati preusmeritvenega URI-ja.
Izberite Registriraj.
Ko je aplikacija registrirana, bi morali biti preusmerjeni na stran Pregled . Poiščite vrednosti ID aplikacije in ID najemnika in ju shranite.
Pomaknite se do Certificates & secrets in izberite New client secret. Zabeležite si skrivno vrednost odjemalca.
2. korak: Ustvarite uporabnika aplikacije
V tem koraku ustvarite uporabnika aplikacije in ga povežite z ustvarjeno aplikacijo. Več informacij: Ustvarjanje uporabnika aplikacije
Pojdite na svoj primerek Dynamics 365 Customer Insights - Journeys in se pomaknite do Nastavitve>Varnost in nato izberite Uporabniki.
Preklopite pogled na Uporabniki aplikacije in izberite Novo.
Prepričajte se, da je izbran pogled Uporabnik: Uporabnik aplikacije . Če ni, izberite puščico spustnega menija, izberite Uporabnik aplikacije in nato vnesite Uporabniško ime, ID aplikacije, Polno ime in Primarni e-poštni vrednosti.
Izberite možnost Shrani. Ko shranite zapis, bi morali biti vrednosti URI ID-ja aplikacije in Azure AD ID predmeta samodejno izpolnjeni. Če ne, se prepričajte, da ste vnesli pravilen ID aplikacije in da ste pravilno registrirali svojo aplikacijo.
3. korak: Dodelitev varnostna vloga uporabniku aplikacije
Naslednji korak je dodelitev zahtevanih varnostnih vlog uporabniku aplikacije. Varnostno skupino morate ustvariti sami. Potrebujete naslednje privilegije:
opomba,
V prihajajoči izdaji avgusta 2019 bo uveden nov varnostna vloga, ki vsebuje vse zahtevane privilegije za dokončanje registracije. Če želite dodeliti to vlogo, izberite Manage roles in nato izberite Finalize RegistrationService.
<RolePrivilege name="prvAppendContact" level="Global" />
<RolePrivilege name="prvAppendLead" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_AttendeePass" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_customregistrationfield" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_eventpurchasepass" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_EventRegistration" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_registrationresponse" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_Session" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_SessionRegistration" level="Global" />
<RolePrivilege name="prvAppendmsevtmgt_waitlistitem" level="Global" />
<RolePrivilege name="prvAppendToAccount" level="Global" />
<RolePrivilege name="prvAppendToContact" level="Global" />
<RolePrivilege name="prvAppendToLead" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_customregistrationfield" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_Event" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_eventadministration" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_eventpurchasepass" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_EventRegistration" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_pass" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_registrationresponse" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_Session" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_SessionRegistration" level="Global" />
<RolePrivilege name="prvAppendTomsevtmgt_waitlistitem" level="Global" />
<RolePrivilege name="prvCreateAccount" level="Global" />
<RolePrivilege name="prvCreateContact" level="Global" />
<RolePrivilege name="prvCreateLead" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_AttendeePass" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_bucket" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_customregistrationfield" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_eventmanagementconfiguration" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_eventpurchasepass" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_EventRegistration" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_registrationresponse" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_SessionRegistration" level="Global" />
<RolePrivilege name="prvCreatemsevtmgt_waitlistitem" level="Global" />
<RolePrivilege name="prvCreateSharePointData" level="Global" />
<RolePrivilege name="prvReadAccount" level="Global" />
<RolePrivilege name="prvReadAsyncOperation" level="Global" />
<RolePrivilege name="prvReadAttribute" level="Global" />
<RolePrivilege name="prvReadContact" level="Global" />
<RolePrivilege name="prvReadEntity" level="Global" />
<RolePrivilege name="prvReadLead" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_AttendeePass" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_bucket" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_customregistrationfield" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_EntityCounter" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_Event" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_eventadministration" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_eventcustomregistrationfield" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_eventmanagementconfiguration" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_eventpurchasepass" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_EventRegistration" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_pass" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_registrationresponse" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_Session" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_SessionRegistration" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_waitlistitem" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_webinarconfiguration" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_WebinarProvider" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_WebinarType" level="Global" />
<RolePrivilege name="prvReadmsevtmgt_websiteentityconfiguration" level="Global" />
<RolePrivilege name="prvReadOptionSet" level="Global" />
<RolePrivilege name="prvReadPluginAssembly" level="Global" />
<RolePrivilege name="prvReadRelationship" level="Global" />
<RolePrivilege name="prvReadSdkMessage" level="Global" />
<RolePrivilege name="prvReadSharePointData" level="Global" />
<RolePrivilege name="prvReadSharePointDocument" level="Global" />
<RolePrivilege name="prvReadTransactionCurrency" level="Global" />
<RolePrivilege name="prvReadUserSettings" level="Global" />
<RolePrivilege name="prvReadWorkflow" level="Global" />
<RolePrivilege name="prvWriteAccount" level="Global" />
<RolePrivilege name="prvWriteContact" level="Global" />
<RolePrivilege name="prvWriteLead" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_bucket" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_customregistrationfield" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_EntityCounter" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_Event" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_eventadministration" level="Basic" />
<RolePrivilege name="prvWritemsevtmgt_eventmanagementconfiguration" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_eventpurchasepass" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_EventRegistration" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_registrationresponse" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_Session" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_SessionRegistration" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_waitlistitem" level="Global" />
<RolePrivilege name="prvWritemsevtmgt_webinarconfiguration" level="Global" />
<RolePrivilege name="prvWriteSharePointData" level="Global" />
4. korak: Preverjanje pristnosti proti Dynamics 365 Customer Insights - Potovanja
Izvedite logiko po meri za preverjanje pristnosti proti Dynamics 365 Customer Insights - Potovanja. Rezultat preverjanja pristnosti mora biti žeton za dostop. Če ne morete pridobiti žeton za dostop, preverite svojo konfiguracijo.
opomba,
Za popolnoma delujoč primer preverite kodo v razdelku Vzorčna koda . Več informacij: Preverjanje pristnosti z OAuth
public static string GetToken()
{
// Get Dataverse access token - https://docs.microsoft.com/power-apps/developer/data-platform/authenticate-oauth#use-the-accesstoken-with-your-requests
}
5. korak: Klicanje dejanja po meri za dokončanje registracije
Ko je žeton za dostop uspešno pridobljen, lahko pokličemo dejanje po meri msevtmgt_FinalizeExternalRegistrationRequest
.
opomba,
Če uporabljate različico rešitve pred izdajo aprila 2019, se dejanje po meri imenuje adx_FinalizeExternalRegistrationRequest
(drugačna predpona). Več informacij: Klicanje dejanj po meri s spletnim API-jem
private static HttpResponseMessage FinalizeRegistration(string accessToken)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(organizationUrl);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var request = CreateFinalizeRegistrationRequest(accessToken);
return client.SendAsync(request).Result;
}
}
public static HttpRequestMessage CreateFinalizeRegistrationRequest(string accessToken)
{
var finalizeRegistrationData = new Dictionary<string, string>
{
{ "PurchaseId", "<purchase-id-as-guid>" },
{ "ReadableEventId", "<readable-event-id" },
{ "UserId", "<optional-user-id>" }
};
var encodedRequestBody = JsonConvert.SerializeObject(finalizeRegistrationData);
var request = new HttpRequestMessage(HttpMethod.Post, FINALIZE_REGISTRATION_ROUTE);
request.Content = new StringContent(encodedRequestBody, Encoding.UTF8, "application/json");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return request;
}
Vzorčna koda
Naslednja vzorčna koda prikazuje, kako preveriti pristnost in sprožiti dejanje po meri za dokončanje postopka registracije za plačane dogodke.
Pomembno
V tem primeru smo metodo finalizeRegistrationData
trdo kodirali. V resnični aplikaciji je treba te podatke pridobiti s spletnega mesta dogodka prek plačilnega prehoda, da se dokonča storitev registracije.
opomba,
ID-ja odjemalca ali skrivnih vrednosti odjemalca ne smete vnesti neposredno v kodo. To se naredi samo za izboljšanje berljivosti vzorčne kode.
using Microsoft.Identity.Client;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
namespace TriggerFinalizeRegistration
{
class Program
{
/// <summary>
/// The route to trigger the `msevtmgt_FinalizeExternalRegistrationRequest` custom action.
/// </summary>
private const string FINALIZE_REGISTRATION_ROUTE = "/api/data/v9.0/msevtmgt_FinalizeExternalRegistrationRequest";
/// <summary>
/// The base URL of your organization.
/// E.g.: https://contoso.crm.dynamics.com/
/// </summary>
static string organizationUrl = "<org-url>";
/// <summary>
/// The tenant ID (GUID) of your application. Can be retrieved from the overview section of your application in
/// Azure Active Directory.
/// </summary>
static string tenantId = "<tenant-id>";
/// <summary>
/// The client ID (GUID) of your application which is used for authentication against Dynamics 365.
/// Can be retrieved from the overview section of your application in Azure Active Directory.
/// </summary>
static string clientId = "<client-id>";
/// <summary>
/// The client secret that can be generated in the certificates & client secrets section in your
/// Azure Active Directory.
/// </summary>
static string clientSecret = "<client-secret>";
static void Main(string[] args)
{
var accessToken = GetToken();
var response = FinalizeRegistration(accessToken);
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
// Handle response.
// The respones contains an attribute called 'status' which indicates
// if the registration was successful or not.
}
else
{
// Something went wrong.
// This most probably means that there is an issue with your configuration.
}
Console.WriteLine(response.StatusCode);
}
public static string GetToken()
{
// Get Dataverse access token - https://docs.microsoft.com/power-apps/developer/data-platform/authenticate-oauth#use-the-accesstoken-with-your-requests
}
private static HttpResponseMessage FinalizeRegistration(string accessToken)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(organizationUrl);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var request = CreateFinalizeRegistrationRequest(accessToken);
return client.SendAsync(request).Result;
}
}
public static HttpRequestMessage CreateFinalizeRegistrationRequest(string accessToken)
{
var finalizeRegistrationData = new Dictionary<string, string>
{
{ "PurchaseId", "ab62525b-7a63-47c0-b6e8-17ad1a2c67a6" },
{ "ReadableEventId", "Paid_Event1479011247" },
{ "UserId", "" }
};
var encodedRequestBody = JsonConvert.SerializeObject(finalizeRegistrationData);
var request = new HttpRequestMessage(HttpMethod.Post, FINALIZE_REGISTRATION_ROUTE);
request.Content = new StringContent(encodedRequestBody, Encoding.UTF8, "application/json");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return request;
}
}
}