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.
PaymentGatewayAsyncAdapter Interface
Namespace
Usage
Implementing an asynchronous adapter also requires the processNotification method from the GatewayNotificationResponse class.
Example
1global with sharing class SampleAsyncAdapter
2 implements commercepayments.PaymentGatewayAsyncAdapter,
3 commercepayments.PaymentGatewayAdapter {
4
5 global SampleAsyncAdapter() {
6 }
7
8 global commercepayments.GatewayResponse processRequest(
9 commercepayments.paymentGatewayContext gatewayContext) {
10 }
11
12 global commercepayments.GatewayNotificationResponse processNotification(
13 commercepayments.PaymentGatewayNotificationContext gatewayNotificationContext) {
14 }
15 }PaymentGatewayAsyncAdapter Methods
The following are methods for PaymentGatewayAsyncAdapter.
processNotification(paymentGatewayNotificationContext)
Signature
global commercepayments.GatewayNotificationResponse processNotification(commercepayments.PaymentGatewayNotificationContext var1)
Parameters
- paymentGatewayNotificationContext: Type: PaymentGatewayNotificationContext The PaymentGatewayNotificationContext object wraps all the information related to a gateway notification.
Return Value
Type: GatewayNotificationResponse
When the payment gateway sends a notification to the payments platform, the platform responds with a GatewayNotificationResponse indicating whether the platform succeeded or failed at receiving the notification.
PaymentGatewayAsyncAdapter Example Implementation
This is a sample implementation of the commercepayments.PaymentGatewayAsyncAdapter interface.
1global with sharing class AdyenAdapter implements commercepayments.PaymentGatewayAsyncAdapter, commercepayments.PaymentGatewayAdapter {
2 global AdyenAdapter() {}
3
4 global commercepayments.GatewayResponse processRequest(commercepayments.paymentGatewayContext gatewayContext) {
5 }
6
7 global commercepayments.GatewayNotificationResponse processNotification(commercepayments.PaymentGatewayNotificationContext gatewayNotificationContext) {
8 }
9}
10
11commercepayments.RequestType requestType = gatewayContext.getPaymentRequestType();
12if (requestType == commercepayments.RequestType.Capture) {
13 req.setEndpoint('/pal/servlet/Payment/v52/capture');
14 body = buildCaptureRequest((commercepayments.CaptureRequest)gatewayContext.getPaymentRequest());
15} else if (requestType == commercepayments.RequestType.ReferencedRefund) {
16 req.setEndpoint('/pal/servlet/Payment/v52/refund');
17 body = buildRefundRequest((commercepayments.ReferencedRefundRequest)gatewayContext.getPaymentRequest());
18}
19
20req.setBody(body);
21req.setMethod('POST');
22commercepayments.PaymentsHttp http = new commercepayments.PaymentsHttp();
23HttpResponse res = null;
24try {
25 res = http.send(req);
26} catch(CalloutException ce) {
27 commercepayments.GatewayErrorResponse error = new commercepayments.GatewayErrorResponse('500', ce.getMessage());
28 return error;
29}
30
31if ( requestType == commercepayments.RequestType.Capture) {
32 response = createCaptureResponse(res);
33} else if ( requestType == commercepayments.RequestType.ReferencedRefund) {
34 response = createRefundResponse(res);
35}
36return response;
37
38commercepayments.PaymentGatewayNotificationRequest notificationRequest = gatewayNotificationContext.getPaymentGatewayNotificationRequest();
39Blob request = notificationRequest.getRequestBody();
40Map<String, Object> jsonReq = (Map<String, Object>)JSON.deserializeUntyped(request.toString());
41List<Object> notificationItems = (List<Object>)jsonReq.get('notificationItems');
42Map<String, Object> notificationRequestItem =
43 (Map<String, Object>)((Map<String, Object>)notificationItems[0]).get('NotificationRequestItem');
44Boolean success = Boolean.valueOf(notificationRequestItem.get('success'));
45String pspReference = (String)notificationRequestItem.get('pspReference');
46String eventCode = (String)notificationRequestItem.get('eventCode');
47Double amount = (Double)((Map<String, Object>)notificationRequestItem.get('amount')).get('value');
48
49commercepayments.NotificationStatus notificationStatus = null;
50if (success) {
51 notificationStatus = commercepayments.NotificationStatus.Success;
52} else {
53 notificationStatus = commercepayments.NotificationStatus.Failed;
54}
55commercepayments.BaseNotification notification = null;
56if ('CAPTURE'.equals(eventCode)) {
57 notification = new commercepayments.CaptureNotification();
58} else if ('REFUND'.equals(eventCode)) {
59 notification = new commercepayments.ReferencedRefundNotification();
60}
61notification.setStatus(notificationStatus);
62notification.setGatewayReferenceNumber(pspReference);
63notification.setAmount(amount);
64
65commercepayments.NotificationSaveResult saveResult = commercepayments.NotificationClient.record(notification);
66
67commercepayments.GatewayNotificationResponse gnr = new commercepayments.GatewayNotificationResponse();
68if (saveResult.isSuccess()) {
69 system.debug('Notification accepted by platform');
70} else {
71 system.debug('Errors in the result '+ Blob.valueOf(saveResult.getErrorMessage()));
72}
73gnr.setStatusCode(200);
74gnr.setResponseBody(Blob.valueOf('[accepted]'));
75return gnr;