Note: This release is in preview. Features described here don’t become generally available until the latest general availability date that Salesforce announces for this release. Before then, and where features are noted as beta, pilot, or developer preview, we can’t guarantee general availability within any particular time frame or at all. Make your purchase decisions only on the basis of generally available products and features.
IdentityVerificationExt Interface
Namespace
Usage
The id_verification.IdentityVerificationExt interface is called by the Verify Customer Identity flow.
1public class IdentityVerificationExtImpl implements id_verification.IdentityVerificationExt{}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}IdentityVerificationExt Methods
The following are methods for IdentityVerificationExt.
getVerifiers(var1)
Signature
public id_verification.VerificationContext getVerifiers(id_verification.VerificationContext var1)
1id_verification.IdentityVerificationExt, getVerifiers, [id_verification.VerificationContext], id_verification.VerificationContextParameters
- 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)
1id_verification.IdentityVerificationExt, search, [id_verification.SearchRequest], id_verification.SearchResultParameters
- 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.
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}