Настройка проверки отправки форм
Проверка на стороне клиента в маркетинговых формах и формах регистрации на события помогает убедиться в достоверности данных, предоставленных клиентом. Однако в некоторых случаях может потребоваться более сложная проверка. Например, вам может потребоваться сравнить отправленные данные с данными, уже существующими в вашей системе. Чтобы упростить сложную проверку, в этой статье подробно описывается, как можно создать пользовательский подключаемый модуль для проверки отправленных данных на серверной части и запуска дополнительной логики обработки данных.
Создайте подключаемый модуль
Заметка
Этот пример пользовательского подключаемого модуля показывает, как создать внутреннюю проверку для ключа reCAPTCHA. Это может послужить источником вдохновения для процесса проверки. Если вы хотите интегрировать reCAPTCHA в свою форму, вы можете использовать готовый подключаемый модуль и следовать этому руководству.
Создайте проект Visual Studio для подключаемого модуля
- Откройте Visual Studio и создайте новый проект библиотеки классов, используя .NET Framework 4.6.2.
- В обозревателе решений выберите Управление пакетами NuGet и установите
Microsoft.CrmSdk.CoreAssemblies
.
Создайте класс подключаемого модуля
Переименуйте
Class1.cs
вCustomValidationPlugin.cs
.Сделайте класс CustomValidationPlugin наследником интерфейса IPlugin и добавьте метод Execute.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Чтобы получить контекст и службу трассировки, добавьте следующий код в метод 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)); }
Добавьте этот код, чтобы получить строку параметра отправки формы. Это строка в кодировке JSON, представляющая поля, отправленные пользователем в форму. Этот процесс извлекает строку и десериализует ее с помощью вспомогательного метода десериализации и класса FormSubmissionRequest, который будет определен позже. Этот код проверяет, содержит ли массив полей ключ для 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; }
Добавьте следующий код для возврата, если значение
g-recaptcha-token
равно null или пустое.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Добавьте следующий код, чтобы проверить токен Google captcha относительно 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
скрывает это поле от отправки формы в пользовательском интерфейсе.Добавьте следующий код, чтобы определить вспомогательные методы 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.
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; } }
Подпишите подключаемый модуль и выполните его сборку
- Щелкните проект правой кнопкой мыши и выберите Свойства в Обозревателе решений.
- Выберите вкладку Подписание и установите флажок Подписать сборку.
- Выберите параметр
<New...>
. - Введите имя файла ключа и снимите флажок Защитить мой файл ключей паролем.
- Выполните сборку проекта.
- Вы можете найти сборку подключаемого модуля
CustomValidationPlugin.dll
в папке\bin\Debug
.
Зарегистрируйте подключаемый модуль
- Открыть
PluginRegistration.exe
. - Выберите Создать новое подключение.
- Выберите Office 365.
- Выберите Войти.
- Выберите Зарегистрировать, затем Зарегистрировать новую сборку.
- Выберите кнопку (...) на шаге 1 и выберите библиотеку dll, созданную на предыдущих шагах.
- Выберите Зарегистрировать выбранный подключаемый модуль.
Регистрация шага
- Выберите CustomValidationPlugin из списка зарегистрированных сборок.
- Выберите Зарегистрировать новый шаг.
- Введите
msdynmkt_validateformsubmission
в текстовом поле сообщения. - Убедитесь, что для параметра Режим выполнения установлено значение Синхронный.
- Убедитесь, что для параметра Порядок выполнения установлено значение
10
. - Убедитесь, что для параметра Стадия выполнения конвейера событий задано значение После операции.
- Выберите Зарегистрировать новый шаг.
Заключение
При отправке формы с атрибутом data-validate-submission
ваш настраиваемый подключаемый модуль запускается и проверяет ответ reCAPTCHA с помощью служб Google. Пользовательский подключаемый модуль запускается после подключаемого модуля проверки Microsoft по умолчанию. Если в форме нет полей Microsoft Captcha, подключаемый модуль Microsoft устанавливает IsValid:false
, и отправка завершается неудачно, если вы не перезапишете это значение значением IsValid:true
.