Делите путем


Интегрисање прилагођене цаптцха услуге са обрасцима Customer Insights - Journeys

Customer Insights - Journeys обрасци вам омогућавају да користите прилагођену цаптцха бот заштиту за проверу прослеђивања образаца. Овај чланак даје пример како интегрисати Гоогле реЦАПТЦХА. Проток је сличан другим цаптцха услугама.

Белешка

У тренутној верзији апликације, само једна цаптцха имплементација може бити активна. Ако користите сопственог цаптцха провајдера (као што је наведено испод), постојећи обрасци који користе цаптцха ван оквира ће престати да раде. Прилагођена цаптцха имплементација захтева најмање основно знање писања и отклањања грешака у додатним компонентама за податке.

Процес се састоји од ових корака:

  1. Додајте РЕЦАПТЦХА обрасцу.
  2. Додајте цаптцха текстуалну вредност у прослеђивање обрасца када се образац проследи.
  3. Креирајте додатну компоненту у ЦРМ-у која проверава ваљаност цаптцха.

Пример "корак по корак": Интегрисати Гоогле реЦАПТЦХА

1 . Додајте РЕЦАПТЦХА обрасцу

  1. Креирајте образац Customer Insights - Journeys у < ДИЦТ__уређивач образаца > форм едитор.

  2. Додајте data-validate-submission="true" елементу атрибут који <form> омогућава прилагођену проверу ваљаности у прослеђивању обрасца:

    Додај атрибут елементу обрасца.

  3. Додајте <div id="g-recaptcha"> образац као чувар места за реЦАПТЦХА. Овај ИД див-а се касније користи као референца. Препоручује се да поставите чувар места између последњег поља и дугмета за прослеђивање.

    Додајте чувар места за реЦАПТЦХА.

  4. Објавите образац и угнећите образац у своју Wеб локацију.

  5. Уредите страницу на којој је образац уграђен. Додајте скрипту коју је обезбедио Гоогле у заглавље странице. Ова скрипта учитава реЦАПТЦХА са параметром onLoad повратног позива. Овај повратни позив се позива чим цаптцха буде напуњен.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Додајте функцију ОнЛоадЦаллбацк:

    function onloadCallback() {
        grecaptcha.render('g-recaptcha',
        { 
          sitekey: '{sitekey}',
        });
    }
    

    Замените {sitekey} чувар места оним који је обезбедио Гоогле. Ова функција повратног позива приказује реЦАПТЦХА унутар чувара места који сте <div id="g-recaptcha"> раније креирали.

  7. Региструјте онлоадЦаллбацк функцију коју ће позвати учитавач обрасца:

document.addEventListener("d365mkt-afterformload", onloadCallback);

2 . Додајте цаптцха текстуалну вредност у прослеђивање обрасца

Када се образац проследи, параметар g-recaptcha-response се аутоматски додаје прослеђивању обрасца. У следећим корацима ћете направити додатну компоненту која скрива ову вредност, јер ValidationOnlyFields ће бити додата на листу у објекту одговора који је вратио кôд додатне компоненте.

Додаје се параметар Г-рецаптцха-респонсе.

3 . Креирајте додатну компоненту

3 .1 Креирајте Visual Studio пројекат за додатну компоненту

  1. Отворите Visual Studio и креирајте нови пројекат библиотеке класа користећи .НЕТ Фрамеwорк 4.6.2.
  2. У истраживачу решења изаберите ставку Управљање пакетима NuGet и инсталирање Microsoft.CrmSdk.CoreAssemblies.

3 .2 Креирање класе додатне компоненте

  1. Преименуј Class1.cs у CustomValidationPlugin.cs.

  2. Нека класа ЦустомВалидатионПлугин наследи од ИПлугин интерфејса и дода метод "Изврши".

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Додајте следећи кôд у метод извршавања да бисте преузели услугу контекста и праћења.

    public void Execute(IServiceProvider serviceProvider)
    {
       // get tracing service
       ITracingService tracingService =
       (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    
       // get plugin execution context
       IPluginExecutionContext context = (IPluginExecutionContext)
       serviceProvider.GetService(typeof(IPluginExecutionContext));
    }
    
  4. Додајте овај кôд да бисте преузели ниску параметра прослеђивања обрасца. То је ЈСОН кодирана ниска која представља поља која је корисник проследио у обрасцу. Овај процес преузима ову ниску и десериализује је помоћу метода помагача десеријализе и формСубмиссионРеqуест класе која се дефинише касније. Овим се проверава да ли низ Поља садржи кључ за г-рецаптцха-респонсе. Ако реЦАПТЦХА кључ није пронађен, он враћа прескакање провере ваљаности јер образац који обрађује није садржао Гоогле рецаптцха елемент.

    var requestString = (string)context.InputParameters["msdynmkt_formsubmissionrequest"];
    var requestObject = Deserialize<FormSubmissionRequest>(requestString);
    if (!requestObject.Fields.TryGetValue("g-recaptcha-response", out string recaptchaToken))
    {
       tracingService.Trace("g-recaptcha-response was not present in form submission");
       return;
    }
    
  5. Додајте следећи кôд да бисте га вратили g-recaptcha-token ако је вредност без вредности или празна.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Додајте следећи кôд да бисте проверили ваљаност Гоогле цаптцха токена у односу на Гоогле АПИс.

    string url = "https://www.google.com/recaptcha/api/siteverify";
    using (HttpClient client = new HttpClient())
    {
       var content = new FormUrlEncodedContent(new Dictionary<string, string>
       {
          {"secret", "your_secret_key"},
          {"response", recaptchaToken}
       });
    
       try
       {
          var response = client.PostAsync(url, content).Result;
          if (!response.IsSuccessStatusCode)
          {
             tracingService.Trace($"Request Failed: ({response.StatusCode}){response.Content}");
             return;
          }
    
          var responseString = response.Content.ReadAsStringAsync().Result;
    
          gRecaptchaResponse = Deserialize<GRecaptchaResponse>(responseString);
    
          var resp = new ValidateFormSubmissionResponse()
          {
             IsValid = isValid,
             ValidationOnlyFields = new List<string>() { "g-recaptcha-response" }
          };
          context.OutputParameters["msdynmkt_validationresponse"] = Serialize(resp);
        }
        catch (Exception e)
        {
           tracingService.Trace($"{e.Message}");
        }
    }
    

    Прво се дефинише УРЛ адреса, а затим се креира инстанца HttpClient . Креиран FormUrlEncodedContent је објекат који садржи преузето recaptchaToken у претходним корацима и тајни кључ који обезбеђује Гоогле. Затим се POST шаље захтев и проверава се статусни кôд, ако није успешан он се враћа. Ако буде успешан, десеријализује одговор помоћу метода помагача десеријализатора GRecaptchaResponse и то је касније дефинисано. Затим креира нови објекат ValidateFormSubmissionResponse , серијализује га и поставља га као вредност излазног параметра msdynmkt_validationresponse, који користи мицрософт услуга за прихватање или одбацивање прослеђивања. Додавање ниске g-recaptcha-response у листу скрива ValidationOnlyFields ово поље од прослеђивања обрасца у УИ.

  7. Додајте следећи кôд да бисте дефинисали методе помагача серијализације и десеријализе.

    private T Deserialize<T>(string jsonString)
    {
       serializer = new DataContractJsonSerializer(typeof(T));
       T result;
       using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
       {
          result = (T)serializer.ReadObject(stream);
       }
       return result;
    }
    
    private string Serialize<T>(T obj)
    {
        string result;
        serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memoryStream = new MemoryStream())
        {
           serializer.WriteObject(memoryStream, obj);
           result = Encoding.Default.GetString(memoryStream.ToArray());
        }
        return result;
    }
    
  8. Додајте следећи кôд да бисте дефинисали класе потребне објектима ЈСОН ниски серијализе/Десериализе.

    public class FormSubmissionRequest
     {
         public Dictionary<string, string> Fields { get; set; }
     }
    
     public class GRecaptchaResponse
     {
         public bool success { get; set; }
     }
    
     public class ValidateFormSubmissionResponse
     {
         public bool IsValid { get; set; }
         public List<string> ValidationOnlyFields { get; set; }
     }
    

3 .3 Потпишите и направите додатну компоненту

  1. Кликните десним тастером миша на пројекат и изаберите ставку Својства у истраживачу решења.
  2. Изаберите картицу Потписивање и потврдите избор у пољу за потврду Потпиши асемблер .
  3. Изаберите <New...>.
  4. Унесите име датотеке кључа и поништите избор Заштити моју кључну датотеку лозинком.
  5. Направите пројекат.
  6. Можете да пронађете склоп додатне компоненте CustomValidationPlugin.dll \bin\Debug.

3 .4 Региструјте додатну компоненту

  1. Отворите PluginRegistration.exe.
  2. Изаберите ставку Креирај нову везу.
  3. Одаберите Office 365.
  4. Изаберите Пријављивање.
  5. Изаберите ставку Региструј , а затим региструј нову асемблер.

    Изаберите ставку Региструј, а затим региструј нову асемблер.

  6. Изаберите (...) у кораку 1 и изаберите длл уграђену у претходним корацима.
  7. Изаберите региструј изабрану додатну компоненту.

3 .4 Региструјте корак

  1. Изаберите ЦустомВалидатионПлугин са листе регистрованих склопова.
  2. Изаберите ставку Региструј нови корак.
  3. Унесите msdynmkt_validateformsubmission у текстуално поље поруке.
  4. Уверите се да је режим извршавања постављен као Синхрони.

    Уверите се да је режим извршавања постављен као синхронизован.

  5. Уверите се да је налог за извршавање подешен на 10.
  6. Уверите се да је фаза извршења цевовода догађаја постављена као " Операција објаве".
  7. Изаберите ставку Региструј нови корак.

Закључак

Када се проследи образац са data-validate-submission атрибутом, покреће се прилагођени плугин и проверава се реЦАПТЦХА одговор помоћу Гоогле сервиса. Прилагођена додатна компонента ће се покренути након подразумеване Мицрософт додатне компоненте за проверу ваљаности. Ако у обрасцу нема Мицрософт цаптцха поља, Мицрософт скупови додатних компоненти и прослеђивање IsValid:false неће успети ако га не замените IsValid:true.

Ток провере ваљаности.