รวมบริการ captcha แบบกำหนดเองเข้ากับฟอร์ม Customer Insights - Journeys
ฟอร์ม Customer Insights - Journeys ช่วยให้คุณใช้การป้องกันบอท captcha แบบกำหนดเองเพื่อตรวจสอบความถูกต้องของการส่งฟอร์ม บทความนี้แสดงตัวอย่างวิธีรวม Google reCAPTCHA โฟลว์จะคล้ายกับบริการ captcha อื่นๆ
หมายเหตุ
ในแอปเวอร์ชันปัจจุบัน คุณสามารถใช้งาน Captcha ได้เพียงรายการเดียวเท่านั้น หากคุณใช้ผู้ให้บริการ Captcha ของคุณเอง (ตามที่ระบุไว้ด้านล่าง) แบบฟอร์มที่มีอยู่ซึ่งใช้ captcha แบบสำเร็จรูปจะหยุดทำงาน การใช้ captcha ที่กำหนดเองต้องมีความรู้พื้นฐานในการเขียนและแก้ไขจุดบกพร่อง ปลั๊กอิน Dataverse เป็นอย่างน้อย
กระบวนการประกอบด้วยขั้นตอนเหล่านี้:
- เพิ่ม reCAPTCHA ในฟอร์ม
- เพิ่มค่าข้อความ captcha ในการส่งฟอร์มเมื่อส่งฟอร์มแล้ว
- สร้างปลั๊กอิน ใน CRM ที่ตรวจสอบความถูกต้องของ captcha
ตัวอย่างทีละขั้นตอน: รวม Google reCAPTCHA
1. เพิ่ม reCAPTCHA ในฟอร์ม
สร้างฟอร์มในตัวแก้ไขฟอร์ม Customer Insights - Journeys
เพิ่มแอตทริบิวต์
data-validate-submission="true"
ให้กับองค์ประกอบ<form>
ซึ่งเปิดใช้งานการตรวจสอบแบบกำหนดเองในการส่งฟอร์ม:เพิ่ม
<div id="g-recaptcha">
ในฟอร์มเป็นตัวยึดตำแหน่งสำหรับ reCAPTCHA รหัส div นี้ใช้เป็นข้อมูลอ้างอิงในภายหลัง ขอแนะนำให้วางตัวยึดระหว่างฟิลด์สุดท้ายและปุ่มส่งเผยแพร่ฟอร์มและฝังฟอร์มลงในเว็บไซต์ของคุณ
แก้ไขหน้าที่ฝังฟอร์ม เพิ่มสคริปต์ที่จัดทำโดย Google ในส่วนหัวของหน้า สคริปต์นี้โหลด reCAPTCHA ด้วยพารามิเตอร์การติดต่อกลับ
onLoad
การติดต่อกลับนี้ถูกเรียกใช้ทันทีที่โหลด captcha<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
เพิ่มฟังก์ชัน onLoadCallback:
function onloadCallback() { grecaptcha.render('g-recaptcha', { sitekey: '{sitekey}', }); }
แทนที่ตัวยึด
{sitekey}
ด้วยตัวยึดที่ Google ให้มา ฟังก์ชัน callback นี้แสดงผล reCAPTCHA ภายในตัวยึด<div id="g-recaptcha">
ที่คุณสร้างไว้ก่อนหน้านี้ลงทะเบียนฟังก์ชัน onloadCallback เพื่อให้ตัวโหลดแบบฟอร์มเรียกใช้:
document.addEventListener("d365mkt-afterformload", onloadCallback);
2. เพิ่มค่าข้อความ captcha ในการส่งฟอร์ม
เมื่อส่งฟอร์มแล้ว g-recaptcha-response
พารามิเตอร์จะถูกเพิ่มลงในการส่งฟอร์มโดยอัตโนมัติ ในขั้นตอนถัดไป คุณจะสร้างปลั๊กอินที่ซ่อนค่านี้ เนื่องจากจะถูกเพิ่มลงในรายการ ValidationOnlyFields
ในออบเจ็กต์การตอบสนองที่ส่งคืนโดยรหัสปลั๊กอิน
3. สร้างปลั๊กอิน
3.1 สร้างโครงการ Visual Studio สำหรับปลั๊กอิน
- เปิด Visual Studio และสร้างโครงการคลาสไลบรารีใหม่โดยใช้ .NET Framework 4.6.2
- ใน Solution Explorer เลือก จัดการแพ็คเกจ NuGet และติดตั้ง
Microsoft.CrmSdk.CoreAssemblies
3.2 สร้างคลาสปลั๊กอิน
เปลี่ยนชื่อ
Class1.cs
เป็นCustomValidationPlugin.cs
ทำให้คลาส CustomValidationPlugin สืบทอดมาจากอินเตอร์เฟส IPlugin และเพิ่มวิธีการดำเนินการ
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
เพิ่มรหัสต่อไปนี้ในวิธีการดำเนินการเพื่อดึงบริบทและบริการการติดตาม
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)); }
เพิ่มรหัสนี้เพื่อดึงสตริงพารามิเตอร์การส่งฟอร์ม ซึ่งเป็นสตริงที่เข้ารหัส JSON ซึ่งแสดงฟิลด์ที่ผู้ใช้ส่งมาในฟอร์ม กระบวนการนี้ดึงสตริงนี้และดีซีเรียลไลซ์โดยใช้วิธีการช่วยเหลือ Deserialize และคลาส FormSubmissionRequest ที่กำหนดไว้ในภายหลัง ซึ่งตรวจสอบว่าอาร์เรย์ของฟิลด์มีคีย์สำหรับ 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; }
เพิ่มรหัสต่อไปนี้เพื่อส่งกลับถ้าค่า
g-recaptcha-token
เป็นโมฆะหรือว่างเปล่าif (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
เพิ่มโค้ดต่อไปนี้เพื่อตรวจสอบความถูกต้องของโทเค็น Google captcha กับ 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}"); } }
ขั้นแรก กำหนด URL จากนั้นสร้างอินสแตนซ์ของ
HttpClient
ออบเจ็กต์FormUrlEncodedContent
ถูกสร้างโดยมีrecaptchaToken
ที่ดึงมาในขั้นตอนก่อนหน้าและคีย์ลับที่ Google ให้มา จากนั้น คำขอPOST
จะถูกส่งและตรวจสอบรหัสสถานะ หากไม่สำเร็จก็จะส่งกลับ หากสำเร็จ จะยกเลิกการตอบกลับโดยใช้วิธีการช่วยเหลือ Deserialize และGRecaptchaResponse
ที่กำหนดไว้ในภายหลัง จากนั้นจะสร้างออบเจ็กต์ValidateFormSubmissionResponse
ใหม่ ทำให้เป็นอนุกรม และตั้งค่าเป็นค่าของพารามิเตอร์เอาต์พุตmsdynmkt_validationresponse
ซึ่งเป็นบริการหนึ่งของ Microsoft ที่ใช้เพื่อยอมรับหรือปฏิเสธการส่ง การเพิ่มสตริงg-recaptcha-response
ในรายการValidationOnlyFields
จะเป็นการซ่อนฟิลด์นี้จากการส่งฟอร์มใน UIเพิ่มรหัสต่อไปนี้เพื่อกำหนดวิธีการช่วยเหลือ 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; }
เพิ่มโค้ดต่อไปนี้เพื่อกำหนดคลาสที่จำเป็นสำหรับออบเจ็กต์สตริง JSON ของ Serialize/Deserialize
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 ลงชื่อและสร้างปลั๊กอิน
- คลิกขวาที่โครงการและเลือก คุณสมบัติ ใน ตัวสำรวจโซลูชัน
- เลือกแท็บ ลงชื่อ และทำเครื่องหมายที่กล่องทำเครื่องหมาย ลงชื่อแอสเซมบลี
- เลือก
<New...>
- ป้อนชื่อไฟล์คีย์และยกเลิกการเลือก ป้องกันไฟล์คีย์ของฉันด้วยรหัสผ่าน
- สร้างโครงการ
- คุณจะพบแอสเซมบลีปลั๊กอิน
CustomValidationPlugin.dll
ใน\bin\Debug
3.4 ลงทะเบียนปลั๊กอิน
- เปิด
PluginRegistration.exe
- เลือก สร้างการเชื่อมต่อใหม่
- เลือก Office 365
- เลือกเข้าสู่ระบบ
- เลือก ลงทะเบียน และจากนั้น ลงทะเบียนแอสเซมบลีใหม่
- เลือกปุ่ม (...) ในขั้นตอนที่ 1 และเลือก dll ที่สร้างขึ้นในขั้นตอนก่อนหน้า
- เลือก ลงทะเบียนปลั๊กอินที่เลือก
3.4 ขั้นตอนลงทะเบียน
- เลือก CustomValidationPlugin จากรายการแอสเซมบลีที่ลงทะเบียน
- เลือก ลงทะเบียนขั้นตอนใหม่
- ป้อน
msdynmkt_validateformsubmission
ลงในฟิลด์ข้อความ - ตรวจสอบให้แน่ใจว่า โหมดการดำเนินการ ถูกตั้งค่าเป็น ซิงโครนัส
- ตรวจสอบให้แน่ใจว่า คำสั่งดำเนินการ ถูกตั้งค่าเป็น
10
- ตรวจสอบให้แน่ใจว่า ลำดับขั้นของไปป์ไลน์เหตุการณ์ของการดำเนินการ ตั้งค่าเป็น หลังการดำเนินการ
- เลือก ลงทะเบียนขั้นตอนใหม่
บทสรุป
เมื่อส่งฟอร์มที่มีแอตทริบิวต์ data-validate-submission
แล้ว ปลั๊กอินที่กำหนดเองของคุณจะเรียกใช้และตรวจสอบการตอบสนองของ reCAPTCHA กับบริการของ Google ปลั๊กอินแบบกำหนดเองจะทำงานหลังจากปลั๊กอินการตรวจสอบความถูกต้องเริ่มต้นของ Microsoft หากไม่มีฟิลด์ Microsoft captcha ในฟอร์ม ปลั๊กอิน Microsoft จะตั้งค่า IsValid:false
และการส่งจะล้มเหลว เว้นแต่คุณจะเขียนทับด้วย IsValid:true