IdentityVerificationExt Interface

The IdentityVerificationExt interface enables you to verify a caller’s identity.

Namespace

id_verification

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:
public class IdentityVerificationExtImpl implements id_verification.IdentityVerificationExt{}
Next, your class must also provide implementation for the following methods:
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
}
The method you implemented must be declared as global or public.

IdentityVerificationExt Methods

The following are methods for IdentityVerificationExt.

getVerifiers(var1)

Returns the verification data that contains the columns to be verified.

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.

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);
   }
}