Bagikan melalui


Mengintegrasikan layanan captcha kustom dengan Customer Insights - Journeys formulir

Customer Insights - Journeys Formulir memungkinkan Anda menggunakan perlindungan bot captcha kustom untuk memvalidasi tanggapan formulir. Artikel ini memberikan contoh cara mengintegrasikan Google reCAPTCHA. Alurnya serupa untuk layanan captcha lainnya.

Catatan

Dalam versi aplikasi saat ini, hanya satu implementasi captcha yang dapat aktif. Jika Anda menggunakan penyedia captcha Anda sendiri (sebagaimana diuraikan di bawah), formulir yang ada yang menggunakan captcha siap pakai akan berhenti berfungsi. Implementasi captcha kustom memerlukan setidaknya pengetahuan dasar tentang penulisan dan debugging plugin dataverse.

Prosesnya terdiri dari langkah-langkah ini:

  1. Tambahkan reCAPTCHA ke formulir.
  2. Tambahkan nilai teks captcha ke pengiriman formulir setelah formulir dikirim.
  3. Buat plugin di CRM yang memvalidasi captcha.

Contoh langkah demi langkah: Mengintegrasikan Google reCAPTCHA

1. Tambahkan reCAPTCHA ke formulir

  1. Buat formulir di editor formulir Customer Insights - Journeys .

  2. data-validate-submission="true" Tambahkan atribut ke elemen, <form> yang memungkinkan validasi kustom pada pengiriman formulir:

    Tambahkan atribut ke elemen formulir.

  3. Tambahkan dalam <div id="g-recaptcha"> formulir sebagai placeholder untuk reCAPTCHA. ID div ini digunakan sebagai referensi nanti. Disarankan untuk menempatkan placeholder di antara bidang terakhir dan tombol kirim.

    Tambahkan placeholder untuk reCAPTCHA.

  4. Publikasikan formulir dan sematkan formulir ke situs web Anda.

  5. Edit halaman tempat formulir disematkan. Tambahkan skrip yang disediakan oleh Google ke header halaman. Skrip ini memuat reCAPTCHA dengan onLoad parameter callback. Callback ini dipanggil segera setelah captcha dimuat.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Tambahkan fungsi onLoadCallback:

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

    Ganti placeholder dengan yang {sitekey} disediakan oleh Google. Fungsi callback ini merender reCAPTCHA di dalam placeholder <div id="g-recaptcha"> yang Anda buat sebelumnya.

  7. Daftarkan fungsi onloadCallback untuk dipanggil oleh pemuat formulir:

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

2. Tambahkan nilai teks captcha ke pengiriman formulir

Setelah formulir dikirimkan, g-recaptcha-response parameter ditambahkan secara otomatis ke pengiriman formulir. Pada langkah berikutnya, Anda akan membangun plugin yang menyembunyikan nilai ini, karena akan ditambahkan ke ValidationOnlyFields daftar dalam objek respons yang dikembalikan oleh kode plugin.

Parameter G-recaptcha-response ditambahkan.

3. Buat plugin

3.1 Membuat Visual Studio Proyek untuk plugin

  1. Buka Visual Studio dan buat proyek Perpustakaan Kelas baru menggunakan .NET Framework 4.6.2.
  2. Di Penjelajah Solusi, pilih Kelola NuGet Paket dan instal Microsoft.CrmSdk.CoreAssemblies.

