Namespace
Usage
The id_verification.IdentityVerificationExt interface is called by the Verify Customer Identity flow.
To implement this interface, you must first declare a class with the implements keyword as
follows:
Next, your class must also provide implementation for the following methods:
The method you implemented must be declared as global or public.
public class IdentityVerificationExtImpl implements id_verification.IdentityVerificationExt{}
public id_verification.SearchResult search(id_verification.SearchRequest searchRequest){
//Your code here
}
public id_verification.VerificationContext getVerifiers(id_verification.VerificationContext verificationContext){
//Your code here
}
public id_verification.ProcessDetail getProcessDetail(id_verification.ProcessDetail processDetail){
//Your code here
}
IdentityVerificationExt Methods
The following are methods for IdentityVerificationExt.
getVerifiers(var1)
Signature
public id_verification.VerificationContext getVerifiers(id_verification.VerificationContext var1)
Parameters
- var1
- Type: id_verification.VerificationContext
- Contains information about the verification context, including the process definition, selected search result, selected verified result, and verified result.
Return Value
search(var1)
Signature
public id_verification.SearchResult search(id_verification.SearchRequest var1)
Parameters
- var1
- Type: id_verification.SearchRequest
- Contains information about the search request data. The search request represents search filters for object-based search, search terms for text-based search, and the verification context that includes the process definition, process details, and process fields.
Return Value
IdentityVerificationExt Example Implementation
This example shows an implementation of the id_verification.IdentityVerificationExt interface.
The MockIdentityVerificationExt implements the id_verification.IdentityVerificationExt interface and MockIdentityVerificationExtHelper contains the logic for each method.
public class MockIdentityVerificationExt implements id_verification.IdentityVerificationExt { public id_verification.SearchResult search(id_verification.SearchRequest searchRequest) { id_verification.SearchResult searchResult = MockIdentityVerificationExtHelper.getDefaultSearchResult( searchRequest.searchTerm, searchRequest.searchFilters); return searchResult; } public id_verification.VerificationContext getVerifiers(id_verification.VerificationContext verificationContext) { id_verification.VerificationContext context = MockIdentityVerificationExtHelper.getVerificationContext(); return context; } public id_verification.ProcessDetail getProcessDetail(id_verification.ProcessDetail processDetail) { return MockIdentityVerificationExtHelper.getAccountProcessDetail(null, null); } }
public class MockIdentityVerificationExtHelper { // Mock records for search, in an ideal implementation these values will come from an API call private static List <String[]> mockDb = new List<String[]> { //MockAccountName, MockAccountNumber, MockPhone, MockPostalCode new String[] {'James Smith', '263872', '4156546635', '94117'}, new String[] {'Michelle Smith', '123872', '3237654456', '56400'}, new String[] {'Robert Smith', '329478', '6548987709', '56410'}, new String[] {'David Smith', '428476', '6099176652', '08701'}, new String[] {'Mary Smith', '238476', '6155123342', '08790'}, new String[] {'Maria Garcia', '349872', '4156754040', '94108'}, new String[] {'Lee Hartman', '949857', '6457833434', '94110'} }; public static id_verification.SearchResult getDefaultSearchResult(String searchTerm, List < id_verification.FieldValue > searchFilters) { id_verification.SearchResult searchResult = new id_verification.SearchResult(); searchResult.searchResultHeaders = getSearchResultHeaders(); searchResult.searchResultRows = getSearchResultRows(searchTerm, searchFilters); return searchResult; } private static List <id_verification.SearchResultHeader> getSearchResultHeaders() { List <id_verification.SearchResultHeader> searchResultHeaders = new List <id_verification.SearchResultHeader>(); id_verification.SearchResultHeader nameHeader = new id_verification.SearchResultHeader(); nameHeader.developerName = 'MockName'; nameHeader.displayLabel = 'Name'; nameHeader.dataType = 'Name'; searchResultHeaders.add(nameHeader); id_verification.SearchResultHeader accountNoHeader = new id_verification.SearchResultHeader(); accountNoHeader.developerName = 'MockAccountNo'; accountNoHeader.displayLabel = 'Account #'; accountNoHeader.dataType = 'Text'; searchResultHeaders.add(accountNoHeader); return searchResultHeaders; } private static List <id_verification.SearchResultRow> getSearchResultRows(String searchTerm, List < id_verification.FieldValue > searchFilters) { List <id_verification.SearchResultRow> searchResultRows = new List <id_verification.SearchResultRow>(); for (String[] row : mockDb) { id_verification.SearchResultRow resultRow = new id_verification.SearchResultRow(); List <id_verification.FieldValue> fieldValues = new List <id_verification.FieldValue>(); Boolean found = false; if (!String.isBlank(searchTerm)) { // Text Based Search else block can hold logic for object based search found = textBasedSearch(searchTerm, row); } if (found) { id_verification.FieldValue fieldValue = new id_verification.FieldValue(); fieldValue.developerName = 'MockAccountName'; fieldValue.value = row[0]; fieldValues.add(fieldValue); fieldValue = new id_verification.FieldValue(); fieldValue.developerName = 'MockAccountNumber'; fieldValue.value = row[1]; fieldValues.add(fieldValue); fieldValue = new id_verification.FieldValue(); fieldValue.developerName = 'MockPhone'; fieldValue.value = row[2]; fieldValues.add(fieldValue); fieldValue = new id_verification.FieldValue(); fieldValue.developerName = 'MockPostalCode'; fieldValue.value = row[3]; fieldValues.add(fieldValue); resultRow.searchResultFieldValues = fieldValues; searchResultRows.add(resultRow); } } return searchResultRows; } private static Boolean textBasedSearch(String searchTerm, String[] row) { Boolean found = false; List<String> terms = searchTerm.split(' '); String allTxt = ''; for (String col : row) { allTxt = allTxt + ' ' + col; } for (String term : terms) { if (allTxt.toLowercase().contains(term.toLowercase())) { found = true; } else { found = false; break; } } return found; } public static id_verification.VerificationContext getVerificationContext() { id_verification.VerificationContext context = new id_verification.VerificationContext(); context.selectedSearchResult = new id_verification.SelectedSearchResult(); context.verifiedResult = new id_verification.VerifiedResult(); context.message = 'Success!'; context.isSuccess = true; context.processDefinition = new id_verification.ProcessDefinition(); context.processDefinition.layoutType = 'Tab'; context.processDefinition.processDetail = new List <id_verification.ProcessDetail>(); context.processDefinition.processDetail.add(getAccountProcessDetail(context.selectedSearchResult, context.verifiedResult)); return context; } /* This method will return static/mock values for the context, these values can also be pulled from the setup entities for Identity Verification */ public static id_verification.ProcessDetail getAccountProcessDetail( id_verification.SelectedSearchResult selectedSearchResult, id_verification.VerifiedResult verifiedResult) { Integer numberOfOptionalVerifiers = 1; id_verification.ProcessDetail accountProcessDetail = new id_verification.ProcessDetail(); accountProcessDetail.developerName = 'External_Process_Detail'; accountProcessDetail.label = 'External Process Detail'; accountProcessDetail.dataSourceType = 'External'; accountProcessDetail.searchObjectName = 'Account'; accountProcessDetail.searchSequenceNo = 1; accountProcessDetail.searchType = 'Object-Based'; accountProcessDetail.searchResultUniqueIdField = 'MockAccountNo'; accountProcessDetail.searchResultFilter = ''; accountProcessDetail.searchResultSortOrder = ''; accountProcessDetail.optionalVerifierCount = 2; //This should be the ID of the apex class implementing the interface accountProcessDetail.apexClassName = '01pRM0000002iUX'; accountProcessDetail.verificationProcessFieldList = new id_verification.VerificationProcessFieldList(); accountProcessDetail.verificationProcessFieldList.verificationProcessFields = getAccountProcessFields(selectedSearchResult, verifiedResult, numberOfOptionalVerifiers); return accountProcessDetail; } // This method does not populate all fields, this is just an example. public static List < id_verification.VerificationProcessField > getAccountProcessFields(id_verification.SelectedSearchResult selectedSearchResult, id_verification.VerifiedResult verifiedResult, Integer numberOfOptionalVerifiers) { List < id_verification.VerificationProcessField > processFields = new List < id_verification.VerificationProcessField >(); List < id_verification.FieldValue > selectedRecordFieldValues = new List < id_verification.FieldValue >(); List < id_verification.Verifier > requiredVerifiers = new List <id_verification.Verifier>(); List < id_verification.Verifier > optionalVerifiers = new List <id_verification.Verifier>(); List < id_verification.FieldValue > selectedPlaceholderOptionalFieldValues = new List < id_verification.FieldValue >(); List < id_verification.VerificationProcessField > optionalVerifierProcessFields = setOptionalVerifierProcessFields(selectedPlaceholderOptionalFieldValues); id_verification.VerificationProcessField nameRequiredField = new id_verification.VerificationProcessField(); nameRequiredField.dataSourceType = 'External'; nameRequiredField.dataType = 'Name'; nameRequiredField.developerName = 'MockAccountName'; nameRequiredField.fieldName = 'Name'; nameRequiredField.fieldType = 'requiredVerifier'; nameRequiredField.label = 'AccountName'; processFields.add(nameRequiredField); id_verification.FieldValue nameRequiredSelectedRecord = new id_verification.FieldValue(); nameRequiredSelectedRecord.developerName = nameRequiredField.developerName; nameRequiredSelectedRecord.value = 'Monica Green'; selectedRecordFieldValues.add(nameRequiredSelectedRecord); requiredVerifiers.add(new id_verification.Verifier(nameRequiredField.developerName, 'unset')); id_verification.VerificationProcessField accountNumberRequiredField = new id_verification.VerificationProcessField(); accountNumberRequiredField.dataSourceType = 'External'; accountNumberRequiredField.dataType = 'Text'; accountNumberRequiredField.developerName = 'MockAccountNumber'; accountNumberRequiredField.fieldName = 'AccountNumber'; accountNumberRequiredField.fieldType = 'requiredVerifier'; accountNumberRequiredField.label = 'AccountNumber'; processFields.add(accountNumberRequiredField); id_verification.FieldValue accountNumberRequiredSelectedRecord = new id_verification.FieldValue(); accountNumberRequiredSelectedRecord.developerName = accountNumberRequiredField.developerName; accountNumberRequiredSelectedRecord.value = '923384'; selectedRecordFieldValues.add(accountNumberRequiredSelectedRecord); requiredVerifiers.add(new id_verification.Verifier(accountNumberRequiredField.developerName, 'unset')); selectedSearchResult.selectedRecordObject = selectedRecordFieldValues; for (Integer i =0; i< optionalVerifierProcessFields.size(); i++) { processFields.add(optionalVerifierProcessFields.get(i)); selectedRecordFieldValues.add(selectedPlaceholderOptionalFieldValues.get(i)); optionalVerifiers.add(new id_verification.Verifier(optionalVerifierProcessFields.get(i).developerName, 'unset')); } verifiedResult.requiredVerifiers = requiredVerifiers; verifiedResult.optionalVerifiers = optionalVerifiers; return processFields; } public static List < id_verification.VerificationProcessField > setOptionalVerifierProcessFields(List < id_verification.FieldValue > selectedPlaceholderValues) { List < id_verification.VerificationProcessField > optionalVerifierProcessFields = new List < id_verification.VerificationProcessField >(); id_verification.VerificationProcessField postalCodeOptionalField = new id_verification.VerificationProcessField(); postalCodeOptionalField.dataSourceType = 'External'; postalCodeOptionalField.dataType = 'Text'; postalCodeOptionalField.developerName = 'MockPostalCode'; postalCodeOptionalField.fieldName = 'BillingPostalCode'; postalCodeOptionalField.fieldType = 'optionalVerifier'; postalCodeOptionalField.label = 'Zip Code'; optionalVerifierProcessFields.add(postalCodeOptionalField); selectedPlaceholderValues.add(new id_verification.FieldValue(postalCodeOptionalField.developerName, '94117')); id_verification.VerificationProcessField birthdateOptionalField = new id_verification.VerificationProcessField(); birthdateOptionalField.dataSourceType = 'External'; birthdateOptionalField.dataType = 'Text'; birthdateOptionalField.developerName = 'MockBirthdate'; birthdateOptionalField.fieldName = 'Birthdate'; birthdateOptionalField.fieldType = 'optionalVerifier'; birthdateOptionalField.label = 'Date of Birth'; optionalVerifierProcessFields.add(birthdateOptionalField); selectedPlaceholderValues.add(new id_verification.FieldValue(birthdateOptionalField.developerName, '05/18/1986')); return optionalVerifierProcessFields; } }
The following example tests the implementation:
@isTest private class MockIdentityVerificationExtTest { static testMethod void getSearchResults() { MockIdentityVerificationExt mock = new MockIdentityVerificationExt(); id_verification.SearchRequest searchRequest= new id_verification.SearchRequest('Smith',null,null); mock.search(searchRequest); } static testMethod void getVerificationContext() { MockIdentityVerificationExt mock = new MockIdentityVerificationExt(); //To keep it simple here, we are passing null in the paramater & returning a default mock context mock.getVerifiers(null); } }