---
title: Web SDK
slug: web-sdk
docTags: 
createdAt: 2024-05-23T08:39:41.979Z
---

Judopay's Web SDK is a JavaScript library which includes a fully customisable hosted iframe solution enabling you to collect sensitive card information.
You will not take on additional PCI scope, as sensitive card information such as:

- card number (PAN)
- expiry date
- card security code&#x20;

will be submitted by your customers into fields hosted by Judopay.

***

### Web SDK Video Tutorials

:::CtaButton{label=">>>  Click to learn the basics of accepting payments with our Web SDK Video Tutorials  >>>" docId="TEY_GEQbut9bneZO5mWgu" docAnchorId="#Nrq-M" openInNewTab="true"}

:::

***

### Payment Flow

![3ds2 payment flow](https://api.archbee.com/api/optimize/QGXTyW3MgdNcMjdEa0v8r/AqtoABBBeoDZ6goooiP1o-20260511-113405.png)

***

# Creating a 3D Secure 2 Payment with the Web SDK

:::hint{type="info"}
When authorising `/payments` or `/preauths` it is recommended to use **paymentSession**.
:::

Web SDK Version **0.0.29** (and higher) fully supports 3D Secure 2 flows. No additional support is required, the SDK does the rest.

:::hint{type="warning"}
Make sure your account has **3D Secure 2 API credentials&#x20;**&#x65;nabled.&#x20;
Contact ​Customer Support​​ to set this up.
:::

***

The following steps are **prerequisites for all the&#x20;**[payment methods](docId:40dWE6LBub7vdKza1QYDC) available for integration using Judopay's Web SDK.

## Step One: Create a paymentSession

:::hint{type="warning"}
Make sure you are using Judopay's API version **6.0.0.0** or higher.
:::

### Important to Consider

-  The paymentSession can be used for up to **three transaction attempts** for the same transaction.
  - If the **block duplicate transactions** permission has been applied on your API tokens, the paymentSession can only be used for **one&#x20;**&#x74;ransaction attempt.&#x20;
    - If you want to have this permission removed, contact Customer Support.
- A payment session can be used again to re-submit a failed transaction attempt.
- Once a transaction attempt is successful, the paymentSession can **no longer be used** even if there are any remaining attempts available.
- The paymentSession will expire in **30 minutes**, unless an **ExpiryDate&#x20;**&#x69;s set in the `/paymentsession` request body.
  - The expiry date must be within one year:
    `"ExpiryDate": "2028-10-06T17:43:21+01:00"`

:::hint{type="info"}
As soon as the payment session is used for the initial transaction attempt, this will initiate the **30 minute expiry time**.
:::

***

To create a paymentSession:

- Make a HTTP **POST&#x20;**&#x52;equest: `/paymentsession`

:::hint{type="warning"}
Merchants operating in specific money movement and financial services categories, as defined by the card schemes **must include** additional data in the [payment session](docId\:ylKW5coh5NQnfQ3j_Wjk2).
For more information, see [Account Funding Transactions](docId:5ol_pTSGBHVGKwJwD0gHg).
:::

:::CodeblockTabs
Payment Session Request Example

```json
{
  "judoId": "100100100",
  "yourConsumerReference": "2b45fd3f-cee5-4e7e-874f-28051db65408",
  "yourPaymentReference": "6482c678-cad3-4efd-b081-aeae7a89a134",
  "currency": "GBP",
  "amount": 10.99,
  "expiryDate": "2028-02-05T16:28:32.8596+00:00" //if not set, session will expire in 30 minutes
}
```

Response Reference Example

```json
//Store the reference returned in your backend server:
{
  "postUrl": "https://pay-sandbox.judopay.com/v2",
  "reference": "5QcAAAQAAAAPAAAACAAAABtGgvhBrF9BHTN7nqn1e0J4hVVmi-y27dGPjWBMtls3Gj_XDg"
}
```
:::

*For the full schema details and descriptions, see Transaction API:&#x20;*[/paymentsession](docId\:bcXNM5keOk-nlNrZTafUT)

:::hint{type="info"}
Your backend server should store the **paymentSession response reference&#x20;**&#x72;eturned by Judopay's API.
Use this reference from the response to populate paymentSession when calling `/payments` and `/preauths` from your front-end client.
See [Making a Transaction](docId:4DZoQ07rT7fyOlM0jUiBj).
:::

The following parameters need to remain consistent between the `/paymentsession` requests and the `/payments` and `/preauths` requests, otherwise the transaction will fail:

- YourPaymentReference
- YourConsumerReference
- JudoID
- Currency
- Amount

This is used to cross reference the validity of the transaction.

***

## Step Two: Add the Payment Form to your Website

::Image[]{src="https://api.archbee.com/api/optimize/QGXTyW3MgdNcMjdEa0v8r/dtlO96hwckHIfb-LD0mdz_docs-quick-start-hres.png" size="32" width="500" height="277" position="flex-start" alt="example payment form" darkWidth="500" darkHeight="277" showCaption="false"}

### Create and customise the Judopay Web SDK iFrame

::::WorkflowBlock
:::WorkflowBlockItem
Add the code snippet in your web page \<HEAD>: `scriptsrc="https://web.judopay.com/js/0.1.0/judopay.min.js">`&#x20;
**
*This example will use jQuery for a promise, so include the following in your web page&#x20;*\<HEAD>: `<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js></script>`
:::

:::WorkflowBlockItem
In your \<BODY> add a \<div> tag where you want the iframe to appear:
`<div id="payment-iframe" width="100%"></div>`&#x20;
**
*This example uses the **id: payment-frame**. You can use whatever id you wish.*
:::

:::WorkflowBlockItem
In your \<BODY> add a \<div> tag where you want the errors in form entry to appear.

*For the purpose of this exercise, the class is name&#x64;**&#x20;judopay-errors**, and sets a style to be **red**.*
**
You can add any custom style you wish in your .CSS file:
`<div class="judopay-errors" style="color:red">Error Location</div>`&#x20;

For more information on all errors that can be returned, see [Payment Form Error Messages](docId\:qfxaWPAQl_-2EVfP8y94d).
:::

:::WorkflowBlockItem
In your \<BODY> add a button call: **submit-payment-button** for the iframe submission to Judopay.
Make sure you have set:
`id="submit-payment-button"`

This is required to perform form validation where the **Pay&#x20;**&#x62;utton will be greyed out until all the information has been entered.
`<button id="submit-payment-button" Pay Now </button>`&#x20;

You can apply any css styling you wish to this button.
:::

:::WorkflowBlockItem
In your \<BODY> define the **iFrameConfiguration&#x20;**&#x6F;bject. This is used to customise the look and behaviour of the iFrame.
For more information on customising the iFrame, see [Customising your Web SDK Integration](docId\:FVh6jG8c0jC7Q7OC9uoac).
:::

:::WorkflowBlockItem
Create an instance of the Judopay Web SDK:
`var judo = new JudoPay("yourAPIToken", true); //initialize library`

- Alter **yourAPIToken&#x20;**&#x74;o match your Sandbox API Token
- The second parameter is called **useSandbox**
  - Set to **true** to use the **Sandbox** environment.
  - Set to **false** to use the **Production** environment.
:::

:::WorkflowBlockItem
Create the iFrame in the \<div> tag:&#x20;
`var payment = judo.createCardDetails('payment-iFrame', iFrameConfiguration)`

- `'payment-iFrame'`
  The \<div> id where the iFrame will be rendered, in step (2) above.
- `iFrameConfiguration`
  The object defined to customise the look and behaviour of the iFrame, in step (5) above.
:::
::::

An example of a&#x6E;**&#x20;iFrameConfiguration** object:

:::CodeblockTabs
iFrame Configuration Object Example

```javascript
//Script to create a minimum iframe:
<script>
const iFrameConfiguration = {
    isGeoLocationGatheringAllowed: true, 
    iframe: {
    language: "en", 
    errorFieldId: 'judopay-errors', 
    showCardTypeIcons: true, 
    layout: "vertical", 
    cardTypeIconRight: "10px", 
    cardTypeIconTop: "-2px",
    backgroundColor: "#FFFFFF", 
    enabledPaymentMethods: ['CARD'], 
    defaultCountryCode: 'UK',
    isCountryAndPostcodeVisible: false, 
    isCardHolderNameVisible: true, 
    errorsDisplay: "HIDE_UNDER_FIELDS", 
    disableUnderline: false, 
    shouldAutofocus: true, 
            }
    }
</script>
```
:::

:::hint{type="info"}
The iframe is created in your \<SCRIPT> location.
:::

See below for more details on the parameters that create th&#x65;**&#x20;iFrameConfiguration&#x20;**&#x6F;bject:

| **Parameter**                                       | **Description**                                                                                                                                                                                            |
| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `isGeoLocationGatheringAllowed`<br />Boolean        | isGeoLocationGatheringAllowed = **false**<br />The browser will not ask for the location.                                                                                                                  |
| `isChallengeModalCancelButtonVisible`<br />Boolean | isChallengeModalCancelButtonVisible = **true**<br />If set to false, the cancel (**X**) button on the 3D Secure 2 challenge modal will not be shown.                                                       |
| **iFrame Parameters**:                              |                                                                                                                                                                                                            |
| `language`<br />String<br />                        | Sets the language of the iFrame.<br />Values:<br />* en (english) (**Default**)
* es (spanish)
* fr (french)
* pt (portugese)
* de (german)                                                                |
| `errorFieldId`<br />String<br />                    | Set as the class name of the \<div> where the errors appear.<br />For example:<br />`<div class="judopay-errors">Error Location</div>`                                                                     |
| `showCardTypeIcons`<br />Boolean<br />              | showCardTypeIcons = **true**<br />The card icons will display when the card entry is recognised.                                                                                                           |
| `cardTypeIconRight`<br />String                     | Changes the position of the card icon.                                                                                                                                                                     |
| `cardTypeIconTop`<br />String                       | Changes the position of the card icon.                                                                                                                                                                     |
| `backgroundColor`<br />String<br />                 | Sets the background colour of the iFrame.<br />For example:<br />* #FFFFFF
* Default: white                                                                                                                |
| `layout`<br />String<br />                          | Sets the layout of the iFrame payment form.<br />Values:<br />* vertical (**default**)
* compact
* horizontal<br />For the form layout illustrations, see  [Form Layout](docId\:FVh6jG8c0jC7Q7OC9uoac).    |
| `defaultCountryCode`<br />String<br />              | Sets the country displayed in the country field.<br />For example:<br />* UK                                                                                                                               |
| `isCountryAndPostcodeVisible`<br />Boolean<br />    | isCountryAndPostcodeVisible = **true**<br />The country and postCode fields will be displayed.                                                                                                             |
| `isCardHolderNameVisible`<br />Boolean              | isCardHolderNameVisible = **true**<br />The cardHolderName field will be displayed.                                                                                                                        |
| `enabledPaymentMethods`<br />String \[ ]<br />      | Array of accepted payment methods.<br />Values:<br />* CARD                                                                                                                                                |
| `errorsDisplay`<br />String<br />                   | Formats how errors are displayed to the consumer.<br />Values:<br />* SHOW\_ALL
* HIDE\_UNDER\_FIELDS
* HIDE\_UNDER\_FORM
* HIDE\_ALL                                                                      |
| `shouldAutofocus`<br />Boolean<br />                | shouldAutofocus = **true**<br />Sets the focus to the cardNumber field when the iFrame appears                                                                                                             |
| `idealPollingTimeout`<br />Number<br />             | Specifies the amount of time the system waits for the IDEAL alternative payment method to respond.<br />For example: 6000                                                                                  |
| `disableUnderline`<br />Boolean<br />               | disableUnderline = **false**<br />When the consumer enters information into the iFrame, the fields will be underlined and highlighted.                                                                     |
| `allowedCardSchemes`<br />String \[ ]<br />         | Array of accepted card schemes.<br />If this field is set, an error will appear if an unsupported card scheme is entered.<br />Values:<br />* amex
* mastercard
* maestro
* visa
* diners
* discover
* jcb |
| `styles`<br />Object<br />                          | A JSON object.<br />Define further css style customisation for the payment fields.<br />For more information, see [Styles Properties](docId\:FVh6jG8c0jC7Q7OC9uoac).                                       |
| `fonts`<br />Object \[ ]<br />                      | An array of JSON objects, each representing a font.<br />For more information, see [Form Fonts](docId\:FVh6jG8c0jC7Q7OC9uoac).                                                                             |

***

## Payment Methods

Once the [paymentSession](docId:40dWE6LBub7vdKza1QYDC) and [payment iFrame](docId:40dWE6LBub7vdKza1QYDC) steps have been implemented, you can integrate the below payment methods, using our Web SDK:

### Card Payments

- [Creating a Payment / PreAuth Request](docId:4DZoQ07rT7fyOlM0jUiBj)&#x20;
- [Token Payment Request](docId\:vOoL6A4NSy9S0gyJpmBst)&#x20;
- [CheckCard Request](docId\:JSL02OrbsFwqCgzG4M099)&#x20;
- [SaveCard Request](docId\:UYdrRYieh3RY8H7kz1zj4)&#x20;

### Wallet Payments

- [Apple Pay™ for Web](docId\:oelqjygAmbce2048QcJP1)&#x20;
- [Google Pay™ for Web](docId\:DOcX7ICJrL11PhChKZ-y-)&#x20;

### Alternative Payments

- [PayPal](docId\:RCuemK4qqk-M-NDM0Nh8g) <font color="#ef5b2e">**(BETA)**</font>

***

# Setting up an Incremental Authorisation

The incremental authorisation feature allows you to increment the value of your original pre-authorisation for scenarios where you need to charge your customer a higher total amount.

By **incrementing the pre-authorisation** value, you will be able to capture the total amount that you wish to charge your customer when you are ready.

:::hint{type="warning"}
This feature is not available with all acquirers.
Check with our customer service team, or your account manager for your eligibility to use this.
:::

- The `allowIncrement` flag is a part of the main **JudoPaymentConfiguration** config object, and can be set when creating the configuration object.
- Set the `allowIncrement` flag t&#x6F;**&#x20;true**.
  - If present = it is automatically applied for preAuth requests.
  - If no value is provided = then **false&#x20;**&#x69;s set by default.

Example:

:::BlockQuote
val configuration: JudoPaymentConfiguration = \{
&#x20;...
&#x20;allowIncrement: true,
};

const judopay = new JudoPay()
judopay.createCardDetails('judopay-payment-iframe', configuration)
:::

***

## Putting it all together

Putting it all together to display the payment form and make a transaction:

:::CodeblockTabs
Example Flow

```javascript
<html>
<head>
    <!-- Include JudoPay WebSDK -->
    <script src="https://web.judopay.com/js/0.0/judopay.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>

    <!-- Where the Judopay iFrame will be displayed -->
    <div id="payment-iframe" width="100%"></div>

    <!-- Payment button for submitting iFrame input -->
    <button id="submit-payment-button" onclick="handlePaymentButtonClick()"> Pay Now </button>

    <!-- Where the payment form errors will be shown -->
    <div class="judopay-errors" style="color:red"></div>

    <script>

        // Define config object for customizing style/behaviour of iFrame
        const iFrameConfiguration = {
            isGeoLocationGatheringAllowed: true,
            iframe: {
                language: "en",
                errorFieldId: 'judopay-errors',
                showCardTypeIcons: true,
                layout: "vertical",
                cardTypeIconRight: "10px",
                cardTypeIconTop: "-2px",
                backgroundColor: "#FFFFFF",
                enabledPaymentMethods: ['CARD'],
                defaultCountryCode: 'UK',
                isCountryAndPostcodeVisible: false,
                isCardHolderNameVisible: true,
                errorsDisplay: "HIDE_UNDER_FIELDS",
                disableUnderline: false,
                shouldAutofocus: true,
            }
        }

        // Initializing/creating an instance of the Judopay webSDK
        var judo = new JudoPay("yourAPIToken", true);

        // Displaying the card entry iFrame
        var payment = judo.createCardDetails("payment-iframe", iFrameConfiguration);

        //Define config object for payment/preauth
        const paymentConfiguration = {
            judoId: "yourJudoId",
            amount: 1.01,
            currency: "GBP",
            phoneCountryCode: "44",
            challengeRequestIndicator: "challengeAsMandate",
            initialRecurringPayment: false,
            yourConsumerReference: "yourConsumerReference",
            yourPaymentReference: "yourPaymentReference",
            billingAddress: {
                address1: "My house",
                address2: "My street",
                town: "My town",
                postCode: "TR14 8PA",
                country: "826"
            },
            mobileNumber: "07999999999",
            emailAddress: "contact@judopay.com"
        }

        function handleSuccess(response) {
            //Redirect to success page and handle response
        }
        function handleError(error) {
            //Redirect to error page and handle error
        }

        //Called when payment button pressed to invoke payment
        function handlePaymentButtonClick() {
            judo.invokePayment("yourPaymentSession", paymentConfiguration)
                .then(handleSuccess)
                .catch(handleError)
        }
    </script>

</body>
```
:::

***

## Handle the Response

All the Judopay Web SDK transaction methods return a promise.
Once the authorisation is complete, the promise will be either fulfilled or rejected.

**Fulfilled**

- You will receive a JSON object response (a Judopay receipt object).
  - For more information and schema on the JSON object, see [API Transaction Response](docId\:bcXNM5keOk-nlNrZTafUT).
- Depending on the result the consumer should be redirected to the appropriate outcome page.
  - For example, if the result = SUCCESS redirect the consumer to the Success Page.
- This page should display the necessary transaction information (found in the Judopay receipt object).

**Rejected**

- You will receive an error object
  - For more information on error responses returned, see [Web SDK Error Responses](docId\:qfxaWPAQl_-2EVfP8y94d).
- The consumer should be redirected to an Error Page.

:::CodeblockTabs
Response Example

```json
const onFulfillment = (receiptObject) => {
  const { result } = receiptObject
  //redirect to appropriate page depending on the result (success/failure/declined page)
}

const onRejection = (error) => {
  //redirect to error page and handle error
}
```
:::

For more information on the response codes, see [Codes](docId:_zrsihomUEW-XnRQ4PBtJ).

***

## Voiding an Incremental Authorisation Transaction

Each incremental authorisation generates its own `receiptId`.&#x20;

If an authorisation has been incremented, any subsequent void request **must&#x20;**&#x72;eference the `receiptId` of the **original pre-authorisation** transaction.&#x20;

:::hint{type="warning"}
Using the `receiptId` returned following an incremental authorisation will result in an **error**.
:::

The void amount **must&#x20;**&#x62;e the sum of the original authorisation amount and all successful increments.&#x20;
Any attempt to process a **partial void**, the sum of any but **not all authorisations** and increments, will result in an **error**.

For example:

- Initial preAuth: £100
- `incrementalAuth` request amount: £20
- `incrementalAuth` request amount: £30
- Total authorised amount after increments: £150


To void this transaction:

1. Use the `receiptId` of the Initial preAuth.
2. Submit a void request for **£150**.

***

# Customisation and Displaying Payment Form Error Messages

For more information on:

- Customising your Web SDK integration, see [Customisation](docId\:FVh6jG8c0jC7Q7OC9uoac)
- Displaying payment form error messages, see [Payment Form Error Messages](docId\:qfxaWPAQl_-2EVfP8y94d)&#x20;

***

# Testing your Integration

Follow our [Testing your Web SDK Integration](docId:5TAFISDJ44kGcCiGW2z-w) test scenarios, to test your integration and generate:

- Successful payments
- Declined payments
- Unexpected errors