3.2 Membuat kelas plugin

  1. Ganti nama Class1.cs menjadi CustomValidationPlugin.cs.

  2. Buat kelas CustomValidationPlugin mewarisi dari antarmuka IPlugin dan tambahkan metode Eksekusi.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Tambahkan kode berikut ke dalam metode eksekusi untuk mengambil konteks dan layanan pelacakan.

    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. Tambahkan kode ini untuk mengambil string parameter pengiriman formulir. Ini adalah string yang dikodekan JSON yang mewakili bidang yang dikirimkan pengguna dalam formulir. Proses ini mengambil string ini dan mendeserialisasinya menggunakan metode pembantu Deserialize dan kelas FormSubmissionRequest yang ditentukan nanti. Ini memeriksa bahwa array Fields berisi kunci untuk g-recaptcha-response. Jika kunci reCAPTCHA tidak ditemukan, kunci tersebut akan menampilkan validasi yang dilewati karena formulir yang diproses tidak berisi elemen 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. Tambahkan kode berikut untuk mengembalikan jika g-recaptcha-token nilainya null atau kosong.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Tambahkan kode berikut untuk memvalidasi token captcha Google terhadap Google API.

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

    Pertama, URL didefinisikan, kemudian instance dibuat HttpClient . Objek FormUrlEncodedContent dibuat berisi recaptchaToken yang diambil pada langkah-langkah sebelumnya dan kunci rahasia yang disediakan oleh Google. POST Kemudian permintaan dikirim dan kode status diperiksa, jika tidak berhasil kembali. Jika berhasil, itu deserializes respon menggunakan metode Deserialize helper dan GRecaptchaResponse itu didefinisikan nanti. Kemudian membuat objek baru ValidateFormSubmissionResponse , membuat serialisasi, dan menetapkannya sebagai nilai parameter msdynmkt_validationresponse output, yang merupakan layanan Microsoft yang digunakannya untuk menerima atau menolak pengiriman. Menambahkan g-recaptcha-response string ke ValidationOnlyFields daftar menyembunyikan bidang ini dari pengiriman formulir di UI.

  7. Tambahkan kode berikut untuk menentukan metode pembantu Serialize dan 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. Tambahkan kode berikut untuk menentukan kelas yang diperlukan untuk Serialize/Deserialize JSON strings objects.

    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 Tanda tangani dan buat plugin

  1. Klik kanan pada proyek dan pilih Properti di Penjelajah Solusi.
  2. Pilih tab Penandatanganan dan centang kotak Tanda tangani perakitan .
  3. Pilih <New...>.
  4. Masukkan nama file kunci dan batal pilih Lindungi file kunci saya dengan kata sandi.
  5. Bangun proyek.
  6. Anda dapat menemukan rakitan CustomValidationPlugin.dll plugin di \bin\Debug.

3.4 Daftarkan plugin

  1. Buka PluginRegistration.exe.
  2. Pilih Buat koneksi baru.
  3. Memilih Office 365.
  4. Pilih Masuk.
  5. Pilih Daftar lalu Daftarkan rakitan baru.

    Pilih Daftar lalu Daftarkan rakitan baru.

  6. Pilih ( ...) tombol di langkah 1 dan pilih dll yang dibangun di langkah sebelumnya.
  7. Pilih Daftarkan plugin yang dipilih.

3.4 Langkah Pendaftaran

  1. Pilih CustomValidationPlugin dari daftar rakitan terdaftar.
  2. Pilih Daftarkan Langkah Baru.
  3. Masukkan msdynmkt_validateformsubmission ke bidang teks Pesan.
  4. Pastikan Mode Eksekusi diatur sebagai Sinkron.

    Pastikan Mode Eksekusi diatur sebagai Sinkronisasi.

  5. Pastikan Execution order diatur ke 10.
  6. Pastikan Event Pipeline Stage Of Execution diatur sebagai Post Operation.
  7. Pilih Daftarkan Langkah Baru.

Kesimpulan

Saat formulir dengan atribut dikirimkan data-validate-submission , plugin kustom Anda akan menjalankan dan memvalidasi respons reCAPTCHA dengan layanan Google. Plugin kustom akan berjalan setelah plugin validasi Microsoft default. Jika tidak ada bidang captcha Microsoft dalam formulir, plugin Microsoft akan ditetapkan IsValid:false dan pengiriman gagal kecuali Anda menimpanya IsValid:true.

Alur validasi.