Newer Version Available

This content describes an older version of this product. View Latest

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.

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.

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}