Salesforce Commerce Cloud

Adyen provides a LINK cartridge to integrate with Salesforce Commerce Cloud (SCC). This cartridge enables a SCC store to use the Adyen payment service. This module is for ecommerce only. Merchants can integrate their in-store payments through any of our Point-of-Sale partners to offer a full omni-channel experience.

The developer has to install the cartridge and integrate it into online store following the instructions from this document. It is mandatory that the merchant has to open an account with Adyen and configure some items in Commerce Cloud Business Manager, as well as in the Adyen account to make the integration working properly.

Adyen offers a test environment, so the integration can be tested before switching to the Adyen production environment.

Compatibility

The integration is based on the Site Genesis demo store provided by Commerce Cloud.

Versions:

  • Commerce Cloud 17.1.0
  • SiteGenesis 103.1.3

Support

In case of problems with the integration or connection to Adyen, contact the Adyen Support Team or your Adyen account manager.

Supply as much information as possible: your merchant account, skin code, time, order number, PSP reference, etc.

Cartridge overview

The integration consists of an archive, which contains the following contents:

  • Cartridge called ‘int_adyen’, and optionally either 'int_adyen_pipelines' or  'int_adyen_controllers'  depending on which architecture is to be employed.
  • An extension cartridge to the Business Manager 'bm_adyen', which enables the display of Adyen-specific information in order details.
  • A site-template archive containing new attributes and settings.
  • An example 'skin', which is used for styling the Adyen hosted payment page (HPP).
  • An archive with standard storefront cartridges with Adyen integrated. They can be used as an example for the integration and testing the cartridge.

Functional overview

Adyen can receive payments in 2 ways:

  1. via the Adyen API using SOAP or POST, where a result is returned right away. This can only be used for Credit Cards. The cartridge uses POST via the Adyen REST API.
  2. via the "redirect model", where a form containing certain fields is posted to Adyen and a shopper is redirected to Adyen's Hosted Payment Page (HPP). After completing the payment, the shopper is returned to the shop's resultURL. This resultURL can be configured and contains the result of the payment (success or failed).

Compared to the API, the redirect model offers more payments methods as well as some other functionality, including reduced PCI SAQ exposure.

However, if you decide to handle credit card payments yourself, you can use API payments, which are implemented in the cartridge. The stored credit card data could be used for returning customers, saving them the trouble of entering their details again.

Payment results are sent asynchronously to a "notification URL" at the Merchant (SCC) site. Payments can change status over the time (Authorised, Refunded, Cancelled and others) on Adyen side, and these statuses are updated automatically on the Commerce Cloud side through sending these notifications.

In both cases the "two-phase ordering" approach is used, where the order is first created but only placed after a payment has been authorized (which is now standard behavior in Site Genesis). In case if the payment cannot be authorized, the order will fail.

Limitations and constraints

  • The merchant will need a configured Adyen account.
  • The merchant can style the Adyen HPP (skin), to make it matching the look and feel of their store. For more information, refer to HPP Manual.
  • Successful payment authorizations lead to a 'Paid' order payment status and 'Ready for Export' export status.
  • Refused payment authorizations lead to a 'Not Paid' order payment status, and 'Not Exported' export status.
  • Cancels and refunds lead to a 'Not Paid' order payment status (even if the status was 'Paid' before), and 'Not Exported' export status.
  • Refused payments have the status 'Refused' in the Adyen CA, but 'AUTHORISATION' Eventcode in Business Manager.
  • In the cartridge these API methods are implemented: 'Capture', 'Cancel Before Capture', and 'Cancel Or Refund'. The statuses require custom integration into the end site, they are optional functions and are not described in this document from a position of integration.
  • The AVS feature requires that all address forms of the site have two new fields 'Building number' and 'Street name' instead of the old field 'Address 1'. When AVS is enabled, all site forms should have two new fields, otherwise either the new or the old approach can be used. Also, 'Address 1' field has to be updated behind the scenes in order to not break existing site functionality. In this guide it is described how to change the Billing address form, it's an example of how should work all the other address forms of your site.
  • The cartridge makes use of the Adyen Hosted Client-Side Encryption library, other methods require additional customization.

Use cases

Registered and unregistered shoppers will be able to follow the standard Site Genesis flow with the following changes:

  • Adyen redirect, Adyen API and Gift Certificates (GC) will be the only payment options if Adyen redirect is enabled:
    • no entering of credit card details on the Billing page is possible when the user selects this payment method (as this is done on the Adyen HPP) and Directory Lookup feature is disabled
    • the possibility to choose one of the predefined payment methods on the Billing page with further redirection to Adyen HPP, if Directory Lookup is enabled and the user selected Adyen payment method
    • a redirect to Adyen HPP after clicking the 'SUBMIT ORDER' button on the Order Confirmation page (only if no GCs are used and/or they don't cover the whole amount)
    • a return to the SCC Order Summary page after successful payment authorization
    • a return to the SCC Order Confirmation page, if the user cancelled the payment on Adyen HPP
    • a return to the SCC Order Confirmation page with an error message displayed, if the payment was refused
  • If Adyen API payments are enabled:
    • credit card details are entered and stored in your SCC shop
    • for the other payment methods you can still redirect to the Adyen HPP, but can disable credit cards via the configuration of your skin
    • if the AVS feature is enabled, the user will see 2 new fields 'Suite' and 'Street' (or 'Building number' and 'Street name') on all address forms of the site, instead of field 'Address 1'

For specific examples, refer to Detailed use cases.

Privacy, payments

  • If only the redirect method is used, all payment data is entered into the Adyen HPP by the shopper and no Credit Card data will be stored inside Commerce Cloud (except the brand of used card)
  • The shoppers email address and shopper ID used in Commerce Cloud are sent to Adyen to allow 'recurring' and/or 'one click' payment

Integrating a cartridge

The following steps are needed to complete the integration:

  • Install the cartridges
  • Change and import 'site-template.zip' (system objects and custom objects)
  • Do the required code changes
  • Configure your merchant's Adyen Account in the Adyen back office
  • Configure Adyen parameters in Commerce Cloud
  • Configure and Enable Scheduled jobs.
  • Test
  • Create Skin for Adyen HPP

These steps should not require more than a few hours (creating the Skin can require several hours depending on complexity of styling).

Note that the name of your storefront site ID should match the name in the 'site-template.zip', otherwise you will get import errors.

Also, note that the payment methods 'Adyen' and 'Credit Card' and the payment processors 'Adyen' and 'ADYEN_CREDIT' will be created updated from the 'site-template.zip'.

Set up

Installation

Integration Choice

The Adyen LINK Cartridge can be used with either a pipeline or controller based SiteGenesis. Depending on the scope and needs of the project the cartridge configuration is different.

Pipeline based integration

Install ‘int_adyen’, 'int_adyen_pipelines' and ‘bm_adyen’ cartridges using Commerce Cloud UX-studio.

Controller based integration

Install ‘int_adyen’ and ‘bm_adyen’, and 'int_adyen_controllers' cartridges using Commerce Cloud UX-studio.

Metadata Import

Find the archive 'site-template.zip' in the installation package, it contains metadata files. Please review the archive, do the necessary modifications, and import it through BM Administration > Site Development > Site Import & Export section. The only required modification is renaming the root folder of the archive to the ID of your site.

Before the import of 'site-template.zip', check and save cartridge paths of your site and Business Manager, because they will be modified, so you will be able to configure them manually if something goes wrong. Also, check the fields which will be updated after importing file 'site-template.zip', and be sure that there won't be any conflict with the existing fields.

The following configuration items will be added after you import 'site-template.zip' archive:

Besides configuration parameters, the following order attributes will be added:

Also the new custom field 'streetName' to 'CustomerAddress' and 'OrderAddress' system objects will be added:

Custom Object Definition

After importing metadata there will be a site specific custom object to store Adyen notifications:

 

Defined as:

<?xml version="1.0" encoding="UTF-8"?>
<custom-type type-id="adyenNotification">
   <display-name xml:lang="x-default">Adyen Notification</display-name>
   <description xml:lang="x-default">Adyen Notification Update Queue</description>
   <staging-mode>no-staging</staging-mode>
   <storage-scope>site</storage-scope>
   <retention-days>3</retention-days>
   <key-definition attribute-id="orderId">
      <type>string</type>
      <min-length>0</min-length>
   </key-definition>
   <attribute-definitions>
      <attribute-definition attribute-id="currency">
         <display-name xml:lang="x-default">Currency</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="eventCode">
         <display-name xml:lang="x-default">Event Code</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="eventDate">
         <display-name xml:lang="x-default">Event Date</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="httpRemoteAddress">
         <display-name xml:lang="x-default">Remote Address</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="live">
         <display-name xml:lang="x-default">Live</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="merchantAccountCode">
         <display-name xml:lang="x-default">Merchant Account Code</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="merchantReference">
         <display-name xml:lang="x-default">Merchant Reference</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="operations">
         <display-name xml:lang="x-default">Operations</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="paymentMethod">
         <display-name xml:lang="x-default">Payment Method</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="processedDate">
         <display-name xml:lang="x-default">Processed Date</display-name>
         <type>datetime</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
      </attribute-definition>
      <attribute-definition attribute-id="processedStatus">
         <display-name xml:lang="x-default">Processed Status</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="pspReference">
         <display-name xml:lang="x-default">PSP Reference</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="reason">
         <display-name xml:lang="x-default">Reason</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="success">
         <display-name xml:lang="x-default">Success</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="updateStatus">
         <display-name xml:lang="x-default">Update Status</display-name>
         <type>enum-of-string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <value-definitions>
            <value-definition>
               <display xml:lang="x-default">PENDING</display>
               <value>PENDING</value>
            </value-definition>
            <value-definition>
               <display xml:lang="x-default">PROCESSED</display>
               <value>PROCESSED</value>
            </value-definition>
            <value-definition>
               <display xml:lang="x-default">PROCESS</display>
               <value>PROCESS</value>
            </value-definition>
         </value-definitions>
      </attribute-definition>
      <attribute-definition attribute-id="value">
         <display-name xml:lang="x-default">Reason</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
      <attribute-definition attribute-id="version">
         <display-name xml:lang="x-default">Version</display-name>
         <type>string</type>
         <localizable-flag>false</localizable-flag>
         <mandatory-flag>false</mandatory-flag>
         <externally-managed-flag>false</externally-managed-flag>
         <min-length>0</min-length>
      </attribute-definition>
   </attribute-definitions>
   <group-definitions>
      <attribute-group group-id="general">
         <display-name xml:lang="x-default">General</display-name>
         <attribute attribute-id="reason" />
         <attribute attribute-id="orderId" />
         <attribute attribute-id="creationDate" system="true" />
         <attribute attribute-id="version" />
         <attribute attribute-id="eventCode" />
         <attribute attribute-id="merchantAccountCode" />
         <attribute attribute-id="processedDate" />
         <attribute attribute-id="operations" />
         <attribute attribute-id="processedStatus" />
         <attribute attribute-id="success" />
         <attribute attribute-id="updateStatus" />
         <attribute attribute-id="httpRemoteAddress" />
         <attribute attribute-id="paymentMethod" />
         <attribute attribute-id="currency" />
         <attribute attribute-id="lastModified" system="true" />
         <attribute attribute-id="merchantReference" />
         <attribute attribute-id="pspReference" />
         <attribute attribute-id="value" />
         <attribute attribute-id="live" />
         <attribute attribute-id="eventDate" />
      </attribute-group>
   </group-definitions>
</custom-type> 

For information on setting up notifications, refer to Scheduled jobs.

Business Manager configuration

Cartridge Path

If using the controller based integration, cartridge path should be setup as such under Sites / Manage Sites /

app_storefront_controllers:app_storefront_core:int_adyen_controllers:int_adyen

Adyen Configurations

In order to use Adyen service for processing credit cards, you have to enable 'Credit Card' payment method and set payment processor to 'ADYEN_CREDIT'. In order to use 'Adyen redirect' feature, 'Adyen' payment method must be enabled. Both can be enabled in Ordering > Payment Processors:

Adyen HPP Redirect Setup

Adyen CREDIT API Setup

Also, there is a page in Business Manager where you have to configure Adyen cartridge, you can find it in Site Preferences > Custom Preferences > Adyen:
 

Here is the description of the Site Preferences fields which have to be configured:

Parameter Name

Description

merchantCode

Adyen merchant account name. The account for which the payments will be processed.

skinCode

Code of the skin which you want to use. There can be defined few skins, each having a different configuration, style, language etc.

Adyen_HMAC256

Secret key used to calculate a signature over the payment fields sent to Adyen. The value must be the same in Site Preferences and in Adyen Account Settings.

allowedMethods

Payment Methods that will be shown on the Adyen HPP.

Test/Production Mode

Define the live (Production) or test mode.

Enable Adyen debug mode

Enables debug mode which shows a 'pay' button before doing the redirect to Adyen. This allows you to check the parameters sent to the HPP.

Recurring Type

One of the following values:

  • RECURRING
  • ONECLICK
  • RECURRING,ONECLICK

Adyen Notifications User

The username used by the Adyen notification system in order to authenticate the calls with Demandware. Should be the same as the one set in Adyen system.

Adyen Notifications Password

The password by the Adyen notification system in order to authenticate the calls with Demandware. Should be the same as the one set in Adyen system.

Enable CSE

Enable Client Side Encryption.

Adyen JS Public Key

The public key for the Adyen CSE encryption This should match the Adyen console configuration.

Adyen Test JS URL

CSE Test JS Url on Adyen.

Adyen Prod JS URL

CSE Prod JS URL on Adyen.

Adyen Notification Delay Minutes

How long to wait before Salesforce will update an order based on notification from Adyen.

Adyen Payment Methods Service Prefix

Prefix for multiple site configurations.

Adyen Payment 3D Secure Service Prefix

Prefix for multiple site configurations.

Adyen Payment Send Service Prefix

Prefix for multiple site configurations.

Enable AVS

Enabled AVS Features.

Services Configuration

Go to Administration > Operations > Services and configure Adyen services.

Make sure that you set up prefixes for services like so:

Integration will use this prefix + current site ID to create web service. Example:

prefix :adyen.http.payment.methods site id: SiteGenesis

at the result will be call service with name : adyen.http.payment.methods.SiteGenesis (prefix + '.' + siteID) Prefix field is required for integration or the Service Registry will error out.

Adyen Account configuration

Some items that need to be configured in the Adyen Customer Area (CA) for the Adyen Integration to work correctly.

Parameter Name

Description

HMAC256 key

Secret key used to calculate a signature over the payment fields sent to Adyen. This should match what is used in the Adyen configuration settings in your DW site

SkinCode

Code of the skin you want to use. You can use different skins, each having a different configuration, style, language, etc.

Notification URL and test page

URL where Adyen should send notification messages to. The script at this URL should always reply with [accepted], otherwise Adyen will keep sending messages. The URL will point to your DW store e.g.:

https://adyen01.tech-prtnr-eu01.dw.demandware.net/on/demandware.store/Demos-SiteGenesis-Site/default/Adyen-Notify

The Notification URL and it's response can be tested from within the CA.

Payment Methods

You can select which payment methods should be displayed by configuring your skin. This can also be influenced with the 'allowedMethods' parameter that can be sent to Adyen for each payment.

Test HPP and skin

The skin and HPP can be tested from within the CA, to check the look and feel, translations, configured payment methods, etc.

Settings for the PAL adapter

To send Credit Card payments directly (without redirecting to the HPP) you can use the PAL adapter. The user, password and location can be configured here

Notifications User Name

The username used by the Adyen notification system in order to authenticate the calls with Demandware. Should be the same as the one set in Demandware system under "Adyen Notifications User" preference. (Found under: Settings -> Notifications -> User Name)

Notifications Password

The password used by the Adyen notification system in order to authenticate the calls with Demandware. Should be the same as the one set in Demandware system under "Adyen Notifications Password" preference. (Found under : Settings -> Notifications -> Password)

Scheduled jobs

The Adyen integration to the notification system requires a scheduled job to be configured and run on a regular basis.

The Adyen servers will call the Commerce Cloud endpoint with updates to payment transactions. Commerce Cloud will store these as custom object instances queued for processing. The scheduled job is responsible for iterating through the received notifications and updating the order payment transactions and order status appropriately.

Setup a site level job for each site using a Adyen configuration to run the Adyen notifications process.  Each client will need to determine the schedule and frequency on which this runs based on their individual needs.

Step 1:  Create new job ID with Priority Normal

Step 2:  Setup two steps for the job in the Step Configuration

The contents of these steps are to be configured as follows:

Testing

Notifications should result in orders having their payment transaction information stored in the order and, if complete, order submitted and "ready for export".

Custom code

The following changes should be made regardless of whether a controller or a pipeline integration approach are being used.

Form billingaddress.xml

Increase the max length of field address1 and add 2 new fields to the form, here is the expected result:

Script cart/CartUtils.ds

Find method CartUtils.getAddressList(), find function getAddressObject() inside of it, and add these 2 new fields to the returned object:

suite: addy.suite, // Added for Adyen AVS support 
streetName: addy.custom.streetName, // Added for Adyen AVS support 

Here is the expected result:

Script checkout/AddAddressToAddressBook.ds

Replace the line of code:

address.setAddress1( usedAddress.address1 );

on the following code:

// Added for Adyen AVS support. If AVS is enabled, 2 new fields are used on the site 
if (dw.system.Site.getCurrent().getCustomPreferenceValue("Adyen_enableAVS")) { address.setSuite( usedAddress.suite ); 
    address.custom.streetName = usedAddress.custom.streetName; 
    address.setAddress1( usedAddress.suite + (!empty(dw.system.Site.getCurrent().getCustomPreferenceValue("Adyen_address1Delimiter")) ? dw.system.Site.getCurrent().getCustomPreferenceValue("Adyen_address1Delimiter") : " ") + usedAddress.custom.streetName ); 
} else { 
    address.setAddress1( usedAddress.address1 ); 
}

The result should look like:

 

Script checkout/UpdateBillingAddress.ds

Replace the line of code:

billingAddress.setAddress1( addressFields.address1.value );

on the following code:

// Added for Adyen AVS support. If AVS is enabled, 2 new fields are used on the site 
if (dw.system.Site.getCurrent().getCustomPreferenceValue("Adyen_enableAVS")) { 
    billingAddress.setSuite( addressFields.suite.value ); 
    billingAddress.custom.streetName = addressFields.streetName.value; 
    billingAddress.setAddress1( addressFields.suite.value + (!empty(dw.system.Site.getCurrent().getCustomPreferenceValue("Adyen_address1Delimiter")) ?  dw.system.Site.getCurrent().getCustomPreferenceValue("Adyen_address1Delimiter") : " ") + addressFields.streetName.value ); 
} else { 
    billingAddress.setAddress1( addressFields.address1.value ); 
}

Resulting in:

Template checkout/billing/paymentmethods.isml

Around line 42, in the if condition checking for CREDIT_CARD add the following:

<isif condition="${pdict.AdyenHelper && pdict.AdyenHelper.getAdyenCseEnabled()}">
   <script src="${pdict.AdyenHelper.getCSEJsUrl()}" type="text/javascript"></script>
   <isinclude template="checkout/billing/adyenpaymentfields"/>
   <isinputfield formfield="${pdict.CurrentForms.billing.paymentMethods.creditCard.encrypte ddata}" type="hidden"/>
<iselseif condition="${pdict.AdyenCseEnabled === true}">
   <isscript>
   var AdyenHelper = require("int_adyen/cartridge/scripts/util/AdyenHelper");
   </isscript>
   <script src="${AdyenHelper.getCSEJsUrl()}" type="text/javascript"></script>
   <isinclude template="checkout/billing/adyenpaymentfields"/>
   <isinputfield formfield="${pdict.CurrentForms.billing.paymentMethods.creditCard.encrypte ddata}" type="hidden"/>
<iselse/>

So that it looks like this:

Add the following code right before the closing </fieldset> tag, near line 147:

<div class="payment-method <isif condition="${!empty(pdict.selectedPaymentID) && pdict.selectedPaymentID=='Adyen'}">payment-method-expanded</isif>" data-method="Adyen"> 
    <isinclude template="hpp"/>
</div> 

 

Template checkout/summary/summary.isml

Add the following code right before the closing </fieldset> tag:

<iscomment>
Set the brandcode and issuerId in session for when user hits the back button on Adyen hpp:
</iscomment>
<isif condition="${!empty(pdict.CurrentHttpParameterMap.brandCode.value) || !empty(session.custom.brandCode)}"> 
    <isset name="brandCode" value="${!empty(pdict.CurrentHttpParameterMap.brandCode.value) ? pdict.CurrentHttpParameterMap.brandCode.value : session.custom.brandCode}" scope="session"/> 
    <input type="hidden" name="brandCode" value="${session.custom.brandCode}" /> 
    <isif condition="${!empty(pdict.CurrentHttpParameterMap.issuerId.value) || !empty(session.custom.issuerId)}"> 
        <isset name="issuerId" value="${!empty(pdict.CurrentHttpParameterMap.issuerId.value) ? pdict.CurrentHttpParameterMap.issuerId.value : session.custom.issuerId}" scope="session"/> 
        <input type="hidden" name="issuerId" value="${session.custom.issuerId}" />
    </isif> 
</isif>

Template components/header/htmlhead.isml

Add the following code after including file style.css:

<link rel="stylesheet" href="${URLUtils.staticURL('/css/checkout.css')}" /> 


Script billing.js

Add the following function:

/**
* @function
* @description Changes the payment type or issuerId of the selected payment method
* @param {String, Boolean} value of payment type or issuerId and a test value to see which one it is, to which the payment type or issuerId should be changed to
*/
function updatePaymentType(selectedPayType, test) {
    if (!test) { 
        $('input[name="brandCode"]').removeAttr('checked');
    } else { 
        $('input[name="issuerId"]').removeAttr('checked'); 
    } 
    $('input[value=' + selectedPayType + ']').prop('checked', 'checked');
    formPrepare.validateForm(); 
}

In the exports.init function, after this code:

var selectedPaymentMethod = $selectPaymentMethod.find(':checked').val(); 

Add the next variable definitions:

var $payType = $('[name="brandCode"]');
var $issuerId = $('[name="issuerId"]');
var $issuer = $('ul#issuer');
var selectedPayType = $payType.find(':checked').val();
var selectedIssuerId = $issuerId.find(':checked').val(); 

Change method $selectPaymentMethod.on('click', 'input[type="radio"]', function () {, add the following code to it:

if ($(this).val() == 'Adyen' && $payType.length > 0) {
    //set payment type of Adyen to the first one 
    updatePaymentType((selectedPayType) ? selectedPayType : $payType[0].value, false);
} else { 
    $payType.removeAttr('checked');
    $issuerId.removeAttr('checked');
} 

Before this line:

// select credit card from list
$('#creditCardList').on('change', function () { 

Add the following code:

$payType.on('click', function () {
    updatePaymentType($(this).val(), false); 
    //if the payment type contains issuerId fields, expand form with the values
    if ($(this).siblings('#issuer').length > 0) {
        $issuer.show();
        updatePaymentType((selectedIssuerId) ? selectedIssuerId : $issuerId[0].value, true);
    } else {
        $issuer.hide();
        $('input[name="issuerId"]').removeAttr('checked');
    }
});

$issuerId.on('click', function () {
    updatePaymentType($(this).val(), true);
});

Resource.ds

  1. Near line 10, add AdyenHelper:

    /* Script Modules */
    var AdyenHelper = require ("int_adyen/cartridge/scripts/util/AdyenHelper");

  2. Near line 129, add line to getResources():

    ADYEN_CC_VALIDATE : Resource.msg('adyen.creditcard', 'adyen', null)

  3. Near line 214, add to the ResourceHelper.getPreferences():

    ADYEN_CSE_ENABLED : AdyenHelper.getAdyenCseEnabled(), 
    ADYEN_CSE_JS_PUBLIC_KEY : AdyenHelper.getAdyenCseJsPublicKey() 



File resources/forms.properties

Add the following lines to the file:

forms.suite=Suite 
forms.streetName=Street 
forms.suiteerror=Please enter Suite number 
forms.streetnameerror=Please enter Street name 
forms.suite.field.invalid=Please enter a valid value 
forms.streetname.field.invalid=Please enter a valid value 
adyentest.missedordernumber=Missed order number 
adyentest.wrongordernumber=Wrong order number 
adyentest.ordernumber=Order number 

  

Template:

/app_storefront_core/cartridge/forms/default/creditcard.xml

Add code prior to 'cvn' definition:

<field formid="encrypteddata" type="string" mandatory="false"/> 

So it looks like:

<!-- field for credit card owner --> 
    <field formid="owner" label="creditcard.ownerlabel" type="string" mandatory="true" max-length="40" binding="creditCardHolder" 
missing-error="creditcard.ownermissingerror"/> 
    <field formid="encrypteddata" type="string" mandatory="false"/> 
<!-- field for credit card security code --> 
    <field formid="cvn" label="creditcard.cvnlabel" type="string" mandatory="true" masked="0" 
missing-error="creditcard.cvnmissingerror" value-error="creditcard.cvnrangeerror"/> 
<!-- optional flags --> 
    <field formid="saveCard" label="creditcard.savecard" type="boolean" mandatory="false" default-value="true" /> 
<!-- confirm action to save the card details -->
   <action formid="confirm" valid-form="true"/> 
</form>

Controller Model: Changes Needed

If using a controller method SiteGenesis integration, additionally follow the instructions on this page. If integrating via the pipeline method please see Pipeline Model: Changes Needed.

COSummary.js:

At the top of the page add controller include:

var AdyenController = require("int_adyen_controllers/cartridge/controllers/Adyen"); 

In the submit function replace SG default code to include Redirect:

function submit() {
    // Calls the COPlaceOrder controller that does the place order action and any payment authorization.
    // COPlaceOrder returns a JSON object with an order_created key and a boolean value if the order was created successfully.
    // If the order creation failed, it returns a JSON object with an error key and a boolean value.
    var placeOrderResult = app.getController('COPlaceOrder').Start(); if (placeOrderResult.error) {
        start({
            PlaceOrderError: placeOrderResult.PlaceOrderError
        });
    } else if (placeOrderResult.order_created) {
        if (placeOrderResult.Order.paymentInstrument.paymentMethod == "Adyen")
        {
            AdyenController.Redirect(placeOrderResult.Order);
        } else {
            if (placeOrderResult.skipSubmitOrder === true) {
                placeOrderResult.view.render('adyenform');
            } else {
                showConfirmation(placeOrderResult.Order);
            }
        }
    }
}

So that it looks like this:

 

COPlaceOrder.js

Starting around Line 72, replace the authoriztationResult to include 3dsecure:

Change to add:

if (PaymentMgr.getPaymentMethod(paymentInstrument.getPaymentMethod()).getPaymentProcessor().ID === 'ADYEN_CREDIT'
                  && authorizationResult.authorized3d === true) {
                  var show3dSecureForm : Boolean = true;
                  var view : Object = authorizationResult.view;
              }

So that it looks like this:

Add new code after closing brackets for loop 'for' around line 79:

 if (show3dSecureForm) {
   return {view: view};
}

Replace line var handlePaymentsResult = handlePayments(order);
with next code :

var skipSubmitOrder : Boolean = false;
var handlePaymentsResult = handlePayments(order);
if (!empty(handlePaymentsResult.view))
{ skipSubmitOrder = true; }

Starting around line 189, add additional code:

if (order.paymentInstrument.paymentMethod == "Adyen") {
    return {
        Order: order,
        order_created: true
    };
    } else {
        if (skipSubmitOrder) {
            return {
                Order: order,
                order_created: true,
                view : handlePaymentsResult.view,
                skipSubmitOrder : skipSubmitOrder
            };
        } else {
            var orderPlacementStatus = Order.submit(order);
        }
    }
    if (!orderPlacementStatus.error) {
        clearForms();
    }
    return orderPlacementStatus;
}

So that it looks like this:



COBilling.js

In the top script modules section add Adyen helpers:

var AdyenController = 
require("int_adyen_controllers/cartridge/controllers/Adyen"); 
var AdyenHelper = require("int_adyen/cartridge/scripts/util/AdyenHelper"); 

Around line 742, modify validatePayment(cart) function:

if (AdyenHelper.getAdyenCseEnabled()) { 
    result = true;
    return result; 
} 

So that it looks like this:



In function 'publicStart()' add this line:

var AdyenHppPaymentMethods = AdyenController.GetPaymentMethods(cart); 




In the same function modify calling function start() to next way:

start(cart, {ApplicableCreditCards: creditCardList.ApplicableCreditCards, AdyenHppPaymentMethods : AdyenHppPaymentMethods} );  




In function returnToForm add next string to render template action:

if (params) {
    app.getView(require('~/cartridge/scripts/object').extend(params, { 
        Basket: cart.object,
        AdyenHelper : AdyenHelper, 
        ContinueURL: URLUtils.https('COBilling-Billing') 
    })).render('checkout/billing/billing'); 
} else {
    app.getView({ 
        Basket: cart.object,
        AdyenHelper : AdyenHelper, 
        ContinueURL: URLUtils.https('COBilling-Billing')
    }).render('checkout/billing/billing'); 
} 


Pipeline Model: Changes Needed

If using a pipeline method SiteGenesis integration, additionally follow the instructions on the dw_integration_adyen version v16.1.0.docx document which can be obtained from Adyen. Follow starting at section 3.5:

3.5 Changes to pipelines, templates and others


Otherwise, it's highly recommended to use the newer Controller Integration Model.

Additional Configuration

You may need to change the ID of the storefront application. This can be defined in the file int_adyen.properties in the root directory of the int_adyen cartridge.

Example:

#defines what ID the storefront application cartridge has - default is app_tdc
demandware.core.cartridge=SiteGenesisNew 

Please open the 'int_adyen.properties' file and edit the value to your storefront cartridge name to make the adyen cartridge work.

Client Side Encryption

For client side encryption to work properly, the following site preferences need to be configured:

Site Pref

Value

CSE Enabled

true

Javascript URL

not empty

Javascript Public Key

Proper value set from Adyen Portal.

Custom Objects

 A Custom object is used in the cartridge to support Adyen notifications back to Commerce Cloud for payment status. The custom object definition is imported as part of the site metadata import.

See Data storage for more information.

Testing integration

Make sure you have an Adyen test account. Configure your account and then configure the Adyen settings in the BM.

Test credit cards

In case you want to test Credit Cards payment method, Adyen provides test numbers you can use. For more information, refer to Test card numbers

Business Manager configuration

Read the Business Manager configuration section for the information about configuring BM.

The Debug Setting set to 'yes' shows a 'pay' button before doing the redirect to Adyen. This allows you to check the parameters sent to the HPP.

Testing API methods

There is a storefront cartridge in the distributive package, where there are added additional pages for testing API methods implemented in the cartridge. The current implementation of the cartridge includes the following APIs:

  • Capture
  • Cancel before the capture
  • Cancel or refund

Here is the instruction for testing API methods.

Capture & Cancellation Payment

Storefront

  1. In both cases you can see the form with the field where you should enter the order number.
  2. Once you provide the order number, you can click the submit button.
  3. You'll be redirected to the result page. On this page, in the grey area, you'll see the result of the operation you asked to perform.
  4. There are only 2 possible results of operation which you may see on result page:
    1. 'Ok' – everything was ok, the data were processed correctly. This status means that the data were handled properly and no any unexpected situation happened, but it does not necessary means that the payment will be captured, see below the info about event codes which are available in BM.
    2. 'Error' – either the order was not found in DWRE system or some error occurred. If you see this message, nothing should be changed in BM, but theoretically something could be changed on Adyen side. See below the info about event codes which are available in BM.

Business Manager

Once you see some result on the storefront, you may check the BM:

  1. Find the order which you modified.
  2. Open it and go to Payment tab.
  3. The default value of Eventcode field is AUTHORISATION.
  4. If order a payment was requested to be captured the following event codes are possible:
    1. CAPTURING – the data were successfully handled and the request was sent to Adyen.
    2. CAPTURING REFUSED – Adyen refused payment capturing.
  5. If order a payment was requested to be canceled the following event codes are possible:
    1. CANCELLATION – the data were successfully handled and the request was sent to Adyen.
    2. CANCELLATION REFUSED – Adyen refused payment cancellation.
  6. If order a payment was requested to be canceled or refunded the following event codes are possible:
    1. CANCELLATION OR REFUND – the data were successfully handled and the request was sent to Adyen.
    2. CANCELLATION OR REFUND REFUSED – Adyen refused payment cancellation.
  7. After you send a request to Adyen, you see immediately only the result of this request, but not the result of operation which will be performed on Adyen side. Adyen works not in real time, so your request won't be handled immediately on Adyen side, but when the request will be handled, Adyen will change the status of payment in its back office and also the Eventcode will be changed on Demandware site. So you should check after some time which is the end result of the operation, in BM and in Adyen back office.

Adyen CA

  1. Once you created new order it'll be placed into the Payment list in Adyen back office.
  2. When you perform some operations on payment, the status of payment is changed in an appropriate way. But this works not in real time, so when you send some request, wait a minute and only then check the result of operation. Also, when payment modification request is made from Adyen back office, an appropriate status of payment is shown in Adyen back office, but when I was working with the API, couldn't see some statuses (Sent for Settlement for example, or Sent for Cancellation).
  3. Possible payment statuses in Adyen back office should be searched for in Adyen documentation.

Data storage

For each order which results in a payment attempt on the Adyen HPP, the payment results are available in the following fields:

  • PSP reference – unique Adyen ID of this payment. It's a link between Demandware order and Adyen payment.
  • Payment Method.
  • Eventcode – AUTHORISED, CANCELLATION, REFUND, etc.
  • Amount – Amount paid.

They are handled by the Adyen.notify() controller method or Adyen-Notify pipeline, which receives the notification messages from Adyen. In one case, when a payment is refused on Adyen HPP, these fields are updated in Adyen.showConfirmatino() controller or Adyen-ShowConfirmation pipeline.

Notifications are queued in Commerce Cloud for a short duration, either until Adyen provides a "final" status for the order or the custom object retention period is reached.

Commerce Cloud stores a custom object briefly until notification has been received from Adyen. As the final status is obtained the CO is deleted. On the off chance that Adyen never responds to the order with a notification, Commerce Cloud will automatically remove the custom object instance after 72 hrs.

On top of that, all the communication to/from Adyen is logged in the log file directory available via webDAV. Please check this first in case you have any problems.

Also, all the notifications sent by Adyen are logged on the order level and can be found on Notifications tab of Order Details page in BM.

Detailed use cases

Use Case: 3-D Secure Credit Card

3-D Secure (Verified by VISA / MasterCard SecureCode™) is an additional authentication protocol that involves the shopper being redirected to their card issuer where they authenticate themselves before the payment can proceed to an authorization request.

To get 3-D Secure test credit card numbers, refer to Test card numbers.

For placing an order you have to follow the same steps like usual. The difference is that before you are directed to the order confirmation page, you will be prompted to enter your 3-D Secure credit card credentials.

The order payment details can be found on the "Payment" tab from the order details page in Business Manager > Site > Ordering > Orders > Orders. Here you can find the information in the Adyen payment info section the PSP reference number with a link for the corresponding payment entry stored in the Adyen Customer Area (CA).

In the CA you can find the details about the payments in general, but also specific information about 3-D Secure payments like 3-D Secure Offered (yes or no) and 3-D Secure Authenticated (yes or no). 

For 3-D Secure, no additional changes of the storefront are required.

This use case describes the 3-D Secure credit card payments, when the card details are entered on SCC side and are sent to Adyen via the Adyen API and PAL adapter. Make sure the settings for Adyen PAL adapter are correct.

Navigate to the place order page following the usual credit card checkout steps. Click on the 'SUBMIT ORDER' button to be directed to the 3-D Secure Authentication Page.

You have to enter your 3-D Secure credit card credentials there.

If you enter the correct credentials in the 3-D Secure authentication page, you will be directed to the order confirmation page. If these credentials are wrong you will be redirected back to the place order page and you will see an error message on top.

Good Order

Bad Order

In Business Manager the order status will be failed in this case.

Orders can have the failed status for many reasons. In order to check that a payment was refused, you should check the notifications tab of order details page. If the credit card payment method was used, the notification should be similar to the one provided below:

There may be a few notifications, you should check the newest one.

Refused payments always have the Eventcode that equals to AUTHORISATION, regardless of the payment method used.

In Adyen CA you can find details about payments in general, but also specific information about 3-D Secure payments like 3-D Secure Offered (yes or no) and 3-D Secure Authenticated (yes or no).

Refused payments always have the appropriate status:

 

Use Case: AVS

How to enable/configure AVS on Business Manager

How to enable/disable AVS

  1. Go to BM
  2. Select a site
  3. Go to Site Preferences > Custom Preferences > Adyen
  4. Check/uncheck Enable AVS flag

Other configurations

There is a field 'Delimiter for parts of Address1 field' that you can use for configuring the handling of address fields. There is a comment to this field in BM in which the meaning of the field is described, also this field is described in one of the next sections of this document.

Adyen Back Office

When billing details are sent to Adyen, the AVS result code is defined, and stored internally in the payment record, without any extra configurations.

Adyen can also send the AVS result code back to SCC site, which may be needed for some site functionality. This possibility is disabled by default. In order to enable AVS, the server communication section has to be used and an appropriate flag has to be set there. This section is disabled by default and in order to enable it, you have to contact Adyen support. Also, when you use server communication, the notifications section has to be turned off, otherwise notifications will be used instead.

 

General explanation

  1. In order to enable/disable AVS on the site, you have to select/deselect the flag in BM
  2. In order to have an AVS code returned back from Adyen to the SCC site, you have to configure Adyen back office properly
  3. The settings in the Adyen back office mean only that AVS is allowed/disallowed to be used, but they do not require to use it, only the flag in BM turns on/off AVS

AVS use cases

AVS is disabled

Storefront

Storefront works as usually, there are no visible changes for user

Business Manager

BM works as usually, there are no visible changes for merchant

Adyen CA

There is a field AVS Result on payment page, where you can check the result code.

There are 2 types of credit cards from an AVS standpoint: cards which support AVS and cards that do not support AVS.

  1. If AVS is not supported for credit cards, an appropriate message will be shown in Adyen back office
  2. If AVS is supported for credit cards, the message will be the following

AVS is enabled

Storefront

When AVS is enabled, there should appear two new fields instead of one field called Address1 on all site forms: Suite and Street. These two new fields should appear on all site forms where the user enters his address data. In the current implementation of the Adyen cartridge, only the billing address form from the checkout process is updated to meet this requirement, the other forms are remained untouched

The billing form should work normally with two new fields. The selection of saved addresses from a dropdown list, storing of new addresses and the other functions should normally work on the standard Site Genesis site.

Business Manager

When AVS is enabled, two new fields are used for storing address details: Suite No and Street Name. There are three different places where address data is stored: Customer addresses, order billing and shipping addresses. In the current cartridge implementation, only customer address and order billing address are configured to be used/updated by the cartridge.

  1. Customer address
  2. Order billing address

The logic of the address fields usage and update is like this: the values of Suite and Street fields which the user updates on the storefront are stored in appropriate fields in BM, but they are also concatenated and stored in field Address1. The concatenation of the values is performed behind the scenes, the delimiter for concatenated strings can be changed in Site Preferences, the concatenation of the values is required in order to make the Adyen cartridge compatible with other site functionality and not to interfere with other site functionality.

Adyen CA

There is a field AVS Result on the payment page, where you can check the result code.

There are two different types of credit cards from an AVS standpoint: cards for which AVS is supported and for which AVS is not supported.

  1. If AVS is not supported for credit card, an appropriate message will be shown in Adyen back office
  2. If AVS is supported for credit card, one of possible result codes will be shown. Here are a few examples:
    1. Successful address verification result
    2. Not successful address verification result
       

Summary

  1. The AVS result code is viewable for the merchant only in Adyen back office.
  2. The AVS feature can be enabled in Business Manager.
  3. If AVS is enabled, new fields will be shown on the storefront, otherwise there will not be any viewable changes for the user.
  4. If AVS is enabled, new fields will be used for storing addresses in BM, but the old field Address1 will be used as well. If AVS is disabled, there will not be any changes visible for the merchant in BM.
  5. The AVS result code can be received by the cartridge from the Adyen server, if an appropriate configuration of Adyen back office is done. If the AVS result code is received by the Adyen cartridge, it will not be shown to the merchant in the current implementation of the feature, the code can be handled only programmatically:
    1. The developer has a possibility to handle AVS result code programmatically if needed.
    2. The merchant can see the AVS result code only in Adyen back office.

Use Case: Cancel Payment on Adyen HPP

If you click on the button 'previous' on the Adyen HPP, you will be redirected back to the SCC order confirmation page. It is a standard order confirmation page, you can to continue work with the site as usually you may return to any step of checkout process or go back to Adyen HPP by clicking 'SUBMIT ORDER' button.

 

Every time when you go to the Adyen HPP, a new order is created in BM, and when you return back to SCC, the order status will be failed. There is no any additional info in BM about the fact that the payment was cancelled. The payment does not appear in the Adyen back office if it was cancelled in this way.

Use Case: Client-Side Encryption (CSE)

Adyen offers CSE / Easy Encryption via JavaScript on the client side to accept payments while the payment data is encrypted in the shopper's browser or application. This integration provides stricter security protocols and you do not need to manage the PCI compliance.

There are three ways that CSE can be used:

  1. Adyen Hosted 

    In this case an Easy Encryption library is hosted by Adyen with your public key injected into JavaScript code. You retrieve this library from the unique URL provided to you by Adyen, and thus you don't need to download and host theadyen.encrypt.min.js on your own servers.

    To obtain this URL, log in the Adyen Customer Area (CA) using your company-level account, go to Settings / Users, filter the list of users by System in the drop-down box, and then open the Web Service (ws) user page. On this page you can find the Library location on the Easy Encryption pane, or (if the library is not available yet), click Generate and then Save (at the page bottom) to create a new URL.

  2. Merchant Hosted

    This integration binds to existing HTML in the page, adding a hidden input containing the encrypted card data to the form on the moment the form is submitted. The complete integration requires HTML markup to be present in the page, as well as accompanying JavaScript to enable the behaviour.

  3. JavaScript Only

    In case the HTML integration does not fulfill your setup requirements, the library has been split up into two parts since release V0_1_11. The newly introduced part is an HTML-independent encryption.

     

 The Adyen preferred method of integration is the Adyen Hosted which is the method assumed in the LINK cartridge. If you wish to utilize Merchant Hosted and/or Javascript only cartridge modifications will be necessary and are beyond the scope of this document. More information can be obtained here:


Configuration

Please configure the following site preferences:

Name

Id

Type / Description

CSE Enabled

cseEnabled

Boolean, default to true.

CSE Test JavaScript URL

cseTestJsURL

String, default to empty.

CSE Prod JavaScript URL

cseProdJsURL

String, default to empty.

To obtain the CSE Hosted JavaScript URL, go into the Adyen CA → Settings → Users, click on the user and copy the latest URL. This URL value should be configured into the Site Preference.

User Selection *
Copy CSE URL: *

Resolves to properly configured JS for client account:

*

Use Case: Credit Card (direct to API)

This use case describes the credit card payments, when the card details are entered on the SCC side and are sent to Adyen via the Adyen API.

Enter the credit card details on the billing page of the checkout process and click the 'CONTINUE' button:

 
You will see the order confirmation page. The credit card details will be shown on the lower right of the page. You can press the Place Order button in order to complete the purchase.

If the payment authorization was successful, you will see the 'Order Summary' page with information about the payment:

You can check the result of the payment authorization in Business Manager. On the payment tab of the order details screen, the payment status should be Paid and the Adyen Eventcode should be AUTHORISATION:

If payment authorization was refused, you will see the order confirmation page where the following error message will be displayed:

In Business Manager, the order will be marked as failed in this case:

Refused payments always have an Eventcode that equals to AUTHORISATION, regardless of the payment method used:

 

In the Adyen back office, refused payments always have the appropriate status:

Use Case: Redirect to Adyen HPP

This use case describes a redirect to the Adyen Payment page (HPP). Make sure the settings are correct (see screenshot below). Usually Payment Selection is set to 'one' to select the one-page flow on the Adyen HPP. If the debug flag is checked, you will see a button before the redirect, which gives you a possibility to inspect the contents of the form being sent to Adyen.

Select 'Adyen' as the payment method on Billing page of checkout process and click the 'CONTINUE' button:

 

You will see the Order Confirmation page and can press the 'SUBMIT ORDER' button:

If debug is enabled, you will see an empty page with a small button:

 

Additionally you will be able to check the form that will be submitted to Adyen via Firebug or an equivalent tool, or just by checking the source code of the page:

If debug is not enabled, you will be redirected to Adyen HPP immediately, and will see a list of payment methods (the list depends on the chosen countries and the settings you applied):

 

After the successful payment authorization, you will be redirected back to the SCC Order Summary page (should be configured in the Adyen CA).

You can check the result of the payment authorization in Business Manager. On the payment tab of the order detail screen, the payment status should be Paid and the Adyen Eventcode should be AUTHORISATION (see the screenshot below):

 

If the payment authorization was refused, you will be redirected back to the SCC Order Confirmation page and an error message will be shown:

In Business Manager, the order will be marked as failed in this case:

 

Orders can fail for many reasons, and in order to check that the payment was refused, you should check the notifications tab of the order details page. If the Adyen payment method was used, the notification should be similar to the one provided below:

There may be a few notifications, you should check the newest one.

Refused payments always have the Eventcode equals to AUTHORISATION, regardless of the payment method used:

 

In the Adyen CA, refused payments always have the appropriate status:

User guide

Roles and Responsibilities

The store administrator should do the following on a regular basis:

  • check the correct configuration of the Adyen Merchant account in the Adyen Customer Area (CA).
  • check the receiving of the Adyen notification messages.
  • check the payments received to see if they contain the expected data (currencyCode, amount, shopperEmail, etc).

Business Manager

Configure the settings relevant to the Adyen integration as described in Business Manager configuration.

After an authorized payment, the Payment tab of the order should look like this:

All possible Eventcodes are described in a separate document from the distributive package and partially described on section Use cases. Note that you can click on the PSP reference to go directly to the payment details in the Adyen back office (if you have logged in first).

In the Adyen back office you can also link back to DW by setting Merchant Settings > Merchant Reference Link to:

https://adyen01.tech-prtnr-eu01.dw.demandware.net/on/demandware.store/Sites-Site/default/ViewOrder_52-FindByNumber?OrderNo=

(change to your own site name)

Storefront Functionality

New storefront functionality is described in section Use Cases.

Known issues

Version

Issue

Workaround

3

'Session validity' and 'Shipbeforedate' are not used

3

Partial payments are not supported

Release history

This page contains version history for the Adyen LINK cartridge for Salesforce Commerce Cloud:

Version Date Changes
4 October, 2016

Updated cartridge for the following:

  • Controllers Support (js)
  • Notification Handling Updates
  • Support for Multiple Service Frameworks
  • Fixed for 3D-Secure handling
  • Support for currencies with fraction digits
  • SHA-2 support
  • CSE support
3 January 8, 2015

Full refactoring and improvement of the document, fixed a lot of mistakes. Added description of new API methods, AVS, 3-D Secure

2 August 16, 2013 Minor changes to documentation
2 June 06, 2013

Plug and play, API payments

1.0.1 May 20, 2011 GC changes
1.0.0 April 27, 2011 Initial release