Završetak registracije za plaćene događaje
Napomena
1. rujna 2023. Dynamics 365 Marketing i Dynamics 365 Customer Insights prodavat će se zajedno kao jedan SKU proizvoda pod nazivom Dynamics 365 Customer Insights. Pojedinačne aplikacije preimenovat će se u Dynamics 365 Customer Insights – putovi i Dynamics 365 Customer Insights – podaci. Dodatne informacije potražite u Najčešćim pitanjima o sustavu Dynamics 365 Customer Insights
Nadalje, 1. runja 2023. novi klijenti s aplikacijom Dynamics 365 Marketing dobit će samo značajke marketinga u stvarnom vremenu. Dodatne informacije potražite u Zadana instalacija marketinga u stvarnom vremenu. Mnogo stranica dokumentacije trenutno upućuje na izlazne značajke koje možda nisu dostupne ili funkcioniraju drugačije u marketingu u stvarnom vremenu. Sadržaj dokumentacije ažurirat će se u rujnu kako bi se naznačilo odnosi li se na marketing u stvarnom vremenu ili na izlazni marketing.
Ovaj tema vodi vas kroz proces razvoja .NET Core aplikacije koja autentificira od Dynamics 365 Customer Insights - Putovanja i pokreće prilagođenu radnju koja dovršava postupak registracije plaćenih događaja. Prije nego što prođete kroz tema, provjerite jeste li pročitali i razumjeli Postavljanje online plaćanja za događaje.
U ovom tema koristimo OAuth kao mehanizam provjere autentičnosti i Dynamics 365 Web API za pokretanje prilagođene akcije. Ovaj pristup funkcionira univerzalno s većinom programskih jezika i okvira, što znači da niste prisiljeni koristiti C# ili .NET Core za izgradnju usluge koja dovršava plaćene registracije.
Napomena
Ako odlučite koristiti .NET Framework za razvoj usluge, možete koristiti XRM biblioteku alata za provjeru autentičnosti i povezivanje s uslugom tvrtke ili ustanove. Ova biblioteka olakšava komunikaciju s Dynamics 365 Customer Insights putovanjima. Dodatne informacije: Provjera autentičnosti pomoću aplikacija .NET Framework
Preduvjeti
Stvorite .NET Core CLI projekt.
Instalirajte sve potrebne ovisnosti.
Instalirajte sljedeći NuGet paket:
- Newtonsoft.Json se koristi za serijalizaciju i deserijalizaciju podataka.
Ako koristite Azure AD biblioteku provjere autentičnosti (ADAL), slijedite vodič za migraciju da biste nadogradili na Microsoftovu biblioteku provjere autentičnosti (MSAL).
Važno
Paket Microsoft.IdentityModel.Clients.ActiveDirectory NuGet i Azure AD biblioteka provjere autentičnosti (ADAL) zastarjeli su. Od 30. lipnja 2020. nisu dodane nove značajke. Preporučujemo vam nadogradnju, pogledajte vodič za migraciju za više detalja.
Korak 1: Registrirajte svoju prijavu
Prije nego što počnemo autentificirati od Dynamics 365 Customer Insights - Putovanja, moramo registrirati aplikaciju u da Azure Active Directory bismo dobili vjerodajnice za provjeru autentičnosti. Više informacija: Kako registrirati aplikaciju u sustavu Azure Active Directory
Slijedite ove korake da biste registrirali prijavu:
Otvorite centar Microsoft 365 za administratore tako da proširite karticu Centri za administratore u lijevom navigacijskom oknu, a zatim odaberite Azure Active Directory.
Dođite do Azure Active Directory, odaberite Registracije aplikacija, a zatim odaberite Nova registracija.
Unesite naziv aplikacije. Odaberite mogućnost Računi u bilo kojem direktoriju tvrtke ili ustanove u odjeljku Podržane vrste računa. Ne morate dodavati URI za preusmjeravanje.
Odaberite Registriraj se.
Nakon registracije aplikacije trebali biste biti preusmjereni na stranicu Pregled . Potražite ID aplikacije i vrijednosti ID-a klijenta i spremite ih.
Idite na tajne certifikata i odaberite & Nova tajna klijenta . Zabilježite tajnu vrijednost klijenta.
Drugi korak: stvaranje korisnika aplikacije
U ovom koraku stvorite korisnika aplikacije i povežite korisnika aplikacije s stvorenom aplikacijom. Više informacija: Stvaranje korisnika aplikacije
Idite na instancu Dynamics 365 Customer Insights putovanja i idite na Sigurnost>postavki , a zatim odaberite Korisnici.
Promijenite prikaz na Korisnici aplikacije i odaberite Novo.
Provjerite je li odabran prikaz Korisnik: korisnik aplikacije. Ako ne, odaberite padajuću strelicu, odaberite Korisnik aplikacije, a zatim unesitevrijednosti Korisničko ime,ID aplikacije , Puno ime i Primarna e-pošta .
Odaberite Spremi. Nakon što spremite zapis, vrijednosti URI ID-a aplikacije i ID-a Azure AD objekta trebale bi se automatski ispuniti. Ako ne, provjerite jeste li unijeli točan ID prijave i jeste li ispravno registrirali prijavu.
Treći korak: dodjeljivanje sigurnosna uloga korisniku aplikacije
Sljedeći korak je dodjeljivanje potrebnih sigurnosnih uloga korisniku aplikacije. Morate sami stvoriti sigurnosnu grupu. Potrebne su vam sljedeće privilegije:
Napomena
U nadolazećem izdanju u kolovozu 2019. uvest će se novi sigurnosna uloga koji sadrži sve potrebne privilegije za dovršetak registracije. Da biste dodijelili tu ulogu, odaberite Upravljanje ulogama , a zatim Dovrši uslugu registracije.
<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" />
Korak 4: Autentificiraj protiv Dynamics 365 Customer Insights - Putovanja
Implementirajte prilagođenu logiku za provjeru autentičnosti protiv Dynamics 365 Customer Insights - Putovanja. Ishod autentifikacije trebao bi biti pristupni token. Ako ne možete dohvatiti pristupni token, provjerite konfiguraciju.
Napomena
Za potpuno radni primjer provjerite šifru iz odjeljka Ogledna šifra. Dodatne informacije: Provjera autentičnosti pomoću OAuth-a
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
}
Peti korak: pozivanje prilagođene akcije radi dovršetka registracije
Nakon što se pristupni token uspješno dohvati, možemo nazvati prilagođenu radnju msevtmgt_FinalizeExternalRegistrationRequest
.
Napomena
Ako koristite verziju rješenja prije izdanja u travnju 2019., poziva adx_FinalizeExternalRegistrationRequest
se prilagođena radnja (drugačiji prefiks). Dodatne informacije:Pozivanje prilagođenih akcija pomoću web-API-ja
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;
}
Uzorak koda
Sljedeći ogledni kôd pokazuje kako provjeriti autentičnost i pokrenuti prilagođenu akciju za dovršetak postupka registracije plaćenih događaja.
Važno
U ovom smo primjeru finalizeRegistrationData
teško kodirali metodu. U stvarnoj aplikaciji te bi podatke trebalo dohvatiti s web mjesta događaja putem pristupnika za plaćanje kako bi se dovršila usluga registracije.
Napomena
Ne biste trebali unositi ni ID klijenta ni tajne vrijednosti klijenta izravno u kod. To se radi samo kako bi se poboljšala čitljivost oglednog koda.
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;
}
}
}