Dostosowywanie sprawdzania poprawności przesłania formularzy
Walidacja po stronie klienta w formularzach marketingowych i rejestracyjnych na wydarzenia pomaga zapewnić aktualność danych podanych przez klienta. Jednak w niektórych przypadkach może być potrzebna bardziej złożona weryfikacja. Na przykład może być konieczne porównanie przesłanych danych z danymi już istniejącymi w systemie. Aby ułatwić złożoną weryfikację, w tym artykule szczegółowo opisano sposób tworzenia niestandardowej wtyczki w celu weryfikowania przesłanych danych na zapleczu i wyzwalania dodatkowej logiki przetwarzania danych.
Utwórz plug-in
Notatka
Ten przykład niestandardowej wtyczki pokazuje, jak zbudować walidację zaplecza dla klucza reCAPTCHA. Może to służyć jako inspiracja dla przepływu walidacji. Jeśli chcesz zintegrować reCAPTCHA ze swoim formularzem, możesz użyć gotowej wtyczki i postępować zgodnie z tym przewodnikiem.
Tworzenie projektu Visual Studio dla dodatków plug-in
- Otwórz Visual Studio i utwórz nowy projekt biblioteki klas przy użyciu programu .NET Framework 4.6.2.
- W Eksploratorze rozwiązań wybierz pozycję Zarządzanie pakietami NuGet i zainstaluj
Microsoft.CrmSdk.CoreAssemblies
.
Tworzenie klasy dodatków plug-in
Zmień nazwę
Class1.cs
naCustomValidationPlugin.cs
.Spraw, by klasa CustomValidationPlugin dziedziczyła po interfejsie IPlugin i dodała metodę wykonania.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Aby pobrać kontekst i usługę śledzenia, dodaj następujący kod do metody 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)); }
Dodaj ten kod, aby pobrać ciąg parametru przesyłania formularza. Jest to zakodowany ciąg JSON reprezentujący pola przesłane przez użytkownika w formularzu. Ten proces pobiera ciąg i deserializuje go przy użyciu metody pomocnika deserialize i klasy FormSubmissionRequest zdefiniowanej później. Ten kod sprawdza, czy tablica fields zawiera klucz g-recaptcha-response. Jeśli klucz reCAPTCHA nie zostanie znaleziony, zwraca walidację pomijającą, ponieważ przetwarzany formularz nie zawierał elementu 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; }
Dodaj następujący kod, który ma zostać zwrócony
g-recaptcha-token
, jeśli wartość ma wartość null lub jest pusta.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Dodaj następujący kod, aby sprawdzić poprawność tokenu captcha google dla interfejsów 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}"); } }
Najpierw jest definiowany adres URL, a później tworzone jest wystąpienie
HttpClient
. Tworzony jest obiektFormUrlEncodedContent
zawierającyrecaptchaToken
pobrany w poprzednich krokach klucz tajny podany przez wyszukiwarkę Google. Następnie żądaniePOST
jest wysyłane i sprawdzany jest kod stanu, jeśli nie powiedzie się, powraca. Jeśli te działania się powiedzie, odpowiedź zostanie zdeserializowana przy użyciu metodyGRecaptchaResponse
i określonej później. Następnie tworzy nowy obiektValidateFormSubmissionResponse
, szereguje go i ustawia jako wartość parametru wyjściowegomsdynmkt_validationresponse
, czyli jednej usługi firmy Microsoft używanej do akceptowania lub odrzucania przesyłania. Dodanieg-recaptcha-response
ciągu doValidationOnlyFields
listy powoduje ukrycie tego pola przed przesłaniem formularza w interfejsie użytkownika.Aby metody pomocnika serializacji i deserializacji, należy dodać następujący kod.
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; }
Dodaj następujący kod, aby zdefiniować klasy potrzebne do serializacji i deserializacji obiektów ciągów 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; } }
Zarejestruj i skompiluj dodatek plug-in
- Kliknij prawym przyciskiem myszy projekt i wybierz polecenie Właściwości w Eksploratorze rozwiązań.
- Wybierz kartę Podpisanie i zaznacz pole wyboru Zarejestruj zestaw.
- Wybierz opcję
<New...>
. - Wprowadź nazwę pliku kluczowego i usuń zaznaczenie opcji Ochrona pliku kluczowego przy użyciu hasła.
- Skompiluj projekt.
- Można znaleźć zestaw dodatków plug-in
CustomValidationPlugin.dll
w\bin\Debug
.
Zarejestruj dodatek plug-in
- Otwórz
PluginRegistration.exe
. - Wybierz pozycję + Utwórz nowe połączenie.
- Wybierz Office 365.
- Wybierz Zaloguj.
- Wybierz opcję Zarejestruj , a następnie Zarejestruj nowy zestaw.
- Wybierz przycisk (...) w kroku 1 i wybierz plik dll skompilowany w poprzednich krokach.
- Wybierz przycisk Zarejestruj wybrany dodatek.
Zarejestruj krok
- Wybierz CustomValidationPlugin z listy zarejestrowanych zestawów.
- Wybierz pozycję Zarejestruj nowy krok.
- Wprowadź tekst
msdynmkt_validateformsubmission
w polu tekst. - Upewnij się , że tryb wykonywania jest ustawiony jako synchroniczny.
- Upewnij się, że Kolejność wykonania jest ustawiona na
10
. - Upewnij się, że Etap potoku zdarzenia wykonania jest ustawiony jako po operacji.
- Wybierz pozycję Zarejestruj nowy krok.
Podsumowanie
Po przesłaniu formularza z atrybutem data-validate-submission
niestandardowy dodatek plug-in uruchamia i sprawdza poprawność odpowiedzi reCAPTCHA w usługach Google. Wtyczka niestandardowa jest uruchamiana po domyślnej Microsoft wtyczce walidacji. Jeśli w formularzu nie ma pól captcha firmy Microsoft, zestawy dodatków plug-in firmy Microsoft IsValid:false
i przesyłanie zakończy się niepowodzeniem, o ile nie zostanie on zastąpione IsValid:true
.