Use Saved Payment Method in Sale Transactions

After you create a Saved Payment Method (SPM), you can use it for Sale transactions by implementing the sale request processing in a class that implements commercepayments.PaymentGatewayAdapter.

If the SPM record is created with a Type value of ExtendedAPM or ExtendedWallet and includes an ExtendedPaymentMethodType, you can access these fields in the Sale request with the Apex layer using a query like the following:

1private static SavedPaymentMethod fetchSavedPaymentMethod(Id idToProcess) {
2    QueryUtils q = new QueryUtils(SavedPaymentMethod.SObjectType);
3    q.getSelectClause().addField('GatewayToken', false);
4    q.getSelectClause().addField('GatewayReference', false);
5    q.getSelectClause().addField('ExtendedPaymentMethodType', false);
6    q.getSelectClause().addField('type', false);
7    q.setWhereClause(' WHERE Id = \'' + idToProcess + '\'');
8    return (SavedPaymentMethod) Database.query(q.buildSOQL())[0];
9}
10
11//Sample Adyen sale transaction request.
12private String buildSaleRequest(commercepayments.SaleRequest saleRequest) {
13    String currencyIso = saleRequest.currencyIsoCode;
14    commercepayments.SaleApiPaymentMethodRequest paymentMethod = saleRequest.paymentMethod;
15    if (currencyIso == null) {
16        currencyIso = UserInfo.getDefaultCurrency();
17    }
18    JSONGenerator jsonGeneratorInstance = JSON.createGenerator(true);
19    jsonGeneratorInstance.writeStartObject();
20    jsonGeneratorInstance.writeStringField('merchantAccount', '{!$Credential.Username}');
21    jsonGeneratorInstance.writeStringField('reference', String.valueOf(Datetime.now().getTime()) + String.valueOf(Math.random()).substring(2, 8));
22
23    jsonGeneratorInstance.writeFieldName('amount');
24    jsonGeneratorInstance.writeStartObject();
25    jsonGeneratorInstance.writeStringField('value', String.ValueOf((saleRequest.amount * 100.0).intValue()));
26    jsonGeneratorInstance.writeStringField('currency', currencyIso);
27    jsonGeneratorInstance.writeEndObject();
28
29    jsonGeneratorInstance.writeFieldName('paymentMethod');
30    jsonGeneratorInstance.writeStartObject();
31    String shopperReference;
32    String token;
33    String type = 'scheme';
34    Id idToProcess = saleRequest.paymentMethod.id;
35    Map < String, String > paymentTypeMap = new Map < String, String > {
36        'us_bank_account' => 'ach',
37        'sepa_debit' => 'sepadirectdebit',
38        'au_becs_debit' => 'directdebit_AU',
39        'bacs_debit' => 'directdebit_GB',
40        'amazon_pay' => 'amazonpay',
41        'googlepay' => 'paywithgoogle'
42    };
43    if (idToProcess.getSObjectType() == SavedPaymentMethod.SObjectType) {
44        SavedPaymentMethod savedPaymentMethod = fetchSavedPaymentMethod(idToProcess);
45        token = savedPaymentMethod.GatewayToken;
46        shopperReference = savedPaymentMethod.GatewayReference;
47        String paymentMethodType = savedPaymentMethod.type;
48        String extendedPaymentMethodType = savedPaymentMethod.ExtendedPaymentMethodType;
49        System.debug('Queried SPM record for QA override');
50        type = determinePaymentType(paymentMethodType, extendedPaymentMethodType, paymentTypeMap);
51    }
52    // Common JSON field population
53    jsonGeneratorInstance.writeStringField('type', type);
54    jsonGeneratorInstance.writeStringField('storedPaymentMethodId', token);
55    jsonGeneratorInstance.writeEndObject();
56    jsonGeneratorInstance.writeStringField('shopperInteraction', 'ContAuth');
57    jsonGeneratorInstance.writeStringField('recurringProcessingModel', 'UnscheduledCardOnFile');
58    jsonGeneratorInstance.writeStringField('shopperReference', shopperReference);
59    //jsonGeneratorInstance.writeStringField('holderName', 'John Smith');
60    jsonGeneratorInstance.writeNumberField('captureDelayHours', 0);
61    jsonGeneratorInstance.writeEndObject();
62    return jsonGeneratorInstance.getAsString();
63}

See Also