Newer Version Available

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

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}