Newer Version Available
Configuring Salesforce Billing to Read Your Mapping Metadata
After you’ve set up your mapping metadata, configure your payment gateway adapter
Apex class to read the gateway status and assign it to TransactionResult.
First, define a GatewayStatusType enum.
1global Enum GatewayStatusType { Success,
2 Decline,
3 ValidationError,
4 PermanentFail,
5 RequiresReview,
6 Indeterminate,
7 SystemError }
8
9// Set gatewayStatus
10global void setGatewayStatus(GatewayStatusType gatewayStatus)
11{
12 this.gatewayStatus = gatewayStatus;
13}
14
15// Get gatewayStatus
16global GatewayStatusType getGatewayStatus()
17{
18 return gatewayStatus;
19}Next, add code that reads your GatewayStatusMapping metadata and sets the correct gateway status in your TransactionResult object. Here’s one way you can configure it.
1private static Map<string, blng.TransactionResult.GatewayStatusType> mapGatewayStatusEnumTypesByStrings =
2 new Map<string, blng.TransactionResult.GatewayStatusType>();
3static {
4 List<blng.TransactionResult.GatewayStatusType> enumValues = blng.TransactionResult.GatewayStatusType.values();
5 for (Integer i = 0; i < enumValues.size(); i++) {
6 mapGatewayStatusEnumTypesByStrings.put(enumValues.get(i).name(), enumValues.get(i));
7 }
8}
9
10// default Gateway Status - It should be always Indeterminate to avoid duplicate payments
11private static final blng.TransactionResult.GatewayStatusType defaultGatewayStatus = blng.TransactionResult.GatewayStatusType.Indeterminate;
12
13/**
14* Does a SOQL lookup on the mapper table and gets the gateway status mapped to the return code
15* Returns the default enum if no match is found
16* @param transactionResult
17*/
18public void populateGatewayStatus(blng.TransactionResult transactionResult) {
19 blng.TransactionResult.GatewayStatusType gatewayStatus = defaultGatewayStatus;
20 String returnCode = transactionResult.getResponseCode();
21 if (returnCode != null) {
22 List<GatewayStatusMapping__mdt> gatewayStatusMaps = [
23 SELECT GatewayStatus__c
24 FROM GatewayStatusMapping__mdt
25 WHERE ResponseCode__c = :returnCode
26 LIMIT 1
27 ];
28 if (!gatewayStatusMaps.isEmpty()) {
29 gatewayStatus = mapGatewayStatusEnumTypesByStrings.get(gatewayStatusMaps.get(0).GatewayStatus__c);
30 if (gatewayStatus == null) {
31 gatewayStatus = defaultGatewayStatus;
32 }
33 }
34 }
35 transactionResult.setGatewayStatus(gatewayStatus);
36}