Поділитися через


Інтегруйте кастомний сервіс капчі з Customer Insights - Journeys формами

Customer Insights - Journeys Форми дозволяють використовувати спеціальний захист бота Captcha для перевірки надісланих форм. У цій статті наведено приклад того, як інтегрувати Google reCAPTCHA. Ланцюжок аналогічний і для інших сервісів капчі.

Нотатка

У поточній версії програми може бути активною лише одна реалізація капчі. Якщо ви користуєтеся власним постачальником капчі (як описано нижче), наявні форми, які використовують готову капчу, перестануть працювати. Користувацька реалізація капчі вимагає принаймні базових знань з написання та налагодження плагінів dataverse.

Процес складається з таких етапів:

  1. Додайте reCAPTCHA у форму.
  2. Додайте текстове значення captcha до надсилання форми після надсилання форми.
  3. Створіть плагін у CRM, який перевіряє капчу.

Покроковий приклад: інтегруйте Google reCAPTCHA

1. Додайте reCAPTCHA у форму

  1. Створіть форму в редактор форм Customer Insights - Journeys .

  2. data-validate-submission="true" Додайте атрибут до елемента <form> , який вмикає кастомну перевірку під час надсилання форми:

    Додайте атрибут до елемента форми.

  3. Додайте a <div id="g-recaptcha"> у форму як заповнювач для reCAPTCHA. Цей ідентифікатор div буде використано як посилання пізніше. Рекомендується поставити заповнювач між останнім полем і кнопкою відправки.

    Додано заповнювач для reCAPTCHA.

  4. Опублікуйте форму та вставте її на свій веб-сайт.

  5. Відредагуйте сторінку, на якій було вбудовано форму. Додайте в шапку сторінки скрипт, наданий Google. Цей скрипт завантажує reCAPTCHA з параметром onLoad callback. Цей зворотний виклик викликається, як тільки завантажується капча.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Додайте функцію onLoadCallback:

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

    Замініть заповнювач {sitekey} на той, що надав Google. Ця функція зворотного виклику відображає reCAPTCHA всередині заповнювача <div id="g-recaptcha"> , який ви створили раніше.

  7. Зареєструйте функцію onloadCallback, яка буде викликана завантажувачем форми:

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

2. Додайте значення тексту капчі до відправки форми

Після надсилання форми параметр g-recaptcha-response автоматично додається до надсилання форми. На наступних кроках ви створите плагін, який приховує це значення, оскільки він буде доданий до ValidationOnlyFields списку в об’єкті відповіді, який повертає код плагіна.

Додано параметр G-recaptcha-response.

3. Створіть плагін

3.1 Створення Visual Studio проекту для плагіна

  1. Відкрийте Visual Studio та створіть новий проект бібліотеки класів за допомогою .NET Framework 4.6.2.
  2. У Провіднику рішень виберіть Керування пакетами NuGet та інсталяція Microsoft.CrmSdk.CoreAssemblies.

3.2 Створіть клас плагіна

  1. Перейменувати Class1.cs на CustomValidationPlugin.cs.

  2. Зробіть так, щоб клас CustomValidationPlugin успадкувався від інтерфейсу IPlugin і додав метод Execute.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Додайте наступний код до методу execute, щоб отримати контекст і службу трасування.

    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. Додайте цей код, щоб отримати рядок параметра надсилання форми. Це рядок у кодуванні JSON, що представляє поля, надіслані користувачем у формі. Цей процес отримує цей рядок і десеріалізує його за допомогою допоміжного методу Deserialize та класу FormSubmissionRequest, який буде визначено пізніше. Це перевіряє, чи масив Fields містить ключ для g-recaptcha-response. Якщо ключ reCAPTCHA не знайдено, він повертає пропуск перевірки, оскільки форма, яка обробляється, не містила елемента recaptcha Google.

    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 значення null або порожнє.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Додайте наведений нижче код, щоб перевірити маркер капчі Google за API Google.

    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}");
        }
    }
    

    Спочатку визначається URL-адреса, потім створюється екземпляр HttpClient . Створюється об’єкт, FormUrlEncodedContent що містить отримані recaptchaToken на попередніх кроках дані та секретний ключ, наданий Google. POST Потім надсилається запит і перевіряється код стану, якщо він не успішний, він повертається. У разі успіху він десеріалізує відповідь за допомогою допоміжного методу Deserialize, який GRecaptchaResponse визначається пізніше. Потім він створює новий ValidateFormSubmissionResponse об’єкт, серіалізує його та встановлює як значення вихідного параметра msdynmkt_validationresponse, який використовується службою Microsoft для прийняття або відхилення надісланого матеріалу. Додавання g-recaptcha-response рядка до ValidationOnlyFields списку приховує це поле від надсилання форми в інтерфейсі користувача.

  7. Додайте наступний код для визначення допоміжних методів Serialize та Deserialize.

    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. Додайте наступний код, щоб визначити класи, необхідні для серіалізації/десеріалізації об’єктів рядків JSON.

    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 і виберіть бібліотеку DLL, вбудовану в попередніх кроках.
  7. Виберіть Зареєструвати вибраний плагін.

3.4 Крок реєстрації

  1. Виберіть CustomValidationPlugin зі списку зареєстрованих збірок.
  2. Виберіть Зареєструвати новий крок.
  3. Введіть msdynmkt_validateformsubmission текстове поле повідомлення.
  4. Переконайтеся, що для параметра Режим виконання встановлено значення Синхронний.

    Переконайтеся, що для параметра Режим виконання встановлено значення Синхронний.

  5. Переконайтеся, що для параметра Порядок виконання встановлено значення 10.
  6. Переконайтеся, що для параметра Event Pipeline Stage Of Execution встановлено значення Post Operation.
  7. Виберіть Зареєструвати новий крок.

Висновок

Коли надсилається форма з атрибутом data-validate-submission , ваш спеціальний плагін запускається та перевіряє відповідь reCAPTCHA за допомогою служб Google. Настроюваний плагін працюватиме після плагіна перевірки Microsoft за замовчуванням. Якщо у формі немає полів капчі Microsoft, плагін Microsoft встановлює IsValid:false , і надсилання не відбудеться, якщо ви не перезапишете його IsValid:true.

Процес валідації.