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:

1public class IdentityVerificationExtImpl implements id_verification.IdentityVerificationExt{}

Next, your class must also provide implementation for the following methods:

1public id_verification.SearchResult search(id_verification.SearchRequest searchRequest){
2 //Your code here
3}
4
5public id_verification.VerificationContext getVerifiers(id_verification.VerificationContext verificationContext){
6 //Your code here
7}
8
9public id_verification.ProcessDetail getProcessDetail(id_verification.ProcessDetail processDetail){
10 //Your code here
11}

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.

  • search(var1)

    Returns the search result that includes the verification data.

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.

Return Value 

Type: id_verification.VerificationContext

search(var1) 

Returns the search result that includes the verification data.

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 

Type: id_verification.SearchRequest

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.

1public class MockIdentityVerificationExt implements id_verification.IdentityVerificationExt {
2    public id_verification.SearchResult search(id_verification.SearchRequest searchRequest) {
3        id_verification.SearchResult searchResult = MockIdentityVerificationExtHelper.getDefaultSearchResult(
4            searchRequest.searchTerm, searchRequest.searchFilters);
5        return searchResult;
6    }
7
8    public id_verification.VerificationContext getVerifiers(id_verification.VerificationContext verificationContext) {
9        id_verification.VerificationContext context = MockIdentityVerificationExtHelper.getVerificationContext();
10        return context;
11    }
12
13    public id_verification.ProcessDetail getProcessDetail(id_verification.ProcessDetail processDetail) {
14        return MockIdentityVerificationExtHelper.getAccountProcessDetail(null, null);
15    }
16}
1public class MockIdentityVerificationExtHelper {
2
3    // Mock records for search, in an ideal implementation these values will come from an API call
4    private static List <String[]> mockDb = new List<String[]> {
5        //MockAccountName, MockAccountNumber, MockPhone, MockPostalCode
6        new String[] {'James Smith', '263872', '4156546635', '94117'},
7        new String[] {'Michelle Smith', '123872', '3237654456', '56400'},
8        new String[] {'Robert Smith', '329478', '6548987709', '56410'},
9        new String[] {'David Smith', '428476', '6099176652', '08701'},
10        new String[] {'Mary Smith', '238476', '6155123342', '08790'},
11        new String[] {'Maria Garcia', '349872', '4156754040', '94108'},
12        new String[] {'Lee Hartman', '949857', '6457833434', '94110'}
13    };
14
15    public static id_verification.SearchResult getDefaultSearchResult(String searchTerm, List < id_verification.FieldValue > searchFilters) {
16        id_verification.SearchResult searchResult = new id_verification.SearchResult();
17        searchResult.searchResultHeaders = getSearchResultHeaders();
18        searchResult.searchResultRows = getSearchResultRows(searchTerm, searchFilters);
19        return searchResult;
20    }
21
22    private static List <id_verification.SearchResultHeader> getSearchResultHeaders() {
23        List <id_verification.SearchResultHeader> searchResultHeaders = new List <id_verification.SearchResultHeader>();
24
25        id_verification.SearchResultHeader nameHeader = new id_verification.SearchResultHeader();
26        nameHeader.developerName = 'MockName';
27        nameHeader.displayLabel = 'Name';
28        nameHeader.dataType = 'Name';
29        searchResultHeaders.add(nameHeader);
30
31        id_verification.SearchResultHeader accountNoHeader = new id_verification.SearchResultHeader();
32        accountNoHeader.developerName = 'MockAccountNo';
33        accountNoHeader.displayLabel = 'Account #';
34        accountNoHeader.dataType = 'Text';
35        searchResultHeaders.add(accountNoHeader);
36
37        return searchResultHeaders;
38    }
39
40    private static List <id_verification.SearchResultRow> getSearchResultRows(String searchTerm, List < id_verification.FieldValue > searchFilters) {
41        List <id_verification.SearchResultRow> searchResultRows = new List <id_verification.SearchResultRow>();
42
43        for (String[] row : mockDb) {
44            id_verification.SearchResultRow resultRow = new id_verification.SearchResultRow();
45            List <id_verification.FieldValue> fieldValues = new List <id_verification.FieldValue>();
46
47            Boolean found = false;
48
49            if (!String.isBlank(searchTerm)) { // Text Based Search else block can hold logic for object based search
50                found = textBasedSearch(searchTerm, row);
51            }
52
53            if (found) {
54                id_verification.FieldValue fieldValue = new id_verification.FieldValue();
55                fieldValue.developerName = 'MockAccountName';
56                fieldValue.value = row[0];
57                fieldValues.add(fieldValue);
58
59                fieldValue = new id_verification.FieldValue();
60                fieldValue.developerName = 'MockAccountNumber';
61                fieldValue.value = row[1];
62                fieldValues.add(fieldValue);
63
64                fieldValue = new id_verification.FieldValue();
65                fieldValue.developerName = 'MockPhone';
66                fieldValue.value = row[2];
67                fieldValues.add(fieldValue);
68
69                fieldValue = new id_verification.FieldValue();
70                fieldValue.developerName = 'MockPostalCode';
71                fieldValue.value = row[3];
72                fieldValues.add(fieldValue);
73
74                resultRow.searchResultFieldValues = fieldValues;
75                searchResultRows.add(resultRow);
76            }
77        }
78        return searchResultRows;
79    }
80
81    private static Boolean textBasedSearch(String searchTerm, String[] row) {
82        Boolean found = false;
83        List<String> terms = searchTerm.split(' ');
84        String allTxt = '';
85
86        for (String col : row) {
87            allTxt = allTxt + ' ' + col;
88        }
89
90        for (String term : terms) {
91            if (allTxt.toLowercase().contains(term.toLowercase())) {
92                found = true;
93            } else {
94                found = false;
95                break;
96            }
97        }
98        return found;
99    }
100
101    public static id_verification.VerificationContext getVerificationContext() {
102        id_verification.VerificationContext context = new id_verification.VerificationContext();
103        context.selectedSearchResult = new id_verification.SelectedSearchResult();
104        context.verifiedResult = new id_verification.VerifiedResult();
105        context.message = 'Success!';
106        context.isSuccess = true;
107
108        context.processDefinition = new id_verification.ProcessDefinition();
109        context.processDefinition.layoutType = 'Tab';
110        context.processDefinition.processDetail = new List <id_verification.ProcessDetail>();
111
112        context.processDefinition.processDetail.add(getAccountProcessDetail(context.selectedSearchResult, context.verifiedResult));
113        return context;
114    }
115
116    /* This method will return static/mock values for the context, these values can also be
117    pulled from the setup entities for Identity Verification
118    */
119    public static id_verification.ProcessDetail getAccountProcessDetail(
120        id_verification.SelectedSearchResult selectedSearchResult, id_verification.VerifiedResult verifiedResult) {
121        Integer numberOfOptionalVerifiers = 1;
122        id_verification.ProcessDetail accountProcessDetail = new id_verification.ProcessDetail();
123        accountProcessDetail.developerName = 'External_Process_Detail';
124        accountProcessDetail.label = 'External Process Detail';
125        accountProcessDetail.dataSourceType = 'External';
126        accountProcessDetail.searchObjectName = 'Account';
127        accountProcessDetail.searchSequenceNo = 1;
128        accountProcessDetail.searchType = 'Object-Based';
129        accountProcessDetail.searchResultUniqueIdField = 'MockAccountNo';
130        accountProcessDetail.searchResultFilter = '';
131        accountProcessDetail.searchResultSortOrder = '';
132        accountProcessDetail.optionalVerifierCount = 2;
133        //This should be the ID of the apex class implementing the interface
134        accountProcessDetail.apexClassName = '01pRM0000002iUX';
135        accountProcessDetail.verificationProcessFieldList = new id_verification.VerificationProcessFieldList();
136        accountProcessDetail.verificationProcessFieldList.verificationProcessFields = getAccountProcessFields(selectedSearchResult, verifiedResult, numberOfOptionalVerifiers);
137
138        return accountProcessDetail;
139    }
140
141    // This method does not populate all fields, this is just an example.
142    public static List < id_verification.VerificationProcessField > getAccountProcessFields(id_verification.SelectedSearchResult selectedSearchResult, id_verification.VerifiedResult verifiedResult, Integer numberOfOptionalVerifiers) {
143        List < id_verification.VerificationProcessField > processFields = new List < id_verification.VerificationProcessField >();
144
145        List < id_verification.FieldValue > selectedRecordFieldValues = new List < id_verification.FieldValue >();
146        List < id_verification.Verifier > requiredVerifiers = new List <id_verification.Verifier>();
147        List < id_verification.Verifier > optionalVerifiers = new List <id_verification.Verifier>();
148
149        List < id_verification.FieldValue > selectedPlaceholderOptionalFieldValues = new List < id_verification.FieldValue >();
150        List < id_verification.VerificationProcessField > optionalVerifierProcessFields = setOptionalVerifierProcessFields(selectedPlaceholderOptionalFieldValues);
151
152        id_verification.VerificationProcessField nameRequiredField = new id_verification.VerificationProcessField();
153        nameRequiredField.dataSourceType = 'External';
154        nameRequiredField.dataType = 'Name';
155        nameRequiredField.developerName = 'MockAccountName';
156        nameRequiredField.fieldName = 'Name';
157        nameRequiredField.fieldType = 'requiredVerifier';
158        nameRequiredField.label = 'AccountName';
159        processFields.add(nameRequiredField);
160
161        id_verification.FieldValue nameRequiredSelectedRecord = new id_verification.FieldValue();
162        nameRequiredSelectedRecord.developerName = nameRequiredField.developerName;
163        nameRequiredSelectedRecord.value = 'Monica Green';
164        selectedRecordFieldValues.add(nameRequiredSelectedRecord);
165        requiredVerifiers.add(new id_verification.Verifier(nameRequiredField.developerName, 'unset'));
166
167        id_verification.VerificationProcessField accountNumberRequiredField = new id_verification.VerificationProcessField();
168        accountNumberRequiredField.dataSourceType = 'External';
169        accountNumberRequiredField.dataType = 'Text';
170        accountNumberRequiredField.developerName = 'MockAccountNumber';
171        accountNumberRequiredField.fieldName = 'AccountNumber';
172        accountNumberRequiredField.fieldType = 'requiredVerifier';
173        accountNumberRequiredField.label = 'AccountNumber';
174        processFields.add(accountNumberRequiredField);
175
176        id_verification.FieldValue accountNumberRequiredSelectedRecord = new id_verification.FieldValue();
177        accountNumberRequiredSelectedRecord.developerName = accountNumberRequiredField.developerName;
178        accountNumberRequiredSelectedRecord.value = '923384';
179        selectedRecordFieldValues.add(accountNumberRequiredSelectedRecord);
180        requiredVerifiers.add(new id_verification.Verifier(accountNumberRequiredField.developerName, 'unset'));
181
182        selectedSearchResult.selectedRecordObject = selectedRecordFieldValues;
183
184        for (Integer i =0; i< optionalVerifierProcessFields.size(); i++) {
185            processFields.add(optionalVerifierProcessFields.get(i));
186            selectedRecordFieldValues.add(selectedPlaceholderOptionalFieldValues.get(i));
187            optionalVerifiers.add(new id_verification.Verifier(optionalVerifierProcessFields.get(i).developerName, 'unset'));
188        }
189        verifiedResult.requiredVerifiers = requiredVerifiers;
190        verifiedResult.optionalVerifiers = optionalVerifiers;
191
192        return processFields;
193    }
194
195    public static List < id_verification.VerificationProcessField > setOptionalVerifierProcessFields(List < id_verification.FieldValue > selectedPlaceholderValues) {
196        List < id_verification.VerificationProcessField > optionalVerifierProcessFields = new List < id_verification.VerificationProcessField >();
197
198        id_verification.VerificationProcessField postalCodeOptionalField = new id_verification.VerificationProcessField();
199        postalCodeOptionalField.dataSourceType = 'External';
200        postalCodeOptionalField.dataType = 'Text';
201        postalCodeOptionalField.developerName = 'MockPostalCode';
202        postalCodeOptionalField.fieldName = 'BillingPostalCode';
203        postalCodeOptionalField.fieldType = 'optionalVerifier';
204        postalCodeOptionalField.label = 'Zip Code';
205        optionalVerifierProcessFields.add(postalCodeOptionalField);
206
207        selectedPlaceholderValues.add(new id_verification.FieldValue(postalCodeOptionalField.developerName, '94117'));
208
209        id_verification.VerificationProcessField birthdateOptionalField = new id_verification.VerificationProcessField();
210        birthdateOptionalField.dataSourceType = 'External';
211        birthdateOptionalField.dataType = 'Text';
212        birthdateOptionalField.developerName = 'MockBirthdate';
213        birthdateOptionalField.fieldName = 'Birthdate';
214        birthdateOptionalField.fieldType = 'optionalVerifier';
215        birthdateOptionalField.label = 'Date of Birth';
216        optionalVerifierProcessFields.add(birthdateOptionalField);
217
218        selectedPlaceholderValues.add(new id_verification.FieldValue(birthdateOptionalField.developerName, '05/18/1986'));
219
220        return optionalVerifierProcessFields;
221    }
222}

The following example tests the implementation:

1@isTest
2private class MockIdentityVerificationExtTest {
3   static testMethod void getSearchResults() {
4        MockIdentityVerificationExt mock = new MockIdentityVerificationExt();
5        id_verification.SearchRequest searchRequest= new id_verification.SearchRequest('Smith',null,null);
6        mock.search(searchRequest);
7   }
8
9   static testMethod void getVerificationContext() {
10        MockIdentityVerificationExt mock = new MockIdentityVerificationExt();
11        //To keep it simple here, we are passing null in the paramater & returning a default mock context
12        mock.getVerifiers(null);
13   }
14}