共用方式為


自訂表單提交驗證

行銷和事件註冊表單中的用戶端驗證有助於確保客戶所提交資料的有效性。 不過,在某些情況下,您可能需要更複雜的驗證。 例如,您可能需要將提交的資料與系統中已存在的資料進行比較。 為便於進行複雜的驗證,本文詳細說明如何建置自訂外掛程式以驗證後端提交的資料並觸發額外的資料處理邏輯。

建立外掛程式

注意

這個自訂外掛程式範例展示如何建置 reCAPTCHA 金鑰的後端驗證。 這可為您實作驗證流程提供啟示。 如果要將 reCAPTCHA 整合至表單,您可以使用預建外掛程式,並遵循本指南

建立外掛程式的 Visual Studio 專案

  1. 開啟 Visual Studio,並使用 .NET Framework 4.6.2 建立新的類別庫專案。
  2. 方案總管中,選取管理 NuGet 套件,並安裝 Microsoft.CrmSdk.CoreAssemblies

建立外掛程式類別

  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 編碼字串,表示使用者在表單中提交的欄位。 此程序會擷取字串,並使用還原序列化協助程式方法以及稍後定義的 FormSubmitRequest 類別對其進行還原序列化。 此程式碼檢查欄位陣列是否包含 g-recaptcha-response 的金鑰。 如果找不到 reCAPTCHA 金鑰,則傳回跳過驗證,因為正在處理的表單不包含 recaptcha 元素。

    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 Captcha 權杖。

    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 要求,並檢查狀態碼,如果不成功則返回。 如果成功,則使用還原序列化協助程式方法和稍後定義的 GRecaptchaResponse 將回應還原序列化。 然後它會建立新 ValidateFormSubmissionResponse 物件、對其進行序列化,並將它設定為輸出參數 msdynmkt_validationresponse 的值,這是用來接受或拒絕提交的 Microsoft 服務。 將 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. 新增下列程式碼以定義序列化和還原序列化 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; }
     }
    

簽署並建置外掛程式

  1. 在專案上按一下滑鼠右鍵,然後在方案總管中選取屬性
  2. 選取簽署索引標籤,並選取 簽署組件核取方塊。
  3. 選取 <New...>
  4. 輸入金鑰檔案名稱,然後取消選取使用密碼保護金鑰檔案
  5. 組建專案。
  6. 您可以在 \bin\Debug 中找到外掛程式組件 CustomValidationPlugin.dll

註冊外掛程式

  1. 開啟 [PluginRegistration.exe]。
  2. 選取建立新連線
  3. 選擇 Office 365
  4. 選取登入
  5. 選取註冊,然後選取註冊新組件選取註冊,然後選取註冊新組件。
  6. 選取步驟 1 中的 (...) 按鈕,然後選取先前步驟中組建的 dll。
  7. 選取註冊選取的外掛程式

註冊步驟

  1. 從已註冊組件清單中選取 CustomValidationPlugin
  2. 選取註冊新步驟
  3. 在訊息文字欄位中輸入 msdynmkt_validateformsubmission
  4. 請確認執行模式已設定為同步請確認執行模式已設定為同步。
  5. 確定執行順序已設定為 10
  6. 請確定執行的事件準銷售案源階段已設定為 PostOperation
  7. 選取註冊新步驟

推論

提交具有 data-validate-submission 屬性的表單時,您的自訂外掛程式會執行並使用 Google 服務驗證 reCAPTCHA 回應。 自訂外掛程式會在預設 Microsoft 驗證外掛程式之後執行。 如果表單中沒有 Microsoft Captcha 欄位,除非您用 IsValid:true覆寫,否則 Microsoft 外掛程式會設定為 IsValid:false 且提交失敗。

驗證流程。