Dijeli putem


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

  1. Stvorite .NET Core CLI projekt.

  2. Instalirajte sve potrebne ovisnosti.

  3. Instalirajte sljedeći NuGet paket:

    • Newtonsoft.Json se koristi za serijalizaciju i deserijalizaciju podataka.
  4. 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:

  1. Otvorite centar Microsoft 365 za administratore tako da proširite karticu Centri za administratore u lijevom navigacijskom oknu, a zatim odaberite Azure Active Directory.

  2. Dođite do Azure Active Directory, odaberite Registracije aplikacija, a zatim odaberite Nova registracija.

    Registracija aplikacije Azure.

  3. 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.

    Podržane vrste računa.

  4. Odaberite Registriraj se.

  5. Nakon registracije aplikacije trebali biste biti preusmjereni na stranicu Pregled . Potražite ID aplikacije i vrijednosti ID-a klijenta i spremite ih.

  6. Idite na tajne certifikata i odaberite & Nova tajna klijenta . Zabilježite tajnu vrijednost klijenta.

    Certifikati i tajne.

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

  1. Idite na instancu Dynamics 365 Customer Insights putovanja i idite na Sigurnost>postavki , a zatim odaberite Korisnici.

    Odaberite korisnike.

  2. Promijenite prikaz na Korisnici aplikacije i odaberite Novo.

    Korisnički obrazac aplikacije.

  3. 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 .

    Uzorak obrasca korisnika aplikacije.

  4. 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;
        }
    }
}