# Global Payments Developer Documentation - Full Markdown Corpus > Reference and integration guides for the Global Payments API, SDKs, plugins and hosted payment products. Covers the REST Global Payments API, the XML ecommerce gateway, and Heartland. This file is every page listed in https://developer.globalpayments.com/llms.txt, concatenated into one document. It exists for tools that ingest a single file: Claude Projects, ChatGPT custom GPTs, Cursor @Docs, NotebookLM, and retrieval pipelines. If your tool can fetch URLs, prefer the index at https://developer.globalpayments.com/llms.txt and fetch pages individually. Pages: 144. Each page below starts with a level-1 heading, followed by `Source:` and `Section:` lines, then the page body. Outside fenced code blocks, a level-1 heading always marks the start of a new page. Every link is absolute, so a link can be followed without knowing where this file came from. Every page listed below is available as clean Markdown at the URL shown. Drop the `.md` suffix for the HTML version of the same page. Sandbox base URL is `https://apis.sandbox.globalpay.com`. Production base URL is `https://apis.globalpay.com`. Agent operation and safety guidance is published separately at https://developer.globalpayments.com/agents.md. Pages carrying `show_md: false` in their front matter are intentionally excluded from this index. # Getting Started Source: https://developer.globalpayments.com/docs/getting-started/overview.md Section: Getting Started Description: Your integration journey begins here! Welcome to our developer portal! We’re happy you’re here. Here you can learn everything you need to know about our integration process — from setting up a free account so you can simulate taking payments, trying out different features, to signing up with us to begin taking payments for real. This page will help you get started quickly, whether you're new to payments or a pro ready to explore what Global Payments has to offer. ## New to payments? If you’re new to the payments industry, you'll probably want to learn the basics first, such as how a card transaction works and how the key players interact with each other. The links below will provide a solid introduction to payments along with a handy glossary for the common terms you'll see throughout our portal. ### [Intro to Payments](https://developer.globalpayments.com/docs/getting-started/new-to-payments/introduction.md) Learn about the key industry players and how they interact. ### [Payments Glossary](https://developer.globalpayments.com/docs/getting-started/new-to-payments/glossary.md) Get familiar with payment terms we use frequently on our portal. ## Prerequisites When you're ready to get started, there are a few things you need to do first. One of the most important is getting access to our testing Sandbox. For this, you'll need to get registered here on our portal and create an app to generate test credentials. ### [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md) Learn how to get a free account and test credentials. Once you've registered, all you need to do is create your first access token so you can execute API requests. ### [Create an Access Token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) Learn how to create a token to access our API. ## Start building and testing Once you’ve taken the first few steps, you’re ready to build your integration. It’s important to know what your integration options are and what free resources we provide to help. ### [Build Your Integration](https://developer.globalpayments.com/docs/getting-started/your-integration.md) Start your payments journey using our portal’s resources. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, fork, or import a copy of our API collection. ### [Testing](https://developer.globalpayments.com/docs/getting-started/testing.md) Understand the test cases to build your integration with confidence. ## Start taking payments for real When you’re done testing and are ready to onboard with us, we'll help you through the validation process for direct API and SDK integrations. ### [Going Live](https://developer.globalpayments.com/docs/getting-started/going-to-production.md) Validate your integration so you can start taking payments for real. ## Get to know our portal As you navigate around our site, you're going to find a lot of useful information — the kind of stuff you're going to want to hang on to. This portal provides high-level overviews with links to a wealth of detailed information about integration options, building for different types of payments, managing risk, and more. We also provide an up-to-date changelog and free test resources to make integration easier. If you haven't already registered, we recommend that you do that now, before you start exploring. Once registered, you’ll see a Save button in the top-right corner of every page in the portal that you can use to bookmark your favorite pages for quick reference whenever you need them. You can access and manage your saved pages on your account page. [Get Registered Now](https://developer.globalpayments.com/login) # Register / Create an App Source: https://developer.globalpayments.com/docs/getting-started/register.md Section: Getting Started Description: Set up a free account and learn how to get your test credentials We’re happy you’ve decided to join us! There are a couple things you need to do before you start your payments journey with us. ## Get registered To use our free Sandbox test environment, you must be a registered user of our developer portal. Once registered, you can manage app test credentials for your different projects and test your integration before going live. You can also try out new features, save your favorite pages to pick up where you left off, and join our Research Community to preview new features. > If you already have an account on our Reporting or Disputes tools for merchants, you can use the same login for our developer portal. You just need to add your company name and region. To get registered, click **Log In | Register** in the top-right corner of any page or click below. [Log In | Register](https://developer.globalpayments.com/user/b2c-login) ## Apps and Testing Environments We use the term _app_ to describe a set of credentials that developers need to execute API actions on our gateway. Each app consists of an App ID and App Key, which together are used to create a bearer token that allows you to access our endpoints and transact using the REST API. Each app also includes permission settings that allow you to customize its capabilities, which in turn determine what API actions are allowed when sending requests. > App credentials (App ID and App Key) are specific to merchants and should never be shared with any unauthorized person. ### Permissions define capabilities Capabilities refer to our payment-processing solutions such as Transaction Processing, Tokenization, Dispute Management, Settlement Reporting, and so on. By default, all of these capabilities are enabled for any app you create. You can customize permissions simply by clearing the checkboxes for any capabilities you don't want. For more information on capabilities, see [Account Capabilities](https://developer.globalpayments.com/api/definitions/account-capabilities.md) in our API References. You can further customize each capability by deciding which individual request types (GET, POST, PATCH) for transactions, verifications, and authentications you want to allow. For example, for `dispute_management`, you could allow only `[GET] Disputes` to run a certain test scenario. We've made our test apps highly configurable to give you the flexibility you need for a wide variety of testing scenarios. For example, you can try a new capability to see how it works before adding it to your Production account. Or, maybe you have several merchants you’re developing for and each one has (or will need) different capabilities enabled. In that case, you could create a test app for each merchant. #### Sandbox test environment For Sandbox testing, you create your own apps from your account page here in the developer portal and configure them as needed for testing your integration. Each test app can serve as an individual project you’re working on — for example, one app to test your ecommerce website and a second to test your ecommerce mobile application. However, you really only need one test app to access the Sandbox endpoint. ```json https://apis.sandbox.globalpay.com ``` #### Production live environment When you have a real Production account with us, an account manager will configure your app(s) based on the capabilities you sign up for and how many linked businesses you have. In Production, capabilities are referred to as _accounts_ because the `account_name` and `account_id` fields are used to identify what data your API request can access when you're processing real payments with us. Your account manager can add new accounts for you at any time, not just during the onboarding process. ```json https://apis.globalpay.com ``` ## Create an app (generate keys) Before you can start testing your integration, you need to create your first test app. This is necessary to generate the test credentials needed to access our Sandbox endpoint — the App ID and App Key described in the section on [apps and testing environments](#apps-and-testing-environments). To create an app: 1. Log into your account in the Developer Portal. 2. Click the Profile icon and select **My Account** to access your dashboard. *Note: When you're logged in, you'll be able to access your dashboard through this menu from any page in the portal.* 3. In the My Sandbox Credentials section of your dashboard, click the **Create a New App** arrow, and select **Unified Payments**. This will bring up the Create an App page. 4. On the Create an App page, enter a name for your test app in the **Display Name** field (for example: *UK Website or US Mobile App Transaction Processing*). *Note: The display name can be changed at any time. However, the machine-readable app\_name can’t be changed once the app is saved.* 5. Optional: By default, a new app has permissions enabled for all capabilities. If this is what you want, you can skip to the next step. However, if you want to limit them, just follow these steps: 1. For each capability you want to limit, click on the down arrow in the **Permissions** field to bring up the permission dialog for that capability. 2. To search for a certain request type (for example, GET), use the search box. 3. If you want to disable all the permissions, clear the **Select All** checkbox. 4. If you're not sure what permissions you want or want to familiarize yourself with those available for a given capability, you can simply scroll through the list. 6. Once you have configured the permissions you need, click down arrow in the **Permissions** field again to close the dialog. Any changes will be reflected in the blue "Enabled" number. *Note: Your changes are not yet saved at this point.* 7. When you're finished creating the app, scroll down to the bottom of the page and click **Generate Keys**. *Your app credentials will now appear on the left panel. You can copy them to use in the configuration section of your API request.* 8. To return to your account, you can click the breadcrumb link at the top of the page or on your profile in the upper right corner. Your new app will now appear in the **My Sandbox Credentials** table. ## Manage your apps You can create as many test apps as you need. We suggest giving them useful, intuitive names so that you can easily keep track of them. For example, you may want to indicate the location that your simulated transactions will originate from or the permissions that the test app will have. So, you might name it something like, *US Apparel Online Transaction Processing*. Once you’ve created a test app, you can edit the app to change the display name, view (and copy your credentials, or reconfigure permissions at any time. You can’t delete a test app, but if you no longer want to use it, you can switch it off. For more information on test apps, you can refer back to the section on [working with apps in our testing environments](#apps-and-testing-environments). To view your credentials: 1. Log into your account in the Developer Portal. 2. Click the **Profile** icon and select **My Keys**. 3. In the **My Sandbox Credentials** table, locate the app you want to view keys for in the app list. 4. Click **View Credentials** button to open a dialog box with your credentials. 5. To copy the credentials, click the copy icon. You can then paste the data into the configuration section of your API request. You’ll need to copy and paste both the App Key and App ID in the request. 6. When finished viewing, click **Close**. To edit an app: 1. Log into your account in the Developer Portal. 2. Click the **Profile** icon and select **My Keys**. 3. In the **My Sandbox Credentials** section, locate the app you want to edit in the app list. 4. Click **Edit App** button to open the App Details page. 5. To edit your app’s name, click in the **Display Name** field and enter the new name. When finished, scroll down to click **Save**. Or, click **Cancel **to cancel.* Note: The machine-readable name for your app (App Name field) can’t be changed.* 6. To configure capabilities and permissions for your app, use the **App Permissions** section. (For more information on capabilities, see [Account Capabilities](https://developer.globalpayments.com/api/definitions/account-capabilities.md) in API References.) 1. For each capability you want to limit, click on the down arrow in the **Permissions** field to bring up the permission dialog for that capability. 2. To search for a certain request type (for example, GET), use the search box. 3. If you want to disable all the permissions, clear the **Select All **checkbox. 4. If you're not sure what permissions you want or want to familiarize yourself with those available for a given capability, you can simply scroll through the list. 5. Once you have configured the permissions you need, click down arrow in the **Permissions** field again to close the dialog. Any changes will be reflected in the blue "Enabled" number. *Note: Your changes are not yet saved at this point.* 7. When you’re finished editing your app, scroll down to the bottom of the page and click **Save**. ## Apps glossary Here are some important terms related to app creation and management. | Term | Definition | | ------- | ---------- | | Account(s) | Payment-processing capabilities that can be added when you sign up with us, the most fundamental of which is Transaction Processing. Others include Tokenization, Dispute Management, Settlement Reporting, Risk Assessment, etc. Each capability you add is considered an account. You can only execute API actions based on what accounts you have configured. | | Account ID | Unique identification of a capability type (i.e., one of our payment-processing solutions) that allows certain data to be accessed through an API request. When you want to use a capability in an API call, you need to include its ID in the API request’s account_id field. The first three letters identify which account capability it is (see Account Name entry). For example, an Account ID for Transaction Processing (TRA) would look something like this: TRA_123456789a123456789b123456789c | | Account Name | Standardized name of a capability type (i.e., one of our payment-processing solutions) that allows certain data to be accessed through an API request. When you want to use a capability in an API call, you need to include its name in the API request’s account_name field. Examples include: transaction_processing, dispute_management, risk_assessment, settlement_reporting, etc. | | App | Set of credentials that you need to execute API actions on our server. Each app consists of an App ID and App Key, which together serve as a bearer token to access our endpoints. An app also includes customized capabilities, which in turn determine what API actions are allowed when sending requests. For more information, see the [Apps and testing environments](#apps-and-testing-environments) section. | | App Name | Machine-readable version of the display name you give your app when you first create it (i.e., underscores replace blank spaces). It’s created automatically and can be edited before the app is first saved but not after. Allowed characters: `[a-z_0-9]`. | | App ID & App Key | Set of credentials needed to access our server and execute API actions. To generate these credentials, you need to create a test app. Only one test app is necessary to access our Sandbox endpoint, but you might want to create several for different testing projects. **Note: These credentials are specific to a merchant and should not be shared.** | | Capability | One of our payment-processing solutions, the most fundamental of which is Transaction Processing. Others include Tokenization, Dispute Management, Settlement Reporting, Risk Assessment, etc. In Production, capabilities are referred to as _accounts_. | | Display Name (App) | Name that you give your test app. You can edit it at any time, but its associated machine-readable name (App Name field) cannot be edited once the test app has been created. | | Merchant | A person or business entity who is authorized to use our API. A merchant can only execute API actions based on the accounts configured for them and the permissions on those accounts. | | Merchant ID | System-generated unique identifier associated with an app. It’s specific to our API and is used to identify a merchant on our platform. The identifier u the prefix MER. For example: MER_7e3e2c7df34f42819b3edee31022ee3f | | Permissions | The individual request types (GET, POST, PATCH) for transactions, verifications, and authentications that are allowed for a capability in a test app. You can edit permissions for each capability associated with a test app. All required permissions are enabled by default when you first create a test app. | ## Next steps Now that you have your test app credentials, there's one more thing you need to do before you can start building your integration: [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md). # Create an Access Token Source: https://developer.globalpayments.com/docs/getting-started/generate-token.md Section: Getting Started Description: Learn how to generate a single-use key to start making API requests An access token is a unique, single-use key used to access API actions for a limited time and is required for every request to create, edit, or read resources. For example, in order to send a transaction, you first need to create a token to access our API. The actions you'll be able to perform (allowable actions) are based on capabilities you were assigned when you registered for your Developer Portal account. This guide will walk you through the following steps to create an access token, including: * Obtaining your app credentials * Creating a random nonce value * Calculating a secret key * Calling the endpoint * Receiving a response You’ll also find information on how an access token differs from other [token types](#token-types). ## Token types An access token is used only for authentication. It's sometimes mistaken for a payment token, which is another type of token used to substitute sensitive card data in a transaction. While a payment token can be either _single-use_ or _multi-use_, an access token is a _single-use_ token only. There are also some functional differences between payment tokens and access tokens. * **Duration** – Limits how long it is valid for (timeout value) * **Permissions** – Restricts the functionality (required for hosted integrations) Token Duration and Token Permissions can be limited for security purposes. The shorter the duration of a token, the less time it is able to be abused, and the fewer permissions available for a token to access, the less likely bad actors can repurpose it for exploits. Some integration types and features, such as our hosted features, require single permission tokens to avoid this exact problem on the clearweb (aka the surface web). ## Prerequisites Before you can use the steps in this guide to create an access token, you first have do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md#get-registered) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) ## Step 1: Obtain your app credentials Your app credentials are the `app_id` and `app_key`. Your app credentials for testing in Sandbox are located on your account page (to learn how to create them, see [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md)). For Production credentials, check with your account manager. For example: ```JSON app_id = "MN500Q8lk5jp0rEmB5LGvTo27gdQgZln" app_key = "QtOSeNmh3DY6AuMO" ``` > App credentials (App ID and App Key) are specific to merchants and should never be shared with any unauthorized person. ## Step 2: Create a random nonce value A random nonce is a unique string used to calculate the secret key, which you'll do in the next step. The nonce value must be unique. A timestamp makes a good nonce value because the time changes every time an access token is run, which makes it a unique value. For example: ```JSON nonce="2029-03-14T13:24:10.832Z" ``` ## Step 3: Calculate the secret key For security reasons, you should never send your `app_key` in a request. That’s why we use encryption to make it secret. The secret key consists of a SHA512 hash of the nonce concatenated with the `app_key`. For example: ```JSON // secret = SHA512(nonce + app_key) secret = SHA512(2029-03-14T13:24:10.832ZQtOSeNmh3DY6AuMO) ``` ## Step 4: Call the endpoint Now it’s time to send the values from the previous steps to the Access Token endpoint. > Never send the app key in a request. Always store it securely. #### Sample request ```JSON curl -v -X POST https://apis.globalpay.com/ucp/accesstoken -H "Content-type: application/json" -H "X-GP-Version: 2021-03-22" -d ' { app_id="" nonce="", secret="", grant_type="client_credentials" } ' ``` ## Step 5: Receive a response When you call the endpoint, you'll receive the token response and its permissions, which you can now use in the Authorization header field in subsequent API requests. #### Sample response ```JSON { "token": "qdYUdzfZfigqTppQOHVwrbJwLlNd", “Type”: “Bearer”, "scope": { "merchant_id": "MER_8cc2638c8a14453fa98e08ad51511a1a", "merchant_name": "GPQA_IPP_CERT", "accounts": [ { "id": "TRA_34b9806b35bd4012bd23206a00abc1a1", "name": "GP API", "permissions": [ "BAT_PUT_Close", "TRN_POST_Adjustment", "TRN_POST_Authorize", "TRN_POST_Capture", "TRN_POST_Force", "TRN_POST_Initiate", "TRN_POST_Reauthorize", "TRN_POST_Refund", "TRN_POST_Refund_Standalone", "TRN_POST_Reverse", "TRN_POST_Verify" ] } ] }, "app_id": "MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "My app name", "date_created": "2019-03-20T10:42:23.527Z", "seconds_to_expire": "86399", "email": "dev.mcdev@example.com" } ``` ## Troubleshooting The two most common error messages errors users experience when trying to pass an access token in a request are: * Invalid Access Token – This most often occurs when a token request is rejected, but your website or application attempts a transaction anyway. * Access Token Expired – This occurs if a token is used after its timeout value has passed (`interval_to_expire` or `seconds_to_expire` fields). If you run into issues passing a token, the following questions will help you troubleshoot: 1) Are the `app_id` and `app_key` you’re using correct? 2) Was the secret key calculated correctly and properly entered in the field? 3) Are other mandatory fields you included in the request correct (for example, `grant_type`)? 4) Do you have the right account permissions for your request? If you’re not sure, check with your account manager. ## Next steps Now that you have your test app credentials and an access token, it's time to start [building your integration](https://developer.globalpayments.com/docs/getting-started/your-integration.md). # Build Your Integration Source: https://developer.globalpayments.com/docs/getting-started/your-integration.md Section: Getting Started Description: Start your payments journey using our portal’s resources To start building your integration, you first need to choose an integration path. Then see what documentation and other resources we provide to help you build and test your integration for free. ## Choose your integration path Using a REST framework, our API provides a single integration to connect into numerous regions, channels, and payment methods worldwide. We have solutions for every level of expertise: * **No code** – Download one of our compatible plugins like WooCommerce or Adobe Commerce (formerly Magento) to add an out-of-the-box payment page to your website. * **Low code** – Use an SDK or a client-side library to simplify your integration and get to market faster. * **High code** – Use our REST API to build a highly customized integration that you control and use to send direct API requests. ### [Plugins](https://developer.globalpayments.com/docs/integration-options/plugins) **Level: No Code** Download a feature-rich shopping cart or platform extension created for us. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) **Level: Low Code** Access our server-side software development kits and client-side libraries. ### [API](https://developer.globalpayments.com/docs/integration-options/api.md) **Level: High Code** Build a highly customized integration that you control and can use to send direct API requests. ## Explore our resources You'll find all the free resources you need on our developer portal to make your integration smooth and easy, no matter which path you choose. * [Guides](#guides) * [Technical resources](#technical-resources) * [Sandbox access](#sandbox-access) * [Testing](#testing) ### Guides Our guides provide step-by-step instructions to get you up and running. They include code samples for API requests and responses in JSON, and Java, PHP, and .NET for some products. We've provided overviews for all the key features and products to help you learn more about their business value and use cases. You’ll also find an overview for each of the major sections of our documentation in the links below. ### [Payments](https://developer.globalpayments.com/docs/payments/overview) Find ways to accept and manage payments that make the checkout process easier. ### [Risk Management](https://developer.globalpayments.com/docs/risk-management/overview) Reduce fraud by better identifying and authenticating online customers. ### [Operations & Reporting](https://developer.globalpayments.com/docs/reporting/overview) Use transaction data to better understand your business. ### [Partners](https://developer.globalpayments.com/docs/partners/overview) Create, manage, and act on behalf of your merchants. ### Technical resources Whether you're integrating by SDK or API, we have all the references and examples to help you during your journey with us. ### [API Explorer](https://developer.globalpayments.com/api/overview.md) Test code in an interactive playground and explore API resources and methods. ### [API Definitions](https://developer.globalpayments.com/api-definitions-overview) Learn how our API works and the common features applicable to all aspects of the API. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, fork, or import a copy of our API collection. ### [SDK References](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/overview) See Java, .NET, and PHP code samples and other resources for our products. ### [Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add client-side SDKs via JavaScript, iOS, and Android to your integration. ### Sandbox access Our free Sandbox test environment provides a secure way to build your integrations, allowing you to sample the full range of payment-processing capabilities our API offers. To access our Sandbox, you first need to get registered on this developer portal and create an app. To execute any API requests, you also need to create an access token. ### [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md) Set up a free test account so you can start using our API. ### [Create an Access Token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) Learn how to create a token to access our API. ### Testing Use the following resources to test your integration. ### [Test Case Scenarios](https://developer.globalpayments.com/docs/getting-started/testing.md) Know the test cases you'll need to run during validation to build your integration with confidence. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/postman-overview) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Technical support For more information on the capabilities of this REST API, see our [frequently asked questions](https://developer.globalpayments.com/support/FAQs). They cover everything from controlling access token expiration, to how the 3D Secure process works, to how reporting works. For technical support, contact [Integration Support](https://developer.globalpayments.com/support/integration) or your account manager. ## Next steps Now that you’re familiar with your integration options and know where to find the resources you need to build an integration, you can use our [Postman collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) to get some hands-on experience building with our API. # Postman Collection Source: https://developer.globalpayments.com/docs/getting-started/postman-collection.md Section: Getting Started Description: Use Postman for easier integration with our API Our API Postman collection is available to view, fork, or import (a copy). The collection includes API requests and responses for many of our products, including Transaction Processing, Fraud Management, Settlement Reporting, Dispute Management, and more. You’ll also find practical use cases for both card-present and card-not-present scenarios, including 3D Secure, Transactions, Card Storage, and Refunds. If you’re ready to jump in, just skip to the [Run in Postman](#run-in-postman) section. If you're not familiar with Postman, you can learn more in the [Get Postman](#get-postman) section. ## How to use it If you’re new to our API, we recommend you first read our documentation to get familiar with how things work. For an overview of our learning resources for this developer portal, see [Build Your Integration](https://developer.globalpayments.com/docs/getting-started/your-integration.md). Once you’re ready, we ask that you fork the collection. It comes with a working test app in the environment file that can serve as your test credentials. However, we highly recommend that you register with us and get your own test app credentials (for more information, see [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md)). To start using the API, replace the credentials in the environment file of our Postman collection with your own. ## Use cases The collection contains practical use cases you can implement using our REST API. The below example shows our 3D Secure use cases. ![File tree structure in Postman showing use cases for 3D Secure.](https://developer.globalpayments.com/gh-assets/postman_use-cases.png) **3DS Use Cases in Postman** ## Keep it updated The collection is updated periodically, so keep checking back to make sure you’re using the most recent version. Keep in mind that when we release a new version of the API, you'll need to import the collection again to get any new updates. ## Run in Postman To view, import, or fork our API collection in Postman, click the button below: > The below link is for merchant processing. If you are looking for partner functionality, please reach out to your integration support contact. To download the environment for your Postman collection, click the Download button below: [Download Environment](/gh-assets/resources /REST API Environment (Merchant).postman_environment.json) ## Get Postman If you’re not currently using Postman, you can [create a free account](https://identity.getpostman.com/login) to try it out. Postman offers a simple collaborative platform with an extensive range of features to help you interact more seamlessly with our API. You can run it in a web browser (Chrome, Firefox, and Edge) or download the [Postman app](https://www.postman.com/downloads) to work with it in Microsoft Windows, on your Mac, or a Linux machine. ## Next steps Now it’s time to play in our Sandbox. Experiment as much as you want with our API to build an integration that works perfectly for your use case. When you're ready, you can [go live](https://developer.globalpayments.com/docs/getting-started/going-to-production.md) and start taking payments for real. # Test Case Scenarios Source: https://developer.globalpayments.com/docs/getting-started/testing.md Section: Getting Started Description: Ready your Integration to go live by running these scenarios. ## Overview This section guides developers through real-world key test-cases and edge-cases they may encounter when integrating with us. By walking through these examples, you will gain a clear understanding of how our APIs behave under normal and boundary conditions. We highly recommend that developers follow these guidelines while building integrations and using these guidelines as part of your internal QA testing before go-live. > In order to determine whether below capabilities suit your business needs and are applicable to your region, please contact your account manager or our [sales team](https://developer.globalpay.com/support/sales) for further details. ## **Test Cards** You may use our simulated credit cards to test different scenarios When testing your integration, *never* use real card details or banking information. This is why we provide simulated payment methods including test card numbers that you may use to test different scenarios for your application or website. #### Test Card Data | Test Card Number | Card Brand | Expiry | CVV | Result | | :---- | :---- | :---- | :---- | :---- | | 4263970000005262 | Visa | 05/39 | 599 | Successful transaction | | 5425230000004415 | Mastercard | 05/39 | 599 | Successful transaction | | 374101000000608 | American Express | 05/39 | 1234 | Successful transaction | | 36256000000725 | Diners Club | 05/39 | 1234 | Successful transaction | | 6011000000000087 | Discover | 05/39 | 599 | Successful transaction | | 3566000000000000 | JCB | 05/39 | 599 | Successful transaction | | 135400000007187 | UATP | 05/39 | 599 | Successful transaction | #### Test Card Track and Tag Data The below test track data and tag data will provide a successful transaction for Credit Cards. ``` %B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000? ``` ``` 9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001 ``` ## Test Cases The API Platform's sandbox environment lets you test your integration without needing to make real charges or payments. To make testing easier, we suggest using the below test cases in the specified amount with information available in the [API Explorer](https://developer.globalpay.com/api/overview) and [Postman Collection](https://developer.globalpay.com/api/postman-collection/overview). #### Platform [**Access Token**](https://developer.globalpay.com/docs/getting-started/generate-token) | Resource | Postman Reference | Steps / Trigger | Description and Expected Result | | :---- | :---- | :---- | :---- | | [**Access Token**](https://developer.globalpay.com/docs/getting-started/generate-token) | [BASIC ACCESS TOKEN](https://www.postman.com/globalproduct-api/gp-api-public-workspace/request/mrvzq6j/access-token) **Description** : A basic access token is a unique, single-use key that allows access to API actions for a limited time. It is required for every request that creates, edits, or reads resources. | The NONCE value must be generated by the client and should be unique for each request. | A successful request returns a Bearer Token, which must be included in the Authorization header of subsequent API calls. | | [**Access Token**](https://developer.globalpay.com/docs/getting-started/generate-token) | [SINGLE PERMISSION ACCESS TOKEN](https://www.postman.com/globalproduct-api/gp-api-public-workspace/request/8bpuuki/access-token-with-single-permission) **Description** : A restricted access token with single permission is used for specific operations such as tokenization, reporting, or other predefined actions for a certain amount of time. | Permissions: Restrict the token by specifying required permissions, for example: "permissions": \["PMT\_POST\_Create\_Single"\] Expiration: Limit token validity by setting an interval, for example: "interval\_to\_expire": "10\_MINUTES" | The token is returned as a Bearer Token with single-use permissions. This token can be used for API calls that generate a single-use card token. | | [**Access Token**](https://developer.globalpay.com/docs/getting-started/generate-token) | [HANDLE EXPIRED TOKEN](https://www.postman.com/globalproduct-api/gp-api-public-workspace/request/mrvzq6j/access-token) **Description** : This scenario ensures the system can detect an expired access token and automatically issue a new token to continue processing API requests. | Set the access token to expire quickly: "seconds\_to\_expire": 60 Call the VERIFY API immediately; it should succeed because the token is still valid. Wait 61 seconds and call the VERIFY API again, it should return: "Access token expired" The system should automatically generate a new access token and continue processing requests. | A new Bearer token is issued automatically when the old token expires. Subsequent API calls continue successfully using the newly issued token. | #### Online Payments [**Pre Sale Actions**](https://developer.globalpay.com/docs/payments/manage-payments/verify-guide) | Resource | Postman Reference | Test Card Details | Description and Expected Result | | ----- | ----- | ----- | ----- | | [**VERIFY**](https://developer.globalpay.com/docs/payments/manage-payments/verify-guide) | [VERIFY](https://developer.globalpay.com/api/verifications#/Verify/createVerification) **Description** : Confirm if a payment method can be used in the creation of a transaction. The verify function allows you to query a card and determine if it's available for payment. | Visa MasterCard American Express Diners Club Discover JCB | CARD should be successfully verified with status "VERIFIED". | [**Sale Actions**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | Resource | Postman Reference | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/cnavu7x/auth) **Description :** Initiates a sale transaction to transfer funds from the payer to the merchant using the specified payment method. | **"amount": "1000"** | Visa MasterCard American Express Diners Club Discover JCB | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [DELAYED CAPTURE TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/uleca9n/preauth-and-capture) **Description :** Authorizes the customer's card without immediately placing the transaction in the settlement file. A separate capture request is required to complete the transaction at a later time. | **"amount": "1001"** | Visa MasterCard American Express Diners Club Discover JCB | The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The transaction should appear in the checkout process as approved. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [MAIL ORDER / TELEPHONE ORDER TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/1vtzqj6/moto) **Description :** Supports transactions entered via Mail Order or Telephone Order (MOTO), where cardholder data is provided by the customer remotely. | **"amount": "1002"** | Visa MasterCard American Express Diners Club Discover JCB | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be visible in the checkout interface. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [PARTIAL CAPTURE TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/7dstw11/multi-capture) **Description :** Processes a partial authorization (capture), where approval is granted for an amount less than originally requested. | **"amount": "1003"** | Visa MasterCard American Express Diners Club Discover JCB UATP | The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved partial and remaining captures will be reflected in the checkout system. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION WITH PAYMENT TOKEN](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/2ndw1ro/auth-with-payment-token) **Description :** Executes a capture transaction using a tokenized payment method (PMT\_ID) instead of a PAN. | **"amount": "1004"** | Visa MasterCard American Express Diners Club Discover JCB | The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The transaction should be reflected as approved in the checkout interface. | [**Risk Management**](https://developer.globalpay.com/docs/risk-management/overview) | Resource | Postman Reference | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [3D SECURE TRANSACTIONS](https://developer.globalpay.com/docs/risk-management/3D-secure/overview) | [FRICTIONLESS FLOW](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/w8fk64t/3ds-authorization-frictionless) **Description :** Used when the issuing bank determines that no customer challenge is required during 3DS authentication. | **"amount": "2001"** | Card Number : 4222000006724235 Expiry : 05/39 CVV : 599 Card Number : 4263970000005262 Expiry : 12/30 CVV : 123 | The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The transaction should be reflected as approved in the checkout interface. | | [3D SECURE TRANSACTIONS](https://developer.globalpay.com/docs/risk-management/3D-secure/overview) | [CHALLENGE FLOW](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/mo9n065/3ds-auth-challenge) **Description :** Used when a customer challenge is required during 3DS authentication | **"amount":"2002"** | Card Number : 4012001038488884 Expiry : 05/39 CVV : 599 Card Number : 4222000001227408 Expiry : 05/29 CVV : 599 | The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The transaction should be reflected as approved in the checkout interface. | | [3D SECURE TRANSACTIONS](https://developer.globalpay.com/docs/risk-management/3D-secure/overview) | [NOT AUTHENTICATED FLOW](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/50zoj8j/3ds-auth-decline) **Description :** This flow simulates when card authentication fails and a new card must be requested | **"amount":"2003"** | Card Number : 4222000002144131 Expiry : 05/39 CVV : 599 | Obtain Result (returns three\_ds .status: AUTHENTICATION\_FAILED). Request new card details from customer; transaction should not proceed. | | [3D SECURE TRANSACTIONS](https://developer.globalpay.com/docs/risk-management/3D-secure/overview) | [3DS FAIL FLOW](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/50zoj8j/3ds-auth-decline) **Description** : This flow simulates when card authentication explicitly fails. | **"amount":"2004"** | Card Number : 4222000008880910 Expiry : 05/39 CVV : 599 | Obtain Result (returns three\_ds .status: CARD\_AUTHENTICATION\_FAILED). Request new card details from customer; transaction should not proceed. | [**Recurring Payments**](https://developer.globalpay.com/docs/payments/recurring/overview) | Resource | Postman Reference | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [RECURRING TRANSACTIONS](https://developer.globalpay.com/docs/payments/recurring/overview) | [VERIFY AND RECURRING PAYMENTS](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/qllfutg/verification-recurring-auth) **Description :** This flow is typically used when merchants process recurring authorization transactions with a tokenized card that has already been verified. | **"amount": "3001"** | Visa MasterCard American Express Diners Club Discover JCB | Process a recurring transaction which auto-captures with status CAPTURED and returns a TRN\_ID. Confirm checkout status showing the transaction as successfully approved. | | [RECURRING TRANSACTIONS](https://developer.globalpay.com/docs/payments/recurring/overview) | [CAPTURE AND RECURRING PAYMENTS](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/e2xeu9i/recurring-auth-tokenized-card) **Description :** This flow is typically used by merchants to process recurring authorization transactions using a tokenized card. | **"amount": "3002"** | Visa MasterCard American Express Diners Club Discover JCB | Process recurring transactions which auto-capture with status CAPTURED and return a TRN\_ID. Confirm checkout status showing the transactions as successfully approved. | [**Dynamic Currency Conversion Transactions**](https://developer.globalpay.com/docs/payments/payment-methods/dynamic-currency-conversion-guide) | Resource | Transaction Type | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [**DCC TRANSACTIONS**](https://developer.globalpay.com/docs/payments/payment-methods/dynamic-currency-conversion-guide#) | [RATE LOOKUP](https://www.postman.com/globalproduct-api/gp-api-public-workspace/request/6pjpflz/rate-lookup) **Description :** Perform a Dynamic Currency Conversion (DCC) Rate Lookup Call DCC enables you to offer cardholders traveling internationally the choice of paying either in the currency of their own card or the currency that the merchant trades in. The customer is offered an exchange rate at the point of sale rather than at the point of settlement | **"amount": "4001"** | Card Number : 4006097467207025 Expiry : 05/39 CVV : 599 | A successful Rate Lookup returns CCS\_ID with status AVAILABLE. Save CCS\_ID for subsequent tests | | [**DCC TRANSACTIONS**](https://developer.globalpay.com/docs/payments/payment-methods/dynamic-currency-conversion-guide#) | [DCC CAPTURE TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/r40mh5d/authorization) **Description :** Perform a Auth (Capture) Transaction using the currency conversion rate obtained | **"amount": "4002"** | Card Number : 4006097467207025 Expiry : 05/39 CVV : 599 | The transaction response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The currency\_conversion block includes exchange rate details. The transaction should be reflected as approved in the checkout interface. | | [**DCC TRANSACTIONS**](https://developer.globalpay.com/docs/payments/payment-methods/dynamic-currency-conversion-guide#) | [CAPTURE TRANSACTION WITHOUT DCC RATE](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/kcfwd1u/dcc-opt-out) **Description :** In this flow, customers want to opt-out of using the currency conversion rate and proceed with the transaction. | **"amount": "4003"** | | In an opt-out scenario, pass payer\_currency equal to the base currency. The transaction response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The Currency\_conversion block shows exchange\_rate=1. The transaction should be reflected as approved in the checkout interface. | | [**DCC TRANSACTIONS**](https://developer.globalpay.com/docs/payments/payment-methods/dynamic-currency-conversion-guide#) | [CAPTURE TRANSACTION WHEN DCC IS NOT AVAILABLE](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/o92glyu/dcc-not-available) **Description :** In this flow, Capture a transaction when the DCC Rate lookup is not available. | **"amount": "4004"** | Card Number : 4263970000005262 Expiry : 05/39 CVV : 599 | The RATE LOOKUP response will return CCS\_ID, status as NOT\_AVAILABLE The transaction should be successfully AUTO captured with a response status field as "CAPTURED" and a TRN\_ID will be included in the response. The transaction should be reflected as approved in the checkout interface. | [**Pay By Link Transactions**](https://developer.globalpay.com/docs/payments/online/pay-by-link-overview) | Resource | Transaction Type | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [PAY BY LINK TRANSACTIONS](https://developer.globalpay.com/docs/payments/online/pay-by-link-overview) | [CREATE LINK](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/3txihfi/create-link) **Description :** Pay by Link gives merchants the ability to automatically generate a unique payment link for their customers without needing a website. When a customer uses the link, they are redirected to a payment page to enter their payment details. This unique link can be set for single use or multiple use, depending on the business case. | **"amount": "5001"** | Visa MasterCard American Express Diners Club Discover JCB | API returns LNK\_ID with status as ACTIVE and type PAYMENT. Response includes a payment URL. The customer enters card details and submits payment. The system sends notifications to return\_url and status\_url. The transaction should be reflected as approved in the checkout interface. | | [PAY BY LINK TRANSACTIONS](https://developer.globalpay.com/docs/payments/online/pay-by-link-overview) | [EDIT LINK](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/lhgutxy/edit-link) **Description :** Merchants can modify properties of an existing payment link, such as amount | **"amount": "1500"** | Visa MasterCard American Express Diners Club Discover JCB | API returns the same LNK\_ID with status ACTIVE and type PAYMENT. Updated amount is reflected in the response. The transaction can now be processed using the updated amount. | [**Post-Sale Actions**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | Resource | Transaction Type | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [**REFUND TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/refund-guide) | [FULL REFUND FOR A TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/ar3u3gg/refund-for-previous-auth) (Linked Refund) **Description :** Return/Refund the total amount of a transaction previously processed using a reference number or transaction ID | **"amount": "6001"** | Visa MasterCard American Express Diners Club Discover JCB | 1\. Original transaction is captured with status CAPTURED and TRN\_ID. 2\. Refund using TRN\_ID returns new Refund TRN\_ID with type REFUND and status CAPTURED. The transaction should be reflected as Refunded in the checkout interface. | | [**REFUND TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/refund-guide) | [STANDALONE REFUND FOR A TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/im2d4t6/standalone-refund) **Description :** Sometimes called Blind Refund or unlinked Refund, is a Refund not linked to a previous transaction and can typically be done for any amount. | **"amount": "6003"** | Visa MasterCard American Express Diners Club Discover JCB | Refund is processed with type REFUND, status CAPTURED, and Refund TRN\_ID. The transaction should be reflected as Refunded in the checkout interface. | | [**REVERSE TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/reverse-guide) | [FULL REVERSE FOR A TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/sc2q4wc/reversal-for-previous-transaction) (Linked Reverse) **Description :** Reversals are sent to reverse an authorization amount if the merchant does not intend to fulfill the order and capture funds. | **"amount": "6004"** | Visa MasterCard American Express Diners Club Discover JCB | 1\. Original transaction is captured with status CAPTURED and TRN\_ID. 2\. Reversal request returns Reversal TRN\_ID with type SALE and status REVERSED. The transaction should be reflected as Reversed in the checkout interface. | | [**REVERSE TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/reverse-guide) | [REVERSE THE REFUND FOR A TRANSACTION](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/8zmugpq/reversal-for-previous-refund) (Linked Reverse) **Description :** Reverse the refund transaction before it's settled. | **"amount": "6005"** | Visa MasterCard American Express Diners Club Discover JCB | 1\. Refund is processed with status CAPTURED and Refund TRN\_ID. 2\. Reversal request using Refund TRN\_ID returns Reversal TRN\_ID with type REFUND and status REVERSED. The transaction should be reflected as Reversed in the checkout interface. | #### InStore Payments [**Pre Sale Actions**](https://developer.globalpay.com/docs/payments/manage-payments/verify-guide) | Resource | Transaction Type | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | | [**VERIFY**](https://developer.globalpay.com/docs/payments/manage-payments/verify-guide) | [VERIFY USING CHIP](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/hzsxmq0/verify-card) **Description :** Card Verify \- Run as CreditAccountVerify with $0 Amount. Credit card authentication is the process of confirming the validity of a customer's credit card by checking with the company that issued the card. | Test Card Track & Tag Data | CARD should be successfully verified with status "VERIFIED". | [**Sale Actions**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | Resource | Transaction Type | Test Amount | Test Card Details | Description and Expected Result | | :---- | :---- | :---- | :---- | :---- | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION USING CHIP](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/uii9h8a/chip) **Description :** Initiates a sale transaction to transfer funds from the payer to the merchant using the specified payment method. | **"amount": "7001"** | Test Card Track & Tag Data | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION USING CONTACTLESS\_CHIP](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/capbm31/contactless-chip) **Description :** Initiates a sale transaction to transfer funds from the payer to the merchant using the specified payment method. | **"amount": "7002"** | Test Card Track & Tag Data | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION USING SWIPE](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/djoqitg/swipe) **Description :** Initiates a sale transaction to transfer funds from the payer to the merchant using the specified payment method. | **"amount": "7003"** | Test Card Track & Tag Data | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION USING EMV FALLBACK](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/8kmccew/emv-tech-fall-back) **Description :** Initiates a sale transaction to transfer funds from the payer to the merchant using the specified payment method. | **"amount": "7004"** | Test Card Track Data | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [CAPTURE TRANSACTION USING MANUAL](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/zujrqr6/manual) **Description :** Initiates a sale transaction to transfer funds from the payer to the merchant using the specified payment method. | **"amount": "7005"** | Visa MasterCard American Express Diners Club Discover JCB UATP | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [TRANSACTION WITH TIP AMOUNT USING CHIP](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/uizxrty/adjust) **Description :** A chip-based transaction where a tip is added to the payment after the initial authorization and capture. | **"amount": "7009"** | Test Card Track & Tag Data | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. Tip amount should be added to the original transaction. The response should return a status of "CAPTURED" and original TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | | [**TRANSACTIONS**](https://developer.globalpay.com/docs/payments/manage-payments/capture-guide) | [TRANSACTION WITH INLINE GRATUITY AMOUNT USING CHIP](https://www.postman.com/globalproduct-api/gp-api-public-workspace/folder/fvjnuhv/in-line) **Description :** This is commonly used for merchants who want to process an authorization with a tip/gratuity amount included during the final sale transaction. | **"amount": "7010"** | Test Card Track & Tag Data | The transaction will be automatically captured. The response should return a status of "CAPTURED" and a TRN\_ID will be included in the response. The approved transaction should be reflected in the checkout process. | ## Simulated Error Scenarios | Transaction Type | Error Message | HTTP Code | Trigger Amount | Test Card Details | Expected Result | Next Step | | :---- | :---- | :---- | :---- | :---- | :---- | :---- | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Internal Server Error | 500 | **27251** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50001", "detailed\_error\_description":"Internal Server Error"\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Internal Server Error | 500 | **27259** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR" ,"detailed\_error\_code":"50001", "detailed\_error\_description":"Internal Server Error"\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Bad Gateway | 502 | **27252** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50002", "detailed\_error\_description":"Bad Gateway"\} | Retry the transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP | Bad Gateway | 502 | **27254** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR\_DOWNSTREAM", "Detailed\_error\_code":"50014", "detailed\_error\_description":"320,3xx,Error with GP Systems"\} | Retry the transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP | Bad Gateway | 502 | **27258** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"ACTION\_FAILED", "Detailed\_error\_code":"50012", "detailed\_error\_description":"Action failed unexpectedly. An automatic reversal was successful. Please try original transaction again."\} | Retry the transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP | Bad Gateway | 502 | **27260** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50002", "detailed\_error\_description":"Bad Gateway"\} | Retry the transaction | | PREAUTHORIZE TRANSACTION **Channel :** CP | Bad Gateway | 502 | **27261** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR\_DOWNSTREAM", "Detailed\_error\_code":"50004", "detailed\_error\_description":"1,Gateway system error"\} | Retry the transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Service Unavailable | 502 | **27262** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50003", "detailed\_error\_description":"Service is temporarily unavailable"\} | Retry the transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Gateway Timeout | 502 | **27250** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50004", "detailed\_error\_description":"Request Connection Timedout"\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Gateway Timeout | 502 | **27253** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50004", "detailed\_error\_description":"Request Connection Timedout"\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | | PREAUTHORIZE TRANSACTION **Channel :** CP | Gateway Timeout | 502 | **27256** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"TIMEOUT", "Detailed\_error\_code":"50009", "detailed\_error\_description":"No response received from a platform while executing this action. An attempted automatic reversal failed. Please try to reverse this transaction."\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | | PREAUTHORIZE TRANSACTION **Channel :** CNP, CP | Gateway Timeout | 502 | **27257** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50004", "detailed\_error\_description":"Request Connection Timedout"\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | | PREAUTHORIZE TRANSACTION **Channel :** CP | Gateway Timeout | 502 | **27201** | Visa MasterCard American Express Diners Club Discover JCB | \{"error\_code":"SYSTEM\_ERROR", "Detailed\_error\_code":"50004", "detailed\_error\_description":"Request Connection Timedout"\} | Perform a REVERSAL transaction using the reference number passed in the original transaction | # Going Live to Production Source: https://developer.globalpayments.com/docs/getting-started/going-to-production.md Section: Getting Started Description: Ready to go live? Contact us to validate your integration At this point, you’ve done some testing of your integration in our Sandbox environment and are ready to take online payments for real. This article provides the next steps for going live with your integration. > This information is for merchants integrating directly with our API or an SDK to take online payments (card not present). For merchants integrating through one of our plugins or a pre-built hosted solution, contact a member of our Sales Support team for next steps. > If you plan to process in-store payments (card present), email [certintake@globalpay.com](mailto:certintake@globalpay.com) to let us know. Here’s what you need to do: * [Sign up with us to become a merchant](#sign-up-with-us) * [Complete all testing requirements](#complete-all-testing-requirements) * [Validate your integration](#validate-your-integration) * [Receive Production credentials](#receive-production-credentials) * [Test real transactions](#test-real-transactions) ## Sign up with us If you don’t already have a Merchant Service Agreement in place, please visit our main website to sign up. During the onboarding process, you’ll have the chance to decide which of our capabilities you want to add. You can learn more about [Account Capabilities](https://developer.globalpayments.com/api/definitions/account-capabilities.md) in the API Definitions. ## Complete all testing requirements You’ve probably already run through some basic checks to make sure your integration works properly (if not, see [Build Your Integration](https://developer.globalpayments.com/docs/getting-started/your-integration.md) to get started). But have you thought about whether your integration can handle expired or invalid access tokens or other errors? Or, whether the Reference field is populated with a unique value for every transaction? These are the types of questions we’ll ask you during the validation process (see next section). Depending on how complex your integration is, we may ask you to run additional test scenarios. If you have any questions regarding testing requirements, contact [Integration Support](https://developer.globalpayments.com/support/integration-support). ## Validate your integration If you’re integrating directly with our API or via an SDK to accept online payments (card not present), we'll walk you through a validation process where we'll ask you some questions to make sure everything is in order. If you’re using our 3D Secure or Recurring Payments solutions, we’ll provide a checklist for you to use to verify that your integration is receiving the proper API responses. To learn more about the validation process or to get started on it, see [Integration Validation](https://developer.globalpayments.com/support/integration-valid). ## Receive Production credentials Once you’ve initiated the onboarding process and signed a Merchant Service Agreement with us, you’ll receive your Production credentials (an App ID and an App Key). These credentials are tailored to the capabilities you certified and signed up for (for example, Transaction Processing, Tokenization, Dispute Management, Settlement Reporting, and so on). Once you have your credentials, you’ll use them to replace the credentials you used for testing in the Sandbox with your Production credentials in the heading of your API requests. You'll also need to change your integration from the Sandbox endpoint to Production: * **Sandbox:** `https://apis.sandbox.globalpay.com` * **Production:** `https://apis.globalpay.com` Now you can start processing and getting paid for real transactions. It's always a good idea to test the first few transactions. This is explained in the next section. ## Test real transactions The final step is to do a little testing in Production and process a real transaction. It’s important to confirm that your integration works as expected and that the merchant’s funds are deposited into the correct bank account. Once that’s been done, you’re good to go. Congratulations! If you have any issues or questions, our [Integration Support](https://developer.globalpayments.com/support/integration-support) team is here to help. # Introduction to Payments Source: https://developer.globalpayments.com/docs/getting-started/new-to-payments/introduction.md Section: Getting Started Description: Learn how the card payment process works and how we fit into it If you’re new to the payments industry, it’s good to start with a basic understanding of how the process for card payments works. You can get that here. This article will introduce you to the relevant players in the payments industry and walk you through two typical flows: payment and settlement. We also describe how we fit into the process and what solutions we offer to help merchants succeed. What we cover: * [Key players](#key-players) – The main participants of the card payments industry * [Technology partners](#technology-partners) – Companies that help merchants handle payment processing * [Payment flow](#payment-flow) – How all the different companies interact during a transaction * [Settlement flow](#settlement-flow) – How a merchant gets paid after a transaction (capture and settle) * [Our offerings](#our-offerings) – A listing of ways to integrate with us, core solutions we offer, and business connections we can provide > All **bolded** terms in this article are further defined in our [Payments Glossary](https://developer.globalpayments.com/docs/getting-started/new-to-payments/glossary.md). ## Key players To understand the card payment process, you first need to know who the relevant players are. | | | | | | --- | --- | --- | --- | |![Card Brands Icon](https://developer.globalpayments.com/gh-assets/icon_card-brands.png)| **Card Brands** Card associations like Visa or Mastercard that operates a network. |![Issuer Icon](https://developer.globalpayments.com/gh-assets/icon_issuer.png)| **Issuer** Financial institution that issues cards to customers to use for payments.| |![Acquirer Icon](https://developer.globalpayments.com/gh-assets/icon_acquirer.png)| **Acquirer** Financial institution that allows merchants to process card transactions on a card brand’s behalf. |![Merchant Icon](https://developer.globalpayments.com/gh-assets/icon_merchant.png)| **Merchant** Seller of goods or services. Can be an individual, a business, or a large enterprise. | |![Cardholder Icon](https://developer.globalpayments.com/gh-assets/icon_cardholder.png)| **Cardholder** Customer who is issued a payment card to use for purchases. | | | Before card payments can begin, the key players need to establish business relationships with each other: 1. First, the **card brand** assigns an **issuer** a **bank identification number (BIN)**, which gives it a license to issue cards on the card brand’s behalf to customers. 2. The **issuer** then assigns a card number — also known as a **primary account number (PAN)** — to a customer who, at that point, becomes a **cardholder**. 3. The **card brand** also assigns a license to an **acquirer** so that the acquirer can allow a merchant to accept card payments on the card brand’s behalf. 4. The **acquirer** then enters into a contract with a **merchant** and offers it a merchant account. This arrangement provides the merchant with a line of credit. Under the agreement, the acquirer exchanges funds with issuers on behalf of the merchant and pays the merchant the net balance of their daily payment-card activity — that is, gross sales minus **chargebacks/reversals** and various fees. So, when it comes to accepting card payments on behalf of the card brands: * Acquirers service merchants * Issuers service cardholders The following illustration shows the business relationship between the key players. ![Diagram flow connecting the Card Brand to other key players.](https://developer.globalpayments.com/gh-assets/flow-key-players.png) **Key Players for Card Payments** Once all the key players have established business relationships with each other, card payments can begin. But with the technical complexity inherent in processing card payments, not to mention all the regulations a merchant must comply with, building a card payment system from the ground up can be a pretty heavy lift. That's why many merchants turn to technology partners. ## Technology partners Two of the most complex aspects of building a card payment system are: * Sending payments between a merchant and an acquirer * Processing card payments There are three types of technology partners that can make these processes easier – **payment gateways**, **developers** that know how to work with them, and **payment processors**. A payment gateway is a technology service used to facilitate the secure transmission of transaction data. Using payment gateways simplifies the process of sending payments between a merchant and an acquirer. To interface with the acquirer, developers use an **application program interface (API)** or **software development kit (SDK)** to build a software solution or integration that the merchant can use to handle card payments. Likewise, processing card payments — including having to facilitate authentication (identity checks), authorization (approvals), and clearing (transferring funds) — can also be too much for a merchant to handle. So, it’s common to enlist the support services of a payment processor to help for a fee. So where does Global Payments fit into this picture? We offer a full range of merchant solutions, including a payment gateway, payment processing, and serving as an acquirer. Our technologies also support developers with a REST API, SDKs, and a developer portal that provides all the resources they need to get up and running quickly. > Learn more about how [our solutions can help](#our-offerings) merchants and developers at the end of this page. Technology partners that can support a merchant include the following: | | | | | | --- | --- | --- | --- | |![Payment Gateway Icon](https://developer.globalpayments.com/gh-assets/icon_payment-gateway.png)| **Payment Gateway** Technology service used by a merchant to securely transmit transaction data to the acquirer. |![Payment Processor Icon](https://developer.globalpayments.com/gh-assets/icon_payment-processor.png)| **Payment Processor** Company used by a merchant to help with tasks related to card payment processing. | |![Developer Icon](https://developer.globalpayments.com/gh-assets/icon_developer.png)| **Developer** Person with coding experience hired to develop a software solution for accepting or processing payments. | | | ## Payment flow In this section, we describe the interaction between the key players and their technology partners in a successful card payment flow. The flow starts when a cardholder selects an item or service to buy from the merchant either in a store or online and pays with a card. Once receiving the card information (PAN + **expiry** + **CVV**), the merchant initiates the sale and sends the transaction data (card information + sale amount) to the acquirer either directly or via a payment gateway. For online sales, the cardholder’s identity may need to be authenticated first, such as through **3D Secure**. The acquirer uses the customer’s PAN, which includes the BIN, to identify which card brand to send the transaction data to for approval. The card brand then sends the transaction to the issuer. The issuer authorizes the payment and lets the merchant know via the card brand and then back to the acquirer. Finally, the customer is notified that the transaction is complete. At close of business, the merchant begins the **clearing** and **settlement** process to get the funds from the sale into its bank account (for more information, see [Settlement flow](#settlement-flow)). The following illustration shows the high-level flow for a card payment and how the key players and technology partners in the payments industry fit in. ![Diagram flow of a card payment transaction between key players and technology partners.](https://developer.globalpayments.com/gh-assets/flow-transaction.png) **Card Payment Flow** ## Settlement flow In this section, we describe the interaction between the key players and their technology partners for a settlement flow in which the merchant receives payment for the day’s credit card sales. The flow starts when a merchant sends **captured** transactions in a batch file to their acquirer who then sends it to the card brand after the clearing process is complete. The card brand then processes the transactions and sends the settlement to the acquirer, debiting the applicable issuer based on card usage. After the issuer confirms every transaction is correct, the card brand transfers funds for sales and credit to the acquirer. The acquirer then deposits the money into the merchant’s bank account, minus any fees. The following illustration shows the high-level flow for settlement and how the key players in the payments industry fit in. ![Diagram flow of settlement between key players and technology partners.](https://developer.globalpayments.com/gh-assets/flow-settlement.png) **Settlement Flow** ## Our offerings We offer a full range of solutions for merchants, connections to key industry players, and various ways for developers to access our worldwide system. Click a link to go to that topic’s article. > If you don’t see what you’re looking for or have any questions, check with an account manager (see [Sales Support](https://developer.globalpayments.com/support/sales)). ##### Ways in which developers can integrate with us: * [Hosted Payment Page](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-overview.md) – Quickly set up a secure checkout page that we handle for you. * [Hosted Fields](https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md) – Use tokenization to customize your payment page. * [API](https://developer.globalpayments.com/docs/integration-options/api.md) – Directly interface with our server using our resource-oriented REST API. * [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) – Add server-side or client-side code to quickly build your integration. * Transaction Management & Virtual Terminal – Manage all transactions in one unified portal. * [Point of Sale (POS)](https://developer.globalpayments.com/docs/payments/in-store/overview.md) – Explore our integration solutions for taking in-store payments. ##### Our core solutions for merchants: * [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) – Tokenize card details to charge customers later. * [3D Secure](https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md) – Enhance security with stronger authentication for online payments. * [Fraud Management](https://developer.globalpayments.com/docs/risk-management/fraud-management/overview.md) – Assess risk and verify transactions. * [Pay by Link](https://developer.globalpayments.com/docs/payments/online/pay-by-link-overview.md) – Send customers a unique link to a payment page. * [Payers](https://developer.globalpayments.com/docs/payments/tokenization/payers-overview.md) – Store customer details for future transactions. * [Partner Solutions](https://developer.globalpayments.com/docs/partners/overview) – Manage payment services across a partner network. * [Operations & Reporting](https://developer.globalpayments.com/docs/reporting/overview) – Use transaction data to better understand your business. * [Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md) – Give customers access to their favorite stored cards at checkout. * [Buy Now Pay Later](https://developer.globalpayments.com/docs/payments/payment-methods/buy-now-pay-later-overview.md) – Provide flexible options for customers to pay over time. * [Open Banking](https://developer.globalpayments.com/docs/payments/payment-methods/open-banking-overview.md) – Let customers pay directly with their bank account. ##### Our connections to key players and other technology partners: * Acquirers – Our gateway supports Global Payments, AIB Merchant Services, American Express, Comercia Global Payments, First Data, Mastercard MIGS Payment Gateway, Elavon, Barclaycard, Lloyds Bank Cardnet, Diners Club International, Redsys, Fiserv, JCB, and Worldpay from FIS. * Credit Cards – We support Visa, Mastercard, American Express, Discover, JCB, Diners Club, Union Pay, and Union Pay Secure. * Debit Cards – We support Visa (Interlink), Mastercard Debit, Bancontact, and Interac. * [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) – In addition to cards, we also accept bank transfers, cash payment vouchers, cryptocurrency, digital wallets, direct debit, local cards, and prepaid cards & vouchers. * [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md) – Tap into the interbank exchange so traveling customers can pay in their home currency. # Module 1: What Fintech Really Means and Why it Matters Source: https://developer.globalpayments.com/docs/getting-started/new-to-payments/fintech-education-module-1.md Section: Getting Started Description: An introduction to modern financial technology for builders and business owners ## What is fintech? Fintech – short for *financial technology* – refers to the use of software, APIs, and cloud infrastructure to deliver financial services faster, more efficiently, and often in ways that were once only available to large institutions.   Fintech isn’t just a category – it’s the infrastructure upon which modern commerce is built. For businesses, fintech simplifies complex operations. For developers, it turns finance into code you can plug in and build on to provide:  - Digital payments and online checkouts - Mobile banking and neobanks - “Buy Now, Pay Later” and online lending - Embedded financial tools inside apps and websites - Real-time fraud detection, identity verification, and more ## Why is fintech important? With a focus on efficiency and inclusivity, fintech is reshaping the global financial ecosystem –  one line of code at a time, to provide: - **Faster service**: By automating risk assessment and leveraging digital payment networks, fintech enables real-time transfers, instant credit decisions, and same-day payouts. - **Lower cost**: The ability to optimize and automate financial processes with APIs and other software advancements means fewer middlemen, less paperwork, and lower transaction costs. - **Access and inclusion**: APIs allow developers to easily embed payment processing, lending, and fraud prevention – features that used to require a bank – directly into their apps, democratizing access to affordable financial services for businesses and consumers alike. - **Global reach**: Fintech enables developers to build direct payment routes that bridge different financial systems and currencies to provide secure, efficient, and borderless transactions.  ## Examples of fintech in action | **Scenario** | **Powered by Fintech** | | -------- | ------- | | Paying with your phone | Tokenized mobile wallet + contactless Point of Sale (POS) | | Getting paid after a delivery | Real-Time Payments (RTP) + embedded ledger | | Selling online without a merchant bank| Stripe, Adyen, or Global Payments APIs| | Offering customers a “Pay Later” option| Embedded lending via Global Payments Buy Now Pay Later (BNPL) API| | Connecting a bank account to an app| Open banking API (e.g., Plaid)| ## Why is fintech regarded as a disruptive technology? Leading academic research (MIT, BIS) and modern fintech platforms (like Stripe and Adyen) agree: Fintech is not just about building new apps – it’s rebuilding financial infrastructure. - **Finance is becoming software.** Banking, lending, and payments are now digital systems running on APIs, without paper contracts or the constraints of bank branches and bankers hours. - **Financial tools are embedded in everyday software.** You no longer need to log into a bank to send money, apply for credit, or reconcile accounts. It’s all inside the tools you already use. - **AI and automation power real-time decisions.** Fraud detection, lending approvals, and payment routing now happen instantly, thanks to machine learning. Here’s what that means for you: - **For small business owners**: You can accept payments, issue invoices, or get paid faster – with fewer systems and no finance team. - **For developers**: You can build checkout, lending, and identity flows in hours, not months, thanks to modular APIs. ## Key categories in fintech |Category|Examples|Core Function| | -------- | ------- | ------- | |Payments|Stripe, Adyen, Square, Global Payments|Accept, route, and settle transactions| |Lending|Klarna, Affirm, Stripe Capital |Embedded credit and checkout financing| |Banking APIs|Treasury Prime, Unit, Synapse|Offer FDIC-backed accounts and cards| |Data and Identity|Plaid, MX, Alloy|Link bank accounts, verify identity| |Infrastructure|Modern Treasury, Finix, Payrix|Orchestrate multi-party payments| ## How can fintech help small businesses and developers? Whether you’re a builder or a business owner, fintech opens new possibilities: - **Build smarter apps**: Developers can use financial data, payout APIs, and compliance layers to create seamless user experiences. - **Grow revenue**: Businesses can turn payments and credit into revenue streams, not just back-office costs. - **Offer what banks once controlled**: You can offer instant account creation, access to credit with informed risk decisions, and make payouts – all without becoming a bank. ## Summary Fintech is innovating traditional financial infrastructure, turning money into code and finance into product features.  If you’re a business owner, fintech simplifies your operations and saves you money. If you’re a developer, fintech gives you the tools to build the next generation of financial products.  ## What’s next In Module 2, we’ll dissect the transaction authorization and settlement flow, exploring how each role supports or influences the journey—and what that means for reliability, performance, and integration design. ### [Module 2](https://developer.globalpayments.com/docs/getting-started/new-to-payments/fintech-education-module-2.md) Continue to Module 2 # Module 2: How Card Payments Work Source: https://developer.globalpayments.com/docs/getting-started/new-to-payments/fintech-education-module-2.md Section: Getting Started Description: A step-by-step guide to the full lifecycle of a card transaction – from the tap or swipe to settlement ## Why it matters Every time a customer swipes, taps, or enters card details, they set off a complex interaction across banking systems, APIs, and networks. Understanding this process helps you: - Design integrations that are secure and reliable - Negotiate better pricing and terms - Predict payout timing and reduce cash flow surprises - Improve approval rates and customer experience Card transactions are where software meets money – and precision matters. ## The two-phase model Card transactions unfold in two distinct — but tightly linked — phases. ### 1. Authorization The moment a card is used, a real-time check occurs to confirm: - The card is valid - Funds or credit are available - There are no signs of fraud These checks will result in either the transaction being approved or declined within 1-2 seconds.   ### 2. Settlement If approved, the merchant groups the transaction with others and submits them to their processor or acquirer. Funds are then: - Deducted from the cardholder’s account - Routed through the card networks - Deposited into the merchant’s account Funds are typically available to the merchant within 1-3 business days (or faster with real-time options).  ## Key roles in a card transaction The table below describes the core roles in a card transaction, which often includes a payment processor and payment gateway.  Two of the most complex aspects a card payment system are: - Sending payments between a merchant and an acquirer - Processing card payments Payment gateways and processors are technology partners that can make these parts of the process easier. While not strictly required for a card transaction, they play an important role in the authentication and settlement processes. | **Role** | **Function** | | --- | --- | | Cardholder | Uses a credit or debit card to initiate a transaction. | | Merchant | Sells goods/services to a cardholder and submits the transaction data for authorization through a payment gateway. | | Gateway | Software and servers that securely transmit cardholder data from the merchant’s website, mobile app, or POS system to the payment processor or acquirer, and transmits responses from issuers for authorization. | | Processor | A company that helps a merchant process card payments by providing the technology to route payment data between the merchant, acquirer, and card networks. | | Issuer|A financial institution that issues payment cards to cardholders, approves or declines transactions, issues payment to the acquirer on behalf of the cardholder, and bills the cardholder. | | Acquirer | A financial institution that manages the merchant’s account, processing card payments for the merchant and sending the transactions to the card network. | | Card Network | A card brand (Mastercard, Visa, etc.) that provides the global financial infrastructure for routing transactions between the acquirer and issuer, sets operational rules, and manages settlement and interchange fees. | ## How authorization and settlement work ### Authorization flow | **Step** | **Description** | | --- | --- | | 1 | The cardholder initiates a payment at the point of sale (POS) or through an online checkout process. | | 2 | The merchant sends the transaction data (card information and amount) to the acquirer either directly or through a payment processor, who will use a payment gateway to send the transaction data to the acquirer. | | 3 | The acquirer requests authorization from the issuer. | | 4 | The issuer sends the authorization response (approved or declined) to the acquirer. | | 5 | The acquirer sends the authorization response to the merchant either directly or back through the payment gateway and payment processor if the merchant is using those services. | | 6 | Assuming the transaction is approved, the merchant finalizes the sale. | ![](https://developer.globalpayments.com/gh-assets/fintech-guide/auth-flow.png) **Authorization flow** ### Settlement flow | **Step** | **Description** | | --- | --- | | 1 | The merchant sends captured transactions in batches to the acquirer at the end of the day. | | 2 | The acquirer clears the transactions (works with the card network and issuer to verify and agree on what’s owed) and then sends the batch file to the card network (aka the card brand). | | 3 | The card network forwards the transactions to the issuers, who debit/credit each cardholder’s account for the amount of the transactions. | | 4 | The card network then transfers funds to the acquirers for the sales and credit transactions. | | 5 | The acquirer deposits funds into the merchant’s account, minus any fees either directly or via the payment gateway and payment processor if the merchant is using those services. | ![](https://developer.globalpayments.com/gh-assets/fintech-guide/settle-flow.png) **Settlement flow** ## Important considerations when building payment systems  - **Idempotency**: Always use unique keys (aka request IDs) for each attempt to process a transaction. This will prevent duplicate processing.  - **Authorization vs. Capture**: You can authorize a payment, then capture it (i.e., submit it to the issuer for financial settlement) later. This is a common practice for businesses with rentals or delayed fulfillment.   - **Webhooks**: Using 'payment_succeeded', 'chargeback_opened', and 'settlement_completed' are important for ensuring your system is reliable, responsive, and trustworthy—one that reacts correctly to each key payment event, reduces risk, and improves the user experience. - **Retry Logic**: When a card is declined, instead of simply showing an error, your system should trigger a user-friendly flow to guide the user through options to try the payment again, fix the issue, or use a different payment method. ## Your tech stack for security and compliance The following capabilities are critical to ensuring your system is secure and compliant: - **PCI-DSS**: Compliance with the PCI-DSS is mandatory for any merchant or provider storing or transmitting cardholder data. - **Tokenization**: To reduce PCI scope and risk, use tokenization to replace sensitive card information with a secure token. - **3DS and EMV**: Adding an extra verification step with 3-Domain Secure (3DS) and Europay, Mastercard, and Visa (EMV) chip technology help prevent fraud and ensure strong customer authentication (SCA) compliance under the Revised Payment Services Directive (PSD2) in Europe. - **Fraud Prevention**: Use AI and machine learning models to strengthen fraud protection by monitoring transaction velocity, identifying IP/location mismatches, and to trigger additional security checks if a transaction comes from a new or unrecognized device (device fingerprinting). ## KPIs to track the performance of your payment system | **Metric** | **Why It Matters**|**Target Benchmark** | | --- | --- | --- | | Authorization Rate | Measures approval success | 97–99% | | False Decline Rate | Indicates friction from risk rules | Less than 0.5% | | Time to Settle | Impacts cash flow | 1–2 business days (avg) | | Chargeback Rate | Indicates disputes/fraud | Less than 0.9% (Visa/MC threshold) | | Latency | Affects user experience | Less than 2 seconds | ## What’s changing? In the future, card transaction flows will be more: - **Real-time**: With emerging real-time payment (RTP) rails and instant funding APIs (FedNow, Visa Direct) - **Modular**: With APIs abstracting issuer/acquirer roles (e.g., Stripe’s Payment Intents) - **Smart**: With dynamic routing, AI-based fraud scoring, and token networks replacing static credentials These shifts are making payments programmable, composable, and highly developer-centric. ## Summary Card payments may feel simple to end users — but they represent one of the most high-volume, multi-actor workflows in global commerce. Building a successful payment system requires that developers, product owners, and merchants: - Understand each step for better integrations - Choose vendors and APIs based on reliability and control - Improve performance, approvals, and payout speed ## What’s Next Next, we’ll explore who actually makes the payments ecosystem work—introducing the players behind each transaction, including card networks, processors, gateways, and platforms like yours. ### [Module 3](https://developer.globalpayments.com/docs/getting-started/new-to-payments/fintech-education-module-3.md) Continue to Module 3 # Module 3: Who is Who in the Payment Ecosystem Source: https://developer.globalpayments.com/docs/getting-started/new-to-payments/fintech-education-module-3.md Section: Getting Started Description: A deep dive into the key organizations, their functions, and how they fit into your product strategy ## Why you need to understand the payments ecosystem Understanding the ecosystem you’re working in is critical, both for the developers building payment systems and the businesses that rely on them: - **Developers**: Developers want to design secure, efficient, and scalable applications that integrate all the payment functionalities necessary to provide the best user experience, all while thinking about compliance. To do both, developers need to know which APIs they’re calling and who owns risk.  - **Businesses**: Business leaders need a solid understanding of the payments ecosystem to make informed decisions about the systems they need to scale their operations and meet customer demands for fast and secure transactions. Understanding all the players and their roles is key to choosing the right partners and technologies and effectively negotiating costs.   As Stripe says – the payment ecosystem is “a complex web” of interlinked roles. From gateways to processors, each is designed to ensure transactions are seamless and secure. ## What is the Four-Corners Model for payment security? Virtually all card-based transactions leverage the Four-Corner Model. This is a framework for card payment security, guaranteeing global acceptance, traceability, and adherence to security standards like PCI-DSS. The model involves four different entities: 1. **Cardholder**: A person given a credit or debit card by an issuer on behalf of a card brand to use for purchases. 2. **Merchant**: Seller of goods or services. 3. **Issuer**: A financial institution that offers debit/credit cards directly to customers.  4. **Acquirer**: A financial institution that processes credit or debit card payments for a merchant ## Core roles and responsibilities The payments ecosystem is made up of the four entities in the Four-Corners Model – key players in the ecosystem – as well as some other key players and a few supporting players. The key players include: - Cardholder - Merchant  - Issuer - Acquirer - Card Brand (aka Card Network) | | | | | | --- | --- | --- | --- | |![Card Brands Icon](https://developer.globalpayments.com/gh-assets/icon_card-brands.png)| **Card Brands** Card associations like Visa or Mastercard that operates a network. |![Issuer Icon](https://developer.globalpayments.com/gh-assets/icon_issuer.png)| **Issuer** Financial institution that issues cards to customers to use for payments.| |![Acquirer Icon](https://developer.globalpayments.com/gh-assets/icon_acquirer.png)| **Acquirer** Financial institution that allows merchants to process card transactions on a card brand’s behalf. |![Merchant Icon](https://developer.globalpayments.com/gh-assets/icon_merchant.png)| **Merchant** Seller of goods or services. Can be an individual, a business, or a large enterprise. | |![Cardholder Icon](https://developer.globalpayments.com/gh-assets/icon_cardholder.png)| **Cardholder** Customer who is issued a payment card to use for purchases. | | | ## Supporting players Two of the most complex aspects of building a card payment system are sending payments between a merchant and an acquirer and processing card payments.  This is where technology partners – payment gateways, developers that know how to work with them, and payment processors – play an important supporting role. ### Payment processor A payment processor (aka card processor or payment provider) is a company that works with banks and other financial institutions to help a merchant process card payments by managing transaction routing (authorization, clearing, and settlement). ### Payment gateway A payment gateway is a technology service used to facilitate the secure transmission of transaction data. Using payment gateways simplifies the process of sending payments between a merchant and an acquirer, by securely capturing and routing payment data.  ## Emerging roles and business models ### Payment service provider (PSP) A payment service provider (PSP) bundles payment gateway, payment processing, and often fraud/settlement services into one service to make it easier for merchants to accept various payment methods. This makes a PSP ideal for merchants needing a single API solution.   ### Payment facilitator (PayFac) PayFac-as-a-Service or PayFac for short is a specialized provider that enables merchants under a master account (sub-merchants) to accept payments. Using PayFac controls risk for merchants and streamlines settlement and helps independent software vendors (ISVs) scale with less complexity. ### Independent software vendor (ISV) An independent software vendor (ISV) is a company or individual that creates specialized payment solutions tailored to specific industries or markets and uses APIs to integrate them with other systems and platforms.  ### Embedded ecosystem players Embedded ecosystem players provide specialized solutions, including: - **Identity services**: Solutions that verify, authenticate, and manage the identities of individuals or businesses during financial transactions - **Multi-rail orchestration**: The ability to route, process, and manage payments across multiple payment networks - **Compliance-as-a-service (CaaS)**: Tools, platforms, and expertise to help organizations meet regulatory and compliance requirements in an efficient and scalable way  ## What you need to know to build a better payments system - **Developers**: Know the types of APIs you can use to build your system – payment processor, payment gateway, PSP or PayFac. Understand their associated latencies and the compliance trade-offs. - **Business Leaders**: Decide whether to bundle payment gateway and processing or manage relationships separately to control costs and workflows. - **ISVs & Platforms**: Evaluate PayFac onboarding, choose between embedded vs. partner-managed flows, and design for multi-tenant separation. ## Strategic recommendations   1. Target ecosystem roles that match your capabilities and roadmap. 2. Use ISV or PayFac models to embed payments deeply in your platform. 3. Consider future roles – like identity, fraud, orchestration – as core to your strategy. ## What’s next Stay tuned for Module 4 where we’ll explore common payment methods. ***(Coming soon)*** # Payments Glossary Source: https://developer.globalpayments.com/docs/getting-started/new-to-payments/glossary.md Section: Getting Started Description: Get definitions for key terms in the payments industry The following table defines the **bolded** terms from our [Introduction to Payments](https://developer.globalpayments.com/docs/getting-started/new-to-payments/introduction.md) article. This includes terms relating to key players in the industry, supporting partners, and the technology used to facilitate payments. | Term | Definition | | --- | --- | | 3-Domain Secure (3D Secure or 3DS) | Security protocol used to prevent fraud in online card transactions by using certain criteria to determine whether the cardholder’s identity needs to be authenticated first. The three domains are the 1) issuer, 2) acquirer, and 3) interoperability domain (i.e., “go-between” platform that handles 3DS). 3D Secure authentication is done in three ways per the European Payment Services Directive 2 (PSD2): **Possession** – Something only the customer *has*, e.g., their mobile device registered with their bank to which they receive a one-time code in a text message. **Inherence** – Something only the customer *is*, e.g., their fingerprint or other form of biometric data. **Knowledge** – Something only the customer *knows*, e.g., a unique passphrase or answer to a personal question. | | Acquirer | Financial institution (usually a bank but not always) that processes credit or debit card payments for a merchant. The acquirer allows merchants to accept credit card payments from the card-issuing banks within a card association. | | Application Program Interface (API) | A structured way for networked computers to communicate through server requests and responses. APIs help developers interface with other software systems to exchange data, for example, to move funds between a customer (payer) and a merchant. | | Authentication | An action in which a merchant verifies the identity of a customer. For online transactions, this can be done using 3D Secure. For in-store transactions, a card chip or entering a personal identification number (PIN) can be used. | | Authorization | An action in which an issuer approves a cardholder’s transaction. This is based on the account standing, account balance, and the validity of the card. | | Bank Identification Number (BIN) | Initial eight numbers that appear on a credit or debit card (see PAN), identifying the institution issuing the card, country of issuance, and type of card. The BIN is a key part of the process of matching transactions to the issuer of the payment card. | | Capture | An action in which an electronic sales transaction with a credit or debit card is submitted to the issuer for financial settlement. Authorized credit card sales must be captured and settled for a merchant to receive credit for their sales and a cardholder account to be debited or credited. | | Card Brand | A payment network linked to a credit or debit card, of which a bank or any other eligible financial institution can become a member (e.g., Visa, Mastercard, etc.). The member then gets to issue or acquire cards operating on the network of that card brand. Also known as _card schemes_. | | Cardholder | A person given a credit or debit card by an issuer on behalf of a card brand to use for purchases. | | Card Verification Value (CVV) | A three- or four-digit security code that appears on a payment card, usually on the opposite side of the card’s number. It provides extra protection against unauthorized use. Also known as a _card verification code (CVC)_ or _card verification number (CVN)_. | | Chargeback | The cardholder or issuer disputes a transaction, and funds are returned to the issuer/cardholder. The merchant can accept or challenge the dispute by supplying documentation proving the transaction was valid. | | Clearing | The process of exchanging financial transaction details between an acquirer and an issuer to facilitate posting of a cardholder's account and reconciliation of a customer’s settlement position. | | Developer | A person who can be hired to build an integration, such as an app or a website, that supports accepting and processing payments. Developers usually specialize in one or more coding, scripting, or markup languages, which they use to interface an integration with the software and hardware systems of the key players in the payment process. | | Expiry | A payment card’s expiration date, meaning the last day that it can be used. It’s represented as a two-digit month (MM) and two-digit year (YY) on the card. | | Fees | Costs associated with processing card payments for merchants. In pricing terminology, Interchange Plus (Interchange++), includes the following three fees: **Interchange fee** – Percentage fee charged to the acquirer by the cardholder's issuer for using the interchange system. **Card Brand fee** – Fee charged to the acquirer by the card brand for using its network. **Processing fee** – Fee (monthly, % of total transaction amount, or per-transaction) added by the acquirer or payment provider (processor) for providing card-processing services. Alternatively, a merchant can choose to use blended, standard, or simple pricing In which an all-in-one rate is quoted as the merchant discount rate. Blended pricing can offer simplicity but often leads to overall higher fees when compared to Interchange Plus. | | Issuer | A financial institution (usually a bank but not always) that offers payment cards branded by a card association directly to customers. The name is derived from the practice of issuing payment to the acquirer on behalf of its customer (the purchaser in the transaction). | | Merchant Identification Number (MID) | A unique number assigned to a merchant account to identify it throughout the course of payment processing activities. | | Payment Gateway | The software and servers that transmit transaction information to acquirers and responses from issuers, such as whether a transaction is approved or declined. Commonly referred to simply as a *gateway.* | | Payment Processor | A company that works with banks and other financial institutions to help a merchant process card payments for a fee. Also known as a card processor or payment provider. | | Primary Account Number (PAN) | A 14- to 19-digit number that appears on a payment card. It’s used to uniquely identify the primary account of the person who owns it and also contains information about which issuer (first eight digits) and which card brand (first digit) the card is associated with. | | Reversal | The act of voiding an authorization, capture, refund, or credit before capturing a transaction. If the transaction was already placed in the next settlement file (or batch), this will remove it. Transactions can be reversed in full or partially reversed. | | Software Development Kit (SDK) | A set of coding tools given to developers to help them quickly build an app or feature, for example, a front-end checkout page or a back-end resource like a database. SDKs are available in various coding languages such as Java, PHP, and .NET. | | Settlement | The process of sending a merchant’s batch file of transactions to the card brand network for processing and payment, and ultimately for cardholder billing. Describes the actual transfer of funds for sales and credits from the issuer to the acquirer. Acquirers pay the merchant (less any fees) with funds from the card brand. The issuer then bills the cardholder for the transaction amount. | # Adobe Commerce Source: https://developer.globalpayments.com/docs/integration-options/plugins/adobe.md Section: Integration Options Description: No Code: Customize your online store quickly and easily By integrating with our Adobe Commerce plugin, you'll gain access to the full range of our solutions, including PCI DSS scope reduction via [Hosted Fields](#hosted-fields "Hosted Fields section") (Drop-In UI), credit and debit processing, Digital Wallets, [Card Storage](#card-management "Card Management section"), [3D Secure](#3d-secure "3D Secure section"), [Order Management](#order-management "Order Management section"), and [Fraud Management](#fraud-management "Fraud Management section"). Specifications -------------- * **Categories:** Extensions, Payments & Security, Payment Integration * **Platform compatibility:** Open Source (CE): 2.4 (current), 2.3 (obsolete); Commerce on prem (EE): 2.4 (current), 2.3 (obsolete); Commerce on Cloud (ECE): 2.4 (current), 2.3 (obsolete) Step 1: Installation -------------------- ### Access plugin Click the button below to download this plugin and view any related documentation available. [Go to Plugin/Marketplace](https://marketplace.magento.com/realexpayments-module-payment-gateway.html) ### Credentials #### Sandbox credentials Our Adobe Commerce plugin requires credentials to our Unified Payments gateway. Test credentials can be obtained after registering with our [developer portal](/user "Developer Portal Login"). Once registration is complete, the required App Key and App Id can be found under your account. For more information and instructions, see [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md). #### Apple Pay credentials To integrate with Apple Pay, you’ll need to obtain the encrypted payment credentials. To do this, follow the steps in the applicable Apple guide below: * [In-app - Apple Pay PassKit](https://developer.apple.com/documentation/passkit/apple_pay/ "Apple Pay Passkit") * [In-browser - Apple Pay on the Web](https://developer.apple.com/documentation/apple_pay_on_the_web/ "Apple Pay on the Web") For more Apple Pay setup information, see our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. ### Configuration To configure this plugin, follow these steps. 1. Log in to the Admin panel for **Adobe Commerce**. 2. Navigate to **Stores > Configuration**.  3. Under the **Sales** heading, select the **Payment Methods** option.  4. From here, you can configure the Unified Payments gateway as well as the payment methods supported by Adobe Commerce. ### Settings The [Unified Payments](#unified-payments-settings "Unified Payments Settings section") gateway offers payment through credit and debit cards. Additional payment methods like Digital Wallets ([Google Pay](#google-pay-settings "Google Pay Settings section"), [Apple Pay](#apple-pay-settings "Apple Pay Settings section"), and [PayPal](#paypal-settings "PayPal Settings section")), Buy Now Pay Later ([Affirm](#affirm-settings "Affirm Settings section"), [Clearpay](#clearpay-settings "Clearpay Settings section"), and [Klarna](#klarna-settings "Klarna Settings section")), and [Bank Payment](#bank-payment-settings "Bank Payment settings section") (Open Banking) can be enabled via the Unified Payments gateway.  #### Unified Payments settings The Unified Payments Settings tab allows you to enter your overall account credentials. These global settings apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Unified Payments Settings tab for Adobe Commerce.  | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., “Credit Card.” The title will also be recorded in Adobe Commerce to indicate how the transaction was processed. | | Sandbox Mode | Allows you to switch between the Production (Live) and Sandbox version of your account with us. | | Sandbox App Id | The App Id and App Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](#global-payments-sandbox-credentials "Global Payments Sandbox Credentials section") section. | | Sandbox App Key | | Credentials Check | Validates your credentials. Note: Payment methods will not display at checkout if the credentials are incorrect. | | Contact Url | A link to an About or Contact page on your website with customer care information (max length: 50). | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Allow Card Saving | Determines whether a customer's card can be saved to our Card Storage solution following a successful transaction. If set to **Yes**, a checkbox displays on the Hosted Fields form that gives the customer the choice to store their card.  If set to **No**, no checkbox displays, and the card is not stored. | | Debug | Allows logging of all requests to and from the gateway. Can also log private data. Should only be enabled in a development or stage environment. Logs can be found at _var/log/_. | | Order Transaction Descriptor | During a Capture or Authorize payment action, this value is passed along as the transaction-specific descriptor listed on the customer's bank account (max length: 25). | | Fraud Mode | Enables merchants to automatically Pass, Hold, or Block transactions based on the result of the rules configured via the Fraud Management section in Ecommerce Portal. | | Enable 3D Secure | Enables the 3D Secure feature. For more details, see the [3D Secure](#3d-secure "3D Secure section") section. | #### Google Pay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Google Pay Settings tab allows you to enter your overall account credentials. These global settings apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Google Pay Settings tab for Adobe Commerce.  | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Google Pay." The title is also recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Client ID | The Client ID provided by us. | | Google Merchant ID | The Merchant ID provided by Google. | | Google Merchant Display Name | The text displayed to the customer in the Google Pay dialog box. | | Accepted Cards | Determines what card types can be used at checkout when paying with Google Pay. | | Allowed Card Authentication Methods | Methods allowed to authenticate a card transaction. Allowed values: **PAN_ONLY**: This authentication method is associated with payment cards stored on file with the user's Google Account. **CRYPTOGRAM_3DS**: This authentication method is associated with cards stored as Android device tokens. PAN\_ONLY can expose the Funding Primary Account Number (FPAN), which requires an additional Strong Customer Authentication (SCA) step up to a 3DS check. Currently, we don't support the Google Pay SCA challenge with an FPAN. For the best acceptance, we recommend that you provide only the CRYPTOGRAM\_3DS option. | | Button Color | Determines the color of the Google button displayed at checkout. | #### Apple Pay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Apple Pay Settings tab allows you to enter your overall account credentials. These global settings apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Apple Pay Settings tab for Adobe Commerce.  | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Apple Pay." The title is also recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Apple Merchant ID | The Merchant ID provided by Apple. For more info on creating an Apple Merchant ID, see [Apple Pay Programming](https://developer.apple.com/library/archive/ApplePay_Guide/Configuration.html "Apple Pay Programming"). | | Apple Merchant Cert Path | The path for the .crt.pem file. This path is the relative path from the root. For example, if you store this certificate as _<magento_location>/.well-known/ApplePay.crt.pem_, the path should be _.well-known/ApplePay.crt.pem_ For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. | | Apple Merchant Key Path | The path for the .key.pem file. For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. | | Apple Merchant Key Passphrase | The encryption key for the .key.pem file. If the .key.pem file is not encrypted, this field must be empty. | | Apple Merchant Domain | To fill this field, you first need to register and validate your domain in your Apple account. Follow the steps in the [Apple Developer Account Help](https://developer.apple.com/help/account/ "Apple Developer Account Help") (see the “Register a merchant domain” and “Verify a merchant domain” sections). Once validated, the value that must be inserted in this field is the Domain value you have in your Apple account for the current domain. | | Apple Merchant Display Name | The text displayed to the customer in the Apple Pay dialog box. | | Accepted Cards | Determines what types of cards can be used at checkout when paying with Apple Pay. | | Button Color | Determines the color of the Apple Pay button displayed at checkout. | #### PayPal settings > For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://docs.google.com/document/d/1hVcQMrfaB6eBwREnGcWN4fOVVV30MLwjNDUcqo9Bf5s/edit#heading=h.x3dp6wwivyvg) section. The PayPal Settings tab allows you to enter your overall account credentials. These are global settings that apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with PayPal." The title will also be recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (_Charge_) or flagged as requiring a separate capture action later (_Authorize_). | #### Affirm settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Affirm Settings tab allows you to enter your overall account credentials. These are global settings that apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Affirm Settings tab for Adobe Commerce.  | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Affirm." The title will also be recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Clearpay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Clearpay Settings tab allows you to enter your overall account credentials. These are global settings that apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Clearpay Settings tab for Adobe Commerce. | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Clearpay." The title will also be recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Klarna settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Klarna Settings tab allows you to enter your overall account credentials. These are global settings that apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Klarna Settings tab for Adobe Commerce. | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Klarna." The title will also be recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Bank Payment settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Bank Payment Settings tab allows you to enter your overall account credentials. These are global settings that apply to all integration types. You can enter specific credentials for different websites by changing the website scope in Adobe Commerce. The following table describes the fields that appear on the Settings tab. | Field | Description | | --- | --- | | Enabled | Determines if the payment method is available at your Adobe Commerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Bank Payment." The title will also be recorded in Adobe Commerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (_Charge_) or flagged as requiring a separate capture action later (_Authorize_). Currently, the Authorize mode is not supported. | | Account Number | Account number for bank transfers within the United Kingdom (UK-to-UK bank). Only required if no bank details are stored on the account. | | Account Name | The name of the individual or business on the bank account. Only required if no bank details are stored on the account. | | Sort Code | Six digits that identify the bank and branch of an account. Included with the account number for UK-to-UK bank transfers. Only required if no bank details are stored on the account. | | IBAN | Key field for bank transfers for Europe-to-Europe transfers. Only required if no bank details are stored on the account. Only required for EUR transacting merchants. | | Countries | Allows you to input a COUNTRY or string of COUNTRIES to limit what is shown to the customer. Including a country overrides your default account configuration. Format: List of ISO 3166-2 (two characters) codes separated by a \| Example: FR\|GB\|IE | | Currencies | The payment method is displayed at checkout only for the selected currencies. | | Sort Order | Checkout sort order. | Step 2: Test integration ------------------------ Use the test card numbers below to verify that your integration was set up properly. For testing, you can use any cardholder name, any expiry date in the future, and any CVN security code. For a full list of test cards, see our [Test Cards](/resources/test-cards "Test Cards") article. Step 3: Going live ------------------ Now that you’ve successfully installed the plugin and tested to see if it was installed properly, you’re all set to go live in the Production environment. For more information, see our [Integration Validation to Go Live](/support/integration-valid "Integration Validation to Go Live") article. **Connect your integration for Production:** * Input your Production App Id / App Key into your gateway configuration in the Adobe Commerce Admin panel, and enable the "Live Mode" for the Unified Payments gateway.  **Go to Production with Google Pay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Google does not offer test cards, so you’ll have to use real ones. * In Sandbox mode, our gateway allows only specific order amount values; all other values will be automatically declined. You can check the allowed values in the [Google Pay section](/resources/test-cards#google-pay "Test Cards") of our Test Cards article. **Go to Production with Apple Pay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * You first need to configure a Sandbox account for Apple. For information on how to create a Sandbox account and test cards, see the Apple’s [Sandbox Testing](https://developer.apple.com/apple-pay/sandbox-testing/ "Apple Sandbox Testing") article. * In Sandbox mode, our gateway allows only specific order amount values; all other values will be automatically declined. You can check the allowed values in the [Apple Pay section](/resources/test-cards#apple-pay "Test Cards") of our Test Cards article. **Go to Production with PayPal:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable PayPal for your current account. * Once you get redirected to the PayPal payment page, create an account and process different transactions. **Go to Production with Affirm:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US and CAD - CA. * Once you get redirected to the Affirm payment page, create an account and process different transactions. **Go to Production with Clearpay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US, CAD - CA, GBP - GB, AUD - AU, and NZD - NZ. * Once you get redirected to the Clearpay payment page, create an account and process different transactions. **Go to Production with Klarna:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US, CAD - CA, GBP - GB, AUD - AU, NZD - NZ, EUR - AT, EUR - BE, EUR - DE, EUR - ES, EUR - FI, EUR - FR, EUR - IT, EUR - NL, CHF - CH, DKK - DK, NOK - NO, PLN - PL, and SEK - SE. * Once you get redirected to the Klarna payment page, create an account and process different transactions. **Go to Production with Bank Payment:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Open Banking for your current account. * Once you get redirected to the Bank Payment payment page, create an account and process different transactions. Additional information ---------------------- This section contains information on payment solutions such as [Hosted Fields](#hosted-fields "Hosted Fields section") and [Hosted Payment Page](#hosted-payment-page "Hosted Payment Page section"), risk management solutions such as [3D Secure](#3d-secure "3D Secure section") and [Fraud Management](#fraud-management "Fraud Management section"), as well as expanded features such as [Card Management](#card-management "Card Management section") and [Order Management](#order-management "Order Management section"). For the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna), additional information on checkout flow can be found in the [Async Payment Methods](#async-payment-methods "Async Payment Methods") section. ### Hosted Fields For information on our PCI DSS requirement-reducing hosted solution, Hosted Fields (Drop-In UI), see our [Hosted Fields - Overview](/docs/payments/online/hosted-fields-overview "Hosted Fields Overview") page. ### Hosted Payment Page For information on our Hosted Payment Page for Unified Payments REST API integrators, see our [Hosted Payment Page - Overview](/docs/payments/online/hosted-payment-page-overview "Hosted Payment Page Overview") page. ### 3D Secure For information on our 3D Secure solutions, see our [3D Secure - Overview](/docs/3DS-overview "3D Secure Overview") page. We provide a Simulator Issuer Access Control Server that allows you to test different 3D Secure scenarios. For more information, see the [3D Secure section](/resources/test-cards#3dsecure-2 "Test Cards - 3D Secure") of our Test Cards article. ### Card Management All card data is tokenized using our tokenization service. Registered customers can save their card information by selecting the “Save for later use” checkbox in the checkout form. The Adobe Commerce plugin securely stores card data with us and receives a token representation of the card, which is stored in the Adobe Commerce vault, with no increased PCI compliance requirements. 1. The customer can choose from the list of their stored cards. ![List of Visa card payment method options with Place Order button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-CardMgt1.png) 2. Registered customers can see their stored cards under **My Account > Stored Payment Methods**. They can also add new cards or delete the existing ones from here. ![List of Stored Payment Methods with Add New Card button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-CardMgt2.png) ### Async Payment Methods > This section applies to the following payment methods: Buy Now Pay Later (Affirm, Clearpay, and Klarna), Bank Payment, and PayPal (except the “Receiving the final payment status” section). Because these payment methods are handled by third-party services and require further processing from these third parties, the checkout flow has some differences compared with the Unified Payments or Digital Wallets ones. #### Initiate the payment 1. When a customer clicks the **Place Order** button, the order is placed with a **Pending Payment** status. ![Order total screen with Submit Comment button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-AsyncPM1.png) 2. Once the order has been created, an Initial Payment request type will occur. #### Redirect to third-party service If the Initiate Payment request is successful, the customer will be redirected to the third-party service to pay. ![Affirm enter mobile number box and Continue button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-AsyncPM2.png) **Third-Party Service Example** #### Redirect back to your website ##### Cancel the payment 1. If the customer decides to cancel the payment using the option provided by the third-party service (for example, clicking the X button on top left of the screen), they will be redirected to the cart page. Also, the order that was previously created will be canceled. ![Loan request decline message with OK button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-AsyncPM3.png) 2. The order canceling will not be processed on your website if the customer decides to leave the page using another option (for example, browser back button, browser X button, closing the tab, and so forth). Therefore, the order will still have the **Pending Payment** status in these cases. ##### Successfully completing the payment 1. If the customer successfully completes the payment, they will be redirected to the success page. 2. At this point, the order will still have a **Pending Payment** status. For more details, see the next section. #### Receiving the final payment status > If you’re using Apache, you need a version **greater than 2.4.47** and the following directive added to your config: **SetEnv proxy-sendcl 1**. Otherwise, the orders within your platform will not be updated as expected. 1. Because these payment methods are asynchronous, the final transaction status might not be available immediately. 2. Once our system gets the final status, it will notify your website. 3. At that point, the order status will change to **Processing**. #### Pending Payment orders 1. In cases where the orders are stuck in a **Pending Payment** status, we provide a **Get Transaction Details** button. ![Transaction id number and Edit button](https://developer.globalpayments.com/gh-assets/plugins/Pending%20Payment%20orders.png) 2. Clicking the **Get Transaction Details** button fetches all the information about the current transaction and displays it in a pop-up window. 3. Based on the Transaction Status, you can manually cancel the order or just continue with the normal flow. ### Order Management 1. Detailed information on transaction outcome is available in the **Orders** section for Adobe Commerce. 2. If the payment was successful, the order status will be set to the **New Order Status** configured under the relevant configuration section for us. #### Create an invoice – capture a transaction Merchants who use Authorize at checkout will authorize the funds on the customer’s card, but the transaction won’t be placed in the settlement file until we  capture it. The amount of time the funds can remain ring-fenced on the customer's card may vary between different Issuers and Acquirers. Card brands like Visa and Mastercard have their own rules regarding how long transactions can wait to be captured. 1. To view the response returned by us, first open the order and then select the **Transactions** tab. Select the relevant transaction to view the details of our response. ![Transaction id number with. search button and edit button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-OrderMgt1.png) 2. If successfully authorized, the funds will be ring-fenced on the customer’s account. When you want to include the transaction in the next settlement file (also known as a _batch_), you can simply send a Capture (Settle) request. When the transaction is captured with the Acquirer, the funds are deducted from the customer's account and settled into the merchant's account. 3. At this point, if you select **Invoices** from the left menu, you'll see that there is no invoice associated with the order. This is because we haven't captured it yet. 4. Click **Submit Invoice** to create a new invoice to be raised against this order. Here, you can review the result of the transaction before deciding to capture the funds. ![Items to invoice details with a Submit Invoice button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-OrderMgt3.png) 5. You must select **Capture Online** for the request to be sent to us. Once you click **Submit Invoice**, a Capture request with the amount specified is sent.   6. Once complete, the result of the Settle request is displayed. A comment indicating the amount captured is included in the order. For example: Captured amount of £2.17 online. Transaction ID: “TRN\_ULgzHnUq0IZfGpjuE20WVrG4dqMlrG\_1626167155” 7. If you select **Invoices** from the left menu now, you’ll see the invoice associated with the order. #### Create a Credit Memo – refund a captured transaction Once an order is successfully settled with your Acquirer, you can rebate the customer for 0% to 115% of the original order value. To do this, you must create a Credit Memo in Adobe Commerce. **Important Note:** The Credit Memo must be linked to a specific invoice, not the overall order.   1. Navigate to **Sales > Orders**, and select the order you want to rebate.  2. Open the relevant invoice, and click **Credit Memo**.  3. Under **Payment Information**, you can review the history of the order before deciding to process the rebate. ![Items to refund details screen with a Refund Online button and a Refund button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-OrderMgt3.png) 4. You must select **Refund** as opposed to Refund Offline. This will send the rebate request to us. You can edit the amount to rebate by editing the adjustment fields provided by Adobe Commerce.  5. Once complete, you will be returned to the **Order View** tab. A message indicating the outcome of the rebate request is included. A comment indicating the amount captured is included in the order. For example: We refunded £2.17 online. Transaction ID: "TRN\_YSaaHfsEfOFp9UB0tlHIUkBkqzaIIJ\_1626167155" #### Cancel an order - void (reverse) a transaction You can cancel a transaction _before_ it is sent for funding. The transaction will be fully reversed. If you already captured (settled) the transaction, see the [Create a Credit Memo – refund a captured transaction](#create-a-credit-memo "Create a Credit Memo section") section.  1. Navigate to **Sales > Orders**, and select the order you want to void (reverse). 2. Click **OK** to confirm the pop-up message. _This will send the Void (Reverse) request to us_. 3. Once complete, a message will display indicating the outcome of the Void (Reverse) request. ![Confirmation message that the payment has been voided](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-OrderMgt7.png) 4. A comment indicating the voided (reversed) amount is included with the order. For example: Voided authorization. Amount: $38.00. Transaction ID: "TRN\_gZU2tA3oku6WGjzlS7vNmdvzFo4u0p\_1643794511-void" ![Order total screen with order processing status and Submit Comment button](https://developer.globalpayments.com/gh-assets/plugins/AdobeCommerce-OrderMgt8.png) ### Fraud Management Our Fraud Filter enables merchants to automatically Pass, Hold, or Block transactions based on the result of one or more rule results. This functionality is configured via the Fraud Management section in Ecommerce Portal. It is important to note that any changes made to the Fraud Filter in Ecommerce Portal will impact the result returned in the API response. You will need to ensure that any changes don't adversely affect transaction processing in your application. For example: * If the Fraud Filter is turned off in the Ecommerce Portal, the data will not be returned in the transaction response. If the mode is changed between Active and Passive, this change will be reflected in the transaction response. * If a new rule is added, an additional element will be returned in the response. Similarly if a rule is deleted, the result will be removed from the response. * If a rule name is edited, the name will change to the new value in the response; the rule ID will remain the same. #### Fraud Mode set to Active 1. When the Fraud Response is set to **Active**, the action detailed in the Fraud Filter overall result will be executed. 2. All the fraud details related to that transaction will be displayed in the **Order Details** page, under the **Fraud Filter Result** tab. ##### Fraud response is PASS In this case, the transaction will pass, and it will follow the normal flow in Adobe Commerce. ##### Fraud response is NOT_EXECUTED In this case, the transaction will pass, and it will follow the normal flow in Adobe Commerce.  ##### Fraud response is HOLD 1. In this case, the transaction will be held and no further actions will be possible until it is released. 2. In Adobe Commerce, the status for the transaction will be set to **Held**, and Transaction Management will not be available. 3. The merchant will have only the option to **Release** or **Cancel** (only when the Payment Action is set to **Authorize**) that order. 4. Once released, Transaction Management will be available. ##### Fraud Response is BLOCK 1. In this case, the transaction will be blocked. 2. In Adobe Commerce, the customer will receive an error saying that “Your card has been declined by the bank” and no order will be created. #### Fraud Mode set to Passive 1. When the Fraud Mode is set to **Passive**, all the rules will be executed, but the action in the Fraud Filter overall will not be executed. 2. All the fraud details related to that transaction will be displayed in the **Order Details** page, under the **Fraud Filter Result** tab. ##### Fraud Response is PASS In this case, the transaction will follow the normal flow in Adobe Commerce. ##### Fraud Response is NOT_EXECUTED In this case, the transaction will follow the normal flow in Adobe Commerce. ##### Fraud Response is HOLD 1. In this case, the status for the order will be set to **Pending Review**, and Transaction Management will be available. 2. The merchant will have the option to **Hold** that order. 3. If the order is held, Transaction Management will be disabled until the order is released. ##### Fraud Response is BLOCK 1. In this case, the status for the order will be set to **Pending Review**, and Transaction Management will be available. 2. The merchant will have the option to **Hold** that order. If the order is held, Transaction Management will be disabled until the order is released. #### Fraud Mode set to Off When Fraud Mode is set to Off, the rules will not be executed. ##### Holding an order 1. The merchant will be presented with the option to **Hold** an order only when the status of the order is **Pending Review**. 2. Once **Hold** is clicked, a pop-up confirmation message appears. 3. If the merchant clicks **OK**, the **Hold** request will be executed. 4. If the request is successful, the order status is changed to **Held**, a success message appears, and Transaction Management will not be available. ##### Releasing an order 1. The merchant will be presented with the option to **Release** an order only when the status of the order is **Held**. 2. Once **Release** is clicked, a pop-up confirmation message appears. 3. If the merchant clicks **OK**, the Release request will be executed. 4. If the request is successful, the order status is changed to **Processing**, a success message appears, and Transaction Management will be available. # OpenCart Source: https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md Section: Integration Options Description: No code: Customize your online store quickly and easily By integrating with our OpenCart plugin, you'll gain access to the full range of our solutions, including PCI DSS scope reduction via [Hosted Fields (Drop-In UI)](#hosted-fields), credit and debit processing, Digital Wallets, [Card Storage](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#card-management), [3D Secure](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#3dsecure), and [Order Management](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#order-management). ## Specifications * **Categories:** Payment Gateways * **Version:** Global Payments * **Created:** 7 Jun 2022 * **Compatibility:** 3.0.3 * **Tags:** creditcard, payment, gateway, debit, credit, secure, currency, free, globalpayments, sca, cardstorage, 3DS, token, tokenize, save cards, digital, wallets ## Installation ### Install the plugin Click the button below to download the plugin that is compatible with your OpenCart version and view any related documentation available. [Get the plugin](https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=43826&filter_search=globalpayments) ### Credentials #### Sandbox credentials Our OpenCart plugin requires credentials to our Unified Payments gateway. Test credentials can be obtained after registering with our [developer portal](https://developer.globalpayments.com/user). Once registration is complete, the required App Key and App Id can be found under your account. For more information and instructions, see our [Unified Payment Apps](https://developer.globalpayments.com/docs/Unified-Payments-Apps) documentation. #### Apple Pay credentials To integrate with Apple Pay, you’ll need to obtain the encrypted payment credentials. To do this, follow the steps in the applicable Apple Pay guide below: * [In-app - Apple Pay PassKit](https://developer.apple.com/documentation/passkit/apple_pay/) * [In-browser - Apple Pay on the Web](https://developer.apple.com/documentation/apple_pay_on_the_web/) For more Apple Pay setup information, see our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) page. ## Configuration To configure this plugin, follow these steps. 1) Log in to the Admin panel for OpenCart. 2) Navigate to **Extensions > Extensions**, and choose the **Payments** plugin type. 3) Locate the **Unified Payments Payment Method**, and click **Install **and then **Edit**.  4) From here, you can configure the Unified Payments gateway as well as the various payment methods supported by OpenCart. ## Settings The [Unified Payments](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) gateway offers payment through credit and debit cards. Additional payment methods like Digital Wallets ([Google Pay](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#google-pay-settings), [Apple Pay](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#apple-pay-settings), and [PayPal](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#paypal-settings)), Buy Now Pay Later ([Affirm](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#affirm-settings), [Clearpay](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#clearpay-settings), and [Klarna](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#klarna-settings)), and [Bank Payment](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#bank-payment-settings) can be enabled via the Unified Payments gateway.  ### Unified Payments settings The Unified Payments Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Unified Payments Settings tab for OpenCart.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Credit Card." | | Live Mode | Allows you to switch between the Live and Sandbox version of your account with us. | | Sandbox/Live App Id | The App Id and Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#sandbox-credentials) section. | | Sandbox/Live App Key | The App Id and Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#sandbox-credentials) section. | | Credentials Check | Determines if your credentials are valid. **The payment methods will not be displayed at checkout if the credentials are not correct.** | | Enable Logging | Allows logging of all requests to and from the gateway. Can also log private data and should only be enabled in a development or stage environment. The requests will be logged in the **storage/logs** folder. The structure for the name of the log file is as follows: `log{current_date}.txt_` | | Contact URl | A link to an About or Contact page on your website with customer care information (max length: 256). This field is mandatory. | | Enable 3D Secure | Enables the 3D Secure feature. For more details, see the [3D Secure](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#3d-secure) section. **If you reside in a region where 3DS is required, this feature will be enabled by default.** | | Sort Order | Sort order for checkout. | The Unified Payments Payment tab allows you to make selections regarding payment actions. The following table describes the fields that appear on the Unified Payments Payment tab for OpenCart. | Field | Description | | --- | --- | | Payment Action | The Sale transaction can be flagged for automatic capture (Authorize + Capture) or flagged as requiring a separate capture action later (Authorize only). | | Allow Card Saving | Determines whether customer's cards can be saved to our Card Storage following a successful transaction. If set to **Yes**, a checkbox displays on the Hosted Fields form giving the customer the choice to store their card. If set to **No**, no checkbox displays, and the card is not stored. | | Order Transaction Descriptor | During a Capture or Authorize payment action, this value will be passed along as the transaction-specific descriptor listed on the customer's bank account. | ### Google Pay settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The Google Pay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Google Pay Settings tab for OpenCart. | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Pay with Google Pay." | | Merchant ID | The Merchant ID provided by us. | | Google Merchant ID | The Merchant ID provided by Google. | | Accepted Cards | Determines what card types can be used at checkout when paying with Google Pay. | | Allowed Card Auth Methods | Methods allowed to authenticate a card transaction: **-PAN_ONLY:** This authentication method is associated with payment cards stored on file with the user's Google account.  **- CRYPTOGRAM_3DS:** This authentication method is associated with cards stored as Android device tokens. PAN_ONLY can expose the Funding Primary Account Number (FPAN), which requires an additional Strong Customer Authentication (SCA) step up to a 3DS check. Currently, we don’t support the Google Pay SCA challenge with an FPAN. **For the best acceptance, we recommend that you provide only the CRYPTOGRAM_3DS option.** | | Button Color | Determines the color of the Google Pay button displayed at checkout. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | ### Apple Pay settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The Apple Pay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Apple Pay Settings tab for OpenCart. | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Pay with Apple Pay." | | Apple Merchant ID | The Merchant ID provided by Apple. | | Apple Merchant Cert Path | The path for the **.crt.pem** file. This path is the relative path from the **DIR_STORAGE**. For example, if you store this certificate as **DIR_STORAGE/.well-known/ApplePay.crt.pem**, the path should be **.well-known/ApplePay.crt.pem** For more Apple Pay setup information, see the [Apple Pay credentials](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#apple-pay-credentials) section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) documentation. | | Apple Merchant Key Path | The path for the .key.pem file. For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) documentation. | | Apple Merchant Key Passphrase | The encryption key for the **.key.pem** file. If the **.key.pem** file is not encrypted, this field must be empty. | | Apple Merchant Domain | To fill this field, you first need to register and validate your domain in your Apple account. Follow the steps in the [Apple Developer Account Help](https://developer.apple.com/help/account/) (see the “Register a merchant domain” and “Verify a merchant domain” sections). Once validated, the value that must be inserted in this field is the Domain value you have in your Apple account, for the current domain. | | Apple Merchant Display Name | The text displayed to the customer in the Apple Pay dialog. | | Accepted Cards | Determines what types of cards can be used at checkout when paying with Apple Pay. | | Button Color | Determines the color of the Apple Pay button displayed at checkout. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | ### PayPal settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The PayPal Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the PayPal Settings tab for OpenCart.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Pay with PayPal." The title will also be recorded in OpenCart to indicate how the transaction was processed. | | Payment Action | The sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Sort Order | Sort order of checkout. | #### Affirm settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The Affirm Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Affirm Settings tab for OpenCart.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Pay with Affirm." The title will also be recorded in Opencart to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | ### Clearpay settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The Clearpay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Clearpay Settings tab for OpenCart.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Pay with Clearpay." The title will also be recorded in Opencart to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | ### Klarna settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The Klarna Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Klarna Settings tab for OpenCart.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your Opencart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, such as "Pay with Klarna." The title will also be recorded in Opencart to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | ### Bank Payment settings > **For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#unified-payments-settings) section.** The Bank Payment Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Bank Payment Settings tab.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your OpenCart store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Bank Payment." The title will also be recorded in OpenCart to indicate how the transaction was processed. | | Payment Action | The sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). Currently, the Authorize mode is not supported. | | Account Number | Account number for bank transfers within the United Kingdom (UK-to-UK bank). Required only if no bank details are stored on the account. | | Account Name | Name of the individual or business on the bank account. Required only if no bank details are stored on the account. | | Sort Code | Six digits that identify the bank and branch of an account. Included with the account number for UK-to-UK bank transfers. Required only if no bank details are stored on the account. | | IBAN | Key field for bank transfers for Europe-to-Europe transfers. Required only if no bank details are stored on account. Required only for EUR-transacting merchants. | | Countries | Allows you to input a `COUNTRY` or string of `COUNTRIES` to limit what is shown to the customer. Including a country overrides your default account configuration. Format: List of ISO 3166-2 two-character codes separated by a vertical pipe. Example: FR|GB|IE | | Currencies | The payment method will be displayed at checkout only for the selected currencies. | | Sort Order | Sort order checkout. | ## Test your integration Use the test card numbers below to verify that your integration was set up properly. For testing, you can use any cardholder name, any expiry date in the future, and any CVN security code. For a full list of test cards, see our [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) page. ## Going live Now that you’ve successfully installed the plugin and tested to see that everything is working properly, you’re all set to go live in the Production environment. For more information, see our [Integration Validation to Go Live](https://developer.globalpayments.com/support/integration-valid) page. ### Connect your integration for Production Input your Production App Id and App Key into your gateway configuration in the OpenCart Admin panel, and enable the “Live Mode” for the Unified Payments  gateway.  ### Going to production with Google Pay This gateway shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * You'll have to use real transactions because Google does not offer test cards. * In Sandbox mode, our gateway allows only specific order amount values. All other values will be automatically declined. You can check the allowed values in the [Google Pay section](https://developer.globalpayments.com/resources/test-cards.md#google-pay) on our Test Cards page. ### Going to production with Apple Pay This gateway shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * You first need to configure a Sandbox account for Apple. For information on how to create a Sandbox account and test cards, see the Apple’s [Sandbox Testing](https://developer.apple.com/apple-pay/sandbox-testing/) page. * In Sandbox mode, our gateway allows only specific order amount values. All other values will be automatically declined. You can check the allowed values in the [Apple Pay section](https://developer.globalpayments.com/resources/test-cards.md#apple-pay) on our Test Cards page. ### Going to production with PayPal** This payment method shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * Contact the Unified Payments team and ask them to enable PayPal for your current account (see [Integration Support](https://developer.globalpayments.com/support/integration)). * Once you get redirected to the PayPal payment page, create an account and process different transactions. ### Going to production with Affirm This payment method shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](https://developer.globalpayments.com/support/integration)). * This payment method will be displayed at checkout only for the following currency-country cases: USD-US and CAD-CA. * Once you get redirected to the Affirm payment page, create an account and process different transactions. ### Going to production with Clearpay This payment method shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](https://developer.globalpayments.com/support/integration)). * This payment method will be displayed at checkout only for the following currency-country cases: USD-US and CAD-CA, GBP-GB, AUD-AU, and NZD-NZ. Once you get redirected to the Clearpay payment page, create an account and process different transactions. ### Going to production with Klarna This payment method shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account ((see [Integration Support](https://developer.globalpayments.com/support/integration)). * This payment method will be displayed at checkout only for the following currency-country cases: USD-US, CAD-CA, GBP-GB, AUD-AU, NZD-NZ, EUR-AT, EUR-BE, EUR-DE, EUR-ES, EUR-FI, EUR-FR, EUR-IT, EUR-NL, CHF-CH, DKK-DK, NOK-NO, PLN-PL, and SEK-SE. * Once you get redirected to the Klarna payment page, create an account and process different transactions. ### Going to production with PayPal This payment method shares the Sandbox/Production mode with the Unified Payments gateway. To process test transactions: * Contact the Unified Payments team and ask them to enable PayPal for your current account (see [Integration Support](https://developer.globalpayments.com/support/integration)). * Once you get redirected to the PayPal payment page, create an account and process different transactions. ## Additional information This section contains information on payment solutions such as [Hosted Fields](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#hosted-fields) and [Hosted Payment Page](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#hosted-payment-page), risk management solutions such as [3D Secure](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#3d-secure), as well as enhanced features such as [Card Management](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#card-management) and [Order Management](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#order-management). For the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna), additional information on checkout flow can be found in the [Async Payment Methods](https://developer.globalpayments.com/docs/integration-options/plugins/opencart.md#async-payment-methods) section. ### Hosted fields For information on Hosted Fields (Drop-In UI), our hosted solution for reducing PCI DSS requirements, see our [Hosted Fields - Overview](https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md). ### Hosted payment page For information on our Hosted Payment Page for Unified Payments REST API integrators, see our [Hosted Payment Page - Overview](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-overview.md). ### 3D Secure For information on our 3D Secure solutions, see our [3D Secure - Overview](https://developer.globalpayments.com/docs/3DS-overview). We provide a Simulator Issuer Access Control Server that allows you to test different 3D Secure scenarios. See the [3D Secure section](https://developer.globalpayments.com/resources/test-cards.md#3dsecure-2) on our Test Cards page. ### Card management All card data is tokenized using our tokenization service. Registered customers can save their card information by selecting the “Save to account” checkbox in the checkout form. The OpenCart plugin securely stores card data with us and receives a token representation of the card, which is stored in the OpenCart vault, with no increased PCI compliance requirements. 1) The customer can choose from the list of their stored cards. ![Send payment method tab with Confirm Order button](https://developer.globalpayments.com/gh-assets/plugins/OpenCart1-5x-AsyncPM1.png) 2) Registered customers can see the list of their stored cards under **My Account > Cards** where they can delete stored cards or add new ones. ### Async Payment Methods > **This section applies only to the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna) and the Bank Payment payment method. All sections except “Receiving the final payment status” apply to PayPal as well.** These payment methods are handled by third-party services and require further processing from them. As a result, the checkout flow has some differences compared with the Unified Payments or Digital Wallets flows. #### Initiate the payment When a customer clicks the **Place Order** button, the order is placed with a “Waiting for payment” status. Once the order has been created, an Initial Payment request type will occur. #### Redirect to a third-party service If the Initiate Payment request is successful, the customer will be redirected to the third-party service to pay. ![Affirm page with mobile number field and continue button](https://developer.globalpayments.com/gh-assets/plugins/OpenCart1-5x-AsyncPM2.png) **Third-Party Service Example** #### Redirect back to your website Here, the customer will either: * Cancel the payment * Successfully complete the payment If the customer successfully completes the payment, they will be redirected to the success page. At this point, the order will still have a **Pending Payment** status. #### Receiving the final payment status If the customer decides to cancel the payment using the option provided by the third party service (for example, clicking the X button on top left of the screen), they will be redirected to the cart page, and the order that was previously created will be canceled. ![Affirm confirmation message to cancel loan request](https://developer.globalpayments.com/gh-assets/plugins/OpenCart1-5x-AsyncPM3.png) If the customer decides to leave the page using another option (for example, browser back button, browser X button, or closing the tab), the canceled order will not be processed in your website and will still have the ‘Waiting for payment’ status. > **If you are using Apache, you'll need a version **greater than 2.4.47** and the following directive added to your config: `SetEnv proxy-sendcl 1`. Otherwise, the orders within your platform will not be updated as expected.** Since these payment methods are asynchronous, the final transaction status might not be available immediately. Once our system gets the final status, it will notify your website. At that point, the order status will be changed to **Processing**. #### ‘Waiting for payment’ orders In cases where the orders are stuck in a **Pending Payment** status, we provide a **Get Transaction Details** button. Clicking **Get Transaction Details** fetches all the information about the current transaction and displays it in a pop-up window. Based on the Transaction Status, you can manually cancel the order or just continue with the normal flow. ### Order management Detailed information relating to the transaction outcome is available in the **Orders** section for OpenCart. If payment was successful, the order status will be set to **Processing**. #### Create an invoice to capture a transaction Merchants who use “Authorize only” at checkout will authorize the funds on the customer's card, but the transaction won't be placed in the settlement file until we capture it. The amount of time the funds can remain ring-fenced on the customer's card may vary between different Issuers and Acquirers. Card brands like Visa and Mastercard have their own rules regarding how long transactions can wait to be captured. You can view the response returned by us in the **Unified Payments** tab: 1) When viewing the order, scroll down to the bottom of the page. The details of the response from us will be displayed. 2) If successfully authorized, the funds will now be ring-fenced on the customer's account. 3) When you want to include the transaction in the next settlement file (also known as a *batch*) you can simply send a Capture (Settle) request. 4) When the transaction is captured with the Acquirer, the funds are deducted from the customer's account and settled into the merchant's account. Once complete, the result of the Settle request will be displayed. #### Refund a captured transaction Once an order has been successfully settled with your Acquirer, you can rebate the customer for 0% to 115% of the original order value. To do this, you must create a Partial Refund in OpenCart:  1) Navigate to **Sales > Orders**, and select the order you want to rebate. 2) Click **Refund**. If no amount entered, a full refund of the authorized amount will be requested. 3) This will send the rebate request to us. You can change the amount to rebate by editing the input field.  4) Once complete, you will be returned to the Order page. A message will display indicating the outcome of the rebate request. A comment will be also added to the **Unified Payments** tab. #### Reverse a transaction You can cancel a transaction before it is sent for funding. The transaction will be fully reversed. If you already captured (settled) the transaction, see the [Refund a captured transaction](#refund-a-captured-transaction "Refund a Captured Transaction section") section.  1) **Scenario 1**: If the gateway has the payment action set to Authorize only: 1. In the Admin panel, select the order you want to reverse. It will have the status **Processing**. 2. Open the **Order History**, and select the **Unified Payments** tab. 2) **Scenario 2**: If the gateway has the payment action set to Authorize & Capture: 1. In the Admin panel, select the order you want to reverse. It will have the status **Processing**. 2. Open the **Order History**, and select the **Unified Payments** tab. 3) Next, click **Reverse**. A warning message will appear, asking if you want to proceed with the reverse. 4) Click **OK**. 5) Notice that a new entry line was added to the **Payment Information** list indicating the voided (reversed) amount with the Payment Action `reverse`. 6) Finally, go to **Add Order History** and manually change the Order Status from Processing to **Reversed**. Click **Add History**.  ![Drop-down list of order statuses with Reversed selected](https://developer.globalpayments.com/gh-assets/plugins/OpenCart-OrderMgt10.png) # PrestaShop Source: https://developer.globalpayments.com/docs/integration-options/plugins/prestashop.md Section: Integration Options Description: No Code: Customize your online store quickly and easily By integrating with our PrestaShop plugin, you gain access to the full range of our solutions, including PCI DSS scope reduction via [Hosted Fields](#hosted-Fields) (Drop-In UI), credit and debit processing, Digital Wallets, [Card Storage](#card-storage "Card Management section"), [3D Secure](#3Dsecure "3D Secure section"), and [Order Management](#order-management "Order Management section"). Specifications -------------- * Prestashop compatibility: 8.x \- 9.0 * Module version: 1.7.2 * PHP version: 8.2 or higher * Minimum Recommended: Prestashop 8.x with PHP 8.2 * Best: Prestashop 9.x with PHP 8.3 Step 1: Installation -------------------- ### Access plugin Click the button below to download this plugin and view any related documentation available. [Go to Plugin/Marketplace](https://github.com/globalpayments/prestashop-hybrid) ### Credentials #### Sandbox credentials Our PrestaShop plugin requires credentials to our Unified Payments gateway. Test credentials can be obtained after registering with our [developer portal](/user "Developer Portal"). Once registration is complete, the required App Key and App Id can be found under your account. For more information and instructions, see [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md). #### Apple Pay credentials To integrate with Apple Pay, you’ll need to obtain the encrypted payment credentials. To do this, follow the steps in the applicable Apple guide below: * [In-app - Apple Pay PassKit](https://developer.apple.com/documentation/passkit/apple_pay/ "Apple Pay PassKit") * [In-browser - Apple Pay on the Web](https://developer.apple.com/documentation/apple_pay_on_the_web/ "Apple Pay on the Web") For more Apple Pay setup information, see our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. ### Configuration To configure this plugin, follow these steps. 1. Log in to the Admin panel for PrestaShop. 2. Navigate to **Modules > Module Manager**.  3. Under the **Other** tab, locate our module, and click **Configure**. _From here, you can configure our gateway._ ### Settings The [Unified Payments](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#unified-payments-settings) gateway offers payment through credit and debit cards. Additional payment methods like Digital Wallets ([Google Pay](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#google-pay-settings), [Apple Pay](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#apple-pay-settings), and [PayPal](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#paypal-settings)), Buy Now Pay Later ([Affirm](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#affirm-settings), [Clearpay](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#clearpay-settings), and [Klarna](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#klarna-settings)), and [Bank Payment](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#bank-payment-settings) can be enabled via the Unified Payments gateway. #### Unified Payments settings The Unified Payments Settings allows you to enter your overall account credentials. 1. Navigate to Modules \> Module Manager \> Global Payments, click Configure ![Module Manager](https://developer.globalpayments.com/gh-assets/plugins/preta1.png) 2. Under the Unified Payments tab toggle **Enable** to **Yes** ![Configure](https://developer.globalpayments.com/gh-assets/plugins/preta2.png) 3. Configure the remaining fields under settings and click **Save**. ![Configure](https://developer.globalpayments.com/gh-assets/plugins/preta3.png) The following table describes the fields that appear on the Unified Payments Settings tab for Prestashop. | Field | Description | | :---- | :---- | | Enable/Disable | Determines if the payment method is available at your Prestashop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g.,"Credit Card." The title will also be recorded in Prestashop to indicate how the transaction was processed. | | Live Mode | Allows you to switch between the Live and Sandbox versions of your account with us. | | Sandbox/Live App Id | The App Id and App Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#sandbox-credentials) section. | | Sandbox/Live App Key | The App Id and App Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#sandbox-credentials) section. | | Sandbox/Live Account Name | Allows you to select the merchant account name associated with your Global Payments merchant account | | Credentials Check | Determines if your credentials are valid. Note: The payment methods will not be displayed at checkout if the credentials are not correct. | | Enable Logging | Allows logging of all requests to and from the gateway. Can also log private data. Should only be enabled in a development or stage environment. Logs can be found at *Prestashop \> Status \> Logs*. | | Contact Url | A link to an About or Contact page on your website with customer care information (maxLength: 50). | | Enable 3D Secure | Enables the 3D Secure feature. For more details, see the [3D Secure](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#3d-secure) section. | | Payment Action | The sale transaction can be flagged for automatic capture (Authorize \+ Capture) or flagged as requiring a separate capture action later (Authorize only). | | Allow Card Saving | Determines whether a customer's card can be saved to our Card Storage solution following a successful transaction. If set to Yes, a checkbox displays on the Hosted Fields form that gives the customer the choice to store their card. If set to No, no checkbox displays, and the card is not stored. | | Order Transaction Descriptor | During a Capture or Authorize payment action, this value will be passed along as the transaction-specific descriptor listed on the customer's bank account. | | Sort Order | Sort order for checkout. | | BLIK | Enables the BLIK payment method and determines if the payment method is available at time of checkout. | | Open Banking | Enables the Open Banking payment method and determines if the payment method is available at time of checkout. | #### Google Pay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The Google Pay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Google Pay Settings tab for PrestaShop.  | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Google Pay." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Merchant ID | The Merchant ID provided by us. | | Google Merchant ID | The Merchant ID provided by Google. | | Accepted Cards | Determines what card types can be used at checkout when paying with Google Pay. | | Allowed Card Auth Methods | Methods allowed to authenticate a card transaction. **PAN_ONLY:** This authentication method is associated with payment cards stored on file with the user's Google account.  **CRYPTOGRAM_3DS:** This authentication method is associated with cards stored as Android device tokens. PAN\_ONLY can expose the Funding Primary Account Number (FPAN), which requires an additional Strong Customer Authentication (SCA) step up to a 3DS check. Currently, we don’t support the Google Pay SCA challenge with an FPAN. For the best acceptance, we recommend that you provide only the CRYPTOGRAM\_3DS option. | | Button Color | Determines the color of the Google Pay button displayed at checkout. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Sort Order | Sort order for checkout. | #### Apple Pay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The Apple Pay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Apple Pay Settings tab for PrestaShop. | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Apple Pay." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Apple Merchant ID | The Merchant ID provided by Apple. For more info on creating an Apple Merchant ID, see [Apple Pay Programming](https://developer.apple.com/library/archive/ApplePay_Guide/Configuration.html "Apple Pay Programming Guide"). | | Apple Merchant Cert Path | The path for the .crt.pem file. This path is the relative path from the root. For example, if you store this certificate as _<prestashop_location>/.well-known/ApplePay.crt.pem_, the path should be _.well-known/ApplePay.crt.pem_ For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. | | Apple Merchant Key Path | The path for the _.key.pem_ file. For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. | | Apple Merchant Key Passphrase | The encryption key for the ._key.pem_ file. If the .key.pem file is not encrypted, this field must be empty. | | Apple Merchant Domain | To fill this field, you will need to register and validate your domain in your Apple account first. Once validated, insert the domain value in your Apple account for the current domain into this field. | | Apple Merchant Display Name | The text displayed to the customer in the Apple Pay dialog box. | | Accepted Cards | Determines what types of cards can be used at checkout when paying with Apple Pay. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### PayPal settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The PayPal Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with PayPal." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Sort Order | Sort order for checkout. | #### Affirm settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The Affirm Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Affirm Settings tab for PrestaShop.  | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Affirm." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Clearpay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The Clearpay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Clearpay Settings tab for PrestaShop.  | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Clearpay." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Klarna settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The Klarna Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Klarna Settings tab for PrestaShop.  | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Klarna." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Bank Payment settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings") section. The Bank Payment Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enable | Determines if the payment method is available at your PrestaShop store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Bank Payment." The title will also be recorded in PrestaShop to indicate how the transaction was processed. | | Account Number | Account number for bank transfers within the United Kingdom (UK-to-UK bank). Required only if no bank details are stored on the account. | | Account Name | The name of the individual or business on the bank account. Required only if no bank details are stored on the account. | | Sort Code | Six digits that identify the bank and branch of an account. Included with the account number for UK-to-UK bank transfers. Required only if no bank details are stored on the account. | | IBAN | Key field for bank transfers for Europe-to-Europe transfers. Required only if no bank details are stored on the account. Required only for EUR transacting merchants. | | Countries | Allows you to input a COUNTRY or string of COUNTRIES to limit what is shown to the customer. Including a country overrides your default account configuration. Format: List of ISO 3166-2 (two characters) codes separated by a \| Example: FR\|GB\|IE | | Currencies | The payment method will be displayed at checkout only for the selected currencies. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | | Sort Order | Sort order for checkout. | Step 2: Test integration ------------------------ Use the test card numbers below to verify that your integration was set up properly. For testing, you can use any cardholder name, any expiry date in the future, and any CVN security code. For a full list of test cards, see our [Test Cards](/resources/test-cards "Test Cards") article. Step 3: Going live ------------------ Now that you’ve successfully installed the plugin and tested to see if it was installed properly, you’re all set to go live in the Production environment. For more information, see our [Integration Validation to Go Live](/support/integration-valid "Integration Validation to Go Live") article. **Connect your integration for Production:** * Input your Production App Id /App Key into your gateway configuration in the PrestaShop Admin panel, and enable the “Live Mode” for the Unified Payments gateway.  **Go to Production with Google Pay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Google does not offer test cards, so you’ll have to use real ones. * In Sandbox mode, our gateway allows only specific order amount values; all other values will be automatically declined. You can check the allowed values in the [Google Pay section](/resources/test-cards#google-pay "Test Cards for Google Pay") of our Test Cards article. **Go to Production with Apple Pay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * You first need to configure a Sandbox account for Apple. For information on how to create a Sandbox account and test cards, see the Apple’s [Sandbox Testing](https://developer.apple.com/apple-pay/sandbox-testing/ "Apple Sandbox Testing article") article. * In Sandbox mode, our gateway allows only specific order amount values; all other values will be automatically declined. You can check the allowed values in the [Apple Pay section](/resources/test-cards#apple-pay "Test Cards for Apple Pay") of our Test Cards article. **Go to Production with PayPal:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable PayPal for your current account (see [Integration Support](/support/integration "Integration Support")). * Once you get redirected to the PayPal payment page, create an account and process different transactions. **Go to Production with Affirm:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US and CAD - CA. * Once you get redirected to the Affirm payment page, create an account and process different transactions. **Go to Production with Clearpay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US, CAD - CA, GBP - GB, AUD - AU, and NZD - NZ. * Once you get redirected to the Clearpay payment page, create an account and process different transactions. **Go to Production with Klarna:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US, CAD - CA, GBP - GB, AUD - AU, NZD - NZ, EUR - AT, EUR - BE, EUR - DE, EUR - ES, EUR - FI, EUR - FR, EUR - IT, EUR - NL, CHF - CH, DKK - DK, NOK - NO, PLN - PL, and SEK - SE. * Once you get redirected to the Klarna payment page, create an account and process different transactions. **Go to Production with Bank Payment:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Open Banking for your current account (see [Integration Support](/support/integration "Integration Support")). * Once you get redirected to the Bank Payment payment page, create an account and process different transactions. **Going to Production with BLIK:** * Set up the store information within Prestashop Configure \> Shop Parameters \> Contact \> Stores and **Save changes** * **Note**: *For BLIK to work properly, the country and currency must be configured for Poland.* ![BLIK](https://developer.globalpayments.com/gh-assets/plugins/blik1.png) * Set the currency within Prestashop International \> Localization \> Currencies and **Save changes** ![BLIK](https://developer.globalpayments.com/gh-assets/plugins/blik2.png) * If you do not see the desired currency, you can add a new currency by downloading the [localization pack](https://help-center.prestashop.com/hc/fr/articles/115000423312) associated with the currency you wish to download. For example, if you wish to add the Polish zlotys to your store, download the "Poland" pack. Once your localization pack has been imported: * Go to the "Currencies" tab on the International \> Localization page. * Select the currency you wish to install. * Set its exchange rate. This option is particularly useful if the currency in question is highly volatile. * Click on the toggle button in the "Enabled" column to bring your new currency online. * Enable BLIK within the shopping cart Payments Settings * Modules \> Module Manager \> Global Payments, click Configure ![BLIK](https://developer.globalpayments.com/gh-assets/plugins/blik3.png) * Process test transactions: * Contact the Unified Payments team and ask them to enable BLIK (redirect) for your current account (see [Integration Support](https://developer.globalpayments.com/support/integration-support)). * This payment method will be displayed at checkout only for the following currency \- country cases: PL **Going to Production with Open Banking:** * Set up the store information within Prestashop Configure \> Shop Parameters \> Contact \> Stores and **Save changes** * **Note**: *For Open Banking to work properly, the country and currency must be configured for Poland.* ![Open Bankikng](https://developer.globalpayments.com/gh-assets/plugins/openbank1.png) * Set the currency within Prestashop International \> Localization \> Currency and **Save changes** ![Open Bankikng](https://developer.globalpayments.com/gh-assets/plugins/openbank2.png) * If you do not see the desired currency, you can add a new currency by downloading the [localization pack](https://help-center.prestashop.com/hc/fr/articles/115000423312) associated with the currency you wish to download. For example, if you wish to add the Polish zlotys to your store, download the "Poland" pack. Once your localization pack has been imported: * Go to the "Currencies" tab on the International \> Localization page. * Select the currency you wish to install. * Set its exchange rate. This option is particularly useful if the currency in question is highly volatile. * Click on the toggle button in the "Enabled" column to bring your new currency online. * Enable Open Banking in the Payments Settings * Modules \> Module Manager \> Global Payments, click Configure ![Open Bankikng](https://developer.globalpayments.com/gh-assets/plugins/openbank3.png) * Process test transactions: * Contact the Unified Payments team and ask them to enable Open Banking for your current account (see [Integration Support](https://developer.globalpayments.com/support/integration-support)). * This payment method will be displayed at checkout only for the following currency \- country cases: PL Additional information ---------------------- This section contains information on payment solutions such as [Hosted Fields](#hosted-fields "Hosted Fields section") and [Hosted Payment Page](#hosted-payment-page "HPP section"), risk management solutions such as [3D Secure](#3Dsecure "3D Secure section"), and expanded features such as [Card Management](#card-storage "Card Management section") and [Order Management](#order-management "Order Management section"). For the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna), additional information on checkout flow can be found in the [Async Payment Methods](#async-payment-methods "Async Payment Methods") section. ### Hosted Fields For information on our PCI DSS requirement-reducing hosted solution, Hosted Fields (Drop-In UI), see our [Hosted Fields - Overview](/docs/payments/online/hosted-fields-overview "Hosted Fields Overview") page. ### Hosted Payment Page For information on our Hosted Payment Page for Unified Payments REST API integrators, see our [Hosted Payment Page - Overview](/docs/payments/online/hosted-payment-page-overview "Hosted Payment Page Overview") page. ### 3D Secure For information on our 3D Secure solutions, see our [3D Secure - Overview](/docs/3DS-overview "3D Secure Overview") page. We provide a Simulator Issuer Access Control Server that allows you to test different 3D Secure scenarios. For more information, see the [3D Secure section](/resources/test-cards#3dsecure-2 "Test Cards - 3D Secure") of our Test Cards article. ### Card Management All card data is tokenized using our tokenization service. Registered customers can save their card information by selecting the “Save for later use” checkbox in the checkout form. The PrestaShop plugin securely stores card data with us and receives a token representation of the card, which is stored in the PrestaShop vault, with no increased PCI compliance requirements. 1. The customer can choose from the list of their stored cards. ![Radio buttons with card selection. Place Order button at bottom.](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-CardMgt1.png) 2. Registered customers can see the list of their stored cards under **My Account > My Cards**. They can also delete their stored cards from here. ### Async Payment Methods This section applies only to the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna) and the Bank Payment payment method. All sections except “Receiving the final payment status” apply to PayPal as well. Because these payment methods are handled by third-party services and require further processing from these third parties, the checkout flow has some differences compared with the Unified Payments or Digital Wallets ones. #### Initiate the payment 1. When a customer clicks the **Place Order** button, the order is placed with a “Waiting for payment” status. 2. Once the order has been created, an Initial Payment request type will occur. #### Redirect to third-party service If the Initiate Payment request is successful, the customer will be redirected to the third-party service to pay. ![Affirm login screen with enter mobile number field and Continue button](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-Async-PM2.png) **Third-Party Service Example** #### Redirect back to your website ##### Cancel the payment 1. If the customer decides to cancel the payment using the option provided by the third-party service (for example, clicking the X button on top left of the screen), they will be redirected to the cart page. Also, the order that was previously created will be canceled. ![Popup message to confirm cancelation without completing loan request](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-Async-PM3.png) 2. The order canceling will not be processed in your website if the customer decides to leave the page using another option (for example, browser back button, browser X button, or closing the tab); therefore, the order will still have the ‘Waiting for payment’ status in these cases. ##### Successfully completing the payment 1. If the customer successfully completes the payment, they will be redirected to the success page. 2. At this point, the order will still have a **Pending Payment** status. For more details, see the next section. ##### Receiving the final payment status If you're using Apache, you’ll need a version **greater than 2.4.47** and the following directive added to your config: **SetEnv proxy-sendcl 1**. Otherwise, the orders within your platform will not be updated as expected. 1. Since these payment methods are asynchronous, the final transaction status might not be available immediately. 2. Once our system gets the final status, it will notify your website. 3. At that point, the order status will be changed to **Processing**. #### ‘Waiting for payment’ orders 1. In cases where the orders are stuck in a **Pending Payment** status, we provide a **Get Transaction Details** button. 2. Clicking the **Get Transaction Details** button will fetch all the information about the current transaction and display it in a pop-up window. 3. Based on the Transaction Status, you can manually cancel the order or just continue with the normal flow. ### Order Management 1. Detailed information on transaction outcome is available in the **Orders** section for PrestaShop. 2. If the payment was successful, the order status will be set to **Payment Accepted**. #### Create an invoice – capture a transaction Merchants who use “Authorize only” at checkout will authorize the funds on the customer’s card, but the transaction won’t be placed in the settlement file until we capture it. The amount of time the funds can remain ring-fenced on the customer's card may vary between different Issuers and Acquirers. Card brands like Visa and Mastercard have their own rules around how long transactions can wait to be captured. 1. To view the response returned by us, first open the order and then select **Transactions** from the left menu. Then, scroll to the bottom of the page to view the response details. 2. If successfully authorized, the funds will be ring-fenced on the customer’s account. When you want to include the transaction in the next settlement file (also known as a _batch_), you can simply send a Capture (Settle) request. When the transaction is captured with the Acquirer, the funds are deducted from the customer's account and settled into the merchant's account. 3. At this point, if you select the **Documents** tab, you'll see that there is no invoice associated with the order. This is because we haven't captured it yet.  4. For the request to be sent to us, you must select **Capture** from the** Transaction Management** tab.  5. Once complete, the result of the Settle request will be displayed. A comment is included in the Transaction Management History tab. For example: Transaction captured, amount: 20.00 USD. Transaction ID for the capture: TRN\_AUqXhl9sAuJ3TeKfAIfrEbPbB8O9L0\_e8f587f27ee6 6. If you select the **Documents** tab now, you’ll see the invoice associated with the order. #### Refund a captured transaction Once an order has been successfully settled with your Acquirer, you can rebate the customer for 0% to 100% of the original order value. To do this, you must create a Partial Refund in PrestaShop.  1. Navigate to **Orders**, and select the order you want to rebate.  2. Click **Partial refund**. This will send the rebate request to us. You can edit the amount to rebate by editing the adjustment fields provided by PrestaShop. ![Product screen with Partial Refund button](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-OrderMgt2a.png) 3. Once complete, you will be returned to the **Order** page, and a message indicating the outcome of the rebate request will display.  4. A comment will be also added to the Transaction Management History tab. For example: 18.9USD was reversed or refunded. Transaction ID: TRN\_1EVdczFZxLthk87bzWRIjJASMtmhPz\_9b5e6cd4f6f3 #### Pay for order 1. For an order created on the admin side with the status “Waiting for payment,” a new **Pay for Order** button is displayed. 2. Clicking this button will open a pop-up window where the admin can pay for the total order value using a card or one of the stored cards of the user that the order was set to. ![Pop-up window with inputs for credit card information and Pay button](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-OrderMgt4.png) # WooCommerce Source: https://developer.globalpayments.com/docs/integration-options/plugins/woocommerce.md Section: Integration Options Description: No Code: Customize your online store quickly and easily By integrating with our WooCommerce plugin, you'll gain access to the full range of our solutions, including PCI DSS scope reduction via [Hosted Fields](#hosted-fields) (Drop-In UI), credit and debit processing, Digital Wallets, [Card Storage](#card-management "Card Management section"), [3D Secure](#3d-secure "3D Secure section"), and [Order Management](#order-management "Order Management section"). Specifications -------------- * **WordPress version:** 6.0 or higher  * **Tested up to:** 6.8.3  * **PHP version:** 8.2 or higher Step 1: Installation -------------------- ### Access plugin Click the button below to download this plugin and view any related documentation available. [Go to Plugin/Marketplace](https://wordpress.org/plugins/global-payments-woocommerce/) ### Credentials #### Sandbox credentials Our WooCommerce plugin requires credentials to our Unified Payments gateway. Test credentials can be obtained after registering with our [developer portal](/user "Developer Portal Login"). Once registration is complete, the required App Key and App Id can be found under your account. For more information and instructions, see [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md). #### Apple Pay credentials To integrate with Apple Pay, you’ll need to obtain the encrypted payment credentials. To do this, follow the steps in the applicable Apple guide below: * [In-app - Apple Pay PassKit](https://developer.apple.com/documentation/passkit/apple_pay/ "Apple Pay PassKit") * [In-browser - Apple Pay on the Web](https://developer.apple.com/documentation/apple_pay_on_the_web/ "Apple Pay on the Web") For more Apple Pay setup information, see our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. ### Configuration To configure this plugin, follow these steps. 1. Log in to the Admin panel for WooCommerce. 2. Navigate to **WooCommerce > Settings > Payments**.  ![Woocommerce config](https://developer.globalpayments.com/gh-assets/integration-options/woo-config1.png) 3. From here, you can click **Manage** to configure the Unified Payments gateway as well as the various payment methods supported by WooCommerce. Note: If this is your first time activating this plugin, the Settings page will appear first. ![Woocommerce config](https://developer.globalpayments.com/gh-assets/integration-options/woo-config2.png) ### Settings The [Unified Payments](#unified-payments-settings "Unified Payments Settings section") gateway offers payment through credit and debit cards. Additional payment methods like Digital Wallets ([Google Pay](#google-pay-settings "Google Pay Settings section"), [Apple Pay](#apple-pay-settings "Apple Pay Settings section"), and [PayPal](#paypal-settings "PayPal Settings section")), Buy Now Pay Later ([Affirm](#affirm-settings "Affirm Settings section"), [Clearpay](#clearpay-settings "Clearpay Settings section"), and [Klarna](#klarna-settings "Klarna Settings section")), and [Bank Payment](#bank-payment-settings "Bank Payment Settings section") can be enabled via the Unified Payments gateway.  #### Unified Payments settings The Unified Payments Settings tab allows you to enter your overall account credentials.  1. Navigate to **WooCommerce > Settings > Payments**.  2. Use the toggle under Enabled to select the **Unified Payments** gateway. Note: If this is your first time activating this plugin, the Settings page will appear. 3. If you already enabled the plugin and want to change the settings, click **Manage**. The following table describes the fields that appear on the Unified Payments Settings tab for WooCommerce.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g.,"Credit Card." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Live Mode | Allows you to switch between the Live and Sandbox versions of your account with us. | | Sandbox/Live App Id | The App Id and App Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](#sandbox-credentials "Sandbox Credentials section") section. | | Sandbox/Live App Key | The App Id and App Key are used to obtain a bearer access token to execute API actions. For more information, see the [Sandbox credentials](https://developer.eservicegateway.com/docs/integration-options/plugins/woocommerce#sandbox-credentials) section. | | Credentials Check | Determines if your credentials are valid. Note: The payment methods will not be displayed at checkout if the credentials are not correct. | | Allow Card Saving | Determines whether a customer's card can be saved to our Card Storage solution following a successful transaction. If set to **Yes**, a checkbox displays on the Hosted Fields form that gives the customer the choice to store their card. If set to **No**, no checkbox displays, and the card is not stored. | | Enable Logging | Allows logging of all requests to and from the gateway. Can also log private data. Should only be enabled in a development or stage environment. Logs can be found at _WooCommerce > Status > Logs_. | | Contact Url | A link to an About or Contact page on your website with customer care information (maxLength: 50). | | Enable 3D Secure | Enables the 3D Secure feature. For more details, see the [3D Secure](#3d-secure "3D Secure section") section. | | Payment Action | The sale transaction can be flagged for automatic capture (Authorize + Capture) or flagged as requiring a separate capture action later (Authorize only). | | Order Transaction Descriptor | During a Capture or Authorize payment action, this value will be passed along as the transaction-specific descriptor listed on the customer's bank account. | | BLIK | Enables the BLIK payment method and determines if the payment method is available at time of checkout. | | Bank Select | Enables the Bank Select payment method and determines if the payment method is available at time of checkout. | #### Google Pay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Google Pay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Google Pay Settings tab for WooCommerce. | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Google Pay." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Client ID | The Client ID provided by us. | | Google Merchant ID | The Merchant ID provided by Google. | | Google Merchant Display Name | Text displayed to the customer in the Google Pay dialog box. | | Accepted Cards | Determines what card types can be used at checkout when paying with Google Pay. | | Allowed Card Auth Methods | Methods allowed to authenticate a card transaction. **PAN_ONLY:** This authentication method is associated with payment cards stored on file with the user's Google account.  **CRYPTOGRAM_3DS:** This authentication method is associated with cards stored as Android device tokens. PAN\_ONLY can expose the Funding Primary Account Number (FPAN), which requires an additional Strong Customer Authentication (SCA) step up to a 3DS check. Currently, we don’t support the Google Pay SCA challenge with an FPAN. For the best acceptance, we recommend that you provide only the CRYPTOGRAM\_3DS option. | | Button Color | Determines the color of the Google Pay button displayed at checkout. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Apple Pay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Apple Pay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Apple Pay Settings tab for WooCommerce. | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Apple Pay." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Apple Merchant ID | The Merchant ID provided by Apple. For more info on creating an Apple Merchant ID, see [Apple Pay Programming](https://developer.apple.com/library/archive/ApplePay_Guide/Configuration.html "Apple Pay Programming Guide"). | | Apple Merchant Cert Path | The path for the .crt.pem file. This path is the relative path from the root. For example, if you store this certificate as _<wordpress_location>/.well-known/ApplePay.crt.pem_, the path should be ._well-known/ApplePay.crt.pem_ For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. | | Apple Merchant Key Path | The path for the .key.pem file. For more Apple Pay setup information, see the [Apple Pay credentials](#apple-pay-credentials "Apple Pay Credentials section") section or our [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) article. | | Apple Merchant Key Passphrase | The encryption key for the .key.pem file. If the .key.pem file is not encrypted, this field must be empty. | | Apple Merchant Domain | To fill this field, you first need to register and validate your domain in your Apple account. Follow the steps in the [Apple Developer Account Help](https://developer.apple.com/help/account/ "Apple Developer Account Help") (see the “Register a merchant domain” and “Verify a merchant domain” sections). Once validated, the value that must be inserted in this field is the Domain value you have in your Apple account, for the current domain. | | Apple Merchant Display Name | The text displayed to the customer in the Apple Pay dialog box. | | Accepted Cards | Determines what types of cards can be used at checkout when paying with Apple Pay. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### PayPal settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Paypal Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Affirm." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Clearpay settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Clearpay Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Clearpay Settings tab for WooCommerce.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Clearpay." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Klarna settings > For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Klarna Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with PayPal." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Affirm settings > For this payment method to work, you’ll need to **fully configure** the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Affirm Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Pay with Klarna." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). | #### Bank Payment settings > For this payment method to work, you’ll need to fully configure the Unified Payments gateway. For more information, see the [Unified Payments settings](#unified-payments-settings "Unified Payments Settings section") section. The Bank Payment Settings tab allows you to enter your overall account credentials. The following table describes the fields that appear on the Settings tab.  | Field | Description | | --- | --- | | Enable/Disable | Determines if the payment method is available at your WooCommerce store’s checkout. | | Title | Description of the payment method displayed to the customer at checkout, e.g., "Bank Payment." The title will also be recorded in WooCommerce to indicate how the transaction was processed. | | Account Number | Account number, for bank transfers within the United Kingdom (UK-to-UK bank). Required only if no bank details are stored on the account. | | Account Name | Name of the individual or business on the bank account. Required only if no bank details are stored on the account. | | Sort Code | Six digits that identify the bank and branch of an account. Included with the account number for UK-to-UK bank transfers. Required only if no bank details are stored on the account. | | IBAN | Key field for bank transfers for Europe-to-Europe transfers. Required only if no bank details are stored on account. Required only for EUR transacting merchants. | | Countries | Allows you to input a COUNTRY or string of COUNTRIES to limit what is shown to the customer. Including a country overrides your default account configuration. Format: List of ISO 3166-2 (two characters) codes separated by a \| Example: FR\|GB\|IE | | Currencies | The payment method will be displayed at checkout only for the selected currencies. | | Payment Action | The Sale transaction can be flagged for automatic capture (Charge) or flagged as requiring a separate capture action later (Authorize). Currently, the Authorize mode is not supported. | Step 2: Test integration ------------------------ Use the test card numbers below to verify that your integration was set up properly. For testing, you can use any cardholder name, any expiry date in the future, and any CVN security code. For a full list of test cards, see our [Test Cards](/resources/test-cards "Test Cards") article. Step 3: Going live ------------------ Now that you’ve successfully installed the plugin and tested to see if it was installed properly, you’re all set to go live in the Production environment. For more information, see our [Integration Validation to Go Live](/support/integration-valid "Integration Validation to Go Live") article. **Connect your integration for Production:** * Input your Production App Id / App Key into your gateway configuration in the WooCommerce Admin panel, and enable the “Live Mode” for the Unified Payments  gateway.  **Go to Production with Google Pay:** * This gateway shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Google does not offer test cards, so you’ll have to use real ones. * In Sandbox mode, our gateway allows only specific order amount values; all other values will be automatically declined. You can check the allowed values in the [Google Pay section](/resources/test-cards#google-pay "Test Cards - Google Pay section") of our Test Cards article. **Go to Production with Apple Pay:** * This gateway shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * You first need to configure a Sandbox account for Apple. For information on how to create a Sandbox account and test cards, see the Apple’s [Sandbox Testing](https://developer.apple.com/apple-pay/sandbox-testing/ "Apple Sandbox Testing ") article. * In Sandbox mode, our gateway allows only specific order amount values; all other values will be automatically declined. You can check the allowed values in the [Apple Pay section](/resources/test-cards#apple-pay "Test Cards - Apple Pay section") of our Test Cards article. **Go to Production with PayPal** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable PayPal for your current account (see [Integration Support](https://developer.globalpayments.com/support/customer)). * Once you get redirected to the PayPal payment page, create an account and process different transactions. **Going to Production with Affirm:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US and CAD - CA. * Once you get redirected to the Affirm payment page, create an account and process different transactions. **Going to Production with Clearpay:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US, CAD - CA, GBP - GB, AUD - AU, and NZD - NZ. * Once you get redirected to the Clearpay payment page, create an account and process different transactions. **Going to Production with Klarna:** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Buy Now Pay Later for your current account (see [Integration Support](/support/integration "Integration Support")). * This payment method will be displayed at checkout only for the following currency - country cases: USD - US, CAD - CA, GBP - GB, AUD - AU, NZD - NZ, EUR - AT, EUR - BE, EUR - DE, EUR - ES, EUR - FI, EUR - FR, EUR - IT, EUR - NL, CHF - CH, DKK - DK, NOK - NO, PLN - PL, and SEK - SE. * Once you get redirected to the Klarna payment page, create an account and process different transactions. **Go to Production with Bank Payment** * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Process test transactions: * Contact the Unified Payments team and ask them to enable Open Banking for your current account (see [Integration Support](https://developer.globalpayments.com/support/customer)). * Once you get redirected to the Bank Payment payment page, create an account and process different transactions. **Go to Production with BLIK** * Set up the store information in the WooCommerce Settings \> General and **Save changes** **Note**: *For BLIK to work properly, the country and currency must be configured for Poland. WooCommerce \> Settings \> General* ![BLIK configuration screen 1](https://developer.globalpayments.com/gh-assets/plugins/blik-1.png) * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * In the WooCommerce Payments Settings, update the **Business location:** to reflect Poland. ![BLIK configuration screen 2](https://developer.globalpayments.com/gh-assets/plugins/blik-2.png) * Enable BLIK within the shopping cart Payments Settings * WooCommerce \> Settings \> Payments \> Unified Payments \> BLIK ![BLIK configuration screen 3](https://developer.globalpayments.com/gh-assets/plugins/blik-3.png) * Process test transactions: * Contact the Unified Payments team and ask them to enable BLIK (redirect) for your current account ([see Integration Support](https://developer.globalpay.com/support/customer)). * This payment method will be displayed at checkout only for the following currency \- country cases: PL **Go to Production with Bank Select** * Set up the store information in the WooCommerce Settings \> General and **Save changes** **Note**: *For Bank Select to work properly, the country and currency must be configured for Poland. WooCommerce \> Settings \> General* ![Bank Select configuration screen 1](https://developer.globalpayments.com/gh-assets/plugins/blik-1.png) * In the WooCommerce Payments Settings, update the **Business location:** to reflect Poland. ![Bank Select configuration screen 2](https://developer.globalpayments.com/gh-assets/plugins/blik-2.png) * This payment method shares the Sandbox/Production mode with the Unified Payments gateway. * Enable Bank Select in the Payments Settings * WooCommerce \> Settings \> Payments \> Unified Payments \> Bank Select ![Bank Select configuration screen 3](https://developer.globalpayments.com/gh-assets/plugins/blik-3.png) * Process test transactions: * Contact the Unified Payments team and ask them to enable Bank Select for your current account ([see Integration Support](https://developer.globalpay.com/support/customer)). * This payment method will be displayed at checkout only for the following currency \- country cases: PL Additional information ---------------------- This section contains information on payment solutions such as [Hosted Fields](#hosted-fields "Hosted Fields section") and [Hosted Payment Page](#hosted-payment-page "Hosted Payment Page section"), risk management solutions such as [3D Secure](#3d-secure "3D Secure section"), as well as enhanced features such as [Card Management](#card-management "Card Management section") and [Order Management](#order-management "Order Management section"). For the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna), additional information on checkout flow can be found in the [Async Payment Methods](#async-payment-methods "Async Payment Method section") section. ### Hosted Fields For information on our PCI DSS requirement-reducing hosted solution, Hosted Fields (Drop-In UI), see our [Hosted Fields - Overview](/docs/payments/online/hosted-fields-overview "Hosted Fields Overview") page. ### Hosted Payment Page For information on our Hosted Payment Page for Unified Payments REST API integrators, see our [Hosted Payment Page - Overview](/docs/payments/online/hosted-payment-page-overview "Hosted Payment Page Overview") page. ### 3D Secure For information on our 3D Secure solutions, see our [3D Secure - Overview](/docs/3DS-overview "3D Secure Overview") page. We provide a Simulator Issuer Access Control Server that allows you to test different 3D Secure scenarios. For more information, see the [3D Secure section](/resources/test-cards#3dsecure-2 "Test Cards - 3D Secure") of our Test Cards article. ### Card Management > All card data is tokenized using our tokenization service. Registered customers can save their card information by selecting the “Save to account” checkbox in the checkout form. The WooCommerce plugin securely stores card data with us and receives a token representation of the card, which is stored in the WooCommerce vault, with no increased PCI compliance requirements. 1. The customer can choose from the list of their stored cards. ![Credit card selection list and Place Order button](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Cardmgt1.png) 2. Registered customers can see the list of their stored cards under **My Account > Payment Methods**. ![Payment methods list of stored cards](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Cardmgt2.png) 3. Registered customers can add new payment methods by navigating to **My Account > Payment Methods > Add Payment Method**. A validation of the payment method is done to ensure it can be used to create a transaction at a later time and the card data is received through Hosted Fields. ![Credit card details page and Add Payment Method button](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Cardmgt3.png) ### Order Management Detailed information relating to the transaction outcome is available in the Orders section for WooCommerce.  #### Capture a transaction Merchants who use “Authorize only” at checkout will authorize the funds on the customer's card, but the transaction won't be placed in the settlement file until We capture it. The amount of time the funds can remain ring-fenced on the customer's card may vary between different Issuers and Acquirers. Card brands like Visa and Mastercard have their own rules around how long transactions can wait to be captured.  1. You can view the Transaction ID returned by us under the order details. ![Edit order details screen](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Ordermgt1.png) 2. If successfully authorized, the funds will be ring-fenced on the customer's account. When you want to include the transaction in the next settlement file (also known as a _batch_), you can simply send a Capture (Settle) request. When the transaction is captured with the Acquirer, the funds are deducted from the customer's account and settled into the merchant's account. 3. To capture a transaction, on the right-hand menu, go to **Order** **actions**. Select **Capture credit card authorization** to send the request to us. ![Choose an action drop-down list with Capture Credit Card Authorization selected](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Ordermgt2.png) 4. When finished, click **Update**. _A Capture request with the total amount authorized will now be sent._   5. Once complete, the result of the Settle request will be displayed as a comment in the Order notes. For example: Transaction captured. Transaction ID for the capture: TRN\_Q5LIgwyAGg19h6OSmTWPSHTtygss5c\_0426b98fcb98). ![two order notes with saved transaction information ](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Ordermgt3.png) #### Refund a captured transaction Once an order is successfully settled with your Acquirer, you can rebate the customer for 0% to 115% of the original order value. To do this, you must do a Refund in WooCommerce.  1. Navigate to **WooCommerce > Orders**, and select the order you want to rebate.  2. You can edit the amount to rebate by editing the adjustment fields provided by WooCommerce. ![Refund input fields with buttons for refunding manually or via Unified Payments](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-Ordermgt4.png) 3. Once complete, the result of the Refund request will be displayed as a comment in the Order notes. For example: €10.00 was reversed or refunded. Transaction ID: TRN\_USaGaxBIRCQajDlqcqPolBkUwfRAL4\_0426b98fcb98. ### Async Payment Methods > This section applies only to the Buy Now Pay Later payment methods (Affirm, Clearpay, and Klarna) and the Bank Payment payment method. All sections except “Receiving the final payment status” apply to PayPal as well. Because these payment methods are handled by third-party services and require further processing from these third parties, the checkout flow has some differences compared with the Unified Payments or Digital Wallets ones. #### Initiate the payment 1. When a customer clicks the **Place Order** button, the order is placed with a “Waiting for payment” status. 2. Once the order has been created, an Initial Payment request type will occur. #### Redirect to third-party service If the Initiate Payment request is successful, the customer will be redirected to the third-party service to pay. ![Affirm login screen with enter mobile number field and Continue button](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-Async-PM2.png) **Third-Party Service Example** #### Redirect back to your website ##### Cancel the payment 1. If the customer decides to cancel the payment using the option provided by the third-party service (for example, clicking the X button on top left of the screen), they will be redirected to the cart page and the order that was previously created will be canceled. ![Popup message to confirm cancelation without completing loan request](https://developer.globalpayments.com/gh-assets/plugins/PrestaShop-Async-PM3.png) 2. The order canceling will not be processed in your website if the customer decides to leave the page using another option (for example, browser back button, browser X button, or closing the tab); therefore, the order will still have the “Waiting for payment” status in these cases. ##### Successfully completing the payment 1. If the customer successfully completes the payment, they will be redirected to the success page. 2. At this point, the order will still have a **Pending Payment** status. For more details, see the next section. #### Receiving the final payment status > If you are using Apache, you will need a version **greater than 2.4.47** and the following directive added to your config: **SetEnv proxy-sendcl 1**. Otherwise, the orders within your platform will not be updated as expected. 1. Because these payment methods are asynchronous, the final transaction status might not be available immediately. 2. Once our system gets the final status, it will notify your website. 3. At that point, the order status will be changed to **Processing**. #### ‘Waiting for payment’ orders 1. In cases where the orders are stuck in a **Pending Payment** status, we provide a **View Transaction Info** button. ![Transaction status page with View Transaction Info button](https://developer.globalpayments.com/gh-assets/plugins/WooCommerce-AsycPM5.png) 2. Clicking **View Transaction Info** fetches all the information about the current transaction and displays it in a pop-up window. 3. Based on the Transaction Status, you can manually cancel the order or just continue with the normal flow. # SDK - Java Source: https://developer.globalpayments.com/docs/integration-options/sdk/java.md Section: Integration Options Description: Integrate our SDK Java into your project ## Requirements Java 8 or higher. ## Installation Installing the SDK into your solution is usually done using Maven. ### Maven To install via [Maven](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html), add the below dependency to the POM: ``` com.heartlandpaymentsystems globalpayments-sdk 15.1.0 ``` ### Gradle ``` implementation 'com.heartlandpaymentsystems:globalpayments-sdk:15.1.0' ``` ## GitHub Download the the latest release of the Java SDK from [GitHub](https://github.com/globalpayments/java-sdk). ## Start integrating ### [Online](https://developer.globalpayments.com/docs/payments/online/api-guide.md) Take payments securely online while meeting PCI DSS requirements. ### [In-Store](https://developer.globalpayments.com/docs/payments/in-store/full-integration.md) Code directly to a payment device and our API for complete control of displays and workflows. ### [SDK Reference](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/overview) References to help you with your SDK integration. # SDK - PHP Source: https://developer.globalpayments.com/docs/integration-options/sdk/php.md Section: Integration Options Description: Integrate our SDK PHP into your project ## Requirements For security and support, we highly recommend you use PHP 8+. * PHP >= 8.0.0 ## Installation Installing the SDK into your solution is usually done using [Composer/Packagist](https://packagist.org/packages/globalpayments/php-sdk). ### Composer Add the following to your composer.json file: ``` { "require": { "globalpayments/php-sdk": "2.0.0" } } ``` Inside the application directory, run composer (from the command line): ``` composer update OR (depending on your server configuration) php composer.phar update ``` Add a reference to the autoloader class anywhere you need to use the SDK: ``` require_once ('vendor/autoload.php'); ``` ## GitHub Download the the latest release of the SDK from [GitHub](https://github.com/globalpayments/php-sdk). ## Start integrating ### [Online](https://developer.globalpayments.com/docs/payments/online/api-guide.md) Take payments securely online while meeting PCI DSS requirements. ### [SDK Reference](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/overview) References to help you with your SDK integration. # SDK - .NET Source: https://developer.globalpayments.com/docs/integration-options/sdk/net.md Section: Integration Options Description: Integrate our SDK .NET into your project ## Requirements * .NET Core 1.0+ * .NET Framework 4.6+ * Mono 4.6+ ## Installation Installing the SDK into your solution is usually done using [NuGet Manager Console](https://docs.nuget.org/consume/package-manager-console). ### NuGet ``` Install-Package GlobalPayments.Api -Version 1.7.14 ``` ## GitHub Download the the latest release of the SDK from [GitHub](https://github.com/globalpayments/dotnet-sdk). ## Start integrating ### [Online](https://developer.globalpayments.com/docs/payments/online/api-guide.md) Take payments securely online while meeting PCI DSS requirements. ### [SDK Reference](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/overview) References to help you with your SDK integration. # JavaScript Library Source: https://developer.globalpayments.com/docs/integration-options/sdk/javascript.md Section: Integration Options Description: Integrate using our JavaScript Library ## Drop-In UI and Hosted Fields Our JavaScript Library allows you to integrate the Drop-In UI payment form into your web application easily. Alternatively, you can use the Hosted Fields components on their own with your existing checkout. To learn how to integrate this solution fully into your application, see our [Hosted Fields](https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md) or [Drop-In UI](https://developer.globalpayments.com/docs/payments/online/drop-in-ui-overview.md) documentation. ## Using our Javascript Library ```xml ``` You can explore the JavaScript Library on [GitHub](https://github.com/globalpayments/globalpayments-js). ## 3D Secure 2 Library The JavaScript Library leverages our 3D Secure solution and helps handle the notification to and from the Issuer Access Control Server (ACS), as well as help with the front end for displaying the challenge to the customer. To learn how to integrate 3D Secure, see our [Browser Authentication for 3D Secure](https://developer.globalpayments.com/docs/risk-management/3D-secure/browser-authentication-guide.md) article. ### npm ```xml npm i globalpayments-3ds ``` You can explore the 3D Secure 2 Library further on [GitHub](https://github.com/globalpayments/globalpayments-js/tree/master/packages/globalpayments-3ds). ## Start integrating ### [Hosted Fields Guide](https://developer.globalpayments.com/docs/payments/online/hosted-fields-guide.md) Easily capture customer card information while meeting PCI DSS requirements. ### [Drop-In UI Guide](https://developer.globalpayments.com/docs/payments/online/drop-in-ui-guide.md) Build your own checkout flow to suit your business. ### [3D Secure Guide](https://developer.globalpayments.com/docs/risk-management/3D-secure/browser-authentication-guide.md) Enhance security with stronger authentication for online payments. # Android Library Source: https://developer.globalpayments.com/docs/integration-options/sdk/android.md Section: Integration Options Description: Integrate using our Android library ## Requirements * Android Studio 4.2+ * Android SDK 21 (Lollipop) * Android SDK Tools * Java Version 1.8 ## Installation 1. Declare jcenter repository in the rood build.gradle file: ``` allprojects { repositories { jcenter() } } ``` 2. Declare dependency in the app build.gradle file: ``` dependencies { implementation 'com.globalpayments.android:globalpayments-android-sdk:1.0' } ``` ## Github You can find a test suite of code samples for using the Android SDK in our [GitHub repository](https://github.com/globalpayments/android-sdk). ## Documentation and samples You can find the latest SDK documentation under [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview). For a full list of test cards, see our [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) article. Code examples can be found in the [API Explorer](https://developer.globalpayments.com/api/overview.md). #### Sample code - Processing a payment ```Java /// Prepare required configuration GpApiConfig config = new GpApiConfig(); config.setServiceUrl("Service Url"); //(Sandbox URL: "https://apis.sandbox.globalpay.com/ucp") config.setAppId("Your application ID"); config.setAppKey("Your application key"); /// Add config to container ServicesContainer.configureService(config); /// Prepare card CreditCardData card = new CreditCardData(); card.setNumber("4111111111111111"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("123"); // Execute operation Transaction transaction = card.charge(new BigDecimal("19.99")) .withCurrency("USD") .execute(); ``` ## Test cards | Card Number | Card Type | Expiration Date | Security Code | | --- | --- | --- | --- | | 4263970000005262 | Visa | 12/2025 | 123 | | 2223000010005780 | MasterCard | 12/2025 | 900 | | 5425230000004415 | MasterCard | 12/2025 | 123 | | 6011000000000087 | Discover | 12/2025 | 123 | | 374101000000608 | Amex | 12/2025 | 1234 | | 3566000000000000 | JCB | 12/2025 | 123 | | 36256000000725 | Diners Club | 12/2025 | 123 | # iOS Library Source: https://developer.globalpayments.com/docs/integration-options/sdk/ios.md Section: Integration Options Description: Integrate using our iOS Library ## Requirements * iOS 9.0+ * Xcode 11+ * Swift 5.0+ ## Installation You can integrate our iOS Library into your Xcode project using Cocoapods. 1) Specify it in your podfile: ``` pod 'GlobalPayments-iOS-SDK', '~> 1.0', ``` 2) Next, run the following command: ``` $ pod install ``` ## Manual If you prefer not to use a dependency manager, you can manually integrate our iOS Library into your project. 1) Download our latest iOS SDK release from [GitHub](https://github.com/globalpayments/ios-sdk/releases). 2) Drag and drop the folder “GlobalPayments-iOS-SDK” into Xcode. ## Github You can find a test suite of code samples for using the iOS SDK in our [GitHub repository](https://github.com/globalpayments/ios-sdk). ## Documentation and samples You can find the latest SDK documentation under [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview). For a full list of test cards, see our [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) article. Code examples can be found in the [API Explorer](https://developer.globalpayments.com/api/overview.md). #### Sample code - Processing a payment ```swift /// Prepare required configuration let config = GpApiConfig ( appId: "Your application ID", appKey: "Your application key" ) /// Add config to container try ServicesContainer.configureService(config: config) /// Prepare card let card = CreditCardData() card.number = "4111111111111111" card.expMonth = 12 card.expYear = 2025 card.cvn = "123" card.cardHolderName = "Joe Smith" // Execute operation card.charge(amount: 19.99) .withCurrency("USD") .execute { transaction, error in // Handle transaction response or error } ``` #### Sample code - Error handling ```swift card.charge(amount: 19.99) .withCurrency("USD") .withAddress(address) .execute { transaction, error in if let error = error as? BuilderException { // handle builder errors } else if let error = error as? ConfigurationException { // handle errors related to your services configuration } else if let error = error as? GatewayException { // handle gateway errors/exceptions } else if let error = error as? UnsupportedTransactionException { // handle errors when the configured gateway doesn't support desired transaction } else if let error = error as? ApiException { // handle all other errors } } ``` ## Testing exceptions During integration, you’ll want to test for specific issuer responses such as "Card Declined." In our Sandbox, you can simulate the response of gateways and Issuers by using specific transaction amounts or card numbers. For a full list of test cards, see our [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) article. If you don’t find what you need to simulate a certain result, contact your account manager. ## Test cards | Card Number | Card Type | Expiration Date | Security Code | | --- | --- | --- | --- | | 4263970000005262 | Visa | 12/2025 | 123 | | 2223000010005780 | MasterCard | 12/2025 | 900 | | 5425230000004415 | MasterCard | 12/2025 | 123 | | 6011000000000087 | Discover | 12/2025 | 123 | | 374101000000608 | Amex | 12/2025 | 1234 | | 3566000000000000 | JCB | 12/2025 | 123 | | 36256000000725 | Diners Club | 12/2025 | 123 | # Configuration Code for SDKs Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md Section: Integration Options Description: Configure client and request settings before sending a request. The following configuration code samples are applicable to each feature we provide SDK code samples for. This includes Card Payments, Digital Wallets, Payment Methods, and so forth. ```java // configure client & request settings GpApiConfig config = new GpApiConfig(); config.setAppId("i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR"); config.setAppKey("QVefNGo6bkMcjveA"); config.setChannel(Channel.CardNotPresent.getValue()); config.setEnvironment(Environment.TEST); config.setChallengeNotificationUrl("https://www.example.com/challengeNotificationUrl"); config.setMethodNotificationUrl("https://www.example.com/methodNotificationUrl"); config.setMerchantContactUrl("https://www.example.com/about"); ``` ```php appId = 'i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR'; $config->appKey = 'QVefNGo6bkMcjveA'; $config->environment = Environment::TEST; $config->channel = Channel::CardNotPresent; $config->methodNotificationUrl = "https://www.example.com/methodNotificationUrl"; $config->challengeNotificationUrl = "https://www.example.com/challengeNotificationUrl"; $config->merchantContactUrl = "https://www.example.com/about"; ServicesContainer::configureService($config); ``` ```dotnet // configure client & request settings GpApiConfig config = new GpApiConfig(); config.AppId = "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR"; config.AppKey = "QVefNGo6bkMcjveA"; config.Channel = Channel.CardNotPresent; config.Environment = Environment.TEST; config.ChallengeNotificationUrl = "https://www.example.com/challengeNotificationUrl"; config.MethodNotificationUrl = "https://www.example.com/methodNotificationUrl"; config.MerchantContactUrl = "https://www.example.com/about"; ServicesContainer.ConfigureService(config); ``` ## **Multiple/named configurations** An optional configuration name parameter can be passed to the `ConfigureService` method of the `ServicesContainer` object to differentiate between configurations and allow multiple configurations for a single service to be held and referenced simultaneously within the `ServicesContainer` singleton. If no configuration name is provided, the default value of “default” will be used. If the configuration name is already referenced within the collection of the `ServicesContainer`, the existing configuration with that name will be replaced by the new one. ```java ServicesContainer.configureService(config, “default”); ``` ```php ServicesContainer::configureService($config, “default”); ``` ```dotnet ServicesContainer.ConfigureService(config, "default"); ``` The configuration names can then be passed to the `Execute` method of any builder to specify which configuration the transaction should use when processing the request. ```java Transaction response = card.charge(...) … .execute(“default”); ``` ```php $response = $card.charge(...) … ->execute(“default”); ``` ```dotnet Transaction response = card.Charge(...) … .Execute(“default”); ``` ## **Removing named configurations** Named configurations can be removed from the collection by passing a null configuration object with the configuration name you want to remove. ```java ServicesContainer.configureService(null, ‘default’); ``` ```php ServicesContainer::configureService(null, "default"); ``` ```dotnet GpApiConfig config = null; ServicesContainer.ConfigureService(config, "default"); ``` ## **Best practices** The `ServicesContainer` object is a singleton, which means object instantiation is restricted to a singular instance and all references to this object return the same instance throughout the life of the application. Given this design pattern, the SDK is best configured once at application startup. It is not necessary, nor recommended, to configure the SDK prior to every interaction. ## **Logging** ### **Enable logging flag** Some of the SDKs support the `EnableLogging` property. Setting this flag to *true* will cause the SDK to output the raw request and response messages to the IDE console. By example, this would be the debug window for .NET, or the system.io.out for Java. The `EnableLogging` flag is not available on all SDKs as the style of logging is not available on all IDEs. ```java config.enableLogging(true); ``` ```php //not applicable to PHP ``` ```dotnet config.EnableLogging = true; ``` ### **IRequestLogger interface** The SDK provides the IRequestLogger interface, an implementation of which is accepted by the SDK configuration. This interface allows the SDK to work with an application's existing logging system to capture the raw request and response messages generated by the SDK. The interface defines two methods: * `RequestSent` – The raw request generated by the SDK will be passed to this method as a string. * `ResponseReceived` – The raw response received from the gateway will be passed to this method as a string. For PCI compliance, the raw requests and responses provided through the `EnableLogging` flag and the IRequestLogger interface contain only masked card numbers. ```java config.setRequestLogger(new RequestFileLogger("logs.txt")); ``` ```php $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ``` ```dotnet config.RequestLogger = new RequestConsoleLogger(); ``` # Card Payments SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/card-payments.md Section: Integration Options Description: SDK Card Payments ## **Configuration** For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. ## **Authorization** We highly recommend sanitizing the cardholder data before sending it in the request. For example, check if the card number is valid and the expiry date is in the future. Our JavaScript Library on [GitHub](https://github.com/globalpayments/globalpayments-js) contains a handy set of functions to help you do this. ```java // create the card object CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("131"); card.setCardHolderName("James Mason"); try { // process an auto-settle authorization Transaction response = card .charge(new BigDecimal("19.99")) .withCurrency("EUR") .execute(); String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED // get the details to save to the DB for future requests String orderId = response.getOrderId(); String authCode = response.getAuthorizationCode(); // 00 String paymentsReference = response.getTransactionId(); } catch (ApiException ex) { // TODO: add your error handling here } ``` ```php number = "4263970000005262"; $card->expMonth = 12; $card->expYear = 2025; $card->cvn = "131"; $card->cardHolderName = "James Mason"; try { // process an auto-capture authorization $response = $card->charge(19.99) ->withCurrency("EUR") ->execute(); } catch (ApiException $e) { // TODO: Add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED // get the details to save to the DB for future requests $authCode = $response->authorizationCode; // 12345 $paymentsReference = $response->transactionId; // TRN_VEeXGQkOxvNv6dvxYwAmnhkMy79vc7_87e11bc6b4dd } ``` ```dotnet // create the card object CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = 12; card.ExpYear = 2025; card.Cvn = "131"; card.CardHolderName = "John Doe"; try { // process an auto-settle authorization Transaction response = card.Charge(19.99m) .WithCurrency("EUR") .Execute(); string result = response.ResponseCode; //SUCCESS string message = response.ResponseMessage; //CAPTURED // get the details to save to the DB for future requests string orderId = response.OrderId; string authCode = response.AuthorizationCode; //00 string paymentsReference = response.TransactionId; } catch (ApiException ex) { // TODO: add your error handling here } ``` ## **Validate (Open To Buy)** ```java // create the card object CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("131"); card.setCardHolderName("James Mason"); try { // check that a card is valid and active without charging an amount Transaction response = card .verify() .withCurrency("EUR") .execute(); // get the details to save to the DB for future requests String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED } catch (ApiException ex) { // TODO: add your error handling here } ``` ```php number = "4263970000005262"; $card->expMonth = 12; $card->expYear = 2025; $card->cvn = "131"; $card->cardHolderName = "James Mason"; try { // check that a card is valid and active without charging an amount $response = $card->verify() ->withCurrency('EUR') ->execute(); } catch (ApiException $e) { // TODO: Add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // VERIFIED // TODO: save the card to Card Storage } ``` ```dotnet // create the card object CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = 12; card.ExpYear = 2025; card.Cvn = "131"; card.CardHolderName = "James Mason"; try { // check that a card is valid and active without charging an amount Transaction response = card.Verify() .WithCurrency("EUR") .Execute(); // get the response details to update the DB string result = response.ResponseCode; //SUCCESS string message = response.ResponseMessage; //VERIFIED // TODO: save the card to Card Storage } catch (ApiException ex) { // TODO: add your error handling here } ``` ## **Credit** > For security reasons this request type is not enabled by default. It must be requested by one of the listed contacts on your account with us. ```java // create the card object CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("131"); card.setCardHolderName("James Mason"); try { // process a refund to the card Transaction response = card .refund(129.99) .withCurrency("EUR") .execute(); // get the details to save to the DB for future requests String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED } catch (ApiException ex) { // TODO: add your error handling here } ``` ```php number = "4263970000005262"; $card->expMonth = 12; $card->expYear = 2025; $card->cardHolderName = "James Mason"; try { // process a refund to the card $response = $card->refund(19.99) ->withCurrency("EUR") ->execute(); } catch (ApiException $e) { // TODO: Add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED // get the details to save to the DB for future requests $authCode = $response->authorizationCode; // 12345 $paymentsReference = $response->transactionId; // TRN_USX1ogySquO6ZTsjrbI9k0lBrf4670_eec76119e6c5 } ``` ```dotnet // create the card object CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = 12; card.ExpYear = 2025; card.Cvn = "131"; card.CardHolderName = "James Mason"; try { // process a refund to the card Transaction response = card.Refund(129.99m) .WithCurrency("EUR") .Execute(); // get the response details to update the DB string result = response.ResponseCode; //SUCCESS string message = response.ResponseMessage; //CAPTURED } catch (ApiException ex) { // TODO: add your error handling here } ``` # Digital Wallets - SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/digital-wallets.md Section: Integration Options Description: Configure your digital wallets. ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. ## Apple Pay ```java // create the card object CreditCardData card = new CreditCardData(); card.setToken("{\"version\":\"EC_v1\",\"data\":\"dvMNzlcy6WNB\",\"header\":{\"ephemeralPublicKey\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeyyM++BjGrlaodphlJUvfTx4tQwn5Ci9IGpAI3RvbYqEshGX5cdkl0j7yNEu913OgT99r/MU1wqHnXn4p7qosA==\",\"publicKeyHash\":\"rEYX/7PdO7F7xL7rH0LZVak/iXTrkeU89Ck7E9dGFO4=\",\"transactionId\":\"38bb5ca49bc54c70e6ff5996bd087f1cce27f0f84fca2f6e71871fc7a56d877e\"}}"); card.setMobileType(MobilePaymentMethodType.APPLEPAY); Transaction response; try { // process an auto-capture authorization response = card .charge(10.00) .withModifier(TransactionModifier.EncryptedMobile) .withCurrency("EUR") .execute(); // get the details to save to the DB for future requests String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED String authCode = response.getAuthorizationCode(); // 12345 String paymentsReference = response.getTransactionId(); // TRN_vTijtcUtg2lPsUTvc0bQXH3U9vn2IK_a8ddd8f7c0fc } catch (ApiException ex) { // TODO: add your error handling here } ``` ```php // create the card object $card = new CreditCardData(); $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E",' .'transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; $card->mobileType = EncyptedMobileType::APPLE_PAY; try { // process an auto-capture authorization $response = $card->charge(10.00) ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) ->withCurrency('EUR') ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED // get the details to save to the DB for future requests $authCode = $response->authorizationCode; // 12345 $paymentsReference = $response->transactionId; // TRN_vTijtcUtg2lPsUTvc0bQXH3U9vn2IK_a8ddd8f7c0fc } ``` ```dotnet // create the card object CreditCardData card = new CreditCardData(); card.Token = "{\"version\":\"EC_v1\",\"data\":\"dvMNzlcy6WNB\",\"header\":{\"ephemeralPublicKey\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E\"," + "\"transactionId\":\"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3\",\"publicKeyHash\":\"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk\"}}"; card.MobileType = MobilePaymentMethodType.APPLEPAY; try { // process an auto-capture authorization Transaction response = card.Charge(10m) .WithModifier(TransactionModifier.EncryptedMobile) .WithCurrency("EUR") .Execute(); string result = response.ResponseCode; // SUCCESS string message = response.ResponseMessage; // CAPTURED // get the details to save to the DB for future requests string authCode = response.AuthorizationCode; // 12345 string paymentsReference = response.TransactionId; } catch (ApiException ex) { // TODO: add your error handling here } ``` ## Google Pay ```java // create the card object CreditCardData card = new CreditCardData(); card.setToken("{\n" + " \"signature\": \"MEQCIG5NDTGsgPrltVuuJQ0NYJnLUm1mo8JOW8vfLvt+ZtW6AiAZXJgnszos88b06ujEKubOMQNIuFdOgU+6ArRDGlZPoQ==\",\n" + " \"protocolVersion\": \"ECv1\",\n" + " \"signedMessage\": \"{\\\"encryptedMessage\\\":\\\"t+8CD+SWUl7VflMnwOqJedp7ZK71qnKX2tabp7px4C3d97ki1eb8vySoZoD8wbp7B2FDZPVGPDtUSUxz67JfwJ04sncw4KyDQiyShlxxdOakK/bnn+ooGHZ3jWA97hXVjtf1YecOCppzQIVk7F4RZZNgfIImQr4nDX5nm4BLN+TGsI4/m542xix45h+5e7y/xtyY/GFm8YwEfHQFCNY5edOr7h4nanDi/k//oQQG+ChOCKHtcmv4LpwtR2W737t5bTj+5mxXWu2sdAx6EnQGFOnmMKbNd1phcw4fdAHGtmxkW2LDUamXq5hnY99ECcl+Iqe75S6d3vQ3Lidk3k2lVVRtXTkxtCGvBOUy8okp4hndQL0665YOOIgEPengKfv3CIgUcKahKPyRVekaybDUalYpvyBvX2xIq+ilOo703z7pdL+FkILe7PC7RrEbnKLLJEv6\\\",\\\"ephemeralPublicKey\\\":\\\"BMLc+beu32XtPnrQ6D2z7IuICWl0gg9XmnKEync31BZ7NAvCa0BXTpLkyii+dDMPahj6xUoI0m7YES2UncrVkS8\\\\u003d\\\",\\\"tag\\\":\\\"QlvO9HQqmHXnlew8IzEWqr1AFSNL2wSc+HEb2IAd4YE\\\\u003d\\\"}\"\n" + "}"); card.setMobileType(MobilePaymentMethodType.GOOGLEPAY); try { // process an auto-capture authorization Transaction response = card .charge(new BigDecimal("10.00")) .withCurrency("EUR") .withModifier(TransactionModifier.EncryptedMobile) .execute(); // get the details to save to the DB for future requests String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED String authCode = response.getAuthorizationCode(); // 12345 String paymentsReference = response.getTransactionId(); //TRN_vTijtcUtg2lPsUTvc0bQXH3U9vn2IK_a8ddd8f7c0fc } catch (ApiException ex) { // TODO: add your error handling here } ``` ```php // create the card object $card = new CreditCardData(); $card->token = '{"signature":"MEUCIQDapDDJyf9lH3ztEWksgAjNe...AXjW+ZM+Ut2BWoTExppDDPc1a9Z7U\u003d",' .'"protocolVersion":"ECv1","signedMessage":"{\"encryptedMessage\":\"VkqwkFuMdXp...TZQxVMnkTeJjwyc4\\u003d\",' .'\"ephemeralPublicKey\":\"BMglUoKZWxgB...YCiBNkLaMTD9G4sec\\u003d\",\"tag\":\"4VYypqW2Q5FN7UP87QNDGsLgc48vAe5+AcjR+BxQ2Zo\\u003d\"}"}'; $card->mobileType = EncyptedMobileType::GOOGLE_PAY; try { // process an auto-settle authorization $response = $card->charge(10.00) ->withCurrency("EUR") ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED // get the details to save to the DB for future requests $authCode = $response->authorizationCode; $paymentsReference = $response->transactionId; // TRN_vTijtcUtg2lPsUTvc0bQXH3U9vn2IK_a8ddd8f7c0fc } ``` ```dotnet .NET // create the card object CreditCardData card = new CreditCardData(); card.Token = "{\"signature\":\"MEUCIQDapDDJyf9lH3ztEWksgAjNe...AXjW+ZM+Ut2BWoTExppDDPc1a9Z7U\\u003d\",\"protocolVersion\":\"ECv1\"," + "\"signedMessage\":\"{\"encryptedMessage\":\"VkqwkFuMdXp...TZQxVMnkTeJjwyc4\\u003d\",\"ephemeralPublicKey\":\"BMglUoKZWxgB...YCiBNkLaMTD9G4sec\\u003d\"," + "\"tag\":\"4VYypqW2Q5FN7UP87QNDGsLgc48vAe5+AcjR+BxQ2Zo\\u003d\"}\"}"; card.MobileType = MobilePaymentMethodType.GOOGLEPAY; try { // process an auto-capture authorization Transaction response = card.Charge(10m) .WithModifier(TransactionModifier.EncryptedMobile) .WithCurrency("EUR") .Execute(); string result = response.ResponseCode; // SUCCESS string message = response.ResponseMessage; // CAPTURED // get the details to save to the DB for future requests string authCode = response.AuthorizationCode; // 12345 string paymentsReference = response.TransactionId; } catch (ApiException ex) { // TODO: add your error handling here } ``` # Payment Methods SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/payment-methods.md Section: Integration Options Description: SDK Payment Methods ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. ## Initiate ```java AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod(AlternativePaymentType.SOFORTUBERWEISUNG); paymentMethod.setReturnUrl("https://www.example.com/returnUrl"); paymentMethod.setStatusUpdateUrl("https://www.example.com/statusUrl"); paymentMethod.setDescriptor("Test Transaction"); paymentMethod.setCountry("DE"); paymentMethod.setAccountHolderName("James Mason"); try { Transaction response = paymentMethod .charge(10.01) .withCurrency("EUR") .execute(); // response-.getAlternativePaymentResponse().getRedirectUrl() // => the redirectUrl for Step2; } catch (ApiException e) { // TODO: Add your error handling here } ``` ```php returnUrl = 'https://www.example.com/returnUrl'; $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; $paymentMethod->descriptor = 'Test Transaction'; $paymentMethod->country = 'DE'; $paymentMethod->accountHolderName = 'James Mason'; try { $response = $paymentMethod->charge(10.01) ->withCurrency("EUR") ->execute(); // $response->alternativePaymentResponse->redirectUrl => the redirectUrl for Step2; } catch (ApiException $e) { // TODO: Add your error handling here } ``` ```dotnet AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod(); paymentMethod.AlternativePaymentMethodType = AlternativePaymentType.SOFORT; paymentMethod.ReturnUrl = "https://www.example.com/returnUrl"; paymentMethod.StatusUpdateUrl = "https://www.example.com/statusUrl"; paymentMethod.Descriptor = "Test Transaction"; paymentMethod.Country = "DE"; paymentMethod.AccountHolderName = "James Mason"; try { Transaction response = paymentMethod .Charge(10.01m) .WithCurrency("EUR") .Execute(); //response.AlternativePaymentResponse.RedirectUrl; // => the redirectUrl for Step2; } catch (ApiException e) { // TODO: Add your error handling here } ``` ## Refund ```java String transactionId = "TRN_h5AfTNboHCEHcUuR2peRgAi5GKcWna_29b0db7c835f"; Transaction transaction = Transaction.fromId(transactionId, PaymentMethodType.APM); AlternativePaymentResponse apr = new AlternativePaymentResponse(); apr.setProviderName(AlternativePaymentType.SOFORTUBERWEISUNG.toString()); apr.setProviderReference("SMKGK7K2BLEUA"); transaction.setAlternativePaymentResponse(apr); try{ Transaction response = transaction.refund(new BigDecimal("10.01")) .withCurrency("EUR") .execute(); String responseCode = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED } catch(ApiException e) { // TODO: Add your error handling here } ``` ```php // the transaction id $transactionId = "TRN_h5AfTNboHCEHcUuR2peRgAi5GKcWna_29b0db7c835f"; // create the rebate transaction object $transaction = Transaction::fromId($transactionId, null, PaymentMethodType::APM); $transaction->alternativePaymentResponse = new AlternativePaymentResponse(); $transaction->alternativePaymentResponse->providerName = AlternativePaymentType::SOFORTUBERWEISUNG; $transaction->alternativePaymentResponse->providerReference = 'SMKGK7K2BLEUA'; try { $response = $transaction->refund(10.01) ->withCurrency("EUR") ->execute(); $responseCode = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED } catch (ApiException $e) { // TODO: Add your error handling here } ``` ```dotnet string transactionId = "TRN_h5AfTNboHCEHcUuR2peRgAi5GKcWna_29b0db7c835f"; Transaction transaction = Transaction.FromId(transactionId, PaymentMethodType.APM); transaction.AlternativePaymentResponse = new AlternativePaymentResponse { ProviderName = AlternativePaymentType.SOFORTUBERWEISUNG.ToString(), ProviderReference = "SMKGK7K2BLEUA" }; try { Transaction response = transaction.Refund(10.01m) .WithCurrency("EUR") .Execute(); String responseCode = response.ResponseCode; // SUCCESS String message = response.ResponseMessage; // CAPTURED } catch (ApiException e) { // TODO: Add your error handling here } ``` ## Test Pay ```java AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod(AlternativePaymentType.TESTPAY); paymentMethod.setReturnUrl("https://www.example.com/returnUrl"); paymentMethod.setStatusUpdateUrl("https://www.example.com/statusUrl"); paymentMethod.setDescriptor("Test Transaction"); paymentMethod.setCountry("DE"); paymentMethod.setAccountHolderName("James Mason"); try { Transaction response = paymentMethod .charge(10.01) .withCurrency("EUR") .execute(); // $response->alternativePaymentResponse->redirectUrl => the redirectUrl for Step2; } catch (ApiException $e) { // TODO: Add your error handling here } ``` ```php returnUrl = 'https://www.example.com/returnUrl'; $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; $paymentMethod->descriptor = 'Test Transaction'; $paymentMethod->country = 'DE'; $paymentMethod->accountHolderName = 'James Mason'; try { $response = $paymentMethod->charge(10.01) ->withCurrency("EUR") ->execute(); // $response->alternativePaymentResponse->redirectUrl => the redirectUrl for Step2; } catch (ApiException $e) { // TODO: Add your error handling here } ``` ```dotnet AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod(); paymentMethod.AlternativePaymentMethodType = AlternativePaymentType.TESTPAY; paymentMethod.ReturnUrl = "https://www.example.com/returnUrl"; paymentMethod.StatusUpdateUrl = "https://www.example.com/statusUrl"; paymentMethod.Descriptor = "Test Transaction"; paymentMethod.Country = "DE"; paymentMethod.AccountHolderName = "James Mason"; try { Transaction response = paymentMethod .Charge(10.01m) .WithCurrency("EUR") .Execute(); //response?.AlternativePaymentResponse.RedirectUrl => the redirectUrl for Step2; } catch (ApiException e) { // TODO: Add your error handling here } ``` # 3D Secure 2 SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/3DS2.md Section: Integration Options Description: Configuration for 3D Secure 2 SDK ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. ## Notification URLs #### Sample Method Notification Endpoint ```java /* * this sample code is intended as a simple example and should not be treated as Production-ready code * you'll need to add your own message parsing and security in line with your application or website */ @RequestMapping("/methodUrlResponse") public void consumeMethodUrlResponse(String threeDSMethodData) throws UnsupportedEncodingException { // sample ACS response for Method URL Response Notification // String threeDSMethodData = "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFmNjVjMzY5LTU5YjktNGY4ZC1iMmY2LTdkN2Q1ZjVjNjlkNSJ9"; try { byte[] decodedBytes = Base64.getDecoder().decode(threeDSMethodData); String methodUrlResponseString = new String(decodedBytes); Gson gson = new Gson(); // map to a custom class MethodUrlResponse MethodUrlResponse response = gson.fromJson(methodUrlResponseString, MethodUrlResponse.class); String threeDSServerTransID = response.getThreeDSServerTransID(); // // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 // TODO: notify client-side that the Method URL step is complete } catch(Exception e) { // TODO: add your exception handling here } } ``` ```php (methodUrlResponseString); string threeDSServerTransID = methodUrlResponse.ThreeDSServerTransID; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 // TODO: notify client-side that the Method URL step is complete } catch (Exception exce) { // TODO: add your exception handling here } ``` #### Sample Challenge Notification Endpoint ```java // Add cardholder data // Frictionless Example: 4263970000005262 // Challenge Example: 4012001038488884 CreditCardData card = new CreditCardData(); card.setNumber("4012001038488884"); ThreeDSecure threeDSecureData = null; try { threeDSecureData = Secure3dService.checkEnrollment(card).execute(); } catch (ApiException exce) { // TODO: add your error handling here } if (threeDSecureData != null) { Boolean enrolled = threeDSecureData.isEnrolled(); // true or false // If enrolled = true, the available response data String serverTransactionId = threeDSecureData.getServerTransactionId(); // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 String dsStartProtocolVersion = threeDSecureData.getDirectoryServerStartVersion(); // 2.1.0 String dsEndProtocolVersion = threeDSecureData.getDirectoryServerEndVersion(); // 2.1.0 String acsStartProtocolVersion = threeDSecureData.getAcsStartVersion(); // 2.1.0 String acsEndProtocolVersion = threeDSecureData.getAcsEndVersion(); // 2.1.0 String methodUrl = threeDSecureData.getIssuerAcsUrl(); // https://www.acsurl.com/method String encodedMethodData = threeDSecureData.getPayerAuthenticationRequest(); // Base64 encoded string // TODO: if supported pass the Method URL and Encoded Method Data to the client-side } ``` ```php number = "4012001038488884"; $card->expMonth = '12'; $card->expYear = date('Y', strtotime('+1 year')); $card->cardHolderName = "James Mason"; try { $threeDSecureData = Secure3dService::checkEnrollment($card) ->withAmount(10.01) ->withCurrency('USD') ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } $enrolled = $threeDSecureData->enrolled; // ENROLLED // if enrolled, the available response data $serverTransactionId = $threeDSecureData->serverTransactionId; // AUT_0f5bdbef-f833-4f8c-a1f1-87f05799fcd5 $dsStartProtocolVersion = $threeDSecureData->directoryServerStartVersion; // 2.1.0 $dsEndProtocolVersion = $threeDSecureData->directoryServerEndVersion; // 2.1.0 $acsStartProtocolVersion = $threeDSecureData->acsStartVersion; // 2.1.0 $acsEndProtocolVersion = $threeDSecureData->acsEndVersion; // 2.1.0 $methodUrl = $threeDSecureData->issuerAcsUrl; // https://test.portal.gpwebpay.com/pay-sim/sim/acs $encodedMethodData = $threeDSecureData->payerAuthenticationRequest; // Base64 encoded string // TODO: if supported pass the Method URL and Encoded Method Data to the client-side ``` ```dotnet /* * this sample code is intended as a simple example and should not be treated as Production-ready code * you'll need to add your own message parsing and security in line with your application or website */ var cres = Request.Form["cres"]; // Example CRes (Challenge Result) sent by the ACS // var cRes = "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFmNjVjMzY5LTU5YjktNGY4ZC1iMmY2LTdkN2Q1ZjVjNjlkNSIsImF" // + "jc1RyYW5zSUQiOiIxM2M3MDFhMy01YTg4LTRjNDUtODllOS1lZjY1ZTUwYThiZjkiLCJjaGFsbGVuZ2VDb21wbGV0a" // + "W9uSW5kIjoiWSIsIm1lc3NhZ2VUeXBlIjoiQ3JlcyIsIm1lc3NhZ2VWZXJzaW9uIjoiMi4xLjAiLCJ0cmFuc" // + "1N0YXR1cyI6IlkifQ=="; try { byte[] data = Convert.FromBase64String(cres); string challengeUrlResponseString = Encoding.UTF8.GetString(data); // map to a custom class ChallengeUrlResponse which has String variables for each response element ChallengeUrlResponse challengeUrlResponse = JsonConvert.DeserializeObject(challengeUrlResponseString); var threeDSServerTransID = challengeUrlResponse.ThreeDSServerTransID; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 var acsTransId = challengeUrlResponse.AcsTransID; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 var challengeCompletionInd = challengeUrlResponse.ChallengeCompletionInd; // Y var messageType = challengeUrlResponse.MessageType; // Cres var messageVersion = challengeUrlResponse.MessageVersion; // 2.1.0 var transStatus = challengeUrlResponse.TransStatus; // Y // TODO: notify client-side that the Challenge step is complete and pass any required data } catch (Exception exce) { // TODO: add your exception handling here } ``` ## Gather device data ```java // import javax.servlet.http.HttpServletRequest; String customerIp = request.getRemoteAddr(); // 123.123.123.123 String acceptHeader = request.getHeader("accept"); // text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 ``` ```php $customerIp = $_SERVER['REMOTE_ADDR']; // 123.123.123.123 $acceptHeader = $_SERVER['HTTP_ACCEPT']; // text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 ``` ```dotnet String customerIp = Request.ServerVariables["REMOTE_ADDR"]; String acceptHeader = Request.ServerVariables["HTTP_ACCEPT"]; ``` ## Check version ```java // Add cardholder data // Frictionless Example: 4263970000005262 // Challenge Example: 4012001038488884 CreditCardData card = new CreditCardData(); card.setNumber("4012001038488884"); ThreeDSecure threeDSecureData = null; try { threeDSecureData = Secure3dService.checkEnrollment(card).execute(); } catch (ApiException exce) { // TODO: add your error handling here } if (threeDSecureData != null) { Boolean enrolled = threeDSecureData.isEnrolled(); // true or false // If enrolled = true, the available response data String serverTransactionId = threeDSecureData.getServerTransactionId(); // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 String dsStartProtocolVersion = threeDSecureData.getDirectoryServerStartVersion(); // 2.1.0 String dsEndProtocolVersion = threeDSecureData.getDirectoryServerEndVersion(); // 2.1.0 String acsStartProtocolVersion = threeDSecureData.getAcsStartVersion(); // 2.1.0 String acsEndProtocolVersion = threeDSecureData.getAcsEndVersion(); // 2.1.0 String methodUrl = threeDSecureData.getIssuerAcsUrl(); // https://www.acsurl.com/method String encodedMethodData = threeDSecureData.getPayerAuthenticationRequest(); // Base64 encoded string // TODO: if supported pass the Method URL and Encoded Method Data to the client-side } ``` ```php number = "4012001038488884"; $card->expMonth = '12'; $card->expYear = date('Y', strtotime('+1 year')); $card->cardHolderName = "James Mason"; try { $threeDSecureData = Secure3dService::checkEnrollment($card) ->withAmount(10.01) ->withCurrency('USD') ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } $enrolled = $threeDSecureData->enrolled; // ENROLLED // if enrolled, the available response data $serverTransactionId = $threeDSecureData->serverTransactionId; // AUT_0f5bdbef-f833-4f8c-a1f1-87f05799fcd5 $dsStartProtocolVersion = $threeDSecureData->directoryServerStartVersion; // 2.1.0 $dsEndProtocolVersion = $threeDSecureData->directoryServerEndVersion; // 2.1.0 $acsStartProtocolVersion = $threeDSecureData->acsStartVersion; // 2.1.0 $acsEndProtocolVersion = $threeDSecureData->acsEndVersion; // 2.1.0 $methodUrl = $threeDSecureData->issuerAcsUrl; // https://test.portal.gpwebpay.com/pay-sim/sim/acs $encodedMethodData = $threeDSecureData->payerAuthenticationRequest; // Base64 encoded string // TODO: if supported pass the Method URL and Encoded Method Data to the client-side ``` ```dotnet // Add cardholder data // Frictionless Example: 4263970000005262 // Challenge Example: 4012001038488884 CreditCardData card = new CreditCardData { Number = "4012001038488884" }; ThreeDSecure threeDSecureData = null; try { threeDSecureData = Secure3dService.CheckEnrollment(card) .Execute(); } catch (ApiException exce) { // TODO: add your error handling here } if (threeDSecureData != null) { var enrolled = threeDSecureData.Enrolled; // True // if enrolled, the available response data var serverTransactionId = threeDSecureData.ServerTransactionId; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 var dsStartProtocolVersion = threeDSecureData.DirectoryServerStartVersion; // 2.1.0 var dsEndProtocolVersion = threeDSecureData.DirectoryServerEndVersion; // 2.1.0 var acsStartProtocolVersion = threeDSecureData.AcsStartVersion; // 2.1.0 var acsEndProtocolVersion = threeDSecureData.AcsEndVersion; // 2.1.0 var methodUrl = threeDSecureData.IssuerAcsUrl; // https://www.acsurl.com/method var encodedMethodData = threeDSecureData.PayerAuthenticationRequest; // Base64 encoded string // TODO: if supported pass the Method URL and Encoded Method Data to the client-side } ``` ## Initiate authentication \- exemptions > When a merchant requests an exemption, they will no longer be able to avail of a liability shift in the event of a chargeback. > > For Mastercard exemption requests, see our [Mastercard Message Extension](https://developer.globalpayments.com/ecommerce/3d-secure-version2/message-extension#mastercard) article. #### Mandatory and recommended fields ```java // Add the cardholder data CreditCardData card = new CreditCardData(); card.setNumber("4012001038488884"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("123"); card.setCardHolderName("James Mason"); // Add the customer's billing address Address billingAddress = new Address(); billingAddress.setStreetAddress1("Apartment 852"); billingAddress.setStreetAddress2("Complex 741"); billingAddress.setStreetAddress3("Unit 4"); billingAddress.setCity("Chicago"); billingAddress.setPostalCode("50001"); billingAddress.setState("IL"); billingAddress.setCountryCode("840"); // Add the customer's shipping address Address shippingAddress = new Address(); shippingAddress.setStreetAddress1("Flat 456"); shippingAddress.setStreetAddress2("House 789"); shippingAddress.setStreetAddress3("Basement Flat"); shippingAddress.setCity("Halifax"); shippingAddress.setPostalCode("W5 9HR"); shippingAddress.setCountryCode("826"); // Add captured browser data from the client-side and server-side BrowserData browserData = new BrowserData(); browserData.setAcceptHeader("text/html,application/xhtml+xml,application/xml;q=9,image/webp,img/apng,/;q=0.8"); browserData.setColorDepth(ColorDepth.TwentyFourBit); browserData.setIpAddress("123.123.123.123"); browserData.setJavaEnabled(true); browserData.setLanguage("en"); browserData.setScreenHeight(1080); browserData.setScreenWidth(1920); browserData.setChallengeWindowSize(ChallengeWindowSize.Windowed_600x400); browserData.setTimezone("0"); browserData.setUserAgent("Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"); ThreeDSecure threeDSecureData = new ThreeDSecure(); threeDSecureData.setServerTransactionId("9de5bccf-c438-4024-8961-ec4b3cff15ff"); try { // Initiate the 3D Secure 2 Authentication request threeDSecureData = Secure3dService.initiateAuthentication(card, threeDSecureData) .withAmount(new BigDecimal("10.01")) .withCurrency("USD") .withOrderCreateDate(DateTime.parse("2019-09-09T11:19:12")) .withCustomerEmail("james.mason@example.com") .withAddress(shippingAddress, AddressType.Billing) .withAddress(billingAddress, AddressType.Shipping) .withBrowserData(browserData) .withMethodUrlCompletion(MethodUrlCompletion.Yes) .withMobileNumber("44", "7123456789") .execute(); } catch (ApiException exce) { // TODO: add your error handling here } String status = threeDSecureData.getStatus(); // for example AUTHENTICATION_SUCCESSFUL or CHALLENGE_REQUIRED ``` ```php // Add the cardholder data $card = new CreditCardData(); $card->number = "4012001038488884"; $card->expMonth = "05"; $card->expYear = date('Y', strtotime('+1 year')); ; $card->cvn = "123"; $card->cardHolderName = "James Mason"; // Add the customer's billing address $billingAddress = new Address(); $billingAddress->streetAddress1 = "Apartment 852"; $billingAddress->streetAddress2 = "Complex 741"; $billingAddress->streetAddress3 = "Unit 4"; $billingAddress->city = "Chicago"; $billingAddress->state = "IL"; $billingAddress->postalCode = "50001"; $billingAddress->countryCode = "840"; // Add the customer's shipping address $shippingAddress = new Address(); $shippingAddress->streetAddress1 = "Flat 456"; $shippingAddress->streetAddress2 = "House 789"; $shippingAddress->streetAddress3 = "Basement Flat"; $shippingAddress->city = "Halifax"; $shippingAddress->postalCode = "W5 9HR"; $shippingAddress->countryCode = "826"; // Add captured browser data from the client-side and server-side $browserData = new BrowserData(); $browserData->acceptHeader = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"; $browserData->colorDepth = ColorDepth::TWENTY_FOUR_BITS; $browserData->ipAddress = "123.123.123.123"; $browserData->javaEnabled = TRUE; $browserData->language = "en"; $browserData->screenHeight = "1080"; $browserData->screenWidth = "1920"; $browserData->challengWindowSize = ChallengeWindowSize::FULL_SCREEN; $browserData->timeZone = "0"; $browserData->userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"; $threeDSecureData = new ThreeDSecure(); $threeDSecureData->serverTransactionId = "AUT_be0e608e-6366-4ee7-833f-71d48c842cb6 "; try { $threeDSecureData = Secure3dService::initiateAuthentication($card, $threeDSecureData) ->withAmount(10.01) ->withCurrency("USD") ->withOrderCreateDate(date("Y-m-d H:i:s")) ->withCustomerEmail("james.mason@example.com") ->withAddress($billingAddress, AddressType::BILLING) ->withAddress($shippingAddress, AddressType::SHIPPING) ->withBrowserData($browserData) ->withMethodUrlCompletion(MethodUrlCompletion::YES) ->withMobileNumber("44", "7123456789") ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } $status = $threeDSecureData->status; //CHALLENGE_REQUIRED ``` ```dotnet // create the card object var card = new CreditCardData { Number = "4012001038488884", CardType = "VISA", ExpMonth = 12, ExpYear = 2025, Cvn = "131", CardHolderName = "James Mason" }; // Add the customer's billing address Address billingAddress = new Address { StreetAddress1 = "Apartment 852", StreetAddress2 = "Complex 741", StreetAddress3 = "Unit 4", City = "Chicago", PostalCode = "50001", State = "IL", CountryCode = "840" }; // Add the customer's shipping address Address shippingAddress = new Address { StreetAddress1 = "Flat 456", StreetAddress2 = "House 789", StreetAddress3 = "Basement Flat", City = "Halifax", PostalCode = "W5 9HR", CountryCode = "826" }; // Add captured browser data from the client-side and server-side BrowserData browserData = new BrowserData { AcceptHeader = "text/html,application/xhtml+xml,application/xml;q=9,image/webp,img/apng,/;q=0.8", ColorDepth = ColorDepth.TWENTY_FOUR_BITS, IpAddress = "123.123.123.123", JavaEnabled = true, Language = "en", ScreenHeight = 1080, ScreenWidth = 1920, ChallengeWindowSize = ChallengeWindowSize.FULL_SCREEN, Timezone = "0", UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" }; ThreeDSecure threeDSecureData = new ThreeDSecure { ServerTransactionId = "9de5bccf-c438-4024-8961-ec4b3cff15ff" }; try { threeDSecureData = Secure3dService.InitiateAuthentication(card, threeDSecureData) .WithAmount(10.01m) .WithCurrency("USD") .WithOrderCreateDate(DateTime.Parse("2019-09-09T11:19:12")) .WithCustomerEmail("james.mason@example.com") .WithAddress(billingAddress, AddressType.Billing) .WithAddress(shippingAddress, AddressType.Shipping) .WithBrowserData(browserData) .WithMethodUrlCompletion(MethodUrlCompletion.YES) .WithMobileNumber("44", "7123456789") .Execute(); } catch (ApiException exce) { // TODO: add your error handling here } var status = threeDSecureData.Status; // for example AUTHENTICATION_SUCCESSFUL or CHALLENGE_REQUIRED ``` ## Optional fields ```java // Initiate the 3D Secure 2 Authentication request threeDSecureData = Secure3dService.initiateAuthentication(card, threeDSecureData) .withAmount(new BigDecimal("10.01")) .withCurrency("USD") .withOrderCreateDate(DateTime.parse("2019-09-09T11:19:12")) .withCustomerEmail("james.mason@example.com") .withAddress(shippingAddress, AddressType.Billing) .withAddress(billingAddress, AddressType.Shipping) .withBrowserData(browserData) .withMethodUrlCompletion(MethodUrlCompletion.Yes) .withMobileNumber("44", "7123456789") // Begin Optional Fields .withHomeNumber("44", "123456789") .withWorkNumber("44", "1801555888") .withMerchantInitiatedRequestType(AuthenticationRequestType.RecurringTransaction) // Gift Card Information .withGiftCardCount(1) .withGiftCardCurrency("USD") .withGiftCardAmount(new BigDecimal("5.00")) // Additional Order Information .withDeliveryEmail("james.mason@example.com") .withDeliveryTimeFrame(DeliveryTimeFrame.ElectronicDelivery) .withShippingMethod(ShippingMethod.VerifiedAddress) .withShippingNameMatchesCardHolderName(true) .withPreOrderIndicator(PreOrderIndicator.MerchandiseAvailable) .withPreOrderAvailabilityDate(DateTime.parse("2019-09-25")) .withReorderIndicator(ReorderIndicator.FirstTimeOrder) .withOrderTransactionType(OrderTransactionType.GoodsAndServicesPurchase) // Additional Payer Information .withCustomerAccountId("6dcb24f5-74a0-4da3-98da-4f0aa0e88db3") .withAccountAgeIndicator(AgeIndicator.LessThanThirtyDays) .withAccountCreateDate(DateTime.parse("2019-09-01")) .withAccountChangeIndicator(AgeIndicator.ThisTransaction) .withAccountChangeDate(DateTime.parse("2019-09-09")) .withPasswordChangeIndicator(AgeIndicator.LessThanThirtyDays) .withPasswordChangeDate(DateTime.parse("2019-09-05")) .withPaymentAccountAgeIndicator(AgeIndicator.LessThanThirtyDays) .withPaymentAccountCreateDate(DateTime.parse("2019-09-25")) .withPreviousSuspiciousActivity(false) .withNumberOfPurchasesInLastSixMonths(3) .withNumberOfTransactionsInLast24Hours(1) .withNumberOfTransactionsInLastYear(5) .withNumberOfAddCardAttemptsInLast24Hours(1) .withShippingAddressUsageIndicator(AgeIndicator.ThisTransaction) .withShippingAddressCreateDate(DateTime.parse("2019-09-09")) // Prior 3D Secure 2 Authentication Data .withPriorAuthenticationMethod(PriorAuthenticationMethod.FrictionlessAuthentication) .withPriorAuthenticationTransactionId("26c3f619-39a4-4040-bf1f-6fd433e6d615") .withPriorAuthenticationTimestamp(DateTime.parse("2019-09-01T12:25:14")) .withPriorAuthenticationData("cKTYtrvvKU7gUoiqbbO7Po") // Recurring Authorization Data .withMaxNumberOfInstallments(5) .withRecurringAuthorizationFrequency(25) .withRecurringAuthorizationExpiryDate(DateTime.parse("2020-05-25")) // Payer Login Data .withCustomerAuthenticationMethod(CustomerAuthenticationMethod.MerchantSystem) .withCustomerAuthenticationTimestamp(DateTime.parse("2019-09-09T11:14:55")) // The following field is currently not in use // .withCustomerAuthenticationData(String) .execute(); ``` ```php withAmount(10.01) ->withCurrency("USD") ->withOrderCreateDate(date("Y-m-d H:i:s")) ->withAddress($billingAddress, AddressType::BILLING) ->withAddress($shippingAddress, AddressType::SHIPPING) ->withBrowserData($browserData) ->withMethodUrlCompletion(MethodUrlCompletion::YES) // Begin Optional Fields ->withHomeNumber("44", "123456789") ->withWorkNumber("44", "1801555888") // Gift Card Information ->withGiftCardCount(1) ->withGiftCardCurrency("USD") ->withGiftCardAmount(5.00) // Additional Order Information ->withDeliveryEmail("james.mason@example.com") ->withDeliveryTimeFrame(DeliveryTimeFrame::ELECTRONIC_DELIVERY) ->withShippingMethod(ShippingMethod::VERIFIED_ADDRESS) ->withShippingNameMatchesCardHolderName(TRUE) ->withPreOrderIndicator(PreOrderIndicator::MERCHANDISE_AVAILABLE) ->withPreOrderAvailabilityDate(date("Y-m-d H:i:s")) ->withReorderIndicator(ReorderIndicator::FIRST_TIME_ORDER) ->withOrderTransactionType(OrderTransactionType::GOODS_SERVICE_PURCHASE) // Additional Payer Information ->withCustomerAccountId("6dcb24f5-74a0-4da3-98da-4f0aa0e88db3") ->withAccountAgeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) ->withAccountCreateDate(date("Y-m-d H:i:s")) ->withAccountChangeDate(date("Y-m-d H:i:s")) ->withAccountChangeIndicator(AgeIndicator::THIS_TRANSACTION) ->withPasswordChangeDate(date("Y-m-d H:i:s")) ->withPasswordChangeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) ->withPaymentAccountCreateDate(date("Y-m-d H:i:s")) ->withPaymentAccountAgeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) ->withPreviousSuspiciousActivity(false) ->withNumberOfPurchasesInLastSixMonths(3) ->withNumberOfTransactionsInLast24Hours(1) ->withNumberOfTransactionsInLastYear(5) ->withNumberOfAddCardAttemptsInLast24Hours(1) ->withShippingAddressCreateDate(date("Y-m-d H:i:s")) ->withShippingAddressUsageIndicator(AgeIndicator::THIS_TRANSACTION) // Prior 3D Secure 2 Authentication Data ->withPriorAuthenticationMethod(PriorAuthenticationMethod::FRICTIONLESS_AUTHENTICATION) ->withPriorAuthenticationTransactionId("26c3f619-39a4-4040-bf1f-6fd433e6d615") ->withPriorAuthenticationTimestamp(date("Y-m-d H:i:s")) ->withPriorAuthenticationData("cKTYtrvvKU7gUoiqbbO7Po") // Recurring Authorization Data ->withMaxNumberOfInstallments(5) ->withRecurringAuthorizationFrequency(25) ->withRecurringAuthorizationExpiryDate(date("Y-m-d H:i:s")) // Payer Login Data ->withCustomerAuthenticationMethod(CustomerAuthenticationMethod::MERCHANT_SYSTEM) ->withCustomerAuthenticationTimestamp(date("Y-m-d H:i:s")) // The following field is currently not in use ->execute(); ``` ```dotnet threeDSecureData = Secure3dService.InitiateAuthentication(card, threeDSecureData) .WithAmount(10.01m) .WithCurrency("USD") .WithOrderCreateDate(DateTime.Parse("2019-09-09T11:19:12")) .WithCustomerEmail("james.mason@example.com") .WithAddress(billingAddress, AddressType.Billing) .WithAddress(shippingAddress, AddressType.Shipping) .WithBrowserData(browserData) .WithMethodUrlCompletion(MethodUrlCompletion.YES) .WithMobileNumber("44", "7123456789") // Begin Optional Fields .WithHomeNumber("44", "123456789") .WithWorkNumber("44", "1801555888") .WithMerchantInitiatedRequestType(MerchantInitiatedRequestType.RECURRING_TRANSACTION) // Gift Card Information .WithGiftCardCount(1) .WithGiftCardCurrency("USD") .WithGiftCardAmount(5.00m) // Additional Order Information .WithDeliveryEmail("james.mason@example.com") .WithDeliveryTimeFrame(DeliveryTimeFrame.ELECTRONIC_DELIVERY) .WithShippingMethod(ShippingMethod.ANOTHER_VERIFIED_ADDRESS) .WithShippingNameMatchesCardHolderName(true) .WithPreOrderIndicator(PreOrderIndicator.MERCHANDISE_AVAILABLE) .WithPreOrderAvailabilityDate(DateTime.Parse("2019-09-25")) .WithReorderIndicator(ReorderIndicator.FIRST_TIME_ORDER) .WithOrderTransactionType(OrderTransactionType.GOODS_SERVICE_PURCHASE) // Additional Payer Information .WithCustomerAccountId("6dcb24f5-74a0-4da3-98da-4f0aa0e88db3") .WithAccountAgeIndicator(AgeIndicator.LESS_THAN_THIRTY_DAYS) .WithAccountCreateDate(DateTime.Parse("2019-09-01")) .WithAccountChangeIndicator(AgeIndicator.THIS_TRANSACTION) .WithAccountChangeDate(DateTime.Parse("2019-09-09")) .WithPasswordChangeIndicator(AgeIndicator.LESS_THAN_THIRTY_DAYS) .WithPasswordChangeDate(DateTime.Parse("2019-09-05")) .WithPaymentAccountAgeIndicator(AgeIndicator.LESS_THAN_THIRTY_DAYS) .WithPaymentAccountCreateDate(DateTime.Parse("2019-09-01")) .WithPreviousSuspiciousActivity(false) .WithNumberOfPurchasesInLastSixMonths(3) .WithNumberOfTransactionsInLast24Hours(1) .WithNumberOfTransactionsInLastYear(5) .WithNumberOfAddCardAttemptsInLast24Hours(1) .WithShippingAddressUsageIndicator(AgeIndicator.THIS_TRANSACTION) .WithShippingAddressCreateDate(DateTime.Parse("2019-09-09")) // Prior 3D Secure 2 Authentication Data .WithPriorAuthenticationMethod(PriorAuthenticationMethod.FRICTIONLESS_AUTHENTICATION) .WithPriorAuthenticationTransactionId("26c3f619-39a4-4040-bf1f-6fd433e6d615") .WithPriorAuthenticationTimestamp(DateTime.Parse("2019-09-01T12:25:14")) .WithPriorAuthenticationData("cKTYtrvvKU7gUoiqbbO7Po") // Recurring Authorization Data .WithMaxNumberOfInstallments(5) .WithRecurringAuthorizationFrequency(25) .WithRecurringAuthorizationExpiryDate(DateTime.Parse("2020-05-25")) // Payer Login Data .WithCustomerAuthenticationMethod(CustomerAuthenticationMethod.MERCHANT_SYSTEM_AUTHENTICATION) .WithCustomerAuthenticationTimestamp(DateTime.Parse("2019-09-09T11:14:55")) // The following field is currently not in use // .WithCustomerAuthenticationData(String) .Execute(); ``` ## Authentication \- Frictionless flow #### Successful authentication response ```java String status = threeDSecureData.getStatus(); // AUTHENTICATION_SUCCESSFUL // Data required for authorization or database record String authenticationValue = threeDSecureData.getAuthenticationValue(); // ODQzNjgwNjU0ZjM3N2JmYTg0NTM= String dsTransId = threeDSecureData.getDirectoryServerTransactionId(); // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 String messageVersion = threeDSecureData.getMessageVersion(); // 2.1.0 String eci = threeDSecureData.getEci(); // 5 // Additional response data String acsTransId = threeDSecureData.getAcsTransactionId(); // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 String statusReason = threeDSecureData.getStatusReason(); // LOW_CONFIDENCE String authenticationSource = threeDSecureData.getAuthenticationSource(); // BROWSER String messageCategory = threeDSecureData.getMessageCategory(); // PAYMENT_AUTHENTICATION ``` ```php status; // SUCCESS_AUTHENTICATED // Data required for authorization or database record $authenticationValue = $threeDSecureData->authenticationValue; // AJkBASQHUAAAAAPphAIGdAAAAAA= $dsTransId = $threeDSecureData->directoryServerTransactionId; // 18230336-94cd-470b-974f-bd9b0949008f $messageVersion = $threeDSecureData->messageVersion; // 2.1.0 $eci = $threeDSecureData->eci; // 05 // Additional response data $acsTransID = $threeDSecureData->acsTransactionId; // f9133b50-0c44-41ed-8c37-18edc346233e $statusReason - $threeDSecureData->statusReason; // LOW_CONFIDENCE $authenticationSource = $threeDSecureData->authenticationSource; // BROWSER $messageCategory = $threeDSecureData->messageCategory; // PAYMENT_AUTHENTICATION ``` ```dotnet var status = threeDSecureData.Status; // AUTHENTICATION_SUCCESSFUL // Data required for authorization or database record var authenticationValue = threeDSecureData.AuthenticationValue; // ODQzNjgwNjU0ZjM3N2JmYTg0NTM= var dsTransId = threeDSecureData.DirectoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 var messageVersion = threeDSecureData.MessageVersion; // 2.1.0 var eci = threeDSecureData.Eci; // 5 // Additional response data var acsTransId = threeDSecureData.AcsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 var statusReason = threeDSecureData.StatusReason; // LOW_CONFIDENCE var authenticationSource = threeDSecureData.AuthenticationSource; // BROWSER var messageCategory = threeDSecureData.MessageCategory; // PAYMENT_AUTHENTICATION ``` #### Failed authentication response ```java String status = threeDSecureData.getStatus(); // AUTHENTICATION_FAILED String authenticationValue = threeDSecureData.getAuthenticationValue(); // ODQzNjgwNjU0ZjM3N2JmYTg0NTM= String dsTransId = threeDSecureData.getDirectoryServerTransactionId(); // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 String messageVersion = threeDSecureData.getMessageVersion(); // 2.1.0 String eci = threeDSecureData.getEci(); // 7 String acsTransId = threeDSecureData.getAcsTransactionId(); // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 String statusReason = threeDSecureData.getStatusReason(); // CARD_AUTHENTICATION_FAILED String authenticationSource = threeDSecureData.getAuthenticationSource(); // BROWSER String messageCategory = threeDSecureData.getMessageCategory(); // PAYMENT_AUTHENTICATION ``` ```php status; // NOT_AUTHENTICATED $dsTransId = $threeDSecureData->directoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 $messageVersion = $threeDSecureData->messageVersion; // 2.1.0 $eci = $threeDSecureData->eci; // 07 $acsTransID = $threeDSecureData->acsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 $statusReason - $threeDSecureData->statusReason; // CARD_AUTHENTICATION_FAILED $authenticationSource = $threeDSecureData->authenticationSource; // BROWSER $messageCategory = $threeDSecureData->messageCategory; // PAYMENT_AUTHENTICATION ``` ```dotnet var status = threeDSecureData.Status; // AUTHENTICATION_FAILED var authenticationValue = threeDSecureData.AuthenticationValue; // ODQzNjgwNjU0ZjM3N2JmYTg0NTM= var dsTransId = threeDSecureData.DirectoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 var messageVersion = threeDSecureData.MessageVersion; // 2.1.0 var eci = threeDSecureData.Eci; // 7 var acsTransId = threeDSecureData.AcsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 var statusReason = threeDSecureData.StatusReason; // CARD_AUTHENTICATION_FAILED var authenticationSource = threeDSecureData.AuthenticationSource; // BROWSER var messageCategory = threeDSecureData.MessageCategory; // PAYMENT_AUTHENTICATION ``` ## Authentication \- Challenge flow #### Challenge response ```java // Data required to display the challenge to the customer String challengeRequestUrl = threeDSecureData.getIssuerAcsUrl(); // https://test.portal.gpwebpay.com/pay-sim-gpi/sim/acs String encodedCreq = threeDSecureData.getPayerAuthenticationRequest(); // Very long base64 encoded string // Additional response data String authenticationType = threeDSecureData.getAuthenticationType(); // DYNAMIC_CHALLENGE Boolean challengeMandated = threeDSecureData.isChallengeMandated(); // true String statusReason = threeDSecureData.getStatusReason(); // LOW_CONFIDENCE String authenticationSource = threeDSecureData.getAuthenticationSource(); // BROWSER String messageCategory = threeDSecureData.getMessageCategory(); // PAYMENT_AUTHENTICATION String dsTransId = threeDSecureData.getDirectoryServerTransactionId(); // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 String acsTransId = threeDSecureData.getAcsTransactionId(); // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 String messageVersion = threeDSecureData.getMessageVersion(); // 2.1.0 ``` ```php issuerAcsUrl; // https://acs2p.test.gpe.cz/tds/challenge/brw/07dfe0b0-0c46-41ed-8c37-18edc3462342 $encodedCreq = $threeDSecureData->payerAuthenticationRequest; // Very long base64 encoded string // Additional response data $challengeMandated = $threeDSecureData->challengeMandated; // true $authenticationSource = $threeDSecureData->authenticationSource; // BROWSER $messageCategory = $threeDSecureData->messageCategory; // PAYMENT_AUTHENTICATION $dsTransId = $threeDSecureData->directoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 $acsTransID = $threeDSecureData->acsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 $messageVersion = $threeDSecureData->messageVersion; // 2.1.0 ``` ```dotnet // Data required to display the challenge to the customer var challengeRequestUrl = threeDSecureData.IssuerAcsUrl; // https://test.portal.gpwebpay.com/pay-sim-gpi/sim/acs var encodedCreq = threeDSecureData.PayerAuthenticationRequest; // Very long base64 encoded string // Additional response data var authenticationType = threeDSecureData.AuthenticationType; // DYNAMIC_CHALLENGE var challengeMandated = threeDSecureData.ChallengeMandated; // true var statusReason = threeDSecureData.StatusReason; // LOW_CONFIDENCE var authenticationSource = threeDSecureData.AuthenticationSource; // BROWSER var messageCategory = threeDSecureData.MessageCategory; // PAYMENT_AUTHENTICATION var dsTransId = threeDSecureData.DirectoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 var acsTransId = threeDSecureData.AcsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 var messageVersion = threeDSecureData.MessageVersion; // 2.1.0 ``` ## Obtain authentication data ```java ThreeDSecure threeDSecureData = null; try { threeDSecureData = Secure3dService.getAuthenticationData() .withServerTransactionId("6c8c286b-9842-4c74-b298-da640da6ebbd") .execute(); } catch (ApiException exce) { // TODO: add your error handling here } if (threeDSecureData != null) { String status = threeDSecureData.getStatus(); // for example AUTHENTICATION_SUCCESSFUL or AUTHENTICATION_FAILED // Data required for authorization or database record String authenticationValue = threeDSecureData.getAuthenticationValue(); // ODQzNjgwNjU0ZjM3N2JmYTg0NTM= String dsTransId = threeDSecureData.getDirectoryServerTransactionId(); // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 String messageVersion = threeDSecureData.getMessageVersion(); // 2.1.0 String eci = threeDSecureData.getEci(); // 5 // Additional response data String acsTransId = threeDSecureData.getAcsTransactionId(); // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 String statusReason = threeDSecureData.getStatusReason(); // LOW_CONFIDENCE String authenticationSource = threeDSecureData.getAuthenticationSource(); // BROWSER String messageCategory = threeDSecureData.getMessageCategory(); // PAYMENT_AUTHENTICATION } ``` ```php withServerTransactionId("AUT_0f5bdbef-f833-4f8c-a1f1-87f05799fcd5") ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } if (isset($threeDSecureData)) { $status = $threeDSecureData->status; // for example SUCCESS_AUTHENTICATED or NOT_AUTHENTICATED // Data required for authorization or database record $authenticationValue = $threeDSecureData->authenticationValue; // AJkBAkcHVQAAAAPphAIGdAAAAAA= or empty if not authenticated $dsTransId = $threeDSecureData->directoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 $messageVersion = $threeDSecureData->messageVersion; // 2.1.0 $eci = $threeDSecureData->eci; // 05 or 07 // Additional response data $acsTransID = $threeDSecureData->acsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 $statusReason - $threeDSecureData->statusReason; //for example LOW_CONFIDENCE or TRANSACTION_TIMED_OUT_AT_THE_ACS $authenticationSource = $threeDSecureData->authenticationSource; // BROWSER $messageCategory = $threeDSecureData->messageCategory; // PAYMENT_AUTHENTICATION } ``` ```dotnet ThreeDSecure threeDSecureData = null; try { threeDSecureData = Secure3dService.GetAuthenticationData() .WithServerTransactionId("6c8c286b-9842-4c74-b298-da640da6ebbd") .Execute(); } catch (ApiException exce) { // TODO: add your error and decline handling here } if (threeDSecureData != null) { var status = threeDSecureData.Status; // for example AUTHENTICATION_SUCCESSFUL or AUTHENTICATION_FAILED // Data required for authorization or database record var authenticationValue = threeDSecureData.AuthenticationValue; // ODQzNjgwNjU0ZjM3N2JmYTg0NTM= var dsTransId = threeDSecureData.DirectoryServerTransactionId; // c272b04f-6e7b-43a2-bb78-90f4fb94aa25 var messageVersion = threeDSecureData.MessageVersion; // 2.1.0 var eci = threeDSecureData.Eci; // 5 // Additional response data var acsTransId = threeDSecureData.AcsTransactionId; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 var statusReason = threeDSecureData.StatusReason; // LOW_CONFIDENCE var authenticationSource = threeDSecureData.AuthenticationSource; // BROWSER var messageCategory = threeDSecureData.MessageCategory; // PAYMENT_AUTHENTICATION } ``` ## Authorization ```java // if you're using our JavaScript Library and SDK solution for 3D Secure 2 // you can skip below to Transaction response = null; // Create the card object CreditCardData card = new CreditCardData(); card.setNumber("4012001038488884"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("123"); card.setCardHolderName("James Mason"); // Add obtained 3D Secure 2 authentication data ThreeDSecure threeDSecureData = new ThreeDSecure(); threeDSecureData.setAuthenticationValue("ODQzNjgwNjU0ZjM3N2JmYTg0NTM="); threeDSecureData.setDirectoryServerTransactionId("c272b04f-6e7b-43a2-bb78-90f4fb94aa25"); threeDSecureData.setEci("05"); threeDSecureData.setMessageVersion("2.1.0"); // Add the 3D Secure 2 data to the card object card.setThreeDSecure(threeDSecureData); Transaction response = null; try { response = card.charge(new BigDecimal("10.01")) .withCurrency("USD") .execute(); } catch (ApiException exec) { // TODO: add your error handling here } if (response != null) { String result = response.getResponseCode(); // 00 == Success String message = response.getResponseMessage(); // [ test system ] AUTHORISED // get the details to save to the DB for future requests String orderId = response.getOrderId(); // ezJDQjhENTZBLTdCNzNDQw String authCode = response.getAuthorizationCode(); // 12345 String paymentsReference = response.getTransactionId(); // pasref String schemeReferenceData = response.getSchemeId(); // MMC0F00YE4000000715 } ``` ```php number = "4263970000005262"; $card->expMonth = 12; $card->expYear = 2025; $card->cvn = "131"; $card->cardHolderName = "James Mason"; // add obtained 3D Secure 2 authentication id $threeDSecureData = new ThreeDSecure(); $threeDSecureData->serverTransactionId = "AUT_e0ad2c9a-5dcd-4d8a-a73d-e1ebb29449be"; // add the 3D Secure 2 data to the card object $card->threeDSecure = $threeDSecureData; try { // process an auto-settle authorization $response = $card->charge(10.01) ->withCurrency("EUR") ->execute(); } catch (ApiException $e) { // TODO: Add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED // get the details to save to the DB for future requests $authCode = $response->authorizationCode; // 12345 $paymentsReference = $response->transactionId; // TRN_gxpusd8g3A4oRAT6jFP7cf0okRdo1P_b33476c861df } ``` ```dotnet // if you're using our JavaScript Library and SDK solution for 3D Secure 2 // you can skip below to Transaction response = null; // add obtained 3D Secure 2 authentication data var threeDSecureData = new ThreeDSecure() { AuthenticationValue = "ODQzNjgwNjU0ZjM3N2JmYTg0NTM=", DirectoryServerTransactionId = "c272b04f-6e7b-43a2-bb78-90f4fb94aa25", Eci = “5”, MessageVersion = "2.1.0" }; // add the 3D Secure 2 data to the card object card.ThreeDSecure = threeDSecureData; Transaction response = null; try { response = card.Charge(10.01m) .WithCurrency("USD") .Execute(); } catch (ApiException exce) { // TODO: add your error handling here } if (response != null) { var result = response.ResponseCode; // SUCCESS var message = response.ResponseMessage; // AUTHORIZED // get the response details to save to the DB for future requests var orderId = response.OrderId; // ezJDQjhENTZBLTdCNzNDQw var authCode = response.AuthorizationCode; // 12345 var paymentsReference = response.TransactionId; // pasref var schemeReferenceData = response.SchemeId; // MMC0F00YE4000000715 } ``` ## 3D Secure helper library (client side) ### Check Version method | Field | Format | Type | Description | | ----- | ----- | ----- | ----- | | Version Check Endpoint | String | M | Your server-side endpoint responsible for handling the Check Version request and response. | | accountId | String | O | Your Account ID assigned by us. | | card | Object | M | Object containing the card information. | | cardHolderName | String | O | The full name of the cardholder. | | customerReference | String | O | Merchant-defined field to reference the customer. | | cvn | String | O | The numeric value printed on the physical card. | | expMonth | String | O | The expiry date month of the card. | | expYear | String | O | The expiry date year of the card. | | number | String | O | The card account number used to authorize the transaction. Also known as PAN. | | reference | String | O | Merchant-defined field to reference the transaction. | | merchantId | String | O | Your Merchant ID assigned by us. | | methodNotificationUrl | String | O | The URL that will receive the Method Completion message. | | methodWindow | ChallengeWindowOptions | O | Object containing the options on how to present the Challenge Window to the cardholder. | | Merchant Data | String | O | Any data you want to pass from the 3DS JavaScript to your server-side code. | ### Initiate Authentication method | Field | Format | Type | Description | | ----- | ----- | ----- | ----- | | Authentication Endpoint | String | M | Your server-side endpoint responsible for handling the Initiate Authentication request and response. | | accountId | String | O | Your Account ID assigned by us. | | authenticationRequestType | Enum | O | Indicates the type of channel used to initiate the transaction. Allowed values: **AddCard CardholderVerification MaintainCard InstalmentTransaction PaymentTransaction RecurringTransaction** | | authenticationSource | Enum | O | Indicates the type of channel used to initiate the transaction. Allowed values: **Browser MobileSDK StoredRecurring** | | browserData | Object | M | Object containing the details of the user's browser. | | colorDepth | String | M | Browser color depth. | | javaEnabled | Boolean | M | Whether the browser can execute Java. | | javascriptEnabled | Boolean | M | Whether the browser can execute Javascript. | | language | String | M | Browser language. | | screenHeight | Number | M | Total height of the customer's screen in pixels. | | screenWidth | Number | M | Total width of the customer's screen in pixels. | | time | Date | M | | | timezoneOffset | Number | M | Time difference between UTC time and the customer's browser local time. | | userAgent | String | M | Exact content of the HTTP user-agent header sent by the browser. | | card | Object | O | Object containing the card information. | | challengeNotificationUrl | String | O | URL that receives the Challenge Result message and informs your application that the customer has completed the challenge. | | challengeRequestIndicator | Enum | O | Indicates whether a challenge is requested for this transaction. The Issuer may override whatever preference is specified in this field. Allowed values: **ChallengeMandated ChallengePreferred NoChallengeRequested NoPreference** | | challengeWindow | Object | M | Object containing the options on how to present the challenge window to the cardholder. | | displayMode | String | O | | | encodedChallengeRequest | String | O | | | hide | Boolean | O | | | origin | String | O | | | requestUrl | String | O | | | response | String | O | | | target | String | O | | | timeout | Number | O | | | windowSize | String | O | Dimensions of the challenge window displayed to the customer. The ACS replies with content that fits the window size. | | merchantId | String | O | Your Merchant ID assigned by us. | | merchantContactUrl | String | O | URL of the merchant's website or customer support site. Should provide contact information for use in the event of a problem. | | messageCategory | Enum | O | Indicates the type of channel used to initiate the transaction. Allowed values: **NonPayment Payment** | | methodUrlComplete | Enum | O | Indicates whether the 3DS Method was completed successfully. Allowed values: **Unavailable No Yes** | | serverTransactionId | String | O | Unique identifier for the authentication in our 3DS solution (3DS server). Must be used for all requests. | | Merchant Data | String | O | Any data you want to pass from the 3DS JavaScript to your server-side code. | # Transaction Management SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/transaction-management.md Section: Integration Options Description: Manage Transactions ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. ## Capture (Settle) > 3D Secure transactions must be settled for the original authorization amount to avail of the chargeback protection. ```java // the transaction id from the authorization response String transactionId = "TRN_UDeQBCNZ1xwQrpJwAF3DK6sUGMRpMH_efffb56bf11; // create the capture transaction object Transaction transaction = Transaction.fromId(transactionId); try { // send the capture request, we must specify the amount and currency Transaction response = transaction.capture(15.00) .withCurrency("EUR") .execute(); String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED } catch (ApiException e) { // TODO: add your error handling here } ``` ```php capture(15.00) ->withCurrency("EUR") ->execute(); $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED } catch (ApiException $e) { // TODO: Add your error handling here } ``` ```dotnet // the transaction id from the authorization response var transactionId = "TRN_UDeQBCNZ1xwQrpJwAF3DK6sUGMRpMH_efffb56bf11"; // create the settle transaction object var transaction = Transaction.FromId(transactionId); try { // send the capture request, we must specify the amount and currency Transaction response = transaction.Capture(99.99m) .WithCurrency("EUR") .Execute(); var result = response.ResponseCode; // 00 == Success var message = response.ResponseMessage; // CAPTURED } catch (ApiException ex) { // TODO: add your error handling here} ``` ## Refund (Rebate) > You can process multiple refunds against one transaction, but this ability is not enabled by default on your account. It must be requested by one of the primary listed contacts on the account. For more information, contact a member of our support team. ```java // the transaction id from the authorization response String transactionId = "TRN_UDeQBCNZ1xwQrpJwAF3DK6sUGMRpMH_efffb56bf11 // create the refund transaction object Transaction transaction = Transaction.fromId(transactionId); try { // if you don’t specify the amount it will do the refund for the full value of the transaction Transaction response = transaction.refund(14.99) .withCurrency("EUR") .execute(); String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED } catch (ApiException e) { // TODO: add your error handling here } ``` ```php refund(14.99) ->withCurrency("EUR") ->execute(); $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED } catch (ApiException $e) { // TODO: Add your error handling here } ``` ```dotnet // the transaction id from the authorization response var transactionId = "TRN_UDeQBCNZ1xwQrpJwAF3DK6sUGMRpMH_efffb56bf11"; // create the refund transaction object var transaction = Transaction.FromId(transactionId); try { // if you don’t specify the amount it will do the refund for the full value of the transaction Transaction response = transaction.Refund(14.99m) .WithCurrency("EUR") .Execute(); var result = response.ResponseCode; // SUCCESS var message = response.ResponseMessage; // CAPTURED } catch (ApiException ex) { // TODO: add your error handling here } ``` # Dynamic Currency Conversion - SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/dynamic-currency.md Section: Integration Options Description: Convert Currencies > The DCC feature is currently not available in the United States or Canada. > > The amount of information that must be presented to the customer, such as rate or margin, varies by Acquirer and Currency Conversion Processor. For more information, contact your account manager (or your Acquirer). ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. ## Rate Lookup ```java Transaction response = null; try { // check if Dynamic Currency Conversion is available response = card .getDccRate() .withAmount(19.99) .withCurrency("EUR") .execute(); } catch (ApiException $e) { // TODO: add your error handling here } if (response != null) { DccRateData dccRateData = response.getDccRateData(); // get the details to present to the customer String cardHolderCurrency = dccRateData.getCardHolderCurrency(); // AUD BigDecimal customerAmount = dccRateData.getCardHolderAmount(); // 28.43 String exchangeRate = dccRateData.getCardHolderRate(); // 1.4220 // TODO: update your application and display the conversion option to the customer } ``` ```php number = "4006097467207025"; $card->expMonth = 12; $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = "131"; $card->cardHolderName = "James Mason"; try { // check if Dynamic Currency Conversion is available $response = $card->getDccRate() ->withAmount(19.99) ->withCurrency('EUR') ->execute();; } catch (ApiException $e) { // TODO: add your error handling here } if (isset($response)) { $dccRateData = $response->dccRateData; // get the details to present to the customer $cardHolderCurrency = $dccRateData->cardHolderCurrency; // AUD $customerAmount = $dccRateData->cardHolderAmount; // 28.43 $exchangeRate = $dccRateData->cardHolderRate; // 1.4220 // TODO: update your application and display the conversion option to the customer } ``` ```dotnet CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = DateTime.Now.Month; card.ExpYear = DateTime.Now.Year + 1; card.Cvn = "123"; card.CardPresent = true; Transaction response = null; try { // check if Dynamic Currency Conversion is available response = card .GetDccRate() .WithAmount(19.99m) .WithCurrency("EUR") .Execute(); } catch (ApiException e) { // TODO: add your error handling here } if (response != null) { DccRateData dccRateData = response.DccRateData; // get the details to present to the customer string cardHolderCurrency = dccRateData.CardHolderCurrency; // AUD decimal? customerAmount = dccRateData.CardHolderAmount; // 28.43 decimal? exchangeRate = dccRateData.CardHolderRate; // 1.4220 // TODO: update your application and display the conversion option to the customer } ``` ## Authorization with DCC ```java // create the card object CreditCardData card = new CreditCardData(); card.setNumber("4006097467207025"); card.setExpMonth(12); card.setExpYear("DCC Rate Lookup request"); card.setCvn("131"); card.setCardHolderName("James Mason"); DccRateData dccRateData = new DccRateData(); dccRateData.setDccId("CCS_bRgMg8rCM4ikmgOWSTXGBm0CsjQlNG"); Transaction response = null; try { // Submit the Authorization with the customer's DCC choice response = card .charge(19.99) .withDccRateData(dccRateData) .withCurrency("EUR") .withOrderId("cd82c0aa-cf3c-4887-aed9-0680aee9f484") .execute(); } catch (ApiException $e) { // TODO: add your error handling here } if (response != null) { String result = response.getResponseCode(); // SUCCESS String message = response.getResponseMessage(); // CAPTURED // get the details to save to the DB for future requests String authCode = response.getAuthorizationCode(); // 12345 String paymentsReference = response.getTransactionId(); // TRN_bRgMg8rCM4ikmgOWSTXGBm0CsjQlNG String carBrandRef = response.getCardBrandTransactionId(); // mnYbrBPsbTySGDKA // TODO: update your application and display transaction outcome to the customer } ``` ```php number = "4006097467207025"; $card->expMonth = 12; $card->expYear = DCC Rate Lookup request; $card->cvn = "131"; $card->cardHolderName = "James Mason"; $dccRateData = new DccRateData(); $dccRateData->dccId = 'CCS_bRgMg8rCM4ikmgOWSTXGBm0CsjQlNG'; try { // Submit the Authorization with the customer's DCC choice $response = $card->charge(19.99) ->withDccRateData($dccRateData) ->withCurrency("EUR") ->withOrderId("cd82c0aa-cf3c-4887-aed9-0680aee9f484") ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } if (isset($response)) { $result = $response->responseCode; // SUCCESS $message = $response->responseMessage; // CAPTURED // get the details to save to the DB for future requests $authCode = $response->authorizationCode; // 12345 $paymentsReference = $response->transactionId; // TRN_bRgMg8rCM4ikmgOWSTXGBm0CsjQlNG $carBrandRef = $response->cardBrandTransactionId; // mnYbrBPsbTySGDKA // TODO: update your application and display transaction outcome to the customer } ``` ```dotnet // create the card object CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = DateTime.Now.Month; card.ExpYear = DateTime.Now.Year + 1; card.Cvn = "123"; card.CardPresent = true; DccRateData dccRateData = new DccRateData(); dccRateData.DccId = "CCS_bRgMg8rCM4ikmgOWSTXGBm0CsjQlNG"; Transaction response = null; try { // Submit the Authorization with the customer's DCC choice response = card .Charge(19.99m) .WithDccRateData(dccRateData) .WithCurrency("EUR") .WithOrderId("cd82c0aa-cf3c-4887-aed9-0680aee9f484") .Execute(); } catch (ApiException e) { // TODO: add your error handling here } if (response != null) { string result = response.ResponseCode; // SUCCESS string message = response.ResponseMessage; // CAPTURED // get the details to save to the DB for future requests string authCode = response.AuthorizationCode; // 12345 string paymentsReference = response.TransactionId; // TRN_bRgMg8rCM4ikmgOWSTXGBm0CsjQlNG string carBrandRef = response.CardBrandTransactionId; // mnYbrBPsbTySGDKA // TODO: update your application and display transaction outcome to the customer } ``` # Dynamic Descriptor SDK Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/dynamic-descriptor.md Section: Integration Options Description: Setting a Dynamic Descriptor ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/configuration-code.md) article. > Dynamic Descriptor is currently supported only by certain Acquirers (that is, our North America division and Allied Irish Banks). Both the Issuer and the Acquirer must support this functionality. Before using, consult with your account manager or support agent. ## Set a descriptor ```java // Create the card object CreditCardData card = new CreditCardData(); card.setNumber("4111111111111111"); card.setExpMonth(12); card.setExpYear(2025); card.setCvn("123"); card.setCardHolderName("Joe Smith"); try { card .authorize(10) .withCurrency("USD") .withDynamicDescriptor("ALTERNATIVE DBA") .execute(); } catch (ApiException e) { // TODO: add your error handling here } ``` ```php number = "4111111111111111"; $card->expMonth = 12; $card->expYear = 2025; $card->cvn = "131"; $card->cardHolderName = "Joe Smith"; try { $response = $card->authorize(10) ->withCurrency('USD') ->withDynamicDescriptor('ALTERNATIVE DBA') ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } ``` ```dotnet // Create the card object CreditCardData card = new CreditCardData(); card.Number = "4111111111111111"; card.ExpMonth = 12; card.ExpYear = 2025; card.Cvn = "123"; card.CardHolderName = "Joe Smith"; try { var authorization = card.Authorize(10m) .WithCurrency("USD") .WithDynamicDescriptor("ALTERNATIVE DBA") .Execute(); } catch (Exception ex) { // TODO: add your error handling here } ``` # SDK - Token Management Source: https://developer.globalpayments.com/docs/integration-options/sdk/sdk-reference/token-management.md Section: Integration Options Description: Track the history of your token updates ## Configuration For configuration code samples, see our [Configuration Code for SDKs](https://developer.globalpayments.com/docs/sdk/config-code) article. ## Token History > **Availability:** \>= SDK V9.0.25 To access the history of your token updates in the .NET SDK, you may use the `TokenUpdaterHistory()` public method. You may access this method in the `ReportingService` class, using the following portico configuration details: ```dotnet var porticoConfig = new PorticoConfig { SecretApiKey = " ", IsSafDataSupported = true, RequestLogger = new RequestConsoleLogger(), ServiceUrl = ServiceEndpoints.PORTICO_TEST }; ``` In order to access this functionality you will need a valid `SecretApiKey` and `ServiceUrl`. While `IsSafDataSupported` is not mandatory, it is a part of the test configuration class. Below are the request parameters with the methods that will set the value in the request: * `ReportStartDate` * `ReportEndDate` * `Limit` * `Offset` * `TokenValue` * `Action` Below are the response parameters that will be returned from the SDK. They will map to the the `TokenUpdaterHistoryResponse` class: * `CountAccountsClosed` * `CountContactCardholder` * `CountUpdateExpirationDate` * `CountUpdateCardNumber` * `Limit` * `Offset` * `ReportEndDate` * `ReportStartDate` * `TotalMatchingRecords` * `Results` * `NewCardNumber` * `NewExpirationDate` * `PreviousCardNumber` * `PreviousExpirationDate` * `TokenValue` * `UpdateAction` * `UpdateDate` The `PorticoReportingTests` file within the test project contains the following test cases for the Report Token Updater History functionality. * `ReportTokenUpdaterHistory_WithStartDateAndResultTypeDetails_ReturnsValidResults` * `ReportTokenUpdaterHistory_WithAllCriteria_ReturnsExpectedDetails` * `ReportTokenUpdaterHistory_WithStartDateAndEndDateAndResultTypeDetails` * `ReportTokenUpdaterHistory_WithStartDateAndCountsResultType_ReturnsValidCounts` * `ReportTokenUpdaterHistory_WithStartAndEndDate_TokenValue_LimitOffset_CountsType_ReturnsResponse` * `ReportTokenUpdaterHistory_WithStartDateAndEndDateAndResultTypeCounts` These tests validate the token updater history reporting feature, ensuring that reports can be generated using various filters. They ensure that all expected fields and counts are present in the response. # MCP on the API Platform - Guide Source: https://developer.globalpayments.com/docs/integration-options/mcp.md Section: Integration Options Description: Let your AI agents interact with the Global Payments API by using our MCP server > This project will be continuously updated over the coming weeks with additional tools and functionalities The Global Payments Model Context ProtocoL (MCP) server on our REST API Platform provides AI agents within tools such as Claude, Windsurf and VS Code with a set of tools they can use to call Global Payments APIs and search our documentation directly from your chat interface. The MCP server also allows you to extend your AI clients/agents capabilities by providing secure, controlled access to our resources. ## Use Cases The Global Payments MCP server is designed to speed up your integration workflow by allowing you to perform key tasks without leaving your IDE or chat interface. Here are three common ways developers use these tools. ##### Use case #1: Generating Payment Links for Testing Instead of manually navigating the merchant portal or writing a temporary script to test your checkout flow, you can ask your AI agent to generate a live payment link instantly. **Example Prompt:** "Create a single-use payment link for 50.00 USD for order #12345." What happens: The agent uses create_payment_link tool to call the API, returning a valid URL that you can immediately click to test the payment experience or send to a customer. ##### Use case #2: Debugging Integrations with Live Logs When building a payment integration on a merchant site, you might encounter vague error messages or failed transactions. Instead of context-switching to the portal to find transaction details, you can ask the agent to pull the recent logs. The agent then has the exact error codes and transaction details in its context, allowing it to analyze your code and suggest a fix immediately. **Example Workflow:** Developer: "I'm getting a 400 error on my checkout page. Can you check the last 5 payment links I created to see what happened?" Agent: Calls get_links and analyzes the response. Agent Response: "I found the failed transaction. The status is FAILED with error code INVALID_CURRENCY. It looks like your code is sending 'US' instead of 'USD'. Here is the corrected line of code for your checkout.js file..." ##### Use case #3: Contextual Documentation Search When you are writing code and need to know the specific parameters for an API endpoint, you can ask the agent to find the relevant docs without switching to a browser. **Example Prompt:** "How do I format the request for the Transaction API? Search the docs for the required fields." What happens: The agent uses get_documentation to pull the specific integration guide or API reference into the chat context. It can then use that information to help you write or fix your code in real-time. ## Prerequisites Before connecting your AI client, ensure you have the following installed on your machine: * **Node.js:** Version 18.0 or higher. * **Git:** To clone the repository. * **Global Payments Credentials:** An App ID and App Secret from your developer account. ## Step 1: Install and Build the Server Unlike cloud-hosted tools, this version of the MCP server runs locally on your machine to ensure maximum security and control over your API credentials. 1. **Clone the repository:** ```BASH git clone https://github.com/globalpayments/mcp-server.git cd mcp-server ``` 2. **Install dependencies and build:** ```BASH npm install npm run build ``` 3. **Configure Environment Variables:** Create a `.env` file in the `Typescript` directory (the project root). Add your credentials: ```BASH \\ Required: Your Global Payments App credentials (format: APP_ID:APP_SECRET) GPAPI_APP=your_app_id:your_app_secret \\ Optional: Set environment to SANDBOX or PROD (Default: SANDBOX) ENV=SANDBOX ``` ## Step 2: Connect to your AI Client Once built, you can connect your preferred AI editor or agent to the local server. **Important:** In the configurations below, you must replace `/absolute/path/to/` with the actual full file path where you cloned the repository. ```JSON Add the following to your `.vscode/mcp.json` file in your workspace. To learn more, see https://code.visualstudio.com/docs/copilot/chat/mcp-servers { "servers": { "global-payments": { "command": "node", "args": ["lib/index.js"] } } } ``` ```JSON Add the following to your `claude_desktop_config.json` file. To learn more, see https://modelcontextprotocol.io/quickstart/user { "mcpServers": { "global-payments": { "command": "node", "args": ["/absolute/path/to/gpapi-mcp-server/Typescript/lib/index.js"] } } } ``` ```JSON Add the following to your `~/.codeium/windsurf/mcp_config.json` file. To learn more, see https://docs.windsurf.com/windsurf/cascade/mcp { "mcpServers": { "global-payments": { "command": "node", "args": ["/absolute/path/to/gpapi-mcp-server/Typescript/lib/index.js"] } } } ``` ```JSON Add the following to your `~/.cursor/mcp.json` file. To learn more, see https://docs.cursor.com/context/model-context-protocol { "mcpServers": { "global-payments": { "command": "node", "args": ["/absolute/path/to/gpapi-mcp-server/Typescript/lib/index.js"] } } } ``` ## Available Tools The server exposes the following tools to your AI agent. The agent will automatically select the correct tool based on your natural language prompt (e.g., "Create a payment link for $50"). | Category | Tool Name | Description | | --- | --- | --- | | **Payments** | `create_payment_link` | Create single-use or multi-use payment links programmatically. | | **Reporting** | `get_links` | Retrieve and filter existing payment links to check status or details. | | **Documentation** | `get_documentation` | Search and retrieve API documentation for 19+ categories directly in chat. | ## Troubleshooting * **Path Errors:** If the agent cannot find the server, ensure you are using the **absolute path** (e.g., `/Users/username/dev/...` or `C:\Users\username\dev...`) in the `cwd` (Current Working Directory) configuration. * **Authentication:** Ensure your `.env` file is located exactly in the `Typescript` folder and contains valid credentials in the `APP_ID:APP_SECRET` format. * **Build Status:** If changes aren't reflecting, try running `npm run build` again to ensure the TypeScript source is compiled to the `lib` folder. # API Source: https://developer.globalpayments.com/docs/integration-options/api.md Section: Integration Options Description: Connect into numerous regions, channels, and payment methods worldwide with one integration Discover the many benefits of integrating with our API. Just to name a few: ### REST API ### Cloud-based tech stack ### One integration ### Single set of credentials ### Secure ### Omnichannel ### Partners ### Small and medium-sized businesses ### Enterprise ### Global A single integration opens a world of possibilities. Not only does our API allow you to take and manage payments online or in-store, but we offer many other features and capabilities that add value to both your business and your customer experience. ### [Payment Processing](https://developer.globalpayments.com/docs/payments/overview) Online or in-store, a simple integration connects you to our vast payments ecosystem. Our market-leading technology connects every aspect of commerce. ### Tokenization & Recurring Payments Securely store customer and card data for single or multiple transactions while also managing monthly subscriptions. ### Dynamic Currency Conversion Offer cardholders traveling internationally the choice of paying either in the currency of their own card or the currency that the merchant trades in. ### Alternative Payment Methods Add alternative and local payment methods to your offering, including PayPal, GooglePay, ApplePay and many more. ### Risk Management Add 3D Secure as well as Fraud Filters with Decision Management to better identify your customers and reduce fraud. ### Reporting Reconcile transactions and manage your daily fund transfer processes with both Real-Time Data and Settlement Reporting. ### Disputes Management Use our Disputes API to automate the reporting and management of transaction disputes. ### Partners Create, manage, and act on behalf of the many merchants in your network. Partners can use our expertise but also take full control of the merchant experience. Our solutions are available in the following regions. For more specific information, check with your account manager. ### United States ### Canada ### United Kingdom ### Europe ### Mexico ### Asia Pacific Our API covers multiple capabilities, so let's get to it and start taking payments. Get up to speed quickly using the steps in our guides for online and in-store payments. Or, jump straight into our code using our full API References section and Postman collection. ### [Online](https://developer.globalpayments.com/docs/payments/online/api-guide.md) Start taking payments using our API with the help of our guides. ### [In-Store](https://developer.globalpayments.com/docs/payments/in-store/full-integration.md) Take full control over the in-store payment experience. ### [Full API References](https://developer.globalpayments.com/api/overview.md) Test code in an interactive playground and explore API resources and methods. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) Download our Postman collection to see working examples to help you with your integration. # Pay by Link - Overview Source: https://developer.globalpayments.com/docs/payments/online/pay-by-link-overview.md Section: Payments Description: Allow customers to pay with a unique payment link. Pay by Link gives merchants the ability to automatically generate a unique payment link for their customers without needing a website. When a customer uses the link, they are redirected to a payment page to enter their payment details. This unique link can be set for single use or multiple use, depending on the business case. You can provide the link to your customers in several ways. For example, the link can be embedded in a QR code for customers to scan with their phone or it can be included in a promotional post on a social media platform such as Facebook or Instagram. You can also send the link directly to a customer via an email or text message (SMS) — for example, if you want to remind them to pay their bill. > Note: SMS delivery is supported but requires additional account configuration. Contact your Global Payments representative to enable SMS and review regional requirements and costs. With Pay by Link, you can also: * Align your Customer Relationship Management (CRM) system to enhance your payment capabilities. * Automate the payment of a Pay by Link into your fulfillment systems. * Track each individual payment link and see if it leads to a payment. ![Screenshot of a payment link created successfully and the payment page associated with the link.](https://developer.globalpayments.com/gh-assets/pay-link_example.png) **Pay by Link Example** ## Use cases In this section, we present some “real world” examples that can be enabled through our Pay by Link solution. Keep in mind that this section doesn’t cover all of the use cases. ##### Use case #1: Reminder texts A medical insurer wants to send reminders to its customers to pay their bill. It uses the API to create payment links, which are then sent via its CRM system as text messages to customers. Customers click the link in the text message, which opens up a payment page on their phone for them to pay their insurance bill. ##### Use case #2: Social media posts A large multinational corporation uses the APIs to create payment links, which it feeds into its social media platform to push products directly to its Facebook, Twitter, and Instagram accounts. Customers can see the posts and click the payment link to purchase the products directly. ##### Use case #3: QR codes on checks A restaurant point-of-sale (POS) software provider enables pay-at-the-table functionality by leveraging the API. The POS software calculates the final bill and then calls the API to generate a payment link. Using a third-party library, the POS software embeds the link into a QR code and prints the QR code onto the check provided to the restaurant’s customer. The customer then scans the code using their phone and is taken to the payment page where they enter the payment details. ##### Use case #4: Telephone orders An online retailer selling high-end products allows customers calling in for product advice to also complete a purchase over the phone using a credit card. The merchant previously used a virtual terminal to input the card number, but since this raised serious data protection and security concerns, their CRM system now sends a payment link to the customer’s phone instead. The customer then completes the purchase on a personalized payment page for the merchant. ## Product information ##### What you get with Pay by Link * Create, manage and share payment links * Dashboard UI to complement our API * Configure what information to capture on payment form (for example, billing info) ##### What you can add to Pay by Link * 3D Secure * Digital Wallets (_Coming Soon_) * Open Banking (_Coming Soon_) ##### Integration options * JavaScript Library * API via the Links resource ##### Regions where you can use Pay by Link * United States * Asia-Pacific * Canada * Europe ## How it works You can easily integrate with our API to use Pay by Link and automate the sharing of payment requests to your customers by embedding the link into the customer journey of your existing system. A payment link is created when you send a request to the Unified Payments API server (_/ucp/links_) to create a new link URL. There are many ways to configure a payment link in the Create Link API request. For example, you can specify if the link can only be paid once or multiple times, as well as set an expiry date. For multiple-use payment links, you can set a maximum number of times that it can be used. Once the request is received, our API then generates a unique id to represent the link (`LNK_ID`). You can send this link to the customer via email or text/SMS. After the customer clicks the link, they are redirected to the hosted page of our technology partner, Truust. The customer then enters their card details to complete the purchase. Truust then sends the transaction to our API. After getting a response, Truust will send a webhook to the API and then redirect the customer back to the Return URL you included in the request. All link and transactional data are available for you to access via the API. For example, you can query how many times the link was viewed or paid. At a high level, Pay by Link works like this: ![Diagram flow show how Pay by Link works at a high level.](https://developer.globalpayments.com/gh-assets/pay-link_flow.png) **Pay by Link Typical Flow** ## Next steps To try Pay by Link, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/payments/online/pay-by-link-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Pay by Link - Guide Source: https://developer.globalpayments.com/docs/payments/online/pay-by-link-guide.md Section: Payments Description: Learn how to create a unique payment link. This guide focuses on the steps needed to create a unique payment link, including initiating the payment, redirecting the customer, and checking the status. We also show you how to use a webhook to keep current with processed paylinks and how to edit a payment link if you need to change its properties. For more information on Pay by Link, including use cases, see our [Overview](https://developer.globalpayments.com/docs/payments/online/pay-by-link-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Initiate the payment In this step, we create a unique payment link using the Create Link request. You can include various data elements specific to each link request, such as product information, price, number of times it can be paid, notification type and destination, and a link expiration date. The Create Link call also retrieves some necessary information to facilitate the redirect and authentication of the customer. For information on API methods and request/response data, see [Links](https://developer.globalpayments.com/api/links.md) in API Explorer. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-type: application/json' \ --data '{ "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "account_name": "Transaction_Processing", "type": "PAYMENT", "usage_mode": "MULTIPLE", "usage_limit": "1000", "reference": "Restaurant", "name": "Invoice #1234567", "description": "3 x pizzas, 4 x 7up", "shippable": "NO", "expiration_date": "2026-12-20T00:35:28Z", "transactions": { "allowed_payment_methods": [ "CARD" ], "amount": "4999", "channel": "CNP", "country": "GB", "currency": "GBP" }, "message_type": "EMAIL_AND_SMS", "payer": { "reference": "CUS_123", "mobile_phone": { "country_code": "+48", "subscriber_number": "656565656" }, "email": "test@test.com" }, "images": [ { "b64_content": "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" } ], "notifications": { "return_url": "https://www.example.com/return", "status_url": "https://www.example.com/status", "cancel_url": "https://www.example.com/cancel" } }' ``` ```java GpApiConfig config = new GpApiConfig(); // GP-API settings config .setAppId("AppID") .setAppKey("AppKey") .setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); AccessTokenInfo accessTokenInfo = new AccessTokenInfo() .setTransactionProcessingAccountName("LinkManagement"); config.setAccessTokenInfo(accessTokenInfo); config.setEnableLogging(true); ServicesContainer.configureService(config); PayByLinkData payByLink = new PayByLinkData(); payByLink.setType(PayByLinkType.PAYMENT); payByLink.setUsageMode(PaymentMethodUsageMode.SINGLE); payByLink.setAllowedPaymentMethods(new String[]{PaymentMethodName.Card.getValue(Target.GP_API)}); payByLink.setUsageLimit(1); payByLink.setName("Mobile Bill Payment"); payByLink.isShippable(true); payByLink.setShippingAmount(new BigDecimal(1.23)); payByLink.setExpirationDate(DateTime.now().plusDays(10)); payByLink.setImages(Arrays.asList("test", "test2", "test3")); payByLink.setReturnUrl("https://www.example.com/returnUrl"); payByLink.setStatusUpdateUrl("https://www.example.com/statusUrl"); payByLink.setCancelUrl("https://www.example.com/returnUrl"); try { Transaction response = PayByLinkService .create(payByLink, amount) .withCurrency("USD") .withClientTransactionId(GenerationUtils.generateRecurringKey()) .withDescription("March and April Invoice") .execute(); } catch (ApiException ex) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "AppID"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Environment.TEST; config.Country = "GB"; config.AccessTokenInfo = new AccessTokenInfo { TransactionProcessingAccountName = "LinkManagement" }; config.RequestLogger = new RequestConsoleLogger(); config.EnableLogging = true; ServicesContainer.ConfigureService(config); PayByLinkData payByLink = new PayByLinkData(); payByLink.Type = PayByLinkType.PAYMENT; payByLink.UsageMode = PaymentMethodUsageMode.Single; payByLink.AllowedPaymentMethods = new PaymentMethodName[] { PaymentMethodName.Card }; payByLink.UsageLimit = 1; payByLink.Name = "Mobile Bill Payment"; payByLink.IsShippable = true; payByLink.ShippingAmount = 1.23m; payByLink.ExpirationDate = DateTime.UtcNow.AddDays(10); //date('Y-m-d H:i:s') + 10; payByLink.Images = new string[] { "test", "test2", "test3" }; payByLink.ReturnUrl = "https://www.example.com/returnUrl"; payByLink.StatusUpdateUrl = "https://www.example.com/statusUrl"; payByLink.CancelUrl = "https://www.example.com/returnUrl"; try { var response = PayByLinkService.Create(payByLink, 7.8m) .WithCurrency("GBP") .WithClientTransactionId(GenerationUtils.GenerateRecurringKey()) .WithDescription("March and April Invoice") .Execute(); } catch (GatewayException ex) { // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppID'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $accessTokenInfo = new AccessTokenInfo(); $accessTokenInfo->transactionProcessingAccountName = 'LinkManagement'; $config->accessTokenInfo = $accessTokenInfo; ServicesContainer::configureService($config); $payByLink = new PayByLinkData(); $payByLink->type = PayByLinkType::PAYMENT; $payByLink->usageMode = PaymentMethodUsageMode::MULTIPLE; $payByLink->allowedPaymentMethods = [PaymentMethodName::CARD]; $payByLink->usageLimit = 1000; $payByLink->name = 'iphone 14'; $payByLink->isShippable = false; $payByLink->shippingAmount = 1.00; $payByLink->images = ['https://gpapi-sandbox.truust.io/assets/images/37272.jpg']; $payByLink->expirationDate = date('Y-m-d H:i:s', strtotime(' + 2 years')); $payByLink->returnUrl = 'https://www.example.com/returnUrl'; $payByLink->statusUpdateUrl = 'https://www.example.com/statusUrl'; $payByLink->cancelUrl = 'https://www.example.com/returnUrl'; try { $response = PayByLinkService::create($payByLink, 1.00) ->withCurrency('USD') ->withClientTransactionId(GenerationUtils::getGuid()) ->withDescription('iPhone 14 Max') ->execute(); } catch (GatewayException $ex){ // TODO: Add your exception handling here } $responseCode = $response->responseCode; // SUCCESS $responseMessage = $response->responseMessage; // ACTIVE $amount = $response->balanceAmount; // 1.00 $payByLinkUrl = $response->payByLinkResponse->url; // https://apis.sandbox.globalpay.com/ucp/postback/MjAyMTAzMjJfbzBnWGJG $payByLinkId = $response->payByLinkResponse->id; // LNK_6U3sKIGH1uNyi22sPob9KZsjXcSHY9 ``` #### Sample response ```JSON { "id": "LNK_ebXXvzKCVf7eOVegpYHaPkld2vDnXn", "account_name": "Transaction_Processing", "url": "https://apis.sandbox.globalpay.com/ucp/postback/MjAyMTAzMjJfS0pvSlc5", "status": "ACTIVE", "type": "PAYMENT", "usage_mode": "MULTIPLE", "usage_limit": "1000", "reference": "Restaurant", "name": "Invoice #1234567", "description": "3 x pizzas, 4 x 7up", "shippable": "NO", "shipping_amount": "0", "viewed_count": "0", "expiration_date": "2026-12-20T00:35:28Z", "transactions": { "channel": "CNP", "amount": "4999", "currency": "GBP", "country": "GB", "allowed_payment_methods": [ "CARD" ] }, "images": [ "https://gpapi-pre.truust.io/assets/images/YEjbBZZjp3.jpg" ], "action": { "id": "ACT_ebXXvzKCVf7eOVegpYHaPkld2vDnXn", "type": "LINK_CREATE", "time_created": "2024-06-07T16:18:45.208Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } } ``` ## Step 2: Redirect the customer Once the link is created, the customer must be redirected using the URL returned in the Create Pay by Link response to facilitate authentication and authorization. You can use a simple JavaScript redirect or HTTP GET (302 redirect). For information on API methods and request/response data, see [Links](https://developer.globalpayments.com/api/links.md#/Get%20a%20list%20of%20Links/get-links) in API Explorer. In this example, we redirect the customer to the URL using JavaScript. #### Sample redirect code ```XML Sample Redirect ``` Once the customer completes the transaction, they are redirected to the Return URL specified in the Create Link request. The unique transaction identifier is also returned, allowing you to check the status of the payment (see next step) #### Sample return URL parameters ```XML https://www.example.com/return?X-GP-Signature=b4d424a3e69c79dc43c4bd7153485a756e8f42e00a15e0e4850d5b0bb7bb45de1471fcbc0d4e248cec8f9911ba742eab3984fa2251d1a8e53d3aaa45a421e4fe&link_id=LNK_ebXXvzKCVf7eOVegpYHaPkld2vDnXn&trn_id=&action_type=REDIRECT_FROM&action_id=ACT_39r9oCnIpK0UchlWjxySeq8AuoLYDl ``` ## Step 3: Check the status, handle the redirect Once the customer completes the transaction, they are redirected back to your site based on transaction success/failure using the URLs specified in the Create Link request. The `TRN_ID` that is passed as a URL parameter should be used to check the status of the transaction before displaying a successful or failed transaction message to the customer and updating your systems. For information on API methods and request/response data, see [Links](https://developer.globalpayments.com/api/links.md#/Get%20a%20list%20of%20Links/get-links) in the API Explorer. #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/links/LNK_ebXXvzKCVf7eOVegpYHaPkld2vDnXn' \ --header 'Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' ``` ```java GpApiConfig config = new GpApiConfig(); // API settings config .setAppId("AppID") .setAppKey("AppKey") .setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); config.setCountry("GB"); AccessTokenInfo accessTokenInfo = new AccessTokenInfo() .setTransactionProcessingAccountName("LinkManagement"); config.setAccessTokenInfo(accessTokenInfo); config.setEnableLogging(true); ServicesContainer.configureService(config); String paylinkId = "LNK_hUh2IIO1YoyDU3wGwkcb4e6SE9v5dY"; try { PayByLinkSummary response = PayByLinkService .payByLinkDetail(paylinkId) .execute(); } catch (Exception ex) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "AppID"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Environment.TEST; config.Country = "GB"; config.AccessTokenInfo = new AccessTokenInfo { TransactionProcessingAccountName = "LinkManagement" }; config.RequestLogger = new RequestConsoleLogger(); config.EnableLogging = true; ServicesContainer.ConfigureService(config); var payByLinkId = "LNK_hUh2IIO1YoyDU3wGwkcb4e6SE9v5dY"; try { var response = PayByLinkService.PayByLinkDetail(payByLinkId) .Execute(); } catch (Exception ex) { // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppID'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $accessTokenInfo = new AccessTokenInfo(); $accessTokenInfo->transactionProcessingAccountName = 'LinkManagement'; $config->accessTokenInfo = $accessTokenInfo; ServicesContainer::configureService($config); try { $response = PayByLinkService::payByLinkDetail('LNK_2GcHA5MqwFxFyd2LbyRzObJPLIoLD7') ->execute(); } catch (GatewayException $ex){ // TODO: Add your exception handling here } $payByLinkId = $response->id; // LNK_2GcHA5MqwFxFyd2LbyRzObJPLIoLD7 $payByLinkUrl = $response->url; // https://apis-sanbox.globalpay.com/ucp-pf/postback/MjAyMTAzMjJQRl83QnpLbmg= $status = $response->status; // ACTIVE $transactionList = $response->transactions; // the list of transactions made with this payment link ``` ## Step 4: Use webhook notification URL To keep your systems up to date with all of the payments that were processed with Pay by Link, you can use a webhook notification URL. This can be set using the Status URL field when creating the Pay by Link. Pay by Link uses our [Drop-In UI](https://developer.globalpayments.com/docs/payments/online/drop-in-ui-overview.md) / [Hosted Fields](https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md) solution to process the payment. The Payment Method ID (`PMT_ID`) can be reused for subsequent transactions using our tokenization solution. For information on API methods and request/response data, see [Links](https://developer.globalpayments.com/api/links.md#/Get%20a%20list%20of%20Links/get-links) in the API Explorer. ## [Optional] Edit a payment link You can edit a payment link. For example, you may want to change the number of times that a link can be paid. You may sell some units via another channel and want to update the link to reflect this, or you may want to reduce or increase the price of an item. The `type`, `usage_mode`, `name`, `description`, and `transactions.amount` fields must all be sent for every update request. Other fields can also be updated. The following fields can be updated via a `PATCH` request: | Field | Description | |-------|-------------| | usage_mode | Indicates whether the link can be used once or multiple times. | | usage_limit | The number of the times that the link can be used or paid. | | name | A descriptive name for the link. This will be visible to the customer on the payment page. | | description | A detailed description of your link that will be visible to the customer on the payment page. | | status | The overall status of the instance of the resource.The overall status of the instance of the resource. | | shippable | Indicates if you want to capture the customers shipping information on the hosted payment page. If you enable this field you can also set an optional shipping fee in the _shipping_amount_. | | shipping_amount | Indicates the cost of shipping when the shippable field is set to YES. | | amount | The amount to transfer between Payer and Merchant for a SALE or a REFUND. It is always represented in the lowest denomination of the related currency. | | expiration_date | Indicates the date and time after which the link can no longer be used or paid. | | images | Base64 encoded image that will be visible to the customer on the payment page. | In this example, we update the description of the link that appears to a customer. ```json curl --location --request PATCH 'https://apis.sandbox.globalpay.com/ucp/links/LNK_ebXXvzKCVf7eOVegpYHaPkld2vDnXn' \ --header 'Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --data '{ "type": "PAYMENT", "usage_mode": "SINGLE", "name": "iphone 14", "description": "Description update via PATCH endpoint", "transactions": { "amount": "1001" } }' ``` ```java GpApiConfig config = new GpApiConfig(); // API settings config .setAppId("AppId") .setAppKey("AppKey") .setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); config.setCountry("GB"); AccessTokenInfo accessTokenInfo = new AccessTokenInfo() .setTransactionProcessingAccountName("LinkManagement"); config.setAccessTokenInfo(accessTokenInfo); config.setEnableLogging(true); ServicesContainer.configureService(config); PayByLinkSummaryPaged response = PayByLinkService .findPayByLink(1, 10) .orderBy(PayByLinkSortProperty.TimeCreated, SortDirection.Ascending) .where(SearchCriteria.StartDate, startDate) .and(SearchCriteria.EndDate, endDate) .execute(); PayByLinkSummary randomPayByLink = response.getResults().get(0); PayByLinkData payByLink = new PayByLinkData(); payByLink.setName("Test of Test"); payByLink.setUsageMode(PaymentMethodUsageMode.MULTIPLE); payByLink.setType(PayByLinkType.PAYMENT); payByLink.setUsageLimit(5); BigDecimal amount = new BigDecimal("10.08"); try { Transaction editResponse = PayByLinkService .edit(randomPayByLink.getId()) .withAmount(amount) .withPayByLinkData(payByLink) .withDescription("Update Paybylink description") .execute(); } catch (Exception ex) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "AppID"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Environment.TEST; config.Country = "GB"; config.AccessTokenInfo = new AccessTokenInfo { TransactionProcessingAccountName = "LinkManagement" }; config.RequestLogger = new RequestConsoleLogger(); config.EnableLogging = true; ServicesContainer.ConfigureService(config); var response = PayByLinkService.FindPayByLink(1, 10) .OrderBy(PayByLinkSortProperty.TimeCreated, SortDirection.Ascending) .Where(SearchCriteria.StartDate, startDate) .And(SearchCriteria.EndDate, endDate) .Execute(); var randomPayByLink = response.Results[0]; PayByLinkData payByLink = new PayByLinkData(); payByLink.Name = "Test of Test"; payByLink.UsageMode = PaymentMethodUsageMode.Multiple; payByLink.Type = PayLinkType.PAYMENT; payByLink.UsageLimit = 5; try { var amount = 10.08m; var editResponse = PayByLinkService.Edit(randomPayByLink.Id) .WithAmount(amount) .WithPayByLinkData(payLink) .WithDescription("Update Paylink description") .Execute(); } catch (Exception ex) { // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppID'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $accessTokenInfo = new AccessTokenInfo(); $accessTokenInfo->transactionProcessingAccountName = 'LinkManagement'; $config->accessTokenInfo = $accessTokenInfo; ServicesContainer::configureService($config); $payByLinkData = new PayByLinkData(); $payByLinkData->name = 'iphone 14'; $payByLinkData->usageMode = PaymentMethodUsageMode::SINGLE; $payByLinkData->type = PayByLinkType::PAYMENT; $payByLinkData->usageLimit = 1; try { $response = PayByLinkService::edit('LNK_eVCvDmH619QYBv3jNJNJ0D6vieihln') ->withAmount(10.01) ->withPayByLinkData($payByLinkData) ->withDescription('Updated Description') ->execute(); } catch (GatewayException $ex){ // TODO: Add your exception handling here echo $ex->getMessage(); exit; } $responseCode = $response->responseCode; // SUCCESS $responseMessage = $response->responseMessage; // ACTIVE $amount = $response->balanceAmount; // 10.01 $payByLinkUrl = $response->payByLinkResponse->url; // https://apis-qa.globalpay.com/ucp-pf/postback/MjAyMTAzMjJQRl8yc3VSWEU= $payByLinkId = $response->payByLinkResponse->id; // LNK_eVCvDmH619QYBv3jNJNJ0D6vieihln ``` ## Integration references To get a deeper understanding of this product, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [API /links](https://developer.globalpayments.com/api/links.md) Create and retrieve payment links. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Our Pay by Link solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ### [SDK Quickstart](https://github.com/globalpayments-samples/starter-template) Starter kit for payment integrations. ### [Pay by Link Sample](https://github.com/globalpayments-samples/pay-by-link) Guide for Pay by Link integration. ## Enhance your integration Explore more functionality to enrich your application or website. Below are value-added services you can enable for Pay by Link. ### [3D Secure](https://developer.globalpayments.com/docs/3DS-overview) Add 3D secure to your integration. # Hosted Payment Page - Overview Source: https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-overview.md Section: Payments Description: Quickly set up a secure checkout page. The Hosted Payment Page (HPP) is our PCI DSS–compliant hosted solution, allowing merchants to capture addresses for customer billing and shipping, contact information, and card details all through one simple redirect or embedded integration. Using the HPP along with our SDKs and libraries means that you can set up a secure payment form in your application or website in minutes. The library handles the opening, display, and response of the HPP on a desktop, tablet, mobile device (both iOS and Android apps), or in-app, with minimal configuration required. For merchants, the benefits of the HPP include: * Prebuilt forms for your payment pages * Simplest level of PCI DSS compliance: SAQ A * Secure address forms to collect other customer details * Built-in input validation of payment fields * Seamless integration with desktop, tablet, mobile, or in-app * Cross-channel secure payment acceptance and customer identification Here's an example of the standard HPP Payment Details form added to a fictitious merchant’s payment page. ![An example of a payment form for Henley Park University built using the HPP.](https://developer.globalpayments.com/gh-assets/hpp_example.png) **Example - HPP Payment Details Form** ## Use cases In this section, we present some “real world” examples that can be enabled through our HPP solution. Keep in mind that this section doesn’t cover all of the use cases. ##### Use case #1: Secure An online bakery has just launched and wants to ensure that they are processing their transactions in a secure environment that is also PCI DSS compliant. Integrating with HPP means that sensitive card information is captured directly by us instead of their own website. ##### Use case #2: Convenient A personal trainer has just gone live with their online training program. They’re working with a small team currently, so they can’t commit to any integration that requires too much maintenance. The HPP allows them to quickly set up with just a single request before they can start processing transactions. ##### Use case #3: Flexible An online bike shop wants to allow their customers to pay using various payment methods. Integrating with the HPP will allow this merchant to accept card payments, digital wallets, alternative payment methods (APMs), and more. ## Product information ##### What you get with the HPP * Payment Page * 3D Secure * PCI DSS (SAQ A) * APMs ##### What you can add to the HPP * Card Storage * Payer Storage * Digital Wallets * Dynamic Currency Conversion ##### Integration options * JavaScript Library * SDK or API ##### Regions where you can use the HPP * Europe * Middle East * North America * Latin America * Africa * Asia-Pacific (*Coming Soon*) ## How does it work? If you're using our other solutions through the HPP — like 3D Secure, APMs, or Fraud Management — the information gathered through the HPP will be used to populate the associated required fields. In other words, you don’t have to provide that additional information in the HPP request. At a high level, HPP works like this: ![Diagram flow of how the Hosted Payment Page works at a high level.](https://developer.globalpayments.com/gh-assets/hpp_flow.png) **HPP Typical Flow** #### 3D Secure The HPP handles the entire 3D Secure authentication flow, including determining which version of 3D Secure to use, gathering the necessary device information, and presenting the challenge to the customer if required. The HPP then processes the authorization and passes the additional authentication information to the card issuer. ## Next steps To try the HPP, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Hosted Payment Page - Guide Source: https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-guide.md Section: Payments Description: Learn how to integrate our secure checkout page. > The Hosted Payment Page (HPP) is currently not available in the Asia Pacific region. For more information, check with your account manager. This guide focuses on adding the HPP to your application or website. After creating an access token, we set up the request to create a unique payment link. Using the HPP URL returned in the response, we then redirect the customer to facilitate authentication and authorization. After receiving the response and checking the transaction outcome, we then handle the redirect to your application’s appropriate successful or failed page. For an overview of the HPP, see our [Overview](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-overview.md) page. To learn how to enable more value-added services to the HPP, see the [Enhance your integration](#enhance-your-integration) section. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Create the HPP URL First, we create a unique payment link using the Create Link request. This request also retrieves some necessary information to facilitate the redirect and authentication of the customer. Our sample request performs a standard card payment with 3D Secure and uses only mandatory and recommended fields (for the full list of HPP Link fields, see the [table](#hpp-link-field-definitions)). It also includes information on API methods and request data. #### Sample request ```JSON curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7V5XtjLBHLN1h' \ --data-raw '{ "account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-549d-4967-aeea-51b3f320046a", "payer": { "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "44", "subscriber_number": "1801555888" }, "billing_address": { "line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Halifax", "postal_code": "44", "country": "GB" } }, "order": { "amount": "1000", "currency": "EUR", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "GB", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD" ] }, "payment_method_configuration": { "authentication": { "preference": "CHALLENGE_PREFERRED" } } }, "notifications": { "return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url" } }' ``` ### Sample response ```JSON { "id":"LNK_JGWfx9L9Oc3RS2N5WobbocjMDuSqvm", "account_name":"transaction_processing", "url":"https://apis.sandbox.globalpay.com/ucp/hpp/redirect/42060877-8bf9-4ae3-a3ae-99a6da10cf41", "status":"ACTIVE", "type":"HOSTED_PAYMENT_PAGE", "usage_mode":"SINGLE", "usage_limit":"1", "name":"Mobile Bill Payment", "description":"February and March Invoice", "expiration_date":"2024-06-11T14:09:23.577Z", "order":{ "amount":"1000", "currency":"EUR", "reference":"order-645", "transaction_configuration":{ "country":"GB", "channel":"CNP" } }, "action":{ "id":"ACT_JGWfx9L9Oc3RS2N5WobbocjMDuSqvm", "type":"LINK_CREATE", "time_created":"2024-06-10T14:09:23.577Z", "result_code":"SUCCESS", "app_id":"i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name":"demo_app" } } ``` ## Step 2: Redirect the customer Once the link is created, the customer must be redirected using the URL returned in the Create Pay by Link response to facilitate authentication and authorization. You can use a simple JavaScript redirect or HTTP GET (302 redirect). For information on API methods and request/response data, see [Links](https://developer.globalpayments.com/api/links.md) in the API Explorer. In this example, you redirect the customer to the URL using JavaScript. ### Sample redirect ```xml Sample Redirect ``` Once redirected to the URL, your customer will be presented with the HPP. ![Example of the HPP on a desktop computer screen](https://developer.globalpayments.com/gh-assets/hpp_desktop.png) **HPP Desktop Example** ## Step 3: Check transaction outcome, handle redirect Once the customer completes the transaction, a transaction response is sent to your Return URL to inform your system of the transaction result. The response contains the outcome of the transaction, whether it was a success or a decline. It also contains the Transaction ID (`TRN_ID`), which can be used to manage the transaction — such as performing a reversal or reporting on the transaction. When the transaction is complete, the HPP will render the contents of the URL supplied in the `return_url`. The URL should only contain basic HTML and JavaScript. The URL should redirect the customer to the final transaction complete page on your website or application. #### Sample response ```JSON { "id":"TRN_xc1XbbUf7MhbFrYDGL1Tbde0aRAWoD_22cf9fb4570a", "time_created":"2024-06-10T14:09:23.577Z", "type":"SALE", "status":"CAPTURED", "channel":"CNP", "capture_mode":"AUTO", "amount":"1000", "currency":"USD", "country":"US", "merchant_id":"MER_2584caaa4b5b4f77a90e7f2582ef53dd", "merchant_name":"sandbox_merchant", "account_id":"TRA_be85d0f6bc13405c8fefcbf455ab039e", "account_name":"transaction_processing", "reference":"order-645", "payment_method":{ "id":"PMT_79144957-13eb-4e2c-a378-92f90b5e97c0", "result":"00", "message":"[ test system ] AUTHORISED", "entry_mode":"ECOM", "authentication":{ "three_ds":{ "value_result":"00" } } }, "link_data":{ "id":"LNK_XnV6crCpM1uxAaqoYuFnfquPSg5oNN", "url":"https://apis.sandbox.globalpay.com/ucp/hpp/redirect/42060877-8bf9-4ae3-a3ae-99a6da10cf41", "status":"ACTIVE", "type":"payment", "allowed_payment_methods":[ "CARD" ], "usage_mode":"SINGLE", "usage_count":"1", "reference":"82c2dbd5-549d-4967-aeea-51b3f320046a", "name":"Mobile Bill Payment", "description":"February and March Invoice", "viewed_count":"1", "expiration_date":"2024-06-11T14:09:23.577Z", "notifications":{ "return_url": "https://www.example.com/responseUrl", "status_url": "https://www.example.com/statusUrl", } }, "action":{ "id":"ACT_u8ckxAxozTXNzzsJmWc7GgwwBa67ZJ", "type":"STATUS_NOTIFICATION", "time_created":"2024-06-11T14:09:23.577Z", "result_code":"SUCCESS", "app_id":"i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name":"demo_app" } } ``` #### HPP Link field definitions *Type* indicates whether the element is Mandatory (M), Optional (O), or Conditional (C)—dependent on another field or regional requirement. | Element/Field | Category | Format | Type | Length | Description | | --- | --- | --- | --- | --- | --- | | account\_name | string | alphanumeric | M | 1-50 | A meaningful label that better identifies the account. | | type | | enum | M | | API-specific label that indicates the type resource an instance is. For example: HOSTED\_PAYMENT\_PAGE | | name | string | alphanumeric | O | 1-120 | Descriptive name of the link. | | description | string | alphanumeric | O | 1-250 | Detailed description of the link. | | usage\_mode | string | enum | O | | Indicates whether the link can be used once or multiple times. For type=HOSTED\_PAYMENT\_PAGE, this can only be SINGLE. | | usage\_limit | string | numeric | O | 1-50 | Indicates the number of times that a link was already successfully paid. For type=HOSTED\_PAYMENT\_PAGE, this can only be 1. | | reference | string | alphanumeric | M | 1-50 | Merchant-defined field to reference the link. | | expiration\_date | string | numeric | O | 1-50 | Indicates the date and time after which the link can no longer be used or paid. For type=HOSTED\_PAYMENT\_PAGE, expiration date is 24 hours only. | | payer.status | string | enum | O | | Indicates whether the payer is new or existing (active). **NEW** - Payer is newly created. Customer can store the card on the HPP, which is associated with the Payer ID. **ACTIVE** - Payer was created previously. Any payment methods stored with this payer are displayed on the HPP. | | payer.id | string | alphanumeric | O | 1-50 | Unique ID generated by us to reference a payer in our system. To learn how to create a payer, see the [Payers - Guide](/docs/payers-guide "Payers Guide"). | | payer.name | string | alphanumeric | O | 1-50 | Name of the payer. | | payer.language | string | enum | O | 1-50 | Language of the payer. | | payer.email | string | alphanumeric | O | 1-100 | Email of the payer. | | payer.mobile\_ phone.country\_ code | string | ISO-3166-1 | O | | Country code in ISO-3166-1 (alpha-2 code) format. | | payer.mobile\_ phone.subscriber\_ number | string | numeric | O | 1-50 | Mobile phone number of the payer. | | payer.billing\_ address.line\_1 | string | alphanumeric | M | 1-50 | First line of the billing address. | | payer.billing\_ address.line\_2 | string | alphanumeric | M | 1-50 | Second line of the billing address. | | payer.billing\_ address.line\_3 | string | alphanumeric | M | 1-50 | Third line of the billing address. | | payer.billing\_ address.city | string | alphanumeric | M | 1-50 | City associated with the billing address. | | payer.billing\_ address.postal\_ code | string | alphanumeric | M | 1-50 | Postal code of the billing address. | | payer.billing\_ address.state | string | ISO 3166-2 | C | | State or region of the billing address. Format: ISO 3166-2 minus the country code itself. For example: US Illinois = IL For Great Britain counties: Wiltshire = WI, Aberdeenshire = ABD | | payer.billing\_ address.country | string | ISO-3166-1 | M | | Country code of the billing address in ISO-3166-1 (alpha-2 code) format. | | payer.address\_ match\_indicator | string | boolean | O | | Indicates whether the shipping address matches the billing address. Allowable values: **YES** **NO** | | order.amount | string | integer | M | 1-50 | Amount to transfer between payer and merchant for a SALE. Always represented in the lowest denomination of the related currency. | | order.currency | string | ISO-4217 | M | | Currency of the amount in ISO-4217 (alpha-3) format. | | order.reference | string | alphanumeric | O | 1-50 | Merchant-defined field to reference the order. | | order.transaction\_ configuration. channel | string | enum | O | | Describes whether the transaction was processed in a customer-present (CP) or customer-not-present (CNP) scenario. | | order.transaction\_ configuration. country | string | ISO-3166-1 | O | | Country code in ISO-3166-1 (alpha-2 code) format. minLength: 2 maxLength: 2 | | order.transaction\_ configuration. capture\_ mode | string | enum | O | | Indicates whether the transaction is to be captured automatically, later, or later using more than one partial capture. Allowed values: **AUTO** - If a transaction is authorized, funds will exchange between the payer and merchant automatically and as soon as possible. **LATER** - If a transaction is authorized, funds will not exchange between the payer and merchant automatically and will require a subsequent separate action to capture that transaction and start the funding process. Only one successful capture is permitted. **MULTIPLE** - If a transaction is authorized, funds will not exchange between the payer and merchant automatically. One or more subsequent separate capture actions are required to capture that transaction in parts and start the funding process for the part captured. One or many successful captures are permitted once the total amount captured is within a range of the original authorized amount. | | order.transaction\_ configuration.currency\_ conversion\_ mode | string | boolean | O | | Determines whether DCC is activated. Allowable values: **YES** **NO** | | order.transaction\_ configuration.allowed\_ payment\_ methods | string | alphanumeric | O | 1-50 | Indicates which payment method(s) to offer the customer, or route customers to a specific one. For example: cards\|paypal\|sofort | | order.payment\_ method\_ configuration. authentication.preference | string | enum | O | | Indicates whether a challenge is requested for this transaction. The Issuer may override whatever preference is specified in this field. For allowed values, see [Authentications](https://developer.globalpayments.com/api/authentications.md#/For%203DS%202,%20submit%20data%20including%20the%20billing%20and%20shipping%20details%20of%20the%20payer,%20at%20least%20one%20phone%20number,%20the%20device%20data,%20transaction%20details,%20outcome%20from%20the%20ACS%20Method%20URL%20if%20it%20took%20place%20and%20a%20link%20to%20the%20merchant's%20About%20or%20Contact%20page./initiate3DS_request_preference) in the API Explorer. | | order.payment\_ method\_configuration. apm.shipping\_ address\_enabled | string | boolean | O | | Determines whether the passing of PayPal shipping address details will be activated or not. Allowable values: **YES** **NO** | | order.payment\_ method\_configuration. apm.address\_ override | string | boolean | O | | Determines whether the shipping address can be changed by the customer on the PayPal review page. Allowable values: **YES** **NO** | | order.payment\_ method\_configuration. storage\_mode | string | enum | O | | Indicates whether to store the card as part of a transaction. Allowed values: **ALWAYS** - Card information is always stored irrespective of whether the payment method authorization was successful. **PROMPT** - Displays a checkbox on the HPP to confirm with the payer to store their card. | | order.shipping\_ address.line\_1 | string | alphanumeric | O | 1-50 | First line of the shipping address. | | order.shipping\_ address.line\_2 | string | alphanumeric | O | 1-50 | Second line of the shipping address. | | order.shipping\_ address.line\_3 | string | alphanumeric | O | 1-50 | Third line of the shipping address. | | order.shipping\_ address.city | string | alphanumeric | O | 1-50 | City associated with the shipping address. | | order.shipping\_ address.postal\_code | string | alphanumeric | O | 1-50 | Postal code of the shipping address. | | order.shipping\_ address.country | string | ISO-3166-1 | O | | Country code in ISO-3166-1 (alpha-2 code) format. | | order.shipping\_ address.state | string | ISO-3166-2 | C | | State or region of the shipping address. Format: ISO 3166-2 minus the country code itself. For example: US Illinois = IL For Great Britain counties: Wiltshire = WI, Aberdeenshire = ABD | | order.shipping\_ phone.country\_code | string | ISO-3166-1 | O | | Country code of the shipping address in ISO-3166-1 (alpha-2 code) format. | | order.shipping\_ phone.subscriber\_ number | string | numeric | O | 1-50 | Phone number associated with the shipping address. | | notifications.return\_url | string | Standard URL Format | O | | Merchant URL to return the payer to once they complete payment using the payment method. Returns control of the payer's payment flow to the merchant. The URL also receives the result of the transaction. | | notifications.status\_url | string | Standard URL Format | O | | Indicates to us where the merchant wants to receive notifications of certain events that occur on our system. For HPP, this is only used when processing APM transactions. | ## Integration references To get a deeper understanding the HPP, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Payment link integration can be completed via our JAVA, PHP, and .NET SDKs. ### [Quickstart Demo](https://demo.globalpay.com/merchants/hosted-payment-page) Demo how easy it is to integrate our customizable solutions into your existing payment experience, and view transactions from multiple channels and regions in one place. ## Testing the HPP Our HPP solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Below are value-added services you can enable for the HPP. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md#hpp) Tokenize card details to charge customers later. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md#hpp) Integrate with alternative and local payment methods. ### [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md#hpp) Let international customers pay in their home currency. # Hosted Payment Page Customization Source: https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-customization.md Section: Payments Description: Use our templates to find a design that fits best for your experience We built the Hosted Payment Page (HPP) so that you can easily customize it to maintain the design of your website or application. You can use our templates to provide different styles for desktop, tablet, and mobile devices. Templates can also be applied at a sub-account level, allowing you to easily choose which one you want to display to the customer. The HPP will automatically render the correct template depending on what device your customer is using. When sending us a template, be sure to match the criteria in the guidelines below. If you don't provide a template, the HPP will display a standard device-optimized version. ## How to use our templates Templates allow you to dramatically change the HPP display through simple changes in the cascading style sheet (CSS). Whether you're using the HPP to take payment for an online store on desktop/mobile or displaying it in-app, templates provide a seamless visual transition throughout the user journey and overall experience. Let's take a simple example. This is the standard desktop HPP with no customization. ![Standard HPP payment form](https://developer.globalpayments.com/gh-assets/hpp_desktop.png) **Standard Desktop HPP Example** In the samples below, you'll see the HPP with some simple CSS changes applied. Note how we retained only the core elements of the payment form, plus the security and trust information. We've reduced the width of each input field and brought all the form elements closer together. We can easily load this form into an iFrame, for example, to embed it into a checkout page. We've created three templates to get you started on customizing the HPP. Simply download the most appropriate template to your project, modify the CSS to your needs, and then send it to your account manager to test it. ## Sample template #1 ![HPP template #1](https://developer.globalpayments.com/gh-assets/hpp_template_1.png) [Download File](https://developer.globalpayments.com/gh-assets/files/hpp_template-1.zip) ## Sample template #2 ![HPP template #2](https://developer.globalpayments.com/gh-assets/hpp_template_2.png) [Download File](https://developer.globalpayments.com/gh-assets/files/hpp_template-2.zip) ## Sample template #3 ![HPP template #3](https://developer.globalpayments.com/gh-assets/hpp_template_3.png) [Download File](https://developer.globalpayments.com/gh-assets/files/hpp_template-3.zip) ## Sample CSS ```css /*----------------- MAIN CONTAINER -----------------*/ .portfolio-realex { background: white; max-width: 435px; } /*----------------- HEADER -----------------*/ /* This hides the entire header - that includes the breadcrumb and the title */ #rxp-header { display: none; } /* this is a div that contains the loading animation */ #info-box-footer { display: none; } /*----------------- FORM -----------------*/ /* main wrapper around elements */ .panel { border-color: white; box-shadow: 0 1px 1px white; } /* this is the same div as "panel" but the ID is specific to the payment form */ #another-card-section { background: white; } /* wrapper around the payment form */ #rpx-another-card { background: white; } /*----------------- CARD MANAGEMENT -----------------*/ /* Heading "pay with a saved card" and "pay with another card*/ #hpp-accordion .panel-heading { background-color: white; } #panelPayWithSavedCard { width: 94%; margin-left: 3%; } /*----------------- BUTTON -----------------*/ /* this is the box around the button */ #main-btn-box { width: 94%; margin-left: 3%; } /* this is the actual button */ #main-btn-box .btn-hpp-a { font-size: 1.25em; background-color: #0099cc; font-weight: 100; } /*----------------- FOOTER -----------------*/ /* this is for the entire footer */ #rxp-footer { background-color: white; padding: 0 0 0 8px; margin-left: 2%; } /* This is to hide logo */ #rxp-footer .text-right { display: none; } ``` ## Desktop and tablet templates ### Guidelines The basic structure of a template is shown below. Note the HTML tag that indicates where the payment form should be placed; this tag must be present in your template. Your template can be set up to resemble the rest of your customer journey. A typical template may consist of the following: * A header image * A plaintext message for the customer * The required `` tag Simply using the general color scheme of your application or store can be highly effective. * Below are the full requirements for the template page: * The template must be written in valid, semantic HTML. You can validate your HTML at the following URL: http://validator.w3.org/ **Note:** You should validate your HTML before inserting the `` into your form as this tag will cause the HTML to fail validation. * Template pages must contain the payment form tag ``. * All images or CSS used in the template must be referred to locally on our server; no absolute URLs to external images or CSS. You'll need to include the image files along with the template page. * All resources used by the desktop template (CSS, images) should be placed in a folder called **desktopresources**. The subfolder structure within this folder is your choice. * No scripting of any kind in the template for security reasons. It should contain only basic HTML. * The filename must be **desktop.html**. This file and accompanying folders should be compressed before sending to us. * Only HTML, CSS, JPG, PNG, and GIF files are permitted. * Maximum size of an individual file is 262 KB. #### Format ```xml My Title
``` ## Mobile templates ### Guidelines The HPP can detect and render a mobile-aware template based on the customer's device. The same rules apply for mobile-aware templates in terms of permitted file types and external links. There is also an additional tag to be placed in the `` of your HTML page for mobile-aware templates to ensure that the payment form renders correctly. This tag will ensure that the payment form will display to the correct scale of the device your customer is using: ```xml ``` The requirements for mobile-aware templates are as follows: * Mobile-aware templates should include the tag: `` within the `` of the template. * The template must be written in valid, semantic HTML. You can validate your HTML at the following URL: http://validator.w3.org/ ++Note++: You should validate your HTML before inserting the into your form as this tag will cause the HTML to fail validation. * Template pages must contain the payment form tag ``. * All images or CSS used in the template must be referred locally on our server; no absolute URLs to external images or CSS. You'll need to include the image files along with the template page. * All resources used by the mobile template (CSS, images) should be placed in a folder called **mobileresources**. The subfolder structure within this folder is your choice. * No scripting of any kind in the template for security reasons. It should contain only basic HTML. * The filename must be **mobile.html**. This file and accompanying folders should be compressed before sending to us. * Only HTML, CSS, JPG, PNG and GIF files are permitted. * The maximum size of an individual file is 262 KB. ### Format ```xml Your title
``` ## Enhance your solution Explore more functionality to enrich your application. ### [Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md) ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) ### [Fraud Management](https://developer.globalpayments.com/docs/risk-management/fraud-management/overview.md) # Hosted Fields - Overview Source: https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md Section: Payments Description: Use tokenization for maximum customization of your payment page. Hosted Fields provide the most flexibility to the checkout experience while still adhering to the minimum PCI DSS requirements. Hosted Fields are prebuilt but customizable fields that accept customer card data, from which a single-use token is created to use as payment instead of the sensitive data. The token can then be stored so that the non-sensitive data can be reused, making future purchases easier for your customers. Hosted Fields are ideal for capturing card details at any point in the checkout process, driving a customer flow that is unique to your needs. For example, you can accept an email address, billing and shipping details, a discount code, or whatever custom information you require from your customer. When it comes to customization, you’re really only limited to the token’s expiration setting and whatever you can capture within that time frame. For merchants, the benefits of Hosted Fields include: * Simplest level of PCI DSS compliance: SAQ A * Prebuilt payment fields in iFrames as you need them for your checkout page * Secured fields to collect other customer details to enhance the checkout experience * Built-in input validation of payment fields * Seamless integration with desktop and mobile devices (both iOS and Android apps) * Cross-channel secure payment acceptance and customer identification Here's an example of a fictitious company's checkout page using our prebuilt payment fields. ![Alt text: An example of a payment page called HomeMerchant built with hosted fields.](https://developer.globalpayments.com/gh-assets/hosted-fields_example.png) ## Use cases In this section, we present some “real world” examples that can be enabled through our Hosted Fields solution. Keep in mind that this section doesn’t cover all of the use cases. ##### Use case #1: Secure A large corporation wants to ensure that they are processing their transactions in a secure environment that is also PCI DSS compliant. Integrating with Hosted Fields means that sensitive card information is captured directly by us instead of their own website. ##### Use case #2: Customizable A well-known airline wants the ability to customize the payment form to match the UI of their site to keep it familiar to the customer. Integrating with Hosted Fields means that the airline will have full control over the styling and placement of the individual fields in the payment form. ##### Use case #3: Support A large online store wants to improve the efficiency of their customer support. With Hosted Fields, requests and responses are shared between the merchant and us. Most of these logs are available to support members, meaning that issues can be identified and investigated accordingly between the two parties. ## Product information ##### What you get with Hosted Fields * Prebuilt input fields * Customizable card form * PCI DSS (SAQ A) ##### What you can add to Hosted Fields * Card Storage * Payer Storage * Digital Wallets * Dynamic Currency Conversion ##### Integration options * JavaScript Library * SDK or API ##### Regions where you can use Hosted Fields * Europe * Asia-Pacific * Middle East * North America * Latin America * Africa ## How do they work? When a customer submits the payment form, we create a single-use, or time-limited, token to represent the sensitive data (it expires after 30 minutes). This token can then be used in requests to take payments and authenticate via 3D Secure. Once converted to multiple-use, the token can store non-sensitive card data (that is, no security code) and any additional customer details for subsequent purchases. This single-use token is different from an access token, which we require for all requests and has a configurable expiration limit. A new access token with the required permissions must be created when performing a payment request or authentication. At a high level, Hosted Fields work like this: ![Diagram flow of how Hosted Fields works at a high level.](https://developer.globalpayments.com/gh-assets/hosted-fields_flow.png) **Hosted Fields Typical Flow** ## Next steps To try Hosted Fields, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/payments/online/hosted-fields-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Hosted Fields - Guide Source: https://developer.globalpayments.com/docs/payments/online/hosted-fields-guide.md Section: Payments Description: Learn how to use tokens to customize your payment form. This guide focuses on how to use tokenization to create a highly customized payment page for your website or application. First, we create an access token, which contains the allowable actions for your integration. Next, we set up Hosted Fields for your payment form, including generating a single-use token, which we then use to process a Create Transaction request and can later store by changing the usage mode. Finally, we provide sample CSS code to customize your page, including custom fonts. For an overview of Hosted Fields, see our [Overview](https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md) page. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) ## Step 1: Create a single permission access token First need to create an access token. This is required to execute any API requests and contains the actions that are permitted for your app, including creating single-use tokens. For added security and integrity, you need to create one access token for each user session. This access token must only contain the single permission to create a single-use payment token and its 'time to expire' must be set to '10 minutes'. Additionally, you can create a `restricted_token` to mask fields returned from the Create Payment Methods response. Although no sensitive information is returned in the response, restricted access tokens ensure that information pertaining to your account will not be visible in the browser. The request below requires an `appid`, `nonce` and `secret`. Our guide on [creating an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) shows how to get these values. ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "app_id": "{{appid}}", "secret": "{{secret - from step 3 on create an access token link above}}", "grant_type": "client_credentials", "nonce": "{{nonce - from step 2 on create an access token link above}}", "interval_to_expire": "10_MINUTES", "restricted_token": "YES", "permissions": [ "PMT_POST_Create_Single" ] }' ``` When passing the `restricted_token` field, the response returned from the JavaScript library for the tokenization request will be masked. ```json { "token": "GZ9nUu2zK9RAFo6rRcAFckaNUBGl", "type": "Bearer", "scope": { "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "accounts": [ { "id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8", "name": "tokenization", "permissions": [ "PMT_POST_Create_Single" ] } ] }, "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test", "time_created": "2024-12-20T13:01:16.632Z", "seconds_to_expire": 599, "interval_to_expire": "10_MINUTES", "email": "firstname.lastname@email.com" } ``` ## Step 2: Set up payment form Once you’ve created the access token, you can now generate the Hosted Fields for your payment form and generate a single-use payment token. Our Hosted Fields integration allows you to use your own existing payment form while lowering your PCI Compliance overhead. To achieve this, the card data elements of your form will be replaced by the Hosted Fields, including: Card Number, Expiry Date, Security Code (CVV), and Cardholder Name. > The Hosted Fields setup example in this section assumes that you already have a payment form. ```xml

Payment Details

``` In the example shown, it’s assumed that your payment form has the following field IDs: * card-number * card-expiration * card-cvv * card-holder-name ![](https://developer.globalpayments.com/gh-assets/payment_form.png) ## Step 3: Add Hosted Fields Once you have the base of a payment form with the field IDs, we can target these IDs to place the Hosted Fields to the appropriate form fields. To do this you will invoke the JavaScript Library and add it to your application. Add the below script tag to access the JavaScript Library: ```javascript ``` The below example shows how to use our JavaScript Library to target the payment fields and convert them to Hosted Fields. The field object is contained in `GlobalPayments.ui.form`. This has the field configurations, including the target ID. ```javascript
...
``` After you have specified where the Hosted Fields will be placed, when the JavaScript initializes, the fields will render and be displayed on your payment form. ![](https://developer.globalpayments.com/gh-assets/hosted_fields.png) ## Step 4: Configure environment Continue setting up the form by configuring the environment and passing the access token created in the previous step. Once the JavaScript is successful in initializing the Hosted Fields, the input fields will be rendered in your payment form. The below configuration within `GlobalPayments.configure` is the minimum required to enable Hosted Fields. However, this [table](#allowable-configurations) contains all allowable configurations. ```javascript
...
``` The registration of the card number and card fields is confirmed: ![](https://developer.globalpayments.com/gh-assets/hosted-fields_card-reg.png) ## [Optional] Add styling Hosted Fields are easily customized to maintain the design of your website or application using CSS. The Hosted Fields example below was customized using the following CSS. > When applying styling to our JavaScript, the CSS must be in JSON format. ```css
...
``` ![](https://developer.globalpayments.com/gh-assets/form_styling.png) ## [Optional] Add custom fonts You can also add custom fonts to your Hosted Fields integration. By default, Hosted Fields uses the GP-Font. However, if your business requires custom fonts, you can do so through the JavaScript Library by following the font-face CSS rule. ```css
...
``` ## Step 5: Generate the payment token Once the JavaScript is successful in initializing the Hosted Fields, the input fields will be rendered on your payment form. When the cardholder enters their card details and submits the form, a single-use payment token (`PMT_ID`) is returned. You can append this payment token as a hidden field and pass it to the server side to process a transaction using it. ```javascript
...
``` Use [test cards](https://developer.globalpayments.com/resources/test-cards.md) to fill in the card details. ![](https://developer.globalpayments.com/gh-assets/form_styling_filled.png) Click **Submit** to see the PMT response: ```JSON { details: { account_id: "TKA_8dd84277223440cia420745c7f5b1c81", accountName: "tokenisation", cardBin: "426397", cardholderName: "Jane smith", cardLast4: "5262", cardNumber: "426397******5262", cardSecurityCode: true, cardType: "visa", expiryMonth: "10", expiryYear: "2026", merchantId: "MER_2584caaa4b5b4f77a90e7f2582ef53dd", merchantName: "jasonbajariastest", reference: "b1b9dc2a-dc7c-11c0-3c6e-bafe17d36628" }, paymentReference: "PMT_96065232-83c3-4e1f-969a-c594c6de8f7e" } ``` ## Step 6: Charging the payment token > Before you can charge the payment token, you will first need to [create a new access token with permissions](https://developer.globalpayments.com/docs/getting-started/generate-token.md) to process a transaction. To charge the single-use token, you will need to process a Create Transaction request. Instead of submitting the customer’s card information in the request, you can simply pass the payment token. This single-use token expires after 30 minutes. You can also assign a reference number to the payment transaction to help reconcile it later. For more information, see [Transactions](https://developer.globalpayments.com/api/transactions.md) in the API Explorer. > If 3D Secure 2 Strong Customer Authentication is part of your integration, see [Browser Authentication for 3D Secure](https://developer.globalpayments.com/docs/browser-auth-3DS#single-use-token) for steps and code samples. Copy `PMT_ID` (`paymentReference`) from the PMT response (generated in Step 4) and paste it into the transaction request. ```JSON { "account_name": "{{acc_name}}", "channel": "CNP", "capture_mode":"AUTO", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "{{reference}}", "country": "IE", "payment_method": { "name": "Jane", "entry_mode": "ECOM", "id": "PMT_3f94e565-99a0-4cbf-9a32-aad3e19034df" } } ``` Send this request to see a response like the below. ```JSON { "id": "TRN_fE2jAsiNCCQ3NzTOE71Qt8OCHSiDNE_39194581", "time_created": "2024-09-04T15:39:29.765Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_2584caaa4b5b4f77a90e7f2582ef53dd", "merchant_name": "jasonbajariastest", "account_id": "TRA_f1300075c09246428aaf06d159b3f4f9", "account_name": "transaction_processing_2", "reference": "39194581", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "123456", "brand_reference": "cjEx3A2v00X4hZvR", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1432801", "action": { "id": "ACT_fE2jAsiNCCQ3NzTOE71Qt8OCHSiDNE", "type": "AUTHORIZE", "time_created": "2024-09-04T15:39:29.765Z", "result_code": "SUCCESS", "app_id": "O25QaOrOlCkGRLs7OUtPzhzocF1bGoyS", "app_name": "jason_baj_test_2" } } ``` #### Allowable configurations | Field Name | Allowable Value | Description | | -------- | ------- | ------- | | accessToken | string | An access token created for an application. | | accountName | string | The tokenization account name for the given merchant account. Required only if there is more than one tokenization account associated with the merchant account. | | apiVersion | string | The target API version. Default is *2021-03-22*. | | reference | string | The reference for the tokenization request. If not provided, a globally unique identifier (GUID) is created and sent in the request. | | enableAutocomplete | boolean | Enables autocomplete/autofill features. Default is *false*. | | language | string | Value for the HTML element's *lang* attribute within the iFrames and dictates the language used to display on Hosted Fields. Default is *en*. | | enableTwoDigitExpirationYear | boolean | Changes the placeholder of the expiry year to two digits (YY). Applicable only if using the default placeholder. | | enableCardFingerPrinting | boolean | Enables the use of the fingerprint mode with the *ALWAYS* value. | | requireCardHolderName | boolean | Enables the cardholder name field to be mandatory. | | fieldValidation.enabled | boolean | Enables the display of a validation message for user input on the card form. | | fieldValidation.characterValidation | string | Configuration for the validation used on the Cardholder Name field. | | allowedCardTypes | array; string | Configuration to allow specific card types on Hosted Fields. | #### Event handlers | Event | Description | | -------- | ------- | | cardForm.on("card-number-test", (resp)); | Returns an event with a validity of the card number entered. Returns *true* or *false*. | | cardForm.on("card-expiration-test", (resp)); | Returns an event with a validity of the expiration date entered. Returns *true* or *false*. | | cardForm.on("card-cvv-test", (resp)); | Returns an event with a validity of the CVV/CVC entered. Returns *true* or *false*. | | cardForm.on("card-type", (resp)); | Returns the card type entered in the Card Number field. Returns *visa*, *mastercard*, *amex*, *diners*, *discover*, *jcb*, or *unknown*. | | cardForm.on("submit", "click", (resp)); | Returns a click event to indicate that the Submit button was clicked. | ## Integration references To get a deeper understanding of Hosted Fields, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). To get a deeper understanding of this product, we’ve provided some references for both API and SDK integrations. ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Payment link integration can be completed via our JAVA, PHP and .NET SDKs. ### [Quickstart Demo](https://demo.globalpay.com/merchants/hosted-fields) Demo how easy it is to integrate our customizable solutions into your existing payment experience, and view transactions from multiple channels and regions in one place. ## Testing Hosted Fields Our Hosted Fields solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Below are value-added services that you can enable for Hosted Fields. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md#api) Tokenize card details to charge customers later. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md#hpp) Integrate with alternative and local payment methods. ### [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md#hpp) Let international customers pay in their home currency. # Drop-In UI - Overview Source: https://developer.globalpayments.com/docs/payments/online/drop-in-ui-overview.md Section: Payments Description: Use prebuilt UI components to enhance your payment page Drop-In UI provides the most flexibility when it comes to customizing the checkout experience. Similar to our prebuilt Hosted Fields solution, our prebuilt Drop-In user interface (UI) components are also customizable but allow you to enhance the payment form with different styles and themes, multiple payment methods, as well as the many services we offer merchants. If you need to control more than just the individual input fields that Hosted Fields offer (that is, alter placement), Drop-In UI is the better solution. Some of the various options available for Drop-UI include card components, Google Pay, Apple Pay, Open Banking, Buy Now Pay Later (BNPL), and QR code payments (Asia Pacific region only). For merchants, the benefits of Drop-In UI include: * Simplest level of PCI DSS compliance: SAQ A * Pre-built and customizable UI components * Built-in input validation of payment fields * Seamless integration with desktop and mobile devices (both iOS and Android apps) * Cross-channel secure payment acceptance and customer identification * Payment method options, such as Google Pay, Apple Pay, BNPL, Open Banking, and more In this example, Drop-In UI was used to create a fictitious merchant’s payment page. ![Alt text: An example of a payment form for Le Mode Chic built using Drop-In UI.](https://developer.globalpayments.com/gh-assets/drop-in-ui_example.png) **Drop-In UI Example** ## Use cases In this section, we present some “real world” examples that can be enabled through our Drop-In UI solution. Keep in mind that this section doesn’t cover all of the use cases. ##### Use case #1: Secure environment A large corporation wants to ensure that they are processing their transactions in a secure environment that is also PCI DSS compliant. Integrating with Drop-In UI means that sensitive card information is captured directly by us instead of their own website. ##### Use case #2: Single platform for payments A school wants to offer students and families a platform where all school-related updates can be shared. Additionally, they want any payments for trips, supplies, and classes to all be accepted through a payment form on the platform. Integrating with Drop-In UI means that they can style the prebuilt form to have an educational theme and also pick which payment methods to offer. ##### Use case #3: Shared customer support A large online store wants to improve the efficiency of their customer support. With Drop-In UI, requests and responses are shared between the merchant and our API. Most of these logs are available to support members, meaning that issues can be identified and investigated accordingly between the two parties. ## Product information ##### What you get with Drop-In UI * Prebuilt UI components * Payment method options * PCI DSS (SAQ A) ##### What you can add to Drop-In UI * Card Storage * Payer Storage * Digital Wallets * Dynamic Currency Conversion ##### Integration options * JavaScript Library * SDK or API ##### Regions where you can use Drop-In UI * Europe * Asia-Pacific * Middle East * North America * Latin America * Africa ## How does it work? When a customer submits the payment form, we create a single-use, or time-limited, token to represent the sensitive data (it expires after 30 minutes). This token can then be used in requests to take payments and authenticate via 3D Secure. Once converted to multiple-use, the token can store non-sensitive card data (that is, no security code) and any additional customer details for subsequent purchases. This single-use token is different from an access token, which we require for all requests and has a configurable expiration limit. A new access token with the required permissions must be created when performing a payment request or authentication. At a high level, Drop-In UI works like this: ![Diagram flow of how Drop-In UI works at a high level.](https://developer.globalpayments.com/gh-assets/drop-in-ui_flow.png) **Drop-In UI Typical Flow** ## Next steps To try Drop-In UI, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/payments/online/drop-in-ui-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Drop-In UI - Guide Source: https://developer.globalpayments.com/docs/payments/online/drop-in-ui-guide.md Section: Payments Description: Learn how to integrate our prebuilt payment form This guide focuses on how to use tokenization to create a highly customized payment page for your website or application. First, we set up the payment form and decide where to put the placeholder for the Drop-In UI. After creating a single-use payment token, we then use the JavaScript Library to target the ID and render the payment form. After configuring the environment, we then generate and charge the payment token. For more information on Drop-In UI, see our [Overview](https://developer.globalpayments.com/docs/payments/online/drop-in-ui-overview.md) page. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) ## Step 1: Create a single permission access token First need to create an access token. This is required to execute any API requests and contains the actions that are permitted for your app, including creating single-use tokens. For added security and integrity, you need to create one access token for each user session. This access token must only contain the single permission to create a single-use payment token and its 'time to expire' must be set to '10 minutes'. Additionally, you can create a `restricted_token` to mask fields returned from the Create Payment Methods response. Although no sensitive information is returned in the response, restricted access tokens ensure that information pertaining to your account will not be visible in the browser. The request below requires an `appid`, `nonce` and `secret`. Our guide on [creating an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) shows how to get these values. ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "app_id": "{{appid}}", "secret": "{{secret - from step 3 on create an access token link above}}", "grant_type": "client_credentials", "nonce": "{{nonce - from step 2 on create an access token link above}}", "interval_to_expire": "10_MINUTES", "restricted_token": "YES", "permissions": [ "PMT_POST_Create_Single" ] }' ``` When passing the `restricted_token` field, the response returned from the JavaScript library for the tokenization request will be masked. ```json { "token": "GZ9nUu2zK9RAFo6rRcAFckaNUBGl", "type": "Bearer", "scope": { "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "accounts": [ { "id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8", "name": "tokenization", "permissions": [ "PMT_POST_Create_Single" ] } ] }, "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test", "time_created": "2024-12-20T13:01:16.632Z", "seconds_to_expire": 599, "interval_to_expire": "10_MINUTES", "email": "jordan.forde@globalpay.com" } ``` ## Step 2: Set up payment form Once you’ve created the access token, you can now generate the Drop-In UI for your payment form hosted by us and generate a single-use payment token. We provide a placeholder for where you want the payment form to render. ```xml
``` ## Step 3: Add Drop-In UI After adding the provided placeholder to determine where you want the payment form, it’s time to place the Drop-In UI. In this example, we use our JavaScript Library to target the ID and render the payment form. > `` ```javascript const cardForm = GlobalPayments.creditCard.form("#credit-card-form", { style: "gp-default" }); ``` When the JavaScript initializes, the Drop-In UI will render and be displayed on your website or application. ![](https://developer.globalpayments.com/gh-assets/gp-default_dropinui.png) ## Step 4: Configure the environment Continue setting up the form by configuring the environment and passing the access token created in the previous step. Once the JavaScript is successful in initializing the Drop-In UI, the payment form will be rendered on your website or application. The below configuration within `GlobalPayments.configure` is the minimum required to enable Drop-In UI. However, this table contains all allowable configurations. ```javascript
...
``` ### Display Order Information Order Information gives a breakdown of the Merchant name, Amount and the Order Reference. This information will be displayed above the card form. The Order information can be hidden using the enabled field by setting `enabled = false`. ```javascript orderInformation: { merchantName: "Test Merchant Name", orderTotalAmount: "84.90", orderReference: "XXXX12345", currencyCode: "USD", } ``` ![Drop-In UI with Order Information](https://developer.globalpayments.com/gh-assets/drop-in_ui-order.png) **Drop-in UI with Order Information** Registration of card number and card fields confirmed: ![Confirmation message of the card number and card fields.](https://developer.globalpayments.com/gh-assets/drop-in-ui_reg-confirm.png) ## Step 5: Generate the payment token Once the JavaScript is successful in initializing the Drop-In UI, the payment form will be rendered. When the cardholder enters their card details and submits the form, a single-use payment token (`PMT_ID`) is returned. You can append this payment token as a hidden field and pass it to the server side to process a transaction using it. ```javascript
...
``` To fill in the card details, use our [test cards](https://developer.globalpayments.com/resources/test-cards.md). ![](https://developer.globalpayments.com/gh-assets/gp-default_dropinui_details.png) Click Submit to see the PMT response. ```JSON { details: { account_id: "TKA_8dd84277223440cia420745c7f5b1c81", accountName: "tokenisation", cardBin: "426397", cardholderName: "Jane smith", cardLast4: "5262", cardNumber: "426397******5262", cardSecurityCode: true, cardType: "visa", expiryMonth: "10", expiryYear: "2026", merchantId: "MER_2584caaa4b5b4f77a90e7f2582ef53dd", merchantName: "jasonbajariastest", reference: "b1b9dc2a-dc7c-11c0-3c6e-bafe17d36628" }, paymentReference: "PMT_96065232-83c3-4e1f-969a-c594c6de8f7e" } ``` ## Step 6: Charge the payment token > Before you can charge the payment token, you first need to [create a new access token with permissions](https://developer.globalpayments.com/docs/getting-started/generate-token.md) to process a transaction. To charge the single-use token, you need to process a Create Transaction request. Instead of submitting the customer’s card information in the request, you can simply pass the payment token. This single-use token expires after 30 minutes. You can also assign a reference number to the payment transaction to help reconcile it later. For more information, see [Transactions](https://developer.globalpayments.com/api/transactions.md) in the API Explorer. > If 3D Secure Strong Customer Authentication is part of your integration, see [Browser Authentication for 3D Secure](https://developer.globalpayments.com/docs/browser-auth-3DS#single-use-token) for step by step instructions. Copy `PMT_ID` (`paymentReference`) from the PMT response (generated in Step 4) and paste it into the transaction request. ```JSON { "account_name": "{{acc_name}}", "channel": "CNP", "capture_mode":"AUTO", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "{{reference}}", "country": "IE", "payment_method": { "name": "Jane", "entry_mode": "ECOM", "id": "PMT_3f94e565-99a0-4cbf-9a32-aad3e19034df" } } ``` Send the request to see a response like the below. ```JSON { "id": "TRN_fE2jAsiNCCQ3NzTOE71Qt8OCHSiDNE_39194581", "time_created": "2024-09-04T15:39:29.765Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_2584caaa4b5b4f77a90e7f2582ef53dd", "merchant_name": "jasonbajariastest", "account_id": "TRA_f1300075c09246428aaf06d159b3f4f9", "account_name": "transaction_processing_2", "reference": "39194581", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "123456", "brand_reference": "cjEx3A2v00X4hZvR", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1432801", "action": { "id": "ACT_fE2jAsiNCCQ3NzTOE71Qt8OCHSiDNE", "type": "AUTHORIZE", "time_created": "2024-09-04T15:39:29.765Z", "result_code": "SUCCESS", "app_id": "O25QaOrOlCkGRLs7OUtPzhzocF1bGoyS", "app_name": "jason_baj_test_2" } } ``` #### Allowable configurations | Field Name | Allowable Value | Description | | -------- | ------- | ------- | | accessToken | string | An access token created for an application. | | accountName | string | The tokenization account name for the given merchant account. Required only if there is more than one tokenization account associated with the merchant account. | | apiVersion | string | The target API version. Default is *2021-03-22*. | | reference | string | The reference for the tokenization request. If not provided, a globally unique identifier (GUID) is created and sent in the request. | | enableAutocomplete | boolean | Enables autocomplete/autofill features. Default is *false*. | | language | string | Value for the HTML element's *lang* attribute within the iFrames and dictates the language used to display on Drop-In UI. Default is *en*. | | enableTwoDigitExpirationYear | boolean | Changes the placeholder of the expiry year to two digits (YY). Applicable only if using the default placeholder. | | enableCardFingerPrinting | boolean | Enables the use of the fingerprint mode with the *ALWAYS* value. | | requireCardHolderName | boolean | Enables the Cardholder Name field to be mandatory. | | fieldValidation.enabled | boolean | Enables the display of a validation message for user input on the card form. | | fieldValidation.characterValidation | string | Configuration for the validation used on the Cardholder Name field. | | allowedCardTypes | array; string | Configuration to allow specific card types on Drop-In UI. | | orderInformation | string | Configuration for the Order Information to display above the card form. | | merchantName | string | The name for the given merchant account. | | orderTotalAmount | int | The total order amount number. | | orderReference | string | The reference for the given transaction. | | currencyCode | string | The currency for the given transaction. | #### Event handlers | Event | Description | | -------- | ------- | | cardForm.on("card-number-test", (resp)); | Returns an event with a validity of the card number entered. Returns *true* or *false*. | | cardForm.on("card-expiration-test", (resp)); | Returns an event with a validity of the expiration date entered. Returns *true* or *false*. | | cardForm.on("card-cvv-test", (resp)); | Returns an event with a validity of the CVV/CVC entered. Returns *true* or *false*. | | cardForm.on("card-type", (resp)); | Returns the card type entered in the Card Number field. Returns *visa*, *mastercard*, *amex*, *diners*, *discover*, *jcb*, or *unknown*. | | cardForm.on("submit", "click", (resp)); | Returns a click event to indicate that the Submit button was clicked. | ## Integration references To get a deeper understanding of this product, we’ve provided some references for both API and SDK integrations. ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Integrate via our Java, PHP, or .NET SDKs. ### [Quickstart Demo](https://demo.globalpay.com/merchants/dropin-ui) Demo how easy it is to integrate our customizable solutions into your existing payment experience, and view transactions from multiple channels and regions in one place. ## Testing Drop-In UI Our Drop-In UI solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Below are value-added services you can enable for Drop-In UI. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md#api) Tokenize card details to charge customers later. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md#hpp) Integrate with alternative and local payment methods. ### [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md#hpp) Let international customers pay in their home currency. # Take payments online Source: https://developer.globalpayments.com/docs/payments/online/api-guide.md Section: Payments Description: Learn how to take your first payment using our API or an SDK This guide shows you the first step on the road to taking payments: a sale via API or an SDK. * To find out the full benefits and capabilities our API offers, see [Integration Options - API](https://developer.globalpayments.com/docs/integration-options/api.md). * For a list of our available SDKs, see [Integration Options - SDK](https://developer.globalpayments.com/docs/integration-options/sdk/overview). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Create a sale Complete a sale by setting `"type":"SALE"` and entering the `account_name`, `channel`, along with the necessary `payment_method` into the body of the request. See a sample request and expected response below. #### Sample request ```JSON curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer sj5MR6mPeAohEQamjhSsVbSMn1jG' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "account_name": "transaction_processing", "channel": "CNP", "capture_mode":"AUTO", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "14594501", "country": "IE", "payment_method": { "name": "Jane", "entry_mode": "ECOM", "card": { "number": "4242424242424242", "expiry_month": "12", "expiry_year": "30", "cvv":"123", "avs_address": "RD.asd'\''-'\'' 17'\''s Bogong", "avs_postal_code": "3699" } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(“AppId”); config.setAppKey(“AppKey”); config.setChannel(Channel.CardNotPresent); config.setCountry("IE"); config.setEnvironment(Environment.TEST); config.setEnableLogging(true); config.setRequestLogger(new RequestConsoleLogger()); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setNumber("4242424242424242"); card.setExpMonth(DateTime.now().getMonthOfYear()); card.setExpYear(DateTime.now().getYear() + 1); card.setCardHolderName("Jane"); Address address = new Address(); address.setStreetAddress1("RD.asd - 17's Bogong"); address.setPostalCode("3699"); try { Transaction response = card.charge(new BigDecimal("1.00")) .withCurrency("EUR") .withClientTransactionId("14594501") .withAddress(address) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchId = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "payment_method->card->brand_reference" String cardBrandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->avs_postal_code_result" String avsResponseCode = response.getAvsResponseCode(); // API raw response key "payment_method->card->->avs_address_result" String avsAddressResponse = response.getAvsAddressResponse(); // API raw response key "payment_method->card->cvv_result" String cvnResponseMessage = response.getCvnResponseMessage(); // API raw response key "payment_method->card->brand"(); String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); // API raw response key "payment_method->card->provider->cvv_result" String cardIssuerCvv = response.getCardIssuerResponse().getCvvResult(); // API raw response key "payment_method->card->provider->avs_address_result" String cardIssuerAvsAddressResult = response.getCardIssuerResponse().getAvsAddressResult(); // API raw response key "payment_method->card->provider->avs_postal_code_result" String cardIssuerAvsPostalCodeResult = response.getCardIssuerResponse().getAvsPostalCodeResult(); // API raw response key "risk_assessment->mode" String fraudResponseMode = response.getFraudFilterResponse().getFraudResponseMode(); // API raw response key "risk_assessment->result" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // API raw response key "risk_assessment->rules" List fraudResponseRules = response.getFraudFilterResponse().getFraudResponseRules(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST, Country = "IE" }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Number = "4242424242424242", ExpMonth = DateTime.Now.Month, ExpYear = DateTime.Now.Year + 1, Cvn = "123", CardHolderName = "Jane" }; Address address = new Address { StreetAddress1 = "RD.asd - 17's Bogong", PostalCode = "3699" }; try { Transaction response = card.Charge(1m) .WithCurrency("EUR") .WithClientTransactionId("14594501") .WithAddress(address) .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; //API raw response key "batch_id" var batchId = response.BatchSummary.BatchReference; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "action->result_code" var responseCode = response.ResponseCode; //API raw response key "payment_method->card->brand_reference" var cardBrandReference = response.CardBrandTransactionId; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "payment_method->card->avs_postal_code_result" var avsResponseCode = response.AvsResponseCode; //API raw response key "payment_method->card->->avs_address_result" var avsAddressResponse = response.AvsAddressResponse; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; //API raw response key "payment_method->card->provider->cvv_result" var cardIssuerCvv = response.CardIssuerResponse.CvvResult; //API raw response key "payment_method->card->provider->avs_address_result" var cardIssuerAvsAddressResult = response.CardIssuerResponse.AvsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" var cardIssuerAvsPostalCodeResult = response.CardIssuerResponse.AvsPostalCodeResult; //API raw response key "risk_assessment->mode" var fraudResponseMode = response.FraudFilterResponse.FraudResponseMode; //API raw response key "risk_assessment->result" var fraudResponseResult = response.FraudFilterResponse.FraudResponseResult; //API raw response key "risk_assessment->rules" var fraudResponseRules = response.FraudFilterResponse.FraudResponseRules; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = '4242424242424242'; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cardHolderName = 'Jane'; $address = new Address(); $address->streetAddress1 = "RD.asd - 17's Bogong"; $address->postalCode = "3699"; try { $response = $card->charge(1) ->withCurrency('EUR') ->withClientTransactionId('14594501') ->withAddress($address) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->avs_postal_code_result" $avsResponseCode = $response->avsResponseCode; //API raw response key "payment_method->card->->avs_address_result" $avsAddressResponse = $response->avsAddressResponse; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; ``` #### Sample response ```JSON { "id": "TRN_Cean1DAySpbCi5NiFvCZBbnvqW2IQX_14594501", "time_created": "2024-08-27T20:12:39.866Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "reference": "14594501", "payment_method": { "result": "00", "message": "(00)[ test system ] Authorised", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX4242", "authcode": "123456", "brand_reference": "0f6o3oGqQ5YI2NqC", "brand_time_created": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "risk_assessment": [ { "mode": "ACTIVE", "result": "ACCEPTED", "rules": [ { "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd", "description": "Cardholder Name Rule", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3", "description": "CardNumber block", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e", "description": "Amount test", "mode": "ACTIVE", "result": "ACCEPTED" } ] } ], "batch_id": "BAT_1429806", "action": { "id": "ACT_Cean1DAySpbCi5NiFvCZBbnvqW2IQX", "type": "AUTHORIZE", "time_created": "2024-08-27T20:12:39.866Z", "result_code": "SUCCESS", "app_id": "x8AWfOAkVt740if3ybt4Lr23TTzHFm7M", "app_name": "yourAppName" } } ``` ## Integration references To get a deeper understanding of this product, we’ve provided some references for both API and SDK integrations. ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [API /transactions](https://developer.globalpayments.com/api/transactions.md) Get the full transactions endpoint. ### [SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Complete transactions via our Java, PHP, NodeJS, or .NET SDKs. ## Testing your integration Our API integration is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Explore more functionality to enrich your application or website. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) Tokenize a card for future payments. ### [3D Secure](https://developer.globalpayments.com/docs/3DS-overview) Enhance security with stronger authentication for online payments. ### [Reporting](https://developer.globalpayments.com/docs/reporting/overview) Add real-time transactions and settlement reporting to your integration. # In-Store Payments Source: https://developer.globalpayments.com/docs/payments/in-store/overview.md Section: Payments Description: Explore our solutions for card-present transactions Merchants have many options when it comes to accepting card payments at the point of sale (POS) from customers who visit their place of business. This article first explains how this card-present process works — such as authorization flow, entry methods, and payer verification — and then covers the various integration solutions we offer to meet the needs of your POS application. ## What is POS? POS environments primarily include “brick and mortar” merchants who want to have their customers (that is, cardholders) pay by swiping an attached terminal device. Application developers who want to use our API to integrate card-present transaction processing into their existing POS application should integrate using our POS options. Our API uses a REST framework and is designed to connect payments from numerous regions, channels, and payment methods worldwide into a single integration. It’s ideally suited if you want to add in-store payments to your existing online integration, such as an app or website. (For more information on taking online payments, see [Online Payments](https://developer.globalpayments.com/docs/payments/online/overview).) ## What is _card present_? Customers have the option of paying with their card in person at a store (_card present_) or using their card remotely to pay via some type of technology (_card not present_). Our API, when implemented in a POS environment, creates a card-present environment, as defined below: * **Card present** – The card (and cardholder) is physically present during the transaction, such as an in-person sale. * **Card not present** – The card (and cardholder) is not physically present during the transaction, such as via a website or app, or by MOTO (mail order / telephone order). ### Authorization flow The outcome of each card-present authorization request is determined by the card issuer. The issuer analyzes the information in the request and either approves or declines. This information can include merchant location, merchant type/category, transaction amount, whether the card was present, how the payer was authenticated, and — if the card was present — other risk factors from the chip. The entire processing time should take no longer than 2–3 seconds, which speaks to the robustness of the payments ecosystem considering all of the entities involved in the transaction. For more information on the key players in the payments industry, see [Introduction to Payments](https://developer.globalpayments.com/docs/getting-started/new-to-payments/introduction.md) and our [Payments Glossary](https://developer.globalpayments.com/docs/getting-started/new-to-payments/glossary.md). At a high level, a typical payment authorization works like this: ![Diagram flow showing interaction between the cardholder, merchant, payment processor, and acquirer to authorize a payment.](https://developer.globalpayments.com/gh-assets/instore_auth-flow.png) **Payment Authorization Process** ### Entry methods Card data can be collected in different ways: * **Manually entered** – Merchants can key card data in cases where the card is damaged such that the chip or mag-stripe data can’t be read by the payment device. ++Note++: This is considered a card-not-present transaction. * **Swiped** – Card data is collected by a card reader device via the mag-stripe reader, returning the entire track or just track-1 or track-2 data. * **Chip insert** – Card data is collected by a card reader device via the chip reader, returning both track and chip data. * **Contactless chip** – Card data is collected by a payment device via the contactless/NFC proximity reader, returning both track and chip data. This interface not only supports NFC-enabled cards but also smartwatches, smartphones, and key fobs. To verify a cardholder’s identity, several types of security can be implemented, as described in the next section. ### Payer verification methods There are several payer verification methods that can be supported. We list them below from highest to lowest security: * **Online PIN/biometrics** – Debit and credit cards can be authenticated with biometrics or a PIN, which is encrypted and sent to the card issuer for verification. * **Offline PIN/biometrics** – Debit and credit cards can be authenticated with biometrics or a PIN, which is verified offline by the chip card data on the card. * **Signature** – Printed receipts can have a signature line that is intended to be signed by the payer and matched to the signature panel on the back of the card. * **No verification method** – High-value payers or low-value transactions typically don’t have any verification method. For example, unattended kiosks, vending machines, or payers flagged as having a special status (VIP) with their card issuer. The following factors determine the payer verification method: * Risk profile set within the chip card data from the card issuer * Physical capabilities of the card reader * Amount of the transaction ## Integration methods There are various types of integrations for you to choose from. One of these types of integrations should meet the needs of your POS application. We have solutions for each, which you can discuss with your account manager. The pros and cons of each integration are described in each section below. ### Standalone terminals Standalone terminals are an in-store method that integrates to our API but has no communication with your POS system. After consulting with an account manager, you purchase an off-the-shelf terminal that already runs a terminal application connected to our API. This will allow your business to quickly run credit card transactions with little additional training. No certifications are required on your end, but additional functionality is limited to what is already available on the terminal. | PROS | CONS | | -------- | ------- | |
  • No development work or certification required
  • Devices are provisioned and supported by us
  • Reduced scope from PCI PA-DSS since the payment card data only resides within the PCI PTS certified device
|
  • Limited to devices available through us
  • No flexibility of the payer experience and flows
  • No control over the device, screens, or messaging to the payer
  • No control over the transaction workflows
  • Can be specific to device/manufacturer
| ### Semi-integration Semi-integration is much easier from a time and effort perspective but is less flexible. This is our preferred integration method as it doesn’t require platform/gateway or EMV certifications, all of which can take a significant amount of time. Semi-integation also significantly reduces your PCI PA-DSS scope from your POS solution. | PROS | CONS | | -------- | ------- | |
  • Usually a quick and easy integration
  • Devices are provisioned and supported by us
  • Reduced scope from PCI PA-DSS since the payment card data only resides within the PCI PTS certified device
  • Platform/gateway certification not required
  • EMV certification not required, so neither is UL BTT software
|
  • Limited to devices available through us
  • Less flexibility of the payer experience and flows
  • No control over the device, screens, or messaging to the payer
  • Less control over the transaction workflows
  • Can be specific to device/manufacturer
| ### Cloud integration Cloud integrations are a subset of semi-integration since they use a semi-integrated capable device. Cloud integrations are typically used by integrators with browser or web-based solutions that can communicate only via a browser versus traditional “fat client” software running on a computer. With semi-integration, the POS application maintains a connection to the device via serial/USB or TCP/IP (Ethernet or WiFi). With cloud integration, the POS application is not physically connected to the device. The POS uses a cloud message routing service as does the terminal. Once the POS sends the transaction request to the cloud-routing service, the device performs the transaction and sends the results to the cloud routing service, which then sends the results back to the POS. | PROS | CONS | | -------- | ------- | |
  • Same pros as semi-integration, but integration efforts are much easier
  • Simple APIs using HTTP POST/GET commands
|
  • Same cons as semi-integration
  • Need a local connection to the device and a backup internet communication method if the internet connection goes down
| ### Full integration Full integration is the most demanding, but it also provides the most flexibility. You have full control over the payer experience and workflows. This type of integration requires a certification to our processing platform followed by EMV certifications in each processing region. In addition, you would be coding directly to a payment device to retrieve card/EMV data to send us for transaction processing. This gives you full control of what is displayed on the device, so you can add marketing images or videos and display or collect any additional information from the payer. Your POS solution needs to be PA-DSS compliant, as you’re in control of sensitive payment card data. | PROS | CONS | | -------- | ------- | |
  • Full flexibility of the payer experience and flows
  • Full control over the PCI PTS certified device choice and screens/messaging to the payer
  • Full control over the transaction workflows
|
  • Requires PCI PA-DSS approval
  • Requires certification to a processing platform or gateway
  • Requires EMV certifications by region
  • Requires UL BTT software ($10k+ or equivalent)
  • Time and cost intensive
  • Specific to device/manufacturer
| ## Next steps To get started with POS transactions, read more about our integration methods. ### [Standalone Terminals](https://developer.globalpayments.com/docs/payments/in-store/standalone.md) Purchase one of our POS terminals to connect to our API. ### [Cloud](https://developer.globalpayments.com/docs/payments/in-store/cloud.md) Integrate wirelessly with your POS device. ### [Semi Integration](https://developer.globalpayments.com/docs/payments/in-store/semi-integration.md) Connect your POS system to our API via a terminal. ### [Full Integration](https://developer.globalpayments.com/docs/payments/in-store/full-integration.md) Code directly for complete control of displays and workflows. # Standalone Terminals Source: https://developer.globalpayments.com/docs/payments/in-store/standalone.md Section: Payments Description: Use a standalone with our built-in payment app for a no-code integration For card-present transactions, using a standalone terminal purchased from us or one of our sales partners is the easiest in-store solution we offer and will get you up and running quickly. It comes with our Unified Payment Application (UPA) installed so that you can directly connect to our API, saving you the trouble of any code development. In fact, there aren’t any code samples for us to share here because no coding is needed. To compare standalone with our other types of integration like cloud, semi-, and full, see [In-Store Payments - Overview](https://developer.globalpayments.com/docs/payments/in-store/overview.md). > A standalone device will **not** connect to your point-of-sale (POS) application without further code development. ## What is a standalone terminal? _Standalone_ refers to an in-store terminal that integrates directly to our API but has no communication with your POS system. After purchasing one of our compatible terminals, either through us or from a partner, you’ll immediately be able to start running credit card transactions with little additional training. And there are no special platform/gateway certifications needed as the payment card data resides only within our already-certified compatible terminal. You’ll have everything you need to take payments, but you won’t be able to connect your POS system, customize the payment flow, or add any new functionality. If you want more flexibility to customize your terminal and don’t mind some coding, our API also supports [semi-integration](https://developer.globalpayments.com/docs/payments/in-store/semi-integration.md) and [full integration](https://developer.globalpayments.com/docs/payments/in-store/full-integration.md). ## What is UPA? UPA is our proprietary payment application for standalone terminals. It can be loaded on a variety of compatible terminals (see next section) for direct access to our API. At present, only UPA terminals are capable of attaching to our API service, bringing the power and features of the Unified Payments API to your business. ## Available terminals > UPA availability is region-specific. In order to determine whether a UPA terminal is available in your region, please contact your account manager for further details. # Cloud Integration Source: https://developer.globalpayments.com/docs/payments/in-store/cloud.md Section: Payments Description: Learn how to send commands directly to a device via our cloud service > Please check with your relationship or sales manager for availability and more details. This guide focuses on how to send commands to a point-of-sale (POS) device using our Unified Cloud Integration (UCI) solution. First, we initiate an instant transaction with a sale (Authorize) request. Optional steps include a restaurant scenario where we initiate orders and review open orders in our app. Finally, we review the outcome of the device command that was relayed to the device. You’ll also find decriptions of UCI [action types](#uci-action-types) and some answers to [common questions](#uci-common-questions) we get about our UCI product. ## Introduction Our UCI solution is a combination of our REST API, UCI service, and Android suite of POS terminals. Our API allows you to send basic retail and restaurant transaction commands — such as authorize, refund, adjust, reverse, pre-authorize, capture, batch close, and so forth — directly to a payment device. With this type of integration, you don’t need to physically connect your POS application to the payment device. UCI manages everything for you. That means no need to manage certifications, vendor specifications, or any additional software or SDKs. In addition to basic retail and restaurant device commands, you can also initiate orders such as a restaurant bill on devices. These orders are queued in our UCI service and are then distributed to each payment terminal within a merchant’s location. As payments are made, those orders are automatically updated on the device. Coupled with a payment terminal, this provides you with a full Pay at Table experience. ## How it works Each device is assigned a unique `device_reference` value. Device commands are sent to our API, specifying the `device_reference` to relay the command to. Every device command is assigned a Device Command ID (`DVC_Id`). This is your reference for each command that was relayed to a device and is your main source of reference for the outcome of that command. The outcome of the device command can be sent to a notification status URL that you specify in the request. Or, you can query our API using the `DVC_Id` to find the device command result. Payment transactions are also assigned a Transaction ID (`TRN_Id`). These can be referenced to perform secondary transactions such as reversals, captures, and so forth, as needed. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Initiate an instant transaction Instant transactions are most common in a retail environment and are represented within the `action_type` in the request. Valid action types include: * `Authorize` * `Refund` * `PreAuthorize` * `Adjust` * `Reverse` * `Reverse_Auth` * `Increment` * `Capture` * `Batch_Close` * `Parameters_Download` * `Ping` These commands send an instant command to the specified device to take action as instructed. The request is acknowledged with an interim response indicating the device command was initiated with the device. ### Sample request This is an example of a sale (Authorize) request. All instant `action_type` commands follow the same basic structure. Some Action Types may include addtional fields. ```json curl --location 'https://base.url/ucp/device_commands ' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "device_reference": "uds_123456789", "action_type": "AUTHORIZE", "transaction": { "amount": "1234", "gratuity_amount": "120", } }, "notifications": { "status_url": "http://Partner.URL/Callbacks/UCI" } }' ``` ### Sample response This is an example of a sale (Authorize) response, but any `action_type` returns the same basic structure. ```json curl --location 'https://base.url/ucp/device_commands ' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "id": "DVC_478c5ee17b9a4907a947d41a6b4997ee", "device_reference": "uds_123456789", "action_type": "AUTHORIZE" "status": "INITIATED" "action": { "id": "ACT_de7855d9ce184c639ccdc4699b3a5f2e", "type": "DEVICE_COMMAND_CREATE", "time_created": "2024-05-20T18:54:18.190Z", "result_code": "SUCCESS", "app_id": "17ebd417071c4289ada5d847fdc0e595", "app_name": "Your POS Application" } }' ``` ## Step 2: (Optional) initiate orders Orders are queued transactions that will be paid at a later time, such as a restaurant bill or check. Orders are sent to each device at a merchant location and are removed once they have been paid in full or deleted by you. Combined with a portable terminal, you can now: * View open orders on all devices at a merchant location * Sort orders by check number, table number, or server number * View order details for an individual seat (if sent to us this way) * Initiate payments against a particular order This example shows three app screens used to initiate an order: 1) the server selects the check, 2) the server opens the selected check, and 3) the cardholder makes the payment. | | | | | --- | --- | --- | | **1. Server Selects Check** | **2. Server Opens Check** | **3. Cardholder Makes Payment** | | ![App screen showing a list of checks for several tables for the selected server.](https://developer.globalpayments.com/gh-assets/instore-cloud-check-list.png) | ![App screen showing an itemized list of charges for Table 10, with buttons to Split or Pay by Card.](https://developer.globalpayments.com/gh-assets/instore-cloud-open-check.png) | ![App screen showing the payment was complete, with buttons to print or email a receipt.](https://developer.globalpayments.com/gh-assets/instore-cloud-payment-complete.png) | **Order Transaction Process Example** Valid action types are: * `Create_Order` * `Delete_Order` * `Pending_Transaction_List` ### Sample request This is an example of an order request showing two seats. ```json curl --location 'https://base.URL/ucp/device_commands ' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "device_reference": "uds_123456789", "action_type": "CREATE_ORDER", "system": { "name": "Happy Merchant", "mid": 123456789, }, "order": { "reference": "123456", "time_created_reference": "2024-05-20T18:54:18.190Z", "description": "Table #15", "user_reference": "Server #11", "subtotal_amount": "4199", "discount_amount": "0", "tax_amount": "294", "tax2_amount": "252", "tax3_amount": "0", "surcharge_amount": "200", "total_amount": "4945", "amount": "4945", "items": [// Restaurant Seating { "line_number": 1, //Seat Number "items_breakdown": [ { "description": "Apples", "quantity": 5, "amount": "1050" }, { "description": "Grapes", "quantity": 12, "amount": "1050" } ], "subtotal_amount": "2049", "discount_amount": "0", "tax_amount": "143", "tax2_amount": "123", "tax3_amount": "0", "surcharge_amount": "1", "total_amount": "2415", "amount_due": "2415" }, { "line_number": 2, //Seat Number "item_selections": [ { "description": "Berries", "quantity": 100, "amount": "1075" }, { "description": "Limes", "quantity": 20, "amount": "1075" } ], "subtotal_amount": "2150", "discount_amount": "0", "tax_amount": "151", "tax2_amount": "129", "tax3_amount": "0", "surcharge_amount": "1", "total_amount": "2530", "amount_due": "2530" } ] }, "notifications": { "status_url": "https://Partner.URL/Callbacks/UCI" } }' ``` ### Sample response This is an example of a `Create_Order` response. The `DVC_ID` and `device_reference` are returned. ```json curl --location 'https://base.url/ucp/device_commands ' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "id": "DVC_478c5ee17b9a4907a947d41a6b4997ee", "device_reference": "uds_123456789", "action_type": "CREATE_ORDER" "status": "COMPLETED" "action": { "id": "ACT_de7855d9ce184c639ccdc4699b3a5f2e", "type": "DEVICE_COMMAND_CREATE", "time_created": "2024-05-20T18:54:18.190Z", "result_code": "SUCCESS", "app_id": "17ebd417071c4289ada5d847fdc0e595", "app_name": "Your POS Application" } }' ``` ## Step 3: (Optional) review open orders As part of the orders workflow, you can also retrieve a list of open orders (that is, orders that are not in a completed status) at any time. ### Sample request This is an example of an open orders request. ```json curl --location 'https://base.URL/ucp/device_commands ' \ --request POST --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "device_reference": "uds_123456789", "action_type": "PENDING_TRANSACTION_LIST", "notifications": { "status_url": "http://jovanny.name/Callbacks/UCI" } }' ``` ### Sample response This is an example of an open orders response that shows two orders that are not in a completed status, one of which was partially paid. ```json [ { "id": "DVC_05716b3f-c836-4041-a917-e61ede7c2419", "device_reference": "uds_123456789", "system": { "mid": "2222b68bb" }, "order": { "time_created_reference":"2024-05-20T18:54:18.190Z", "reference": "432556", "description": "12", "user_reference": "7", "amount": "345", "requested_amount": "1000" } }, { "id": "DVC_05716b3f-c836-4041-a917-e61ede7c2420", "device_reference": "uds_123456789", "system": { "mid": "2222b68bb" }, "order": { "time_created_reference": "2024-05-20T18:59:30.190Z", "reference": "432556", "description": "15", "user_reference": "8", "amount": "799", "requested_amount": "1500" } }, { "action": { "id": "ACT_c5c78b09-dcca-4620-a6f3-8b42f0a78a83", "type": "PENDING_TRANSACTION_LIST", "time_created":"2024-06-25T13:30:23.750Z", "result_code": "SUCCESS", "app_id": "aa9c1cda-def7-44ca-8345-1a7cfdcf4753", "app_name": "Rowe - Zulauf" } } ] ``` ## Step 4: Review the outcome The final step is to review the outcome of the device command that was relayed to the device. The device will take the appropriate action once the command is sent. The result of that action is then returned to our API. It can be sent to your notification URL, or you can query the API using the `DVC_Id`. The result for instant transactions may take some time depending on certain human factors, such as the amount of time a cardholder takes to present their payment mechanism, enter a PIN if needed, or confirm any device prompting. In general, a result is usually available in 5 seconds but can take as long as 50 seconds depending on the human factor. Results can also be validated using our X-GP-Signature header field. See our [Validating Webhook Notifications](https://developer.globalpayments.com/api/definitions/webhooks.md) page for details. ### Sample request This is an example of a POST transaction result request. This request can be used instead of or in addition to our callback response. ```json curl --location 'https://base.url/ucp/device_commands ' \ --request POST --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "id": "DVC_478c5ee17b9a4907a947d41a6b4997ee", "device_reference": "uds_123456789", "action_type": "TRANSACTION_LIST", "notifications": { "status_url": "https://haylie.com/Callbacks/UCI" } } ' ``` ### Sample response This is a sample response of a Device Command outcome, retrieved via our API using the above POST method and/or sent to your notification URL automatically. Responses may contain multiple transactions within the transaction object if multiple transactions are performed, as is the case with partial payments or restaurant splits broken down by seat. ```json curl --location 'https://base.url/ucp/device_commands ' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer XLky3MCUyMPnIIU5G29e2aRUa8X3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 03-02-2021' \ --data '{ "id": "DVC_478c5ee17b9a4907a947d41a6b4997ee", "device_reference": "uds_123456789", "action_type": "TRANSACTION_LIST", "status": "COMPLETED", "transaction": [ { "id": "TRN_de7855d9ce184c639ccdc4699b3a5f2e", "time_created_reference": "2024-05-20T18:54:18.190Z", "parent-action_type": "AUTHORIZE", "authorization_mode": "", "tax_amount": "100", "gratuity_amount": "123", "cashback_amount": "21", "surcharge_amount": "30", "amount": "34543", "request_amount": "54677", "system": { "name": "Happy Merchant", "mid": 123456789, }, "currency": "EUR", "currency_conversion": { "conversion_rate": "1", "payer_amount": "500" }, "payment_method": { "id": "", "message": "", "entry_mode": "Chip", "cvm": "PIN", "apm": { "provider_transaction_reference": "BLIK12345", "custom_reference": "Blik7890" }, "emv": { "aid": "A0000000031010", "tvr": "0000000000", "tsi": "0000", "cvm": "PIN" }, "card": { "brand": "TD VISA DEBIT", "masked_number_last4": "************2074", "auth_code": "dbfc66", "provider": { "avs_postal_code_result": null, "cvv_result": null } } } }, ], "action": { "id": "ACT_12d6ae92e3ac40889dfde867f2f2543c", "type": "DEVICE_GET_LIST", "time_created": "2024-05-20T18:54:18.190Z", "result_code": "SUCCESS", "app_id": "17ebd417071c4289ada5d847fdc0e595", "app_name": "Your POS Application" } }' ``` ## UCI action types The following is a list of all action types and their intended use. | Action_Type | Description | | --- | --- | | Authorize | Initiate a sale command on the device. | |Refund | Initiate a refund command on the device. | |PreAuthorize | Initiate a pre-authorization command on the device. | |Capture | Initiate a capture of a pre-authorized transaction on the device. | |Adjust | Initiate an adjustment of a previously captured sale on the device. | |Increment | Initiate an incremental authorization of a prior pre-authorization on the device. | | Reverse | Initiate a reversal of a previous sale or pre-authorization on the device. | | Reverse_Auth | Initiate a reversal of a previous authorization on the device. | | Batch_Close | Initiate a batch-close command on the device. | | Last_Transaction | Get the last _DVC_Id_ performed on the device. | | Transaction_List | Get the result of the transaction command from the device. | | Pending_Transaction_List | Get a list of pending/unpaid orders from the device. | | Create_Order | Create an order on the device. | | Delete_Order | Delete an order from the device. | | Ping | Test the communications to a device. | | Parameters_download | Initiate a parameter download on the device (region specific). | ## UCI common questions ### How do I update a bill? Resend the bill using the `Create_Order` action type, and be sure to include the same check number (`order.reference`). Bills uploaded with the same check number during the same day will replace the previous bill. This will generate a new `DVC_Id` for the updated version of the bill. The prior bill’s `DVC_Id` will still be used if any payments were made before the new bill version was uploaded. ### What is the bill's lifespan? Every bill uploaded has a “keep-alive” time value of 6 hours, but the merchant can change it up to 99 hours if it meets their business needs. If the keep-alive time expires, UCI will automatically cancel the bill. The bill keep-alive timer starts when a bill is uploaded or updated from a POS. Therefore, if a specific bill needs to stay available beyond the keep-alive time, the POS can just resubmit the bill and the timer will restart. **Note:** The best practice is for the POS to send a Delete request if needed. ### Can I use UCI if I don't track orders by seats? If the restaurant POS doesn't support orders entered by seat number, only by tables, send all items under seat #1. The payment terminal will not give the option to split by seat. # Semi-Integration Source: https://developer.globalpayments.com/docs/payments/in-store/semi-integration.md Section: Payments Description: Code to our payment app for terminals to save time Semi-integration is our preferred integration method as it gives you some flexibility by allowing you to connect your own point-of-sale (POS) application that you use for business operational tasks. This requires some development work but is usually quick and easy. For this type of integration, you need to use a compatible standalone terminal purchased from us or one of our sales partners, which comes with our Unified Payment Application (UPA) pre-installed. UPA directly connects to our API, so there’s no need for us to provide steps or code samples here. To compare semi-integration with our other types of integration like standalone, cloud, and full, see our [In-Store Payments - Overview](https://developer.globalpayments.com/docs/payments/in-store/overview.md) article. For information on connecting your POS system to one of our terminals, see the [Get Started](#get-started) section. ## What is semi-integration? Semi-integration allows developers to deploy an integration with less time spent troubleshooting code. It also prevents spending time and money on lengthy, expensive EMV certifications as the payment application on the terminal is already integrated to our API. > Semi-integrated solutions don’t require host or EMV certification; however, we do recommend testing and validating all of your POS application workflows. > Even though certification for EMV is not necessary for a semi-integrated application, validating your application with Global Payments is still required. Please see the [Get Started](#get-started) section for steps on how to accomplish this. The only development necessary is to connect the POS application that you typically use for inventory management, menus, staffing, and other day-to-day business operational tasks to the terminal you purchase from us or one of our partners. This gives you the added flexibility that a standalone integration does not, with only a small amount of development work. That is why it’s our preferred integration. If you want even more flexibility, such as a customized payment flow or new functionality, and don’t mind more coding, our API also supports [full integration](https://developer.globalpayments.com/docs/payments/in-store/full-integration.md). ## What is UPA? UPA is our proprietary payment application for standalone terminals. It can be loaded on a variety of compatible terminals for direct access to our API. For a list of what’s available, see the next section. At present, only UPA terminals are capable of attaching to our API service, bringing the power and features of the Unified Payments API to your business. ## Available terminals > UPA availability is region-specific. In order to determine whether a UPA terminal is available in your region, please contact our support team at [ccoe_si@globalpay.com](mailto:ccoe_si@globalpay.com) ## Get started > Certification is required for any integration for card-present payment processing. If you have any questions about the process, please reach out to our support team at [ccoe_si@globalpay.com](ccoe_si@globalpay.com). ### Certification process 1) Fill out the [Solutions Engineering Project Request Form](https://www.globalpayments.com/se-form-request) (SEPRF). 2) Upon receiving your completed SEPRF, we will assign a Solutions Engineer to contact you and help determine the best solution for you based on your requirements. 3) Our Integration team will check each transaction to make sure all data is correct for compliance purposes. Based on our review, we’ll let you know if there are any issues or changes you'll need to make. If not we will finalize and send a certification announcement letter. ### Out-of-scope configuration 1) POS system sends request to EMV terminal for payment acceptance. 2) EMV terminal sends transaction request (cardholder data) directly to processor for authorization. 3) Processor returns authorization, then terminal passes response to POS system to finish transaction. # Full Integration Source: https://developer.globalpayments.com/docs/payments/in-store/full-integration.md Section: Payments Description: Learn how to complete a sale in your application This guide assumes that you’re integrating directly to our REST API from within your own already-built terminal application. We focus on showing you how to send commands to our API from your terminal application rather than how to develop one from the ground up. Our steps show you how to process and capture a transaction with POST commands for a chip-insert debit transaction scenario. We also provide information on other types of scenarios as well as how to handle end-of-day procedures like batch and settlement. > For information on application development, we recommend that you consult your terminal manufacturer’s reference materials. Our API also supports [standalone](https://developer.globalpayments.com/docs/payments/in-store/standalone.md), [semi-](https://developer.globalpayments.com/docs/payments/in-store/semi-integration.md), and [cloud](https://developer.globalpayments.com/docs/payments/in-store/cloud.md) integrations for card-present transactions. However, the JSON code samples in this guide are for connecting to the API directly with a payment terminal attached to your application to handle the associated payment card data. ## What is full integration? Full integration is the most demanding method of connecting to our API, but it also provides the most flexibility. You have full control over the payer experience and workflows. This type of integration requires a certification to our processing platform followed by EMV certifications in each processing region. In addition, you would be coding directly to a payment device to retrieve card/EMV data to send us for transaction processing. To compare full integration with our other types like standalone, semi-, and cloud, see [In-Store Payments - Overview](https://developer.globalpayments.com/docs/payments/in-store/overview.md). ## Full-integration considerations This section covers some considerations and resources to keep in mind when choosing a full integration: * [Code directly to our API or use an SDK](#code-directly-to-our-api-or-use-an-sdk) (required) * [Single versus multiple TIDs](#single-versus-multiple-tids) * [Testing and certification](#testing-and-certification) ### Code directly to our API or use an SDK For full integrations, you need to code directly to our API or use one of our SDKs (see [SDK & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview)). Alternatively, you can bypass our SDKs and incorporate our code directly into your terminal application. Coding directly to our API for card-present transactions requires a basic understanding of how our API works, from authentication to transaction processing. For more information, see [API Explorer](https://developer.globalpayments.com/api/overview.md) or [API Definitions](https://developer.globalpayments.com/api-definitions-overview). We provide the following resources to help: * Our source code is publically available on [GitHub](https://github.com/globalpayments). You also can find this GitHub link in the footer of our portal pages under Connect. * We provide use cases and sample API requests and responses on Postman. For more information, see [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md). ### Single versus multiple TIDs Terminal ID number (TID) management should also be considered as it could impact how your software functions when processing secondary transactions. Consult with your account manager to ensure that there are no regional nuances with this approach. Our devices can be configured to have a single TID per location as long as the lane is identified in the transaction (for example, Front Desk, Bar, and so on). Cloud servers or local “fat” software installed on a computer can act as a controller for all lanes, sending transactions, receiving responses, and routing them to the originating device or lane. The advantage is that secondary transactions are no longer tied to the device or lane that processed the original transaction. Secondary transactions can be performed at any lane, thereby improving the customer and server experience. Consult with your account manager to ensure that there are no regional nuances with this approach. ### Testing and certification Fully integrated solutions must be certified to our platform. A certification analyst will collect details — such as your terminal application; EMV kernel, PCI PTS, and PA-DSS approvals; supported industries and transaction types, and so forth — and configure a certification script tailored to your solution. The typical approach is to certify mag-stripe transactions first. Once that is successfully completed, we begin the EMV certification. EMV certification requires you to purchase the UL BTT software, which simulates the various issuers’ EMV chip card profiles for contact and contactless EMV test cases, as well as digital wallets. ## Available terminals Any compliant terminal (With the above requirements for EMV kernel, PCI PTS, and PA-DSS approvals) that supports custom applications can be used to code an integration to our API. That said, if a terminal is required, we are able to provide a variety of terminal models for your use as well. For available models, please contact your account manager. ## Transaction overview Payment devices need to have keys injected into the device to properly function. End-to-end encryption (E2EE) takes clear PAN data found on track 1 and track 2 of the mag stripe or in the chip data and encrypts it using cryptographic keys, which are securely injected into the card reader/terminal. The keys are used to transform the clear track data into a unique data string before it’s transmitted. This is usually done within a secure hardware module on a PCI PTS certified terminal, ensuring it can’t be read and decoded during transmission. The string of data is then transmitted to us, where we securely decrypt it and send to the card issuer for processing. To avoid sending full PAN or PIN data over the internet, a form of end-to-end encryption called TDES DUKPT is standard. For a transaction on a successfully injected terminal to include this, the key serial number (KSN) must be included on the transaction request, as shown in the code sample below. > Our API identifies the physical device using only the _account_name_ parameter, rather than by using a serial number, TID, or other fields common in other environments. ### Sample request In this example, we use a swipe entry mode and end-to-end encryption. ```JSON data { "account_name": "{{acc_name}}", "channel": "CP", "type": "SALE", "capture_mode": "AUTO", "amount": "10000", "currency": "CAD", "reference": "{{reference}}", "country": "CA", "payment_method": { "first_name": "Jane", "last_name": "Doe", "entry_mode": "SWIPE", "encryption": { "method": "KSN", "version": "05", "info": "//89P4IADOAD4A==" }, "card": { "track_number": "2", "track": "iaQbFN0EqXK3x8YHgh2ogmylKCG5J11v9BcOaOyCSVQ=" } } } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->country = 'CA'; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $debitCard = new DebitTrackData(); $debitCard->value = 'iaQbFN0EqXK3x8YHgh2ogmylKCG5J11v9BcOaOyCSVQ='; $debitCard->entryMethod = EntryMethod::SWIPE; $encryptionData = new EncryptionData(); $encryptionData->version = '05'; $encryptionData->ksn = '//89P4IADOAD4A=='; $debitCard->encryptionData = $encryptionData; try { $response = $debitCard->charge(100) ->withCurrency("CAD") ->withClientTransactionId("26851101") ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" ``` ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/api/access-token.md) ## Step 1: Process a transaction The first step is to create an authorization. This creates the transaction, assigns it a transaction ID, and processes the authorization. A sale transaction can be flagged for automatic capture using the `capture_mode` flag or flagged as requiring a separate capture action later. By default, it will automatically attempt capture. Partial authorizations are possible by setting the `authorization_mode` to `partial`. This allows your application to be notified if only part of the transaction was approved and a second form of payment will be required to complete the balance (for example, on a $100 sale, only $85 was approved, leaving a remaining balance of $15 that requires a secondary form of payment to complete). If the `authorization_mode` flag is not set, transactions will instead decline. In a card-present environment, many types of transactions are possible, including chip insert (dipped), tapped (contactless), swiped, or keyed (depending upon your region). The below example is of a chip-insert debit transaction. The type of transaction is indicated by the `entry_mode` flag on the request. ### Sample request ```json { "account_name": "Transaction_Processing", "type": "SALE", "channel": "CP", "capture_mode": "AUTO", "amount": "1999", "currency": "USD", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "US", "ip_address": "123.123.123.123", "site_reference": "Site-1324", "payment_method": { "name": "James Mason", "entry_mode": "CHIP", "card": { "track": "%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?", "tag": "9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001", "funding": "DEBIT", "chip_condition": "", "pin_block": "", "brand_reference": "" } } } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $debitCard = new DebitTrackData(); $debitCard->setTrackData('%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?'); $tagData = '9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001'; try { $response = $debitCard->charge(19.99) ->withCurrency("USD") ->withCustomerIpAddress("123.123.123.123") ->withTagData($tagData) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; // API raw response key "payment_method->card->tag_response" $tagResponse = $response->cardDetails->tagResponse; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->avs_result" $cardIssuerAvsResult = $response->cardIssuerResponse->avsResult; ``` ### Sample response ```JSON { "id": "TRN_ewFfZZmrdQ6jGaObwu2FbyRonAerwG", "time_created": "2024-02-28T21:35:06.077Z", "type": "SALE", "status": "CAPTURED", "channel": "CP", "capture_mode": "AUTO", "amount": "1999", "currency": "USD", "country": "US", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "payment_method": { "result": "00", "message": "APPROVED 000APPROVED O00999", "entry_mode": "CHIP", "card": { "funding": "DEBIT", "brand": "INTERAC", "masked_number_last4": "XXXXXXXXXXXX0016", "authcode": "", "brand_reference": "", "brand_time_created": "2024-02-28T16:35:07.000Z", "tag_response": "910A11111111111111111111", "provider": { "result": "00" } } }, "batch_id": "BAT_943493-494", "action": { "id": "ACT_ewFfZZmrdQ6jGaObwu2FbyRonAerwG", "type": "AUTHORIZE", "time_created": "2024-02-28T21:35:06.077Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } } ``` ## Step 2: Capture a transaction If the `capture_mode` flag is not set to `AUTO`, the transaction must be captured at a later date. This is frequently done in scenarios where you want to finalize the purchase price later. This is also known as a _pre-authorization_ and is frequently used in hospitality and lodging scenarios. To capture a transaction, you must use the original ID returned in the authorization response in the query URL. You can capture a transaction for any amount up to 115% of the original value. If you don't include an amount in your request, by default the full amount will be captured. ### Sample request ```json https://apis.sandbox.globalpay.com/ucp/transactions/TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d/capture { "amount": "11099", "gratuity_amount": "1999", "capture_sequence": "FIRST", "total_capture_count": "integer", "lodging": { "booking_reference": "797ebe05bf34dd4b6a8ec4fa", "duration_days": "4", "room_tax_amount": "10555", "date_checked_in": "2022-07-04", "date_checked_out": "2022-07-08", "daily_rate_amount": "35050", "charge_items": "array" }, "payment_method": { "card": { "tag": "string" } } } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $trn = Transaction::fromId('TRN_PlrobvEXlPsA9JIJDwXaIYc1K0TihU'); $tagData = '9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001'; $lodgingInfo = new LodgingData(); $lodgingInfo->bookingReference = '797ebe05bf34dd4b6a8ec4fa'; $lodgingInfo->durationDays = 4; $lodgingInfo->checkedInDate = date('Y-m-d H:i:s'); $lodgingInfo->checkedOutDate = date('Y-m-d H:i:s', strtotime("+7 days")); $lodgingInfo->dailyRateAmount = '350.5'; $item1 = new LodgingItems(); $item1->types = [LodgingItemType::NO_SHOW]; $item1->reference = 'item1'; $item1->totalAmount = '350.5'; $item1->paymentMethodProgramCodes = [PaymentMethodProgram::ASSURED_RESERVATION]; $lodgingInfo->items = [$item1]; try { $response = $trn->capture(110.99) ->withGratuity(19.99) ->withTagData($tagData) ->withMultiCapture(RecurringSequence::FIRST, 2) ->withLodgingData($lodgingInfo) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ``` ### Sample response ```JSON { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2021-05-03T21:23:39.718Z", "type": "SALE", "status": "INITIATED", "amount": "11099", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "00", "message": "Successful", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "string", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "demo_app" } } ``` ## Step 3: Additional transaction functionality Our API supports many other card-present functions you may want to implement. This includes voids, returns, refunds, and adjustments, among others. The most common of these is an adjustment, also known as a _tip_ or _gratuity_. Tips are a common way for customers to reward staff for good service in North America and other markets, and are an additional amount added to a transaction either during the sale (prompted on the physical device) or after the sale (signed on a receipt and later adjusted by staff). ##### Related articles: ### [Adjust](https://developer.globalpayments.com/docs/payments/manage-payments/adjust-guide.md) Add tips using our Adjust capability. ### [Increment](https://developer.globalpayments.com/docs/payments/manage-payments/increment-guide.md) Add supplemental charges using our Increment capability. ## Step 4: Batch / settlement / end-of-day procedures > Before implementing batches, check with your account manager for any specific market or platform requirements. Card-present transactions are managed in batches. Typically, a batch of transactions is an entire business day for a merchant. A batch must be closed for transactions to be settled and funded. Depending upon your region, our platform may automatically batch your daily transactions for you. In some regions, you may be required to batch your transactions yourself on your application. ##### Related articles: ### [Batches](https://developer.globalpayments.com/docs/payments/manage-payments/batches-guide.md) Settle and fund transactions via our Batches capability. ### [Captures](https://developer.globalpayments.com/docs/payments/manage-payments/capture-guide.md) Capture pre-authorized transactions and open checks using our Capture capability. # Recurring Payments - Overview Source: https://developer.globalpayments.com/docs/payments/recurring/overview.md Section: Payments Description: Make subsequent payments easier for your customers We offer an easily implemented Recurring Payments solution. Our platform is equipped to handle credential-on-file transactions that are compliant with modern standards to enable seamless integration. ## Use cases In this section, we present some “real world” examples that can be enabled through Recurring Payments. Keep in mind that this section doesn’t cover all use cases. ##### Use case #1: One-click checkout An online retailer wants to allow customers to save card information for later purchases. When a customer returns to their website to purchase more items, they can use the saved card details to check out faster. A correctly integrated shopping cart software then sends the details to our API for running the subsequent transaction. ##### Use case #2: Subscriptions A meal delivery service wants to implement subscription plans to ensure customers are able to easily register and pay for their meals. While the service’s systems manage subscriptions, customers, and triggering the payments, our Recurring Payments solution is ready to accept the initial transaction, create a payment token, and wait for any recurring payments to be sent. ##### Use case #3: Account top-up A restaurant using ecommerce software to manage their gift cards wants to allow their customers to refill their card under a certain threshold. Using our Recurring Payments solution, the owner can send a transaction request from their software to our servers authorizing and capturing the payments as they occur. ## Product information ##### Related products * 3D Secure * Tokenization ##### Integration options * SDK or API ##### Regions where you can use this solution * Europe * North America * Asia-Pacific ## Next steps To get familiar with how Recurring Payments work, see our below guides. ### [Recurring Payments - Guide](https://developer.globalpayments.com/docs/payments/recurring/recurring-payments-guide.md) Learn how to perform a recurring transaction. ### [Recurring Payments - Credential on File](https://developer.globalpayments.com/docs/payments/recurring/credentials-on-file.md) Properly flag COF transactions to adhere to card brands mandates. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) Tokenize card details to charge customers later. You also may want to read about [Tokenization](https://developer.globalpayments.com/docs/payments/tokenization/overview.md) or [3D Secure](https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Recurring Payments Guide Source: https://developer.globalpayments.com/docs/payments/recurring/recurring-payments-guide.md Section: Payments Description: Learn how to perform a recurring transaction This guide focuses on the full scope of running a recurring payment and provides steps from start to finish. This includes tokenizing the card, authorizing a transaction, converting your card token to multi-use, and performing a recurring payment when needed.  For information on the various use cases for recurring payments, see our [Overview](https://developer.globalpayments.com/docs/payments/recurring/overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1:  Generate a single-permission access token A single-permission access token must first be generated in order to create a single-use payment token in the next step. An [access token](https://developer.globalpayments.com/api/definitions/access-tokens.md) is a unique, single-use key used to access our API.  #### Sample request ```json curl --location POST 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "app_id": "{{app_id}}", "secret": "{{secret}}", "grant_type": "client_credentials", "nonce": "{{nonce}}", "interval_to_expire": "10_MINUTES", "permissions": [ "PMT_POST_Create_Single" ] } ``` #### Sample response ```json { "token": "4eQo0UX29btysKqJhDbjr688z7re", "type": "Bearer", "scope": { "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "accounts": [ { "id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8", "name": "tokenization", "permissions": [ "PMT_POST_Create_Single" ] } ] }, "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test", "time_created": "2025-03-20T11:20:20.603Z", "seconds_to_expire": 599, "interval_to_expire": "10_MINUTES", "email": "jordan.forde@globalpay.com" } ``` ## Step 2: Tokenize the card Once you’ve created the single-permission access token, you can use it to tokenize the card.  [Tokenization](https://developer.globalpayments.com/docs/payments/tokenization/overview.md) replaces sensitive data with unique identification symbols, or tokens, that retain all the essential information about the data without compromising its security. This gives you the ability to securely store and manage payment methods on our API in any region. Next, we will create a second access token with all the permissions for any transactions. #### Sample request ```json curl --location POST 'https://apis.sandbox.globalpay.com/ucp/payment-methods' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 4eQo0UX29btysKqJhDbjr688z7re' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "usage_mode":"SINGLE", "account_name": "{{token_acc_name}}", "reference": "{{reference}}", "card": { "number": "4242424242424242", "expiry_month": "{{expiry_month}}", "expiry_year": "{{expiry_year}}", "cvv":"{{cvv}}" } }' ``` #### Sample response ```json { "id": "PMT_4d1c481a-a275-42b2-a795-85aef97b5db8", "time_created": "2025-03-20T11:20:22.775Z", "status": "ACTIVE", "usage_mode": "SINGLE", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8", "account_name": "tokenization", "reference": "96068801", "card": { "masked_number_last4": "XXXXXXXXXXXX4242", "brand": "VISA", "expiry_month": "12", "expiry_year": "30" }, "action": { "id": "ACT_xn2IAZsZfkMy309zl12q0Jrb9FF3wA", "type": "PAYMENT_METHOD_CREATE", "time_created": "2025-03-20T11:20:22.775Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Step 3: Generate an access token with all the permissions Now, we will create a second access token with all the permissions to use for authorizing transactions. #### Sample request ```json curl --location POST 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "app_id": "{{app_id}}", "secret": "{{secret}}", "grant_type": "client_credentials", "nonce": "{{nonce}}" }' ``` #### Sample response ```json {   "token": "3W4y5tOoIOBxiBQPvqlrEyN1JkVd",   "type": "Bearer",   "scope": {     "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c",     "merchant_name": "Sandbox_Merchant_4",     "accounts": [       {         "id": "TRA_27c901760029495f813afbb0dab197ef",         "name": "transaction_processing",         "permissions": [           "TRN_POST_Authorize",           "TRN_POST_Force",           "TRN_POST_Refund",           "TRN_POST_Capture",           "TRN_POST_Reverse",           "TRN_POST_Adjust",           "TRN_POST_Initiate",           "BAT_POST_Close",           "TRN_POST_Refund_Standalone",           "VER_POST_Verify",           "TRN_POST_Reauthorize",           "INS_POST_Query",           "TRN_GET_Single",           "TRN_POST_Confirm",           "DEV_POST_Sync",           "ACT_GET_Single",           "ACT_GET_List",           "TRN_GET_List",           "TRN_POST_Capture_Multiple",           "ACT_POST_Multiple",           "APP_GET_Single",           "AUT_POST_Initiate",           "CCS_POST_DCC",           "ACC_GET_Single_Platform",           "ACC_GET_Single",           "APP_POST_Search_PFCValidate",           "ACT_POST_Auto_Action",           "PFC_GET_List",           "PFC_GET_Single",           "TRN_POST_Incremental",           "AUT_POST_Results",           "BAT_GET_Single",           "ACC_GET_List",           "GET_Single",           "AUT_POST_Check_Availability",           "APP_GET_List",           "TRN_POST_Split",           "AUT_GET_Single",           "AUT_GET_List",           "TRN_POST_Hold",           "TRN_POST_Release"         ]       },       {         "id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8",         "name": "tokenization",         "permissions": [           "PMT_POST_Create",           "PMT_PATCH_Edit",           "PMT_Delete",           "PMT_GET_List",           "PMT_GET_Single",           "PMT_POST_Search",           "ACT_POST_Multiple",           "PMT_POST_Create_Single",           "ACC_GET_Single",           "GET_Single",           "ACT_POST_Auto_Action",           "APP_POST_Search_PFCValidate",           "ACC_GET_List",           "ACT_GET_List",           "ACT_GET_Single",           "PYR_GET_Single",           "PYR_POST_Edit",           "PYR_GET_List",           "PYR_POST_Create"         ]       }     ]   },   "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r",   "app_name": "Postman_Collection_Test",   "time_created": "2025-03-20T11:20:24.635Z",   "seconds_to_expire": 86399,   "email": "jordan.forde@globalpay.com" } ``` ## Step 4: Validate the Card Simply storing a tokenized card for use in recurring payments will not validate the card. This is why it’s important to perform a [verification](https://developer.globalpay.com/docs/payments/manage-payments/verify-guide) to ensure the information on the card is accurate and  the cardholder has sufficient funds for the transaction. Both are necessary to authorize the transaction. In this example, we send a request for a standard transaction using the single-use payment token in the request body to verify the card and authorize the initial transaction. Note that the brand reference generated in this step will be used in the recurring transaction request. #### Sample request ```json curl --location POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 3W4y5tOoIOBxiBQPvqlrEyN1JkVd' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "account_name": "{{acc_name}}", "channel": "CNP", "capture_mode":"AUTO", "type": "SALE", "amount": "100", "currency": "USD", "reference": "{{reference}}", "country": "US", "payment_method": { "name": "Jane", "entry_mode": "ECOM", "id": "PMT_4d1c481a-a275-42b2-a795-85aef97b5db8" } } ``` #### Sample response ```json { "id": "TRN_Wa3UZsF0PnM4NDARGmLwjuhvRarHlV_10984351", "time_created": "2025-03-20T11:20:28.538Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "USD", "country": "US", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "TRA_27c901760029495f813afbb0dab197ef", "account_name": "transaction_processing", "reference": "10984351", "payment_method": { "result": "00", "message": "(00)[ test system ] Authorised", "entry_mode": "ECOM", "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX4242", "authcode": "123456", "brand_reference": "mH21POhUcoogvgt6", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "risk_assessment": [ { "mode": "ACTIVE", "result": "ACCEPTED", "rules": [ { "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd", "description": "Cardholder Name Rule", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3", "description": "CardNumber block", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e", "description": "Amount test", "mode": "ACTIVE", "result": "ACCEPTED" } ] } ], "batch_id": "BAT_1510378", "action": { "id": "ACT_Wa3UZsF0PnM4NDARGmLwjuhvRarHlV", "type": "AUTHORIZE", "time_created": "2025-03-20T11:20:28.538Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Step 5: Convert the single-use payment token to a multi-use payment token Once the card is verified, the card can now be stored by converting the single use payment token to a multi use payment token using a PATCH call as shown in the below example. #### Sample request ```json curl --location PATCH 'https://apis.sandbox.globalpay.com/ucp/payment-methods/PMT_4d1c481a-a275-42b2-a795-85aef97b5db8' --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 3W4y5tOoIOBxiBQPvqlrEyN1JkVd' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ ``` #### Sample response ```json { "id": "PMT_4d1c481a-a275-42b2-a795-85aef97b5db8", "status": "ACTIVE", "usage_mode": "MULTIPLE", "card": { "expiry_month": "", "expiry_year": "" }, "action": { "id": "ACT_6qwDoGM9pqBkqoLPHEflxQFQKqguDk", "type": "PAYMENT_METHOD_EDIT", "time_created": "2025-03-20T11:20:50.538Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Step 6: Perform a recurring payment The recurring payment process is not automated in our API. The request for payment must be sent at the time the recurring payment is due.  This is typically handled by your software, which will require the payment token identifier and a brand reference fetched in the initial authorization (Step 4) when making its recurring requests for payment. > Because the next transaction might occur days or weeks after the initial authorization, a new full access token might be required to complete subsequent authorizations. #### Sample request ```json curl --location POST 'https://apis.sandbox.globalpay.com/ucp/transactions --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 3W4y5tOoIOBxiBQPvqlrEyN1JkVd' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{     "account_name": "{{acc_name}}",     "channel": "CNP",     "capture_mode": "AUTO",     "type": "SALE",     "amount": "100",     "currency": "USD",     "reference": "{{reference}}",     "country": "US",     "initiator": "MERCHANT",     "stored_credential": {         "model": "RECURRING",         "reason": "INCREMENTAL",         "sequence": "SUBSEQUENT"     },     "payment_method": {        "name": "Jane",         "entry_mode": "ECOM",         "id": "{{pmt_id}}",         "card": {             "brand_reference": "{{brand_ref}}"         }     } } ``` #### Sample response ```json {     "id": "TRN_fT7SsRTYZkBBzNO5Jtkky3Br54veOp_78442951",     "time_created": "2025-03-20T11:21:00.538Z",     "type": "SALE",     "status": "CAPTURED",     "channel": "CNP",     "capture_mode": "AUTO",     "amount": "100",     "currency": "USD",     "country": "US",     "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c",     "merchant_name": "Sandbox_Merchant_4",     "account_id": "TRA_27c901760029495f813afbb0dab197ef",     "account_name": "transaction_processing",     "reference": "78442951",     "payment_method": {         "result": "00",         "message": "(00)[ test system ] Authorised",         "entry_mode": "ECOM",         "card": {             "brand": "VISA",             "masked_number_last4": "XXXXXXXXXXXX4242",             "authcode": "123456",             "brand_reference": "CildSOKDR0xyrWGK",             "brand_time_created": "",             "provider": {                 "result": "00",                 "cvv_result": "M",                 "avs_address_result": "M",                 "avs_postal_code_result": "M"             }         }     },     "risk_assessment": [         {             "mode": "ACTIVE",             "result": "ACCEPTED",             "rules": [                 {                     "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd",                     "description": "Cardholder Name Rule",                     "mode": "ACTIVE",                     "result": "ACCEPTED"                 },                 {                     "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3",                     "description": "CardNumber block",                     "mode": "ACTIVE",                     "result": "ACCEPTED"                 },                 {                     "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e",                     "description": "Amount test",                     "mode": "ACTIVE",                     "result": "ACCEPTED"                 }             ]         }     ],     "batch_id": "BAT_1530138",     "action": {         "id": "ACT_fT7SsRTYZkBBzNO5Jtkky3Br54veOp",         "type": "AUTHORIZE",         "time_created": "2025-03-20T11:21:00.538Z",         "result_code": "SUCCESS",         "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r",         "app_name": "Postman_Collection_Test"     } } ``` ## Integration references For a deeper understanding of this function, use the integration references we provide for our API and SDK integrations. You can see the full detailed API specification in our [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including recurring payments. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing You can test our Recurring Payments solution in our free Sandbox environment. All it takes is a registered user in our developer portal. Get started with the resources below. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. # Recurring Payments - Credential on File Source: https://developer.globalpayments.com/docs/payments/recurring/credentials-on-file.md Section: Payments Description: Learn how to flag COF transactions to adhere to card brand mandates In this guide, you’ll learn how to correctly pass Credential on File (COF) data for the following use cases: * One-Click Checkout – Unscheduled payments triggered by the cardholder. * Recurring & Installments – A subscription/variable amount billing agreement or regular payments for a fixed term triggered by the merchant. * Account Auto Top-Up – Unscheduled payments triggered by the merchant. Each use case involves an initial CIT where the customer transacts with the merchant and agrees to store their card (customer signup). Depending on the use case, the customer might also consent to an installment/subscription or agree that their card can be charged without their direct involvement. So, first we’ll cover that initial step and then go into each specific use case. The following table summarizes the required data for each use case. | Data | First Transaction / Customer Signup | Subsequent Transaction: One-Click Checkout | Subsequent Transaction: Recurring or Installment | Subsequent Transaction: Auto Account Top-Up | | --- | --- | --- | --- | --- | | Model | UNSCHEDULED | UNSCHEDULED | RECURRING or INSTALLMENT | UNSCHEDULED | | Initiator | PAYER | PAYER | MERCHANT | MERCHANT | | Sequence | FIRST | SUBSEQUENT | SUBSEQUENT | SUBSEQUENT | | Brand Reference| N/A | N/A | Required | Required | ## What is COF? COF is a way of identifying stored card transactions. The location of the stored card details doesn't matter — the details could be held in our Card Storage solution or stored securely by the merchant or by a third party for merchant use. The purpose of the COF mandate from the card schemes, such as Visa or Mastercard, is to help reduce fraud by requiring merchants to include certain fields in the authorization message when using a customer’s stored credentials for payments. These COF fields indicate to issuers and acquirers that the merchant has a prior arrangement with the customer to store their card details and potentially to make subsequent payments on their behalf. This benefits the merchant and cardholder by identifying a more trusted transaction, which can enable scenarios like one-click checkout or [recurring transactions](https://developer.globalpayments.com/docs/payments/recurring/overview.md). Transactions using stored card details are either customer-initiated (payer) (CIT) or merchant-initiated (MIT). ## COF data and fields The following table describes the relevant COF data and fields. | Field Name / Data | Description | | --- | --- | | Initiator | The initiator of the transaction. Allowed values: **PAYER** - Indicates a transaction that is customer-initiated (CIT). **MERCHANT** - Indicates a transaction that is merchant-initiated (MIT). | | Model | The relationship type the customer agreed to with the merchant and the category of transaction being processed. Allowed values: **RECURRING** - Payment with no fixed duration that continues until the customer cancels. **INSTALLMENT** - Payment of an agreed amount on the same day each month until the fixed duration ends. **UNSCHEDULED** - Oneoff payment with no fixed duration. | | Sequence | Indicates the stage of card storage. Allowed values: **FIRST** **SUBSEQUENT** | | Brand Reference | Also referred to as Scheme Reference Data (SRD). A unique identifier provided by a card scheme, such as Visa or Mastercard, that links to the payment history between the customer and merchant. Also referred to as Transaction ID or Trace ID, depending on the card scheme. This will appear in the response message of an initial transaction. | ## First transaction - Customer signup The first transaction is a CIT. For example, the customer is making a payment on the merchant’s website for the first time or choosing a subscription or installment product. With this in mind, the model needs to match the agreement that the customer is signing up for. In our example, it’s Unscheduled, but it could be Installment or Recurring. For this transaction, initiator and sequence will always be Payer and First, respectively. If future transactions using this stored card are merchant-initiated (MITs), the first transaction must include 3D Secure 2 payment authentication with the Challenge Mandated flag passed to the Issuer. You must also store the brand references for future transactions. For more information, see our [Merchant-Initiated Transactions](https://developer.globalpayments.com/docs/MIT) article. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 2orSiiEoQc82EMBUNDyX1DS7guO3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_6716058969854a48b33347043ff8225f", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "14406011", "country": "IE", "initiator": "PAYER", "stored_credential": { "model": "UNSCHEDULED", "sequence": "FIRST" }, "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22", "cvv": "123" }, "authentication": { "three_ds": { "server_trans_ref": "vJ9NXpFueXsAqeb4iAbJJbe+66s=", "value": "AAACBUGDZYYYIgGFGYNlAAAAAAA=", "eci": "05", "message_version": "2.1.0" } } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setCountry("IE"); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(DateTime.now().getMonthOfYear()); card.setExpYear(DateTime.now().getYear() + 1); card.setCvn("123"); card.setCardHolderName("James Mason"); ThreeDSecure threeDSecure = new ThreeDSecure(); threeDSecure.setProviderServerTransRef("vJ9NXpFueXsAqeb4iAbJJbe+66s="); threeDSecure.setAuthenticationValue("AAACBUGDZYYYIgGFGYNlAAAAAAA="); threeDSecure.setEci("05"); threeDSecure.setMessageVersion("2.1.0"); card.setThreeDSecure(threeDSecure); StoredCredential storedCredential = new StoredCredential(); storedCredential.setInitiator(StoredCredentialInitiator.CardHolder); storedCredential.setType(StoredCredentialType.Unscheduled); storedCredential.setSequence(StoredCredentialSequence.First); try { Transaction response = card.charge(new BigDecimal("1.00")) .withCurrency("EUR") .withClientTransactionId("14406011") .withStoredCredential(storedCredential) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchId = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "payment_method->card->brand_reference" String cardBrandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->cvv_result" String cvnResponseMessage = response.getCvnResponseMessage(); // API raw response key "payment_method->card->brand"(); String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); // API raw response key "payment_method->card->provider->cvv_result" String cardIssuerCvv = response.getCardIssuerResponse().getCvvResult(); // API raw response key "payment_method->card->provider->avs_address_result" String cardIssuerAvsAddressResult = response.getCardIssuerResponse().getAvsAddressResult(); // API raw response key "payment_method->card->provider->avs_postal_code_result" String cardIssuerAvsPostalCodeResult = response.getCardIssuerResponse().getAvsPostalCodeResult(); // API raw response key "risk_assessment->mode" String fraudResponseMode = response.getFraudFilterResponse().getFraudResponseMode(); // API raw response key "risk_assessment->result" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // API raw response key "risk_assessment->rules" List fraudResponseRules = response.getFraudFilterResponse().getFraudResponseRules(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST, Country = "IE" }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Number = "4263970000005262", ExpMonth = DateTime.Now.Month, ExpYear = DateTime.Now.Year + 1, Cvn = "123", CardHolderName = "James Mason", ThreeDSecure = new ThreeDSecure { ProviderServerTransRef = "vJ9NXpFueXsAqeb4iAbJJbe+66s=", AuthenticationValue = "AAACBUGDZYYYIgGFGYNlAAAAAAA=", Eci = "05", MessageVersion = "2.1.0" } }; StoredCredential storeCredentials = new StoredCredential { Initiator = StoredCredentialInitiator.CardHolder, Type = StoredCredentialType.Unscheduled, Sequence = StoredCredentialSequence.First }; try { Transaction response = card.Charge(1m) .WithCurrency("EUR") .WithClientTransactionId("14406011") .WithStoredCredential(storeCredentials) .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.AuthorizedAmount; //API raw response key "batch_id" var batchId = response.BatchSummary.BatchReference; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "action->result_code" var responseCode = response.ResponseCode; //API raw response key "payment_method->card->brand_reference" var cardBrandReference = response.CardBrandTransactionId; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; //API raw response key "payment_method->card->provider->cvv_result" var cardIssuerCvv = response.CardIssuerResponse.CvvResult; //API raw response key "payment_method->card->provider->avs_address_result" var cardIssuerAvsAddressResult = response.CardIssuerResponse.AvsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" var cardIssuerAvsPostalCodeResult = response.CardIssuerResponse.AvsPostalCodeResult; //API raw response key "risk_assessment->mode" var fraudResponseMode = response.FraudFilterResponse.FraudResponseMode; //API raw response key "risk_assessment->result" var fraudResponseResult = response.FraudFilterResponse.FraudResponseResult; //API raw response key "risk_assessment->rules" var fraudResponseRules = response.FraudFilterResponse.FraudResponseRules; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = '4263970000005262'; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = '123'; $card->cardHolderName = 'James Mason'; $card->threeDSecure = new \GlobalPayments\Api\Entities\ThreeDSecure(); $card->threeDSecure->providerServerTransRef = 'vJ9NXpFueXsAqeb4iAbJJbe+66s='; $card->threeDSecure->authenticationValue = 'AAACBUGDZYYYIgGFGYNlAAAAAAA='; $card->threeDSecure->eci = '05'; $card->threeDSecure->messageVersion = '2.1.0'; $storeCredentials = new StoredCredential(); $storeCredentials->initiator = StoredCredentialInitiator::PAYER; $storeCredentials->type = StoredCredentialType::UNSCHEDULED; $storeCredentials->sequence = StoredCredentialSequence::FIRST; try { $response = $card->charge(1) ->withCurrency("EUR") ->withClientTransactionId("14406011") ->withStoredCredential($storeCredentials) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; ``` #### Sample response ```json { "id": "TRN_wyU5fw3aUJZZXZ9OzdxHhLYete9tYk_14406011", "time_created": "2022-05-20T14:18:05.428Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "14406011", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "ef5FXsbbtJfXKhh0", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1092561", "action": { "id": "ACT_wyU5fw3aUJZZXZ9OzdxHhLYete9tYk", "type": "AUTHORIZE", "time_created": "2022-05-20T14:18:05.428Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app" } } ``` ## Subsequent transaction examples In our code samples, we use a stored card / payment method (also known as a token), but a merchant might store the card data themselves or use a third party. ### One-click checkout This use case is a CIT. For example, the customer returns to the merchant’s website and is presented with their previously stored card. It is recommended to also capture the security code (CVV) and, depending on the region, perform 3D Secure 2 authentication. > Brand reference is not required for subsequent CITs. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 2orSiiEoQc82EMBUNDyX1DS7guO3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_6716058969854a48b33347043ff8225f", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "53509251", "country": "IE", "initiator": "PAYER", "stored_credential": { "model": "UNSCHEDULED", "sequence": "SUBSEQUENT" }, "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "id": "PMT_850924e2-d2bd-4724-bb59-12ae1cec392d", "card": { "cvv": "123" }, "authentication": { "three_ds": { "server_trans_ref": "vJ9NXpFueXsAqeb4iAbJJbe+66s=", "value": "AAACBUGDZYYYIgGFGYNlAAAAAAA=", "eci": "05", "message_version": "2.1.0" } } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setCountry("IE"); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setToken("PMT_7554986a-1e77-4c75-a80f-5889d0621c13"); card.setCvn("123"); card.setCardHolderName("James Mason"); ThreeDSecure threeDSecure = new ThreeDSecure(); threeDSecure.setProviderServerTransRef("vJ9NXpFueXsAqeb4iAbJJbe+66s="); threeDSecure.setAuthenticationValue("AAACBUGDZYYYIgGFGYNlAAAAAAA="); threeDSecure.setEci("05"); threeDSecure.setMessageVersion("2.1.0"); card.setThreeDSecure(threeDSecure); StoredCredential storedCredential = new StoredCredential(); storedCredential.setInitiator(StoredCredentialInitiator.CardHolder); storedCredential.setType(StoredCredentialType.Unscheduled); storedCredential.setSequence(StoredCredentialSequence.Subsequent); try { Transaction response = card.charge(new BigDecimal("1.00")) .withCurrency("EUR") .withClientTransactionId("53509251") .withStoredCredential(storedCredential) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchId = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "payment_method->card->brand_reference" String cardBrandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->avs_postal_code_result" String avsResponseCode = response.getAvsResponseCode(); // API raw response key "payment_method->card->->avs_address_result" String avsAddressResponse = response.getAvsAddressResponse(); // API raw response key "payment_method->card->cvv_result" String cvnResponseMessage = response.getCvnResponseMessage(); // API raw response key "payment_method->card->brand"(); String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); // API raw response key "payment_method->card->provider->cvv_result" String cardIssuerCvv = response.getCardIssuerResponse().getCvvResult(); // API raw response key "payment_method->card->provider->avs_address_result" String cardIssuerAvsAddressResult = response.getCardIssuerResponse().getAvsAddressResult(); // API raw response key "payment_method->card->provider->avs_postal_code_result" String cardIssuerAvsPostalCodeResult = response.getCardIssuerResponse().getAvsPostalCodeResult(); // API raw response key "risk_assessment->mode" String fraudResponseMode = response.getFraudFilterResponse().getFraudResponseMode(); // API raw response key "risk_assessment->result" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // API raw response key "risk_assessment->rules" List fraudResponseRules = response.getFraudFilterResponse().getFraudResponseRules(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST, Country = "IE" }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Token = "PMT_7554986a-1e77-4c75-a80f-5889d0621c13", Cvn = "123", CardHolderName = "James Mason", ThreeDSecure = new ThreeDSecure { ProviderServerTransRef = "vJ9NXpFueXsAqeb4iAbJJbe+66s=", AuthenticationValue = "AAACBUGDZYYYIgGFGYNlAAAAAAA=", Eci = "05", MessageVersion = "2.1.0" } }; StoredCredential storeCredentials = new StoredCredential { Initiator = StoredCredentialInitiator.CardHolder, Type = StoredCredentialType.Unscheduled, Sequence = StoredCredentialSequence.Subsequent }; try { Transaction response = card.Charge(1m) .WithCurrency("EUR") .WithClientTransactionId("53509251") .WithStoredCredential(storeCredentials) .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.AuthorizedAmount; //API raw response key "batch_id" var batchId = response.BatchSummary.BatchReference; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "action->result_code" var responseCode = response.ResponseCode; //API raw response key "payment_method->card->brand_reference" var cardBrandReference = response.CardBrandTransactionId; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; //API raw response key "payment_method->card->provider->cvv_result" var cardIssuerCvv = response.CardIssuerResponse.CvvResult; //API raw response key "payment_method->card->provider->avs_address_result" var cardIssuerAvsAddressResult = response.CardIssuerResponse.AvsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" var cardIssuerAvsPostalCodeResult = response.CardIssuerResponse.AvsPostalCodeResult; //API raw response key "risk_assessment->mode" var fraudResponseMode = response.FraudFilterResponse.FraudResponseMode; //API raw response key "risk_assessment->result" var fraudResponseResult = response.FraudFilterResponse.FraudResponseResult; //API raw response key "risk_assessment->rules" var fraudResponseRules = response.FraudFilterResponse.FraudResponseRules; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->token = 'PMT_7554986a-1e77-4c75-a80f-5889d0621c13'; $card->cvn = '123'; $card->cardHolderName = 'James Mason'; $card->threeDSecure = new \GlobalPayments\Api\Entities\ThreeDSecure(); $card->threeDSecure->providerServerTransRef = 'vJ9NXpFueXsAqeb4iAbJJbe+66s='; $card->threeDSecure->authenticationValue = 'AAACBUGDZYYYIgGFGYNlAAAAAAA='; $card->threeDSecure->eci = '05'; $card->threeDSecure->messageVersion = '2.1.0'; $storeCredentials = new StoredCredential(); $storeCredentials->initiator = StoredCredentialInitiator::PAYER; $storeCredentials->type = StoredCredentialType::UNSCHEDULED; $storeCredentials->sequence = StoredCredentialSequence::SUBSEQUENT; try { $response = $card->charge(1) ->withCurrency("EUR") ->withClientTransactionId("53509251") ->withStoredCredential($storeCredentials) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->avs_postal_code_result" $avsResponseCode = $response->avsResponseCode; //API raw response key "payment_method->card->->avs_address_result" $avsAddressResponse = $response->avsAddressResponse; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; ``` #### Sample response ```json { "id": "TRN_G8Kj4BTiKOS67ywj9V3nbn5hLpet6f_53509251", "time_created": "2022-05-20T16:43:27.568Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "53509251", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "66CX0osxtpW7hPOG", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1092561", "action": { "id": "ACT_G8Kj4BTiKOS67ywj9V3nbn5hLpet6f", "type": "AUTHORIZE", "time_created": "2022-05-20T16:43:27.568Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app" } } ``` ### Recurring & Installments This use case is an MIT. For example, the merchant charges the customer’s card based on an agreed subscription or installment plan. You must supply the brand reference from the original authorization or verification when the card was first stored. When flagged correctly, MITs are deemed as out of scope for the European requirements for Strong Customer Authentication (SCA). For more information, see our [Merchant-Initiated Transactions](https://developer.globalpayments.com/docs/MIT) article. In this example, we set the model to be Recurring, but we could also choose Installment. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 2orSiiEoQc82EMBUNDyX1DS7guO3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_6716058969854a48b33347043ff8225f", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "75652561", "country": "IE", "initiator": "MERCHANT", "stored_credential": { "model": "RECURRING", "sequence": "SUBSEQUENT" }, "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "id": "PMT_850924e2-d2bd-4724-bb59-12ae1cec392d", "card": { "brand_reference": "wqIV3urYYTj5LkCT" } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setCountry("IE"); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setToken("PMT_7554986a-1e77-4c75-a80f-5889d0621c13"); card.setCardHolderName("James Mason"); StoredCredential storedCredential = new StoredCredential(); storedCredential.setInitiator(StoredCredentialInitiator.Merchant); storedCredential.setType(StoredCredentialType.Recurring); storedCredential.setSequence(StoredCredentialSequence.Subsequent); String chargeCardBrandReference = "t9XevTa8Oia31WVL"; try { Transaction response = card.charge(new BigDecimal("1.00")) .withCurrency("EUR") .withClientTransactionId("75652561") .withStoredCredential(storedCredential) .withCardBrandStorage(StoredCredentialInitiator.Merchant, chargeCardBrandReference) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchId = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "payment_method->card->brand_reference" String cardBrandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->avs_postal_code_result" String avsResponseCode = response.getAvsResponseCode(); // API raw response key "payment_method->card->->avs_address_result" String avsAddressResponse = response.getAvsAddressResponse(); // API raw response key "payment_method->card->cvv_result" String cvnResponseMessage = response.getCvnResponseMessage(); // API raw response key "payment_method->card->brand"(); String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); // API raw response key "payment_method->card->provider->cvv_result" String cardIssuerCvv = response.getCardIssuerResponse().getCvvResult(); // API raw response key "payment_method->card->provider->avs_address_result" String cardIssuerAvsAddressResult = response.getCardIssuerResponse().getAvsAddressResult(); // API raw response key "payment_method->card->provider->avs_postal_code_result" String cardIssuerAvsPostalCodeResult = response.getCardIssuerResponse().getAvsPostalCodeResult(); // API raw response key "risk_assessment->mode" String fraudResponseMode = response.getFraudFilterResponse().getFraudResponseMode(); // API raw response key "risk_assessment->result" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // API raw response key "risk_assessment->rules" List fraudResponseRules = response.getFraudFilterResponse().getFraudResponseRules(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST, Country = "IE" }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Token = "PMT_7554986a-1e77-4c75-a80f-5889d0621c13", CardHolderName = "James Mason", ThreeDSecure = new ThreeDSecure { ProviderServerTransRef = "vJ9NXpFueXsAqeb4iAbJJbe+66s=", AuthenticationValue = "AAACBUGDZYYYIgGFGYNlAAAAAAA=", Eci = "05", MessageVersion = "2.1.0" } }; StoredCredential storeCredentials = new StoredCredential { Initiator = StoredCredentialInitiator.Merchant, Type = StoredCredentialType.Recurring, Sequence = StoredCredentialSequence.Subsequent }; var cardBrandRef = "t9XevTa8Oia31WVL"; try { Transaction response = card.Charge(1m) .WithCurrency("EUR") .WithClientTransactionId("75652561") .WithStoredCredential(storeCredentials) .WithCardBrandStorage(StoredCredentialInitiator.Merchant, cardBrandRef) .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.AuthorizedAmount; //API raw response key "batch_id" var batchId = response.BatchSummary.BatchReference; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "action->result_code" var responseCode = response.ResponseCode; //API raw response key "payment_method->card->brand_reference" var cardBrandReference = response.CardBrandTransactionId; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; //API raw response key "payment_method->card->provider->cvv_result" var cardIssuerCvv = response.CardIssuerResponse.CvvResult; //API raw response key "payment_method->card->provider->avs_address_result" var cardIssuerAvsAddressResult = response.CardIssuerResponse.AvsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" var cardIssuerAvsPostalCodeResult = response.CardIssuerResponse.AvsPostalCodeResult; //API raw response key "risk_assessment->mode" var fraudResponseMode = response.FraudFilterResponse.FraudResponseMode; //API raw response key "risk_assessment->result" var fraudResponseResult = response.FraudFilterResponse.FraudResponseResult; //API raw response key "risk_assessment->rules" var fraudResponseRules = response.FraudFilterResponse.FraudResponseRules; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->token = 'PMT_7554986a-1e77-4c75-a80f-5889d0621c13'; $card->cardHolderName = 'James Mason'; $storeCredentials = new StoredCredential(); $storeCredentials->initiator = StoredCredentialInitiator::MERCHANT; $storeCredentials->type = StoredCredentialType::RECURRING; $storeCredentials->sequence = StoredCredentialSequence::SUBSEQUENT; $cardBrandReference = 't9XevTa8Oia31WVL'; try { $response = $card->charge(1) ->withCurrency("EUR") ->withClientTransactionId("75652561") ->withStoredCredential($storeCredentials) ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $cardBrandReference) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->avs_postal_code_result" $avsResponseCode = $response->avsResponseCode; //API raw response key "payment_method->card->->avs_address_result" $avsAddressResponse = $response->avsAddressResponse; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; ``` #### Sample response ```json { "id": "TRN_xOPLdeWShj4YYqydi2Sn7HkQ3Gf3ZK_40424451", "time_created": "2022-05-20T17:38:17.637Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "40424451", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "FB7P70xHebhcC7Rr", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1092561", "action": { "id": "ACT_xOPLdeWShj4YYqydi2Sn7HkQ3Gf3ZK", "type": "AUTHORIZE", "time_created": "2022-05-20T17:38:17.637Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app" } } ``` ### Auto account top-up This use case is an MIT. For example, the merchant charges the customer’s card based on their account balance dropping below a certain threshold. In this case, we set the model to be Unscheduled. You must also supply the brand reference from the original authorization or verification when the card was first stored. When flagged correctly, MITs are deemed as out of scope for the European requirements for SCA. For more information, see our [Merchant-Initiated Transactions](https://developer.globalpayments.com/docs/MIT) article. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 2orSiiEoQc82EMBUNDyX1DS7guO3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_6716058969854a48b33347043ff8225f", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "01577731", "country": "IE", "initiator": "MERCHANT", "stored_credential": { "model": "UNSCHEDULED", "sequence": "SUBSEQUENT" }, "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "id": "PMT_850924e2-d2bd-4724-bb59-12ae1cec392d", "card": { "brand_reference": "wqIV3urYYTj5LkCT" } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setCountry("IE"); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setToken("PMT_7554986a-1e77-4c75-a80f-5889d0621c13"); card.setCardHolderName("James Mason"); StoredCredential storedCredential = new StoredCredential(); storedCredential.setInitiator(StoredCredentialInitiator.Merchant); storedCredential.setType(StoredCredentialType.Unscheduled); storedCredential.setSequence(StoredCredentialSequence.Subsequent); String chargeCardBrandReference = "t9XevTa8Oia31WVL"; try { Transaction response = card.charge(new BigDecimal("1.00")) .withCurrency("EUR") .withClientTransactionId("01577731") .withStoredCredential(storedCredential) .withCardBrandStorage(StoredCredentialInitiator.Merchant, chargeCardBrandReference) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchId = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "payment_method->card->brand_reference" String cardBrandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->avs_postal_code_result" String avsResponseCode = response.getAvsResponseCode(); // API raw response key "payment_method->card->->avs_address_result" String avsAddressResponse = response.getAvsAddressResponse(); // API raw response key "payment_method->card->cvv_result" String cvnResponseMessage = response.getCvnResponseMessage(); // API raw response key "payment_method->card->brand"(); String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); // API raw response key "payment_method->card->provider->cvv_result" String cardIssuerCvv = response.getCardIssuerResponse().getCvvResult(); // API raw response key "payment_method->card->provider->avs_address_result" String cardIssuerAvsAddressResult = response.getCardIssuerResponse().getAvsAddressResult(); // API raw response key "payment_method->card->provider->avs_postal_code_result" String cardIssuerAvsPostalCodeResult = response.getCardIssuerResponse().getAvsPostalCodeResult(); // API raw response key "risk_assessment->mode" String fraudResponseMode = response.getFraudFilterResponse().getFraudResponseMode(); // API raw response key "risk_assessment->result" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // API raw response key "risk_assessment->rules" List fraudResponseRules = response.getFraudFilterResponse().getFraudResponseRules(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST, Country = "IE" }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Token = "PMT_7554986a-1e77-4c75-a80f-5889d0621c13", CardHolderName = "James Mason", ThreeDSecure = new ThreeDSecure { ProviderServerTransRef = "vJ9NXpFueXsAqeb4iAbJJbe+66s=", AuthenticationValue = "AAACBUGDZYYYIgGFGYNlAAAAAAA=", Eci = "05", MessageVersion = "2.1.0" } }; StoredCredential storeCredentials = new StoredCredential { Initiator = StoredCredentialInitiator.Merchant, Type = StoredCredentialType.Unscheduled, Sequence = StoredCredentialSequence.Subsequent }; var cardBrandRef = "t9XevTa8Oia31WVL"; try { Transaction response = card.Charge(1m) .WithCurrency("EUR") .WithClientTransactionId("01577731") .WithStoredCredential(storeCredentials) .WithCardBrandStorage(StoredCredentialInitiator.Merchant, cardBrandRef) .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.AuthorizedAmount; //API raw response key "batch_id" var batchId = response.BatchSummary.BatchReference; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "action->result_code" var responseCode = response.ResponseCode; //API raw response key "payment_method->card->brand_reference" var cardBrandReference = response.CardBrandTransactionId; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; //API raw response key "payment_method->card->provider->cvv_result" var cardIssuerCvv = response.CardIssuerResponse.CvvResult; //API raw response key "payment_method->card->provider->avs_address_result" var cardIssuerAvsAddressResult = response.CardIssuerResponse.AvsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" var cardIssuerAvsPostalCodeResult = response.CardIssuerResponse.AvsPostalCodeResult; //API raw response key "risk_assessment->mode" var fraudResponseMode = response.FraudFilterResponse.FraudResponseMode; //API raw response key "risk_assessment->result" var fraudResponseResult = response.FraudFilterResponse.FraudResponseResult; //API raw response key "risk_assessment->rules" var fraudResponseRules = response.FraudFilterResponse.FraudResponseRules; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->token = 'PMT_7554986a-1e77-4c75-a80f-5889d0621c13'; $card->cardHolderName = 'James Mason'; $storeCredentials = new StoredCredential(); $storeCredentials->initiator = StoredCredentialInitiator::MERCHANT; $storeCredentials->type = StoredCredentialType::UNSCHEDULED; $storeCredentials->sequence = StoredCredentialSequence::SUBSEQUENT; $cardBrandReference = 't9XevTa8Oia31WVL'; try { $response = $card->charge(1) ->withCurrency("EUR") ->withClientTransactionId("01577731") ->withStoredCredential($storeCredentials) ->withCardBrandStorage(StoredCredentialInitiator::MERCHANT, $cardBrandReference) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; $referenceNumber = $response->referenceNumber; // API raw response key "reference" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" $responseCode = $response->responseCode; // API raw response key "action->result_code" //API raw response key "payment_method->card->brand_reference" $cardBrandReference = $response->cardBrandTransactionId; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->avs_postal_code_result" $avsResponseCode = $response->avsResponseCode; //API raw response key "payment_method->card->->avs_address_result" $avsAddressResponse = $response->avsAddressResponse; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; ``` #### Sample response ```json { "id": "TRN_J69gReLKy8dP1p5WgdVLLnX7xADx8y_01577731", "time_created": "2022-05-20T17:43:28.196Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "01577731", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "0sJ211EAr8pEp7dy", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1092561", "action": { "id": "ACT_J69gReLKy8dP1p5WgdVLLnX7xADx8y", "type": "AUTHORIZE", "time_created": "2022-05-20T17:43:28.196Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app" } } ``` # Tokenization - Overview Source: https://developer.globalpayments.com/docs/payments/tokenization/overview.md Section: Payments Description: Store card and customer data for secure payments Tokenization is the capability to securely store and manage payment methods on our API in any region and across both online (card not present) and in-store (card present) environments. It involves replacing sensitive data with unique identification symbols, or _tokens_, that retain all the essential information about the data without compromising its security. These tokens can be used in place of the actual data to perform operations, such as processing payments, without exposing the sensitive information itself. The PCI DSS sets stringent requirements for handling and storing card information. Tokenization helps businesses comply with these regulations by minimizing the amount of sensitive data they handle and store. ## Payment token types Payment tokens are different from the access tokens required to authorize and use our API. For more information on access tokens, see our [guide](https://developer.globalpayments.com/api/definitions/access-tokens.md). There are two types of payment tokens: * Single-Use Payment Token – Valid for only a certain amount of time and for a single use, thus eliminating the risk of reuse in fraudulent activities. A single use token is automatically deleted after a few minutes, unless it is explicitly converted to a multi-use token to store the card information. * Multi-Use Payment Token – Can be used for multiple transactions. These tokens are typically linked to a specific payment method and can be reused for various transactions until they are explicitly invalidated. They provide a balance between security and convenience, making them suitable for scenarios where recurring transactions are needed. ## Next steps Now that you have an understanding of the tokenization types, the next step is to look at the tokenization capabilities our API can provide you. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) Tokenize card details to charge customers later. ### [Payers](https://developer.globalpayments.com/docs/payments/tokenization/payers-overview.md) Store customer details for future transactions. ### [Recurring Payments](https://developer.globalpayments.com/docs/payments/recurring/overview.md) Make subsequent payments easier for your customers. # Card Storage - Guide Source: https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md Section: Payments Description: Tokenize card details to charge customers later #### API With our API, you can securely store card data with us and receive a token representation of the card. This token can be stored with no increased PCI DSS compliance requirements. Tokens can be used for recurring billing or to enable one-click checkout. You can add, delete, and update stored cards. This guide focuses on how to store cards (tokenization) and charge them. We also show you how to enable our Payment Method Alias solution in the request. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Store a card We highly recommend processing an authorization or verification against a card before storing it. This allows you to check that the card data provided is valid. For more information, see [Transactions](https://developer.globalpayments.com/api/transactions.md#/Create%20a%20Sale%20or%20Refund/createSaleOrRefundTransaction) and [Verifications](https://developer.globalpayments.com/api/verifications.md#/Verify/post_verifications) in the API Explorer. In this exammple, we send a request to store a card. For more information, see [Payment Methods - Tokenization](https://developer.globalpayments.com/api/payment-methods-tokenization.md#/Create/post-payment-method) in the API Explorer. #### Sample request ```JSON curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/payment-methods' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 19MKWmKalkNz241ECHPH2VTpx9Uc' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "reference": "99388961", "card": { "number": "4012001037141112", "expiry_month": "12", "expiry_year": "25" } }' ``` #### Sample response The `id` value returned in the response is the token to use to reference the stored card when processing payments. It begins with the three letters `PMT_`. ```JSON { "id": "PMT_815adaf8-4f8b-43bd-934d-d9fd086897f2", "time_created": "2021-01-18T12:06:17.227Z", "status": "ACTIVE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TKA_eba30a1b5c4a468d90ceeef2ffff7f5e", "account_name": "Tokenization", "reference": "99388961", "card": { "masked_number_last4": "XXXXXXXXXXXX1112", "brand": "VISA", "expiry_month": "12", "expiry_year": "25" }, "action": { "id": "ACT_KfF9omT2vg3bl8s8uqFsimo2416yv5", "type": "PAYMENT_METHOD_CREATE", "time_created": "2021-01-18T12:06:17.227Z", "result_code": "SUCCESS", "app_id": "jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name": "cathal_sandbox" } } ``` ## Step 2: Create a transaction Creating a transaction from a stored card works the same as a standard authorization, except instead of collecting card data you simply send the `id` in the `payment_method` object in the request. We obtain the securely stored card data and build the authorization message. Under PCI DSS compliance rules, the security code (CVN, CVV) cannot be stored. However, if in your application you let the customer use a card they previously saved, you can prompt them for their security code again. Then include the code in the request. #### Sample request ```JSON curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 19MKWmKalkNz241ECHPH2VTpx9Uc' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_name": "Transaction_Processing", "channel": "CNP", "type": "SALE", "amount": "4500", "currency": "USD", "reference": "56938151", "country": "US", "payment_method": { "id": "PMT_815adaf8-4f8b-43bd-934d-d9fd086897f2", "entry_mode": "ECOM" } }' ``` ## [Optional] Payment Method Alias With Payment Method Alias, you can link customer data among various payment-processing channels. We provide a unique reference that helps you recognize a customer’s payment interactions no matter where they occur, without exposing sensitive information. To enable this solution, add the following field to the `payment_method` object in the sample request for [Step 2](#step-2-create-a-transaction). For more information, see [Payment Method Alias](https://developer.globalpayments.com/docs/payments/tokenization/payment-method-alias-guide.md). ```JSON curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 19MKWmKalkNz241ECHPH2VTpx9Uc' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_name": "Transaction_Processing", "channel": "CNP", "type": "SALE", "amount": "4500", "currency": "USD", "reference": "56938151", "country": "US", "payment_method": { "id": "PMT_815adaf8-4f8b-43bd-934d-d9fd086897f2", "entry_mode": "ECOM", "fingerprint_mode": "ALWAYS" } }' ``` #### HPP Our Card Storage solution is designed to enhance your customers’ experience while alleviating your PCI DSS compliance requirements. We store all of the sensitive cardholder data, whereas your application or website can simply store the customer references. You can then call on the Hosted Payment Page (HPP) to allow your customer to pay with one of their saved cards. They can also update and delete their cards. It’s also possible to raise payments against stored cards using our API. This guide builds on our main [HPP Guide](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-guide.md) and focuses on how to create a payer and store a card using the Create HPP Link request. We also show you how to display stored cards to the customer in future transactions. You'll also find field definitions for additional request fields related to this process. > Card Storage is a chargeable service. If you want to add it, contact your account manager. Card Storage uses a dual-token system. Each customer is assigned a unique token reference called a *payer*. Each card saved is assigned a Payment Method reference. These references are automatically generated by us. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Create a payer and store a card To enable Card Storage on the HPP, we simply add three fields in the Create HPP Link request. We can also choose to provide the option to the customer to save their card or save it automatically. * `payer.status` = ACTIVE * `payer.id` = ID created from the Payers resource * `order.payment_method_configuration.storage_mode` = PROMPT To learn how to create a payer, see the [Payers - Guide](https://developer.globalpayments.com/docs/payments/tokenization/payers-guide.md). #### Sample request ``` curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7V5XtjLBHLN1h' \ --data-raw '{ "account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-549d-4967-aeea-51b3f320046a", "payer": { "status": "ACTIVE", "id": "PYR_a488356f29ac4e4c9a89977652a3215e", "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "44", "subsriber_number": "1801555888" }, "billing_address": { "line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Halifax", "postal_code": "44", "country": "GB" } }, "order": { "amount": "1000", "currency": "EUR", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "GB", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD" ] }, "payment_method_configuration": { "authentication": { "preference": "CHALLENGE_PREFERRED" }, "storage_mode": "PROMPT" } }, "notifications": { "return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url" } }' ``` #### Example – Store a new card ![](/gh-assets/card-storage_store card.png) **Store New Card Example** ## Display stored cards to the customer With our payer created and a card stored, we can now use this Payer ID in future transactions to present all of the stored cards to the customer. To do this, we pass the same fields and value as before in [Create a payer and store a card](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md#create-a-payer-and-store-a-card): * `payer.status` = ACTIVE * `payer.id` = the ID of our payer * `order.payment_method_configuration.storage_mode` = PROMPT #### Sample request ```JSON curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7V5XtjLBHLN1h' \ --data-raw '{ "account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-549d-4967-aeea-51b3f320046a", "payer": { "status": "ACTIVE", "id": "PYR_a488356f29ac4e4c9a89977652a3215e", "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "44", "subsriber_number": "1801555888" }, "billing_address": { "line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Halifax", "postal_code": "44", "country": "GB" } }, "order": { "amount": "1000", "currency": "EUR", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "GB", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD" ] }, "payment_method_configuration": { "authentication": { "preference": "CHALLENGE_PREFERRED" }, "storage_mode": "PROMPT" } }, "notifications": { "return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url" } }' ``` #### Example – Display cards ![](/gh-assets/card-storage_display card.png) **Display Stored Card(s) Example** ## Additional request fields | Element/Field | Category | Format | Type | Length | Description | | -------- | ------- | ------- | ------- | ------- | ------- | | payer.status | string | enum | O | | Indicates whether the payer is new or existing (active). **ACTIVE** - Payer was created and any payment methods stored with this payer are displayed on the HPP. | | payer.id | string | alphanumeric | O | 1-50 | Unique ID generated by us to reference a payer in our system. To learn how to create a payer, see the [Payers - Guide](https://developer.globalpayments.com/docs/payments/tokenization/payers-guide.md). | | order.payment_ method_configuration. storage_mode | string | enum | O | | Indicates whether to store the card as part of a transaction. Allowed values: **ALWAYS** - Card information is always stored irrespective of whether the payment method authorization was successful. **PROMPT** - Displays a checkbox on the HPP to confirm with the payer to store their card. | ## Enhance your integration Below are value-added services you can enable for the HPP. ### [Recurring Payments](https://developer.globalpayments.com/docs/payments/recurring/overview.md) Make subsequent payments easier for your customers. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md#hpp) Integrate with alternative and local payment methods. ### [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md) Let international customers pay in their home currency. # Payment Method Alias Source: https://developer.globalpayments.com/docs/payments/tokenization/payment-method-alias-guide.md Section: Payments Description: Unify customer transactions from multiple channels Merchants need more than just the ability to process both card-present and card-not-present payments. To deliver a seamless experience, the payment channels must be unified and present a full picture of the customer and their purchase data. ## What is it? Our Payment Method Alias solution enables your business to seamlessly identify customers using their method of payment across any channel by creating a link between payment-processing channels. Combined with tokenization, this enables merchants to track and store the customer’s payment details on file to connect a customer’s behavior with their payment interactions, whether they occur in-store, in-app, or online — without exposing sensitive information. Using our Payment Method Alias solution, merchants can: * Identify a customer by their card only. * Match transactions through a card to a known customer. * Link the data to existing customer profiles on the merchant’s Customer Relationship Management (CRM) system. * Provide an endless range of new commerce opportunities, including simplified refunds, loyalty incentives, verifications, and much more. ## How does it work? With our API, each time a card number (PAN) passes through for tokenization or processing, we create and store a unique non-sensitive reference for this card that is separate from the payment token. Using this alias, you can uniquely identify a card in your system, even across different processing channels (for example, in-store, online, mobile, or MOTO). This alias is used for reporting purposes only and is not required for any API requests. When the `fingerprint_mode` flag is set to either `ALWAYS` or `ON_SUCCESS` in a transaction request, the alias that is returned in the response enables additional use cases that merchants can implement (for examples, see the Payment Method Alias section in our [Card Storage Guide](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md). ## Use cases Here, we present some “real world” examples that can be enabled through our Payment Method Alias tokenization solution. Keep in mind that this section doesn’t cover all of the use cases and assumes that the merchant neither has nor wants direct access to the PAN used in the transaction. ##### Use case #1: Using card as ID (buy online, pick up in-store) A merchant who offers the ability to buy online and pick up in-store will usually require that the customer authenticate or identify themselves at the register. Using our Payment Method Alias solution, merchants can leverage a secure and robust mechanism to authenticate the purchaser by using the PAN read from the card’s (EMV) chip and matching it against the stored token from the online transaction. With a semi-integrated terminal that supports payment aliases, a merchant can request that a customer insert their card to perform an account-verification transaction (or instruct them to use a tokenization-specific function of the terminal). The alias returned in the result can then be compared with the alias stored from the online transaction to see if there’s a match. ##### Use case #2: Refund without a receipt, using card as customer lookup When a customer wants to return merchandise (whether purchased online or in-store) but doesn’t have the receipt, the merchant can look up their purchase using the customer’s card. As in the previous use case, a merchant can request that a customer insert their card into a semi-integrated terminal that supports a payment alias to perform an account-verification transaction (or instruct them to use a tokenization-specific function of the terminal). The alias returned in the result can then be compared with other aliases stored in the merchant’s database. If an alias match is found, the search then focuses on matching transaction details to find the particular merchandise. Once the item is found, the merchant can authorize a refund directly to that card without requiring the card to be reinserted if a token of the card was also stored with the transaction. ##### Use case #3: Recognize existing customers for loyalty rewards or CRM tracking When processing a transaction from a returning customer, a merchant can offer loyalty rewards or other items related to customer tracking without requiring that the customer identify themselves through other means, such as entering a phone number or scanning a barcode. When a transaction is processed, the merchant uses the alias in the result to see if the customer already has an account. If so, the merchant can add loyalty points, email a receipt, or take some other CRM-related action. If the alias doesn’t match anything in the database, the merchant can ask for additional identifying information, such as a phone number, to determine whether the card represents an existing customer using a new card or whether the customer is new. If the additional information produces a match, the merchant can add the new card alias to the existing customer’s profile; if not, they can set up a new account. ## Next steps Take a look at our [Card Storage Guide](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md), which takes you through the tokenization of a card and how to enable Payment Method Alias. # Network Tokenization - Overview Source: https://developer.globalpayments.com/docs/payments/tokenization/network-tokenization-overview.md Section: Payments Description: Allow card brands to manage customers’ payment credentials A network token is similar to an acquirer token in that it reduces PCI DSS scope and improves security by swapping sensitive card data (PAN) for non-sensitive data. However, network tokens are generated by the card brands such as Visa and Mastercard. Each brand maintains its own secure repository of network tokens that serve as payment credentials. So, if a customer loses their card or it’s stolen, the brand updates their token automatically without any disruption in service. With network tokens, merchants can: * Reduce declined charges due to outdated credentials * Avoid additional fees incurred using traditional tokens or PANs * Minimize involuntary drop-offs due to outdated customer card data * Employ multi-processor redundancy since network tokens are fully portable We work with the card brands to provide a Card Storage service to merchants who want to initiate transactions using network tokens. This also includes generating cryptograms, which are required for transactions that are customer initiated. ## Use cases In this section, we present some “real world” examples that can be enabled through our Network Tokens - Card Storage service. Keep in mind that this section doesn’t cover all of the use cases. ##### Use case #1: Easy migration to our payment gateway A merchant who was previously with another payment gateway provider wants to migrate all repeat payments, such as subscriptions, to our gateway. The merchant can just provide the Funding Primary Account Numbers (FPANs). We then convert the FPANs to network tokens on the merchant's behalf. Using network tokens results in higher acceptance rates and reduced involuntary drop-offs from continued repeat payments. ##### Use case #2: Automatic card management A merchant using an account updater to keep their customers’ cards up to date wants to reduce this burden as well as improve customer service. Since network tokens are managed by the card brands (like Visa or Mastercard), token updating is done automatically by them on behalf of the merchant. This results in higher acceptance rates because it reduces declined charges due to outdated credentials. Also, if a customer loses their card or it gets stolen, the card network updates the token directly so it continues to work without any service interruption, improving customer satisfaction. ##### Use case #3: Multi-provider merchant A merchant wants to use multiple gateways for fallback or redundancy purposes. This way, if one of the gateways is slow or has an outage, another provider can be used so that there’s no interruption of payment processing. Since network tokens are fully portable (unlike acquirer tokens), the merchant can use them to switch between multiple providers as needed. This can also result in greater protection of customer PCI data. ##### Use case #4: Fewer fees (US/Canada only) A merchant wants to reduce the fees they have to pay for payment processing. To help with this, the merchant decides to use network tokens because they are cheaper to operate at volume with lower interchange fees compared to standard FPANs or tokens. ## How does it work? This section provides a high-level understanding of how the network tokenization process works for both customer-initiated transactions (CITs) and merchant-initiated transactions (MITs). ### CITs The following diagrams show the typical flow for requesting a cryptogram with an existing network token for a CIT. **Generate a cryptogram with existing network token** ![Flow between the merchant, our API, and the Card Network to generate a cryptogram with an existing network token to make a CIT payment.](https://developer.globalpayments.com/gh-assets/network-token_cit-cryptogram.png) **Make a payment with a network token** ![Flow between the merchant, our API, Card Network, and the Issuer to make a CIT payment with a network token.](https://developer.globalpayments.com/gh-assets/network-token_cit-payment.png) ### MITs The following diagrams show the typical flow for generating a network token for an MIT. **Create a network token** ![Flow between the merchant, our API, the Card Network, and the issuer to create a network token for an MIT](https://developer.globalpayments.com/gh-assets/network-token_mit-create.png) **Make a payment with a network token** ![Flow between the merchant, our API, the Card Network, and the Issuer to make a CIT payment with a network token.](https://developer.globalpayments.com/gh-assets/network-token_mit-payment.png) ## Ready to get started? To get started with network tokens, see our [guide](https://developer.globalpayments.com/docs/payments/tokenization/network-tokenization-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Network Tokenization - Guide Source: https://developer.globalpayments.com/docs/payments/tokenization/network-tokenization-guide.md Section: Payments Description: Learn how to create a network token for card processing > Before coding this feature, please contact us to confirm it will be available to you when you go live. In this guide, you’ll learn how to create and process network tokens so that payment credentials for Visa and Mastercard customers can be kept up to date by the card brands instead. For more information on network tokens, see our [Overview](https://developer.globalpayments.com/docs/payments/tokenization/network-tokenization-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md#get-registered) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) ## Step 1: Create a Network Token The first step is to create the network token using the [Payment Methods - Tokenization](https://developer.globalpayments.com/api/payment-methods-tokenization.md#/Create/post-payment-method) resource. The field that determines whether a network token is created when creating the token is the `usage_mode` field. This needs to be set to `USE_NETWORK_TOKEN` for a network token to be created and associated with the token (`PMT_ID`). #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/payment-methods' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer LE1wnLSzvmbptrDWeEbjmw4t6Vsc' \ --header 'Content-Type: application/json' \ --data '{ "account_id": "TKA_236d5785e12a4ba380521ddfd9d4a70a", "reference": "TRANS-20221030203649423Z421b8221fc", "first_name": "James", "last_name": "Mason", "usage_mode": "USE_NETWORK_TOKEN", "fingerprint_mode": "", "card": { "number": "4622943123052970", "expiry_month": "12", "expiry_year": "25" } }' ``` #### Sample response The ID field returned in the response is the payer token to use to reference the stored card when processing payments. It begins with the three letters `PMT_`. The network token is returned in the card `network_token` field. If a network token can’t be created for a card, the following fields will **not** be returned in the response: * `network_token` * `masked_network_token_last4` * `network_token_expiry_month` * `network_token_expiry_year fields` The network token value looks the same as a card number but can only be used by you to process transactions. In this case, you can see that the actual card number in the request was _4622943123052970_ and that the corresponding network token to be used for transactions against this card is _4895370019221065_, as shown in the response. ```json { "id": "PMT_c8b43395-fb61-4698-8b59-5e16a348ceef", "time_created": "2025-02-21T11:46:09.929Z", "status": "ACTIVE", "usage_mode": "USE_NETWORK_TOKEN", "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "merchant_name": "Network Token_merchant", "account_id": "TKA_236d5785e12a4ba380521ddfd9d4a70a", "account_name": "ECOM_TKA", "reference": "TRANS-20221030203649423Z421b8221fc", "card": { "masked_number_last4": "XXXXXXXXXXXX2970", "brand": "VISA", "expiry_month": "12", "expiry_year": "25", "network_token": "4895370019221065", "masked_network_token_last4": "XXXXXXXXXXXX1065", "network_token_expiry_month": "12", "network_token_expiry_year": "30" }, "action": { "id": "ACT_YhZydEPsa3UMWj4mYB3rpSDLrUXAOh", "type": "PAYMENT_METHOD_CREATE", "time_created": "2025-02-21T11:46:09.929Z", "result_code": "SUCCESS", "app_id": "wIlGuatIHcO5xk7SHuTiMGbanC0dnzwy", "app_name": "NetworkToken_cert" } } ``` ## Step 2: Create a transaction There are three ways in which network tokens can be processed: * Merchant-initiated transaction (MIT) * Customer-initiated transaction (CIT) * Standalone one-off transaction Select the tab below to see the applicable steps. #### MIT In an MIT transaction, there are three ways to create a transaction using a network token. * [Method 1](#method-1) – Create a network token as in Step 1 and process it by sending the actual network token to us. * [Method 2](#method-2) – Create a network token as in Step 1 and process it by sending the `PMT_ID` that was returned to us, and set the `usage_mode` to `USE_NETWORK_TOKEN:` * `"usage_mode": "USE_NETWORK_TOKEN"` * [Method 3](#method-3) – Process a transaction as normal by sending the original card number but by setting the `payment_method.usage_mode` field to `USE_NETWORK_TOKEN` * For `ON_SUCCESS` storage mode ### Method 1 In this method, you create a network token as in Step 1 and process it by sending the actual network token to us. #### Sample request Note that the network token _4895370016970953_ is sent in the request. ```json { "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "account_id": "TRA_2d8a445280104ed5bfffcbf6d1292499", "type": "SALE", "channel": "CNP", "amount": "500", "currency": "GBP", "country": "US", "initiator": "MERCHANT", "stored_credential": { "model": "UNSCHEDULED", "reason": "INCREMENTAL", "sequence": "FIRST" }, "reference": "TRANS-20231012130751186Z838bc5328f", "payment_method": { "first_name": "James", "last_name": "Mason", "entry_mode": "MOTO", "storage_mode": "always", "card": { "network_token": "4895370016970953", "network_token_expiry_month": "12", "network_token_expiry_year": "30" } } } ``` #### Sample response ```json { "id": "TRN_2aDrTOiCUNsCwB56cF3IkOtJeMnZfU_6Z838bc5328f", "time_created": "2025-02-21T11:36:49.609Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "500", "currency": "GBP", "country": "US", "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "merchant_name": "Network Token_merchant", "account_id": "TRA_2d8a445280104ed5bfffcbf6d1292499", "account_name": "ECOM_NT", "reference": "TRANS-20231012130751186Z838bc5328f", "payment_method": { "result": "00", "message": "[ test system ] Authorised", "entry_mode": "MOTO", "card": { "masked_network_token_last4": "XXXXXXXXXXXX0953", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "nzwk4W4c8IltAD3U", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1500176", "action": { "id": "ACT_2aDrTOiCUNsCwB56cF3IkOtJeMnZfU", "type": "AUTHORIZE", "time_created": "2025-02-21T11:36:49.609Z", "result_code": "SUCCESS", "app_id": "wIlGuatIHcO5xk7SHuTiMGbanC0dnzwy", "app_name": "NetworkToken_cert" } } ``` ### Method 2 In this method, you create a network token as in Step 1, and process it by sending the `PMT_ID` that was returned to us, setting the `usage_mode` to `USE_NETWORK_TOKEN`. #### Sample request Note that the `PMT_ID` is sent in the request as opposed to the network token. ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Cookie: TS01759047=01e235508837c30bbf6a1caa7a559418e60b45d2f1e4e8c770db066961d0535ff43ae43f3206097755fe0b0bb4b6993cb3e35de3fc' \ --header 'a: m' \ --header 'Authorization: Bearer LE1wnLSzvmbptrDWeEbjmw4t6Vsc' \ --data '{ "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "account_id": "TRA_2d8a445280104ed5bfffcbf6d1292499", "type": "SALE", "channel": "CNP", "amount": "500", "currency": "GBP", "country": "US", "initiator": "MERCHANT", "stored_credential": { "model": "UNSCHEDULED", "reason": "INCREMENTAL", "sequence": "FIRST" }, "reference": "TRANS-20231012130751186Z838bc5328f", "payment_method": { "first_name": "James", "last_name": "Mason", "entry_mode": "MOTO", "usage_mode": "USE_NETWORK_TOKEN", "id": "PMT_8a69a8ba-cd69-4137-8aa3-f5354914bd34" } }' ``` #### Sample response Note that the transaction was processed with a network token as the `masked_network_token_last4` field was returned in the response as opposed to the `masked_number_last4` field that would be returned if the actual card number was used. ```json { "id": "TRN_aNcpI8o8Cg9NVIVy3Jx6WlBpdmyHDf_6Z838bc5328f", "time_created": "2025-02-21T11:58:39.857Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "500", "currency": "GBP", "country": "US", "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "merchant_name": "Network Token_merchant", "account_id": "TRA_2d8a445280104ed5bfffcbf6d1292499", "account_name": "ECOM_NT", "reference": "TRANS-20231012130751186Z838bc5328f", "payment_method": { "result": "00", "message": "[ test system ] ", "entry_mode": "MOTO", "card": { "masked_network_token_last4": "XXXXXXXXXXXX1065", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "XSPCEnJK54uEAF5x", "brand_time_created": "", "tag_response": "", "cvv_result": "NOT_CHECKED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1500176", "action": { "id": "ACT_aNcpI8o8Cg9NVIVy3Jx6WlBpdmyHDf", "type": "AUTHORIZE", "time_created": "2025-02-21T11:58:39.857Z", "result_code": "SUCCESS", "app_id": "wIlGuatIHcO5xk7SHuTiMGbanC0dnzwy", "app_name": "NetworkToken_cert" } } ``` ### Method 3 In this method, you process a transaction as normal by sending the original card number but by setting the `payment_method.usage_mode` field to `USE_NETWORK_TOKEN` (for `ON_SUCCESS` storage mode). #### Sample request In this example, you send a card number to us, and we process the transaction as a network token. ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Cookie: TS01759047=01e235508837c30bbf6a1caa7a559418e60b45d2f1e4e8c770db066961d0535ff43ae43f3206097755fe0b0bb4b6993cb3e35de3fc' \ --header 'a: m' \ --header 'Authorization: Bearer LE1wnLSzvmbptrDWeEbjmw4t6Vsc' \ --data-raw '{ "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "account_id": "TRA_2d8a445280104ed5bfffcbf6d1292499", "type": "SALE", "channel": "CNP", "amount": "500", "currency": "GBP", "gratuity_amount": "50", "tax_amount": "50", "user_reference": "TA1215", "country": "US", "initiator": "MERCHANT", "stored_credential": { "model": "UNSCHEDULED", "reason": "INCREMENTAL", "sequence": "FIRST" }, "capture_mode": "AUTO", "reference": "TRANS-20231012130751186Z838bc5328f", "payment_method": { "first_name": "James", "last_name": "Mason", "entry_mode": "MOTO", "usage_mode": "USE_NETWORK_TOKEN", "card": { "cvv": "999", "brand": "VISA", "number": "4622943123052970", "expiry_month": "12", "expiry_year": "25" } }, "order": { "reference": "-.,+@", "shipping_address": { "first_name": "", "last_name": "" }, "items": [ { "reference": "Bag1", "label": "aa", "description": "aa", "quantity": "1", "unit_amount": "3000", "unit_currency": "EUR", "tax_amount": "750" }, { "label": "ab", "description": "ab", "quantity": "1", "unit_amount": "6000", "unit_currency": "EUR", "tax_amount": "750" } ] }, "description": "description" }' ``` #### Sample response ```json { "id": "TRN_ujjnZCfiaVzXiUQkopx1NnhYgoJvF5_6Z838bc5328f", "time_created": "2025-02-27T09:48:52.655Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "500", "currency": "GBP", "country": "US", "merchant_id": "MER_5f596365bf7646efafc3f86e299ad25d", "merchant_name": "Network Token_merchant", "account_id": "TRA_2d8a445280104ed5bfffcbf6d1292499", "account_name": "ECOM_NT", "reference": "TRANS-20231012130751186Z838bc5328f", "payment_method": { "result": "00", "message": "[ test system ] ", "entry_mode": "MOTO", "card": {F "masked_network_token_last4": "XXXXXXXXXXXX1065", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "QKi3wnEXQicOdXyR", "brand_time_created": "", "cvv_result": "NOT_CHECKED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1502599", "action": { "id": "ACT_ujjnZCfiaVzXiUQkopx1NnhYgoJvF5", "type": "AUTHORIZE", "time_created": "2025-02-27T09:48:52.655Z", "result_code": "SUCCESS", "app_id": "wIlGuatIHcO5xk7SHuTiMGbanC0dnzwy", "app_name": "NetworkToken_cert" } } ``` #### CIT There are 3 ways in which you can create a Customer Initiated Transaction (CIT) using Network Tokens * [Method 1](#cit-method-1) \- Create a network token and then create a cryptogram and process it by sending the actual network token and cryptogram to Global Payments and the initiator as “PAYER” * [Method 2](#cit-method-2) \- Create a Network Token and process it by sending the `PMT_ID` that was returned along with the usage mode being set to `USE_NETWORK_TOKEN` * `"usage_mode": "USE_NETWORK_TOKEN ` * `"initiator": "PAYER"` * [Method 3](#cit-method-3) \- Process a transaction by sending the original card number but by setting the payment_method.usage_mode field to `USE_NETWORK_TOKEN` and `"initiator": "PAYER"`, * `"usage_mode": "USE_NETWORK_TOKEN` * `"initiator": "PAYER"` ### CIT Method 1 In this method, you will create a Network Token, then create a cryptogram and process it by sending us the actual Network Token and Cryptogram with the initiator set as ": "PAYER", You can either create a Network Token as outlined above or you can use an existing Network Token that you have on file. Next, create a cryptogram to send alongside the Network Token in the transaction. This can be done in two ways: 1. Create a Cryptogram using the Network Token obtained in the initial step The key fields in the request here are the amount that the transaction will ultimately be processed for and the Network Token. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/payment-methods/cryptogram' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data '{ "transaction": { "amount": "1000" }, "card": { "network_token": "4895370019221065" } }' ``` #### Sample response The cryptogram and cryptogram expiry date along with the eci will be returned in the response. These values can be sent in the authorization request. ```json { "time_created": "2025-05-26T09:50:11.329Z", "merchant_id": "MER_e997bf482fb84e5aac2eee2cd33fdfe9", "merchant_name": "CERTEservice_Standalone", "account_id": "TKA_a9e31752c52f47b395b943cf6558fb34", "account_name": "Eservice_TKA_01", "transaction": { "amount": "1000" }, "card": { "cryptogram": "AwAAAAAAeSQRtbsAAABMgpIAAAA=", "cryptogram_expiry_month": "12", "cryptogram_expiry_year": "30", "eci": "07", "masked_network_token_last4": "XXXXXXXXXXXX1065" }, "action": { "id": "ACT_QLCoKoiESyw1yC4FaUYHEuInx1tREW", "type": "CRYPTOGRAM_CREATE", "time_created": "2025-05-26T09:50:11.329Z", "result_code": "SUCCESS", "app_id": "LyFIeClnIpPwgn4SRuFNHiXVOTdyQkir", "app_name": "CERTEservice_Standalone" } } ``` 2. Create a cryptogram using the `PMT_ID` generated while creating the Network Token. Here the key field required will be the transaction amount. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/payment-methods/PMT_8a69a8ba-cd69-4137-8aa3-f5354914bd34/cryptogram' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data '{ "transaction": { "amount": "1000" } }' ``` #### Sample response The cryptogram and cryptogram expiry date along with the eci will be returned in the response. These values can be sent in the authorization request. ```json { "time_created": "2025-05-26T09:50:11.329Z", "merchant_id": "MER_e997bf482fb84e5aac2eee2cd33fdfe9", "merchant_name": "CERTEservice_Standalone", "account_id": "TKA_a9e31752c52f47b395b943cf6558fb34", "account_name": "Eservice_TKA_01", "transaction": { "amount": "1000" }, "card": { "cryptogram": "AwAAAAAAeSQRtbsAAABMgpIAAAA=", "cryptogram_expiry_month": "12", "cryptogram_expiry_year": "30", "eci": "07", "masked_network_token_last4": "XXXXXXXXXXXX1065" }, "action": { "id": "ACT_QLCoKoiESyw1yC4FaUYHEuInx1tREW", "type": "CRYPTOGRAM_CREATE", "time_created": "2025-05-26T09:50:11.329Z", "result_code": "SUCCESS", "app_id": "LyFIeClnIpPwgn4SRuFNHiXVOTdyQkir", "app_name": "CERTEservice_Standalone" } } ``` Next, send the Network Token and Cryptogram in the authorization request and set the Initiator as PAYER. **Note** : You can also just send the Network Token and set the initiator to PAYER. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Authorization: Bearer DCKbRy6gtN6gWJI2ja0B7e3POtbb' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-type: application/json' \ --header 'Accept: application/json' \ --data '{ "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "amount": "1999", "currency": "EUR", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "DE", "initiator": "PAYER", "stored_credential": { "model": "RECURRING", "reason": "INCREMENTAL", "sequence": "SUBSEQUENT" }, "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "authentication": { "id": "AUT_d455464a-115c-46b7-9622-6829e0326e23" }, "card": { "cryptogram": "AwAAAAABpS+FG8EAAABMgz0AAAA=", "eci": "07", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "network_token": "4895370019013736", "avs_address": "Flat 123", "avs_postal_code": "50001" } } }' ``` #### Sample response ```json { "id": "TRN_ped48TsfETw13y9iMyCBTalm2B2cfi_ca0584bb55bf", "time_created": "2025-11-13T21:09:42.548Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "DE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "payment_method": { "result": "00", "message": "(00)[ test system ] ", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "masked_network_token_last4": "XXXXXXXXXXXX3736", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "gSvbfdFUe04KZRPh", "brand_time_created": "", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1605993", "action": { "id": "ACT_ped48TsfETw13y9iMyCBTalm2B2cfi", "type": "AUTHORIZE", "time_created": "2025-11-13T21:09:42.548Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } ``` ### CIT Method 2 Create a Network Token as in Method 1 and process it by sending the PMT_ID that was returned along with the usage mode being set to `USE_NETWORK_TOKEN` (`"usage_mode": "USE_NETWORK_TOKEN"`,) and `"initiator": "PAYER"`. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Authorization: Bearer DCKbRy6gtN6gWJI2ja0B7e3POtbb' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-type: application/json' \ --header 'Accept: application/json' \ --data '{ "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "amount": "1999", "currency": "EUR", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "DE", "initiator": "PAYER", "stored_credential": { "model": "RECURRING", "reason": "INCREMENTAL", "sequence": "SUBSEQUENT" }, "payment_method": { "id":"PMT_563277b7-277a-4795-955a-20a4af885026", "usage_mode": "USE_NETWORK_TOKEN", "name": "James Mason", "entry_mode": "ECOM", "authentication": { "id": "AUT_d455464a-115c-46b7-9622-6829e0326e23" } } }' ``` #### Sample response ```json { "id": "TRN_WIZXVVTxGFWH8XciwiUVXh7Nv2PM1M_ca0584bb55bf", "time_created": "2025-11-13T21:15:08.645Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "DE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "payment_method": { "result": "00", "message": "(00)[ test system ] ", "entry_mode": "ECOM", "id": "PMT_563277b7-277a-4795-955a-20a4af885026", "authentication": { "cavv_result": "" }, "card": { "masked_network_token_last4": "XXXXXXXXXXXX3736", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "rSge6JWMgABayMRd", "brand_time_created": "", "tag_response": "", "cvv_result": "NOT_CHECKED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1605993", "action": { "id": "ACT_WIZXVVTxGFWH8XciwiUVXh7Nv2PM1M", "type": "AUTHORIZE", "time_created": "2025-11-13T21:15:08.645Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } } ``` ### CIT Method 3 Process a transaction by sending the original card number but by setting the `payment_method.usage_mode` field to `USE_NETWORK_TOKEN` and `"initiator": "PAYER"`, #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Authorization: Bearer DCKbRy6gtN6gWJI2ja0B7e3POtbb' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-type: application/json' \ --header 'Accept: application/json' \ --data '{ "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "amount": "1999", "currency": "EUR", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "DE", "initiator":"PAYER", "stored_credential": { "model": "RECURRING", "reason": "INCREMENTAL", "sequence": "SUBSEQUENT" }, "payment_method": { "usage_mode": "USE_NETWORK_TOKEN", "storage_mode": "ON_SUCCESS", "name": "James Mason", "entry_mode": "ECOM", "authentication": { "id": "AUT_d455464a-115c-46b7-9622-6829e0326e23" }, "card": { "number": "4622943123052970", "expiry_month": "12", "expiry_year": "30", "cvv": "852", "cvv_indicator": "PRESENT", "avs_address": "Flat 123", "avs_postal_code": "50001" } } }' ``` #### Sample response ```json { "id": "TRN_2nKXXuU0oMHAU4B2spA59Yp0GTTYNd_ca0584bb55bf", "time_created": "2025-11-13T21:28:29.185Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "DE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "payment_method": { "result": "00", "message": "(00)[ test system ] ", "entry_mode": "ECOM", "id": "PMT_317adb77-421b-4325-aaee-b381f0774b6f", "authentication": { "cavv_result": "" }, "card": { "masked_network_token_last4": "XXXXXXXXXXXX3736", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "C3I8SsJDDTXkxIFa", "brand_time_created": "", "cvv_result": "NOT_CHECKED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1605993", "action": { "id": "ACT_2nKXXuU0oMHAU4B2spA59Yp0GTTYNd", "type": "AUTHORIZE", "time_created": "2025-11-13T21:28:29.185Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } } ``` #### Standalone Network Tokens can also be used in on-off or standalone transactions. This can be done by using any of the various methods highlighted above to generate the network token and authorize the transaction. The main difference here is that the initiator and stored credentials block is not sent in the request, thereby indicating a standalone transaction. Below is one of the methods of sending a network token in a standalone transaction. #### Sample request ```json curl \--location 'https://apis.sandbox.globalpay.com/ucp/transactions' \\ \--header 'Authorization: Bearer DCKbRy6gtN6gWJI2ja0B7e3POtbb' \\ \--header 'X-GP-Version: 2021-03-22' \\ \--header 'Content-type: application/json' \\ \--header 'Accept: application/json' \\ \--data '{ "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "amount": "1999", "currency": "EUR", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "DE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "authentication": { "id": "AUT_d455464a-115c-46b7-9622-6829e0326e23" }, "card": { "network_token": "4895370019013736", "network_token_expiry_month": "12", "network_token_expiry_year": "30" } } }' ``` ### Sample response ```json { "id": "TRN_2nKXXuU0oMHAU4B2spA59Yp0GTTYNd_ca0584bb55bf", "time_created": "2025-11-13T21:28:29.185Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "DE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "payment_method": { "result": "00", "message": "(00)[ test system ] ", "entry_mode": "ECOM", "id": "PMT_317adb77-421b-4325-aaee-b381f0774b6f", "authentication": { "cavv_result": "" }, "card": { "masked_network_token_last4": "XXXXXXXXXXXX3736", "network_token_expiry_month": "12", "network_token_expiry_year": "30", "brand": "VISA", "masked_number_last4": "", "authcode": "123456", "brand_reference": "C3I8SsJDDTXkxIFa", "brand_time_created": "", "cvv_result": "NOT_CHECKED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "BAT_1605993", "action": { "id": "ACT_2nKXXuU0oMHAU4B2spA59Yp0GTTYNd", "type": "AUTHORIZE", "time_created": "2025-11-13T21:28:29.185Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } } ``` ## Integration references To get a deeper understanding of this product, we’ve provided some references for both API and SDK integrations. ### [API /payment-methods](https://developer.globalpayments.com/api/payment-methods-tokenization.md#/Create/post-payment-method) Create a payment method. ### [SDKs](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Integrate via our Java, PHP, or .NET SDKs. ## Testing Our Network Tokenization solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards - Network Tokens](https://developer.globalpayments.com/resources/test-cards.md#network-tokens---css) Test different transaction outcomes with our test cards for this solution. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Below are value-added services you can enable for your integration. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md#api) Tokenize card details to charge customers later. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md#hpp) Integrate with alternative and local payment methods. ### [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md#hpp) Let international customers pay in their home currency. # Payers - Overview Source: https://developer.globalpayments.com/docs/payments/tokenization/payers-overview.md Section: Payments Description: Store customer details for future transactions With our Payers solution, you can store customer details such as name, billing address, shipping address, and payment methods. This information can then be used for subsequent actions like transaction processing. We handle the storage of all personal identifiable information (PII) on our system, so you don’t need to worry about keeping payer data secure. With Payers, you can: * Store multiple payment tokens for a single payer. * Charge a payer for one-time and recurring transactions. * Specify which stored card the customer wants to use as the default. ## Use cases In this section, we present some “real world” examples that can be enabled through our Payers solution. Keep in mind that this section doesn’t cover all use cases. ##### Use case #1: Penalties and late fees A merchant who lends products to their customers wants to charge them a penalty if the products aren’t returned. The merchant can initially create a payer to store the customer’s details and make a charge to that payer if they miss the deadline to return the products. ##### Use case #2: Multiple payment options An online marketplace allows their customers to create a profile where they can add multiple payment cards and select a default for their purchases. Payers can be used here to store multiple cards for each payer and define which payment card to be used as a default for subsequent transactions. ##### Use case #3: Subscriptions A video streaming platform that offers a subscription service and has recurring charges against their customers can use the Payers feature to store their customers details and initiate recurring payments against the payer. ## How does it work? Once you’re set up to use our Payers solution, you can start creating your payers. To store cards for a payer, you can use our [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) capability to tokenize payment cards. Tokenized cards can then be stored alongside a payer and used for subsequent transactions. At a high level, creating a payer works like this: ![Diagram flow showing interaction between the customer, merchant, and our API to create a payer.}.](https://developer.globalpayments.com/gh-assets/payers_flow.png) **Payers Typical Flow** ## Next steps To get familiar with how Payers work, see our below guide. ### [Payers Guide](https://developer.globalpayments.com/docs/payments/tokenization/payers-guide.md) Learn how to store customer details for future use. # Payers - Guide Source: https://developer.globalpayments.com/docs/payments/tokenization/payers-guide.md Section: Payments Description: Learn how to store customer details for future use In this guide, you’ll learn how to create and edit a payer, as well as make a charge to a payer. For more information on our Payers solution, see our [Overview](https://developer.globalpayments.com/docs/payments/tokenization/payers-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Create a payer We provide two ways to create a payer. * **Create a token first** – Use if you’ve already tokenized a customer’s payment methods and you just need to establish them as a payer on our system and associate their payment tokens. * **Create a payer first** – Use if you haven’t already tokenized a customer’s payment methods. Steps include creating a payer on our system, tokenizing a customer’s payment method, and then associating the payment token to the payer. #### Create a token first ### Create a token first This step assumes that you’ve already tokenized your customer’s payment methods and you just need to create a payer and associate those payment tokens with the other payer information. For information on tokenizing payment cards, see [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-overview). To create a payer on our system, you need to send a request. This will establish the relevant payer information and return a unique payer identifier (`PYR_ID`) in the response. While creating a payer, you can specify which payment card should be used as the default. #### Sample request ```JSON { "first_name": "John", "last_name": "James", "reference": "payer-123", "payment_methods": [ { "id": "PMT_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "default": "YES" } ] } ``` #### Sample response ```JSON { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "time_created": "2021-05-03T21:23:39.718Z", "time_last_updated": "2021-05-03T21:23:39.718Z", "merchant_id": "MER_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "merchant_name": "merchant_1", "account_id": "TKA_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "account_name": "Tokenization", "first_name": "John", "last_name": "James", "reference": "payer-123", "payment_methods": [ { "id": "PMT_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "default": "YES" } ], "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "PAYER_CREATE", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` #### Create a payer first ### Create a payer first These steps assume that you haven’t already tokenized your customer’s payment methods and need to do so, but you want to create a payer first. ### Create a payer First, we create a payer on our system. #### Sample request ```JSON { "first_name": "John", "last_name": "James", "reference": "payer-123" } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Token = "PMT_7554986a-1e77-4c75-a80f-5889d0621c13" }; Customer newCustomer = new Customer { Key = "payer-123", FirstName = "John", LastName = "James" }; try { newCustomer.AddPaymentMethod(card.Token, card); Customer payer = newCustomer.Create(); // API raw response "id" var payerId = payer.Id; // API raw response "reference" var payerRef = payer.Key; //API raw response "first_name" var payerFirstName = payer.FirstName; //API raw response "last_name" var payerLastName = payer.LastName; //API raw response "payment_methods" var paymentMethods = payer.PaymentMethods; } catch (GatewayException e) { Console.WriteLine(e); throw; } $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->token = "PMT_oOAH6BClraQWS3Qy07dh7tZAN3X2nW"; $newCustomer = new Customer(); $newCustomer->key = 'payer-123'; $newCustomer->firstName = "John"; $newCustomer->lastName = "James"; try { $newCustomer->addPaymentMethod($tokenizeResponse->token, $card); /** @var \GlobalPayments\Api\Entities\Customer $payer */ $payer = $newCustomer->create(); } catch (GatewayException $ex){ // TODO: Add your exception handling here } $payerId = $payer->id; // API raw response "id" $payerRef = $payer->key; // API raw response "reference" $payerFirstName = $payer->firstName; //API raw response "first_name" $payerLastName = $payer->lastName; //API raw response "last_name" $paymentMethods = $payer->paymentMethods; //API raw response "payment_methods" ``` #### Sample response ```JSON { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "time_created": "2021-05-03T21:23:39.718Z", "time_last_updated": "2021-05-03T21:23:39.718Z", "merchant_id": "MER_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "merchant_name": "merchant_1", "account_id": "TKA_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "account_name": "Tokenization", "first_name": "John", "last_name": "James", "reference": "string", "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "PAYER_CREATE", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ### Create a token and assign it to a payer Next, we tokenize the customer’s payment method and then associate the payment token to the payer. #### Sample request ```JSON { "account_name": "Tokenization", "reference": "CustABC_Card_1", "usage_mode": "SINGLE", "fingerprint_mode": "ALWAYS", "name": "John's payment method", "payer": { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW" }, "card": { "number": "4263970000005262", "expiry_month": "05", "expiry_year": "25", "cvv": "852" } } ``` #### Sample response ```JSON { "id": "PMT_31087d9c-e68c-4389-9f13-39378e166ea5", "time_created": "2021-05-03T21:23:39.718Z", "status": "ACTIVE", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_86920f927028745yt34d077d88beb29b", "account_name": "Tokenization", "fingerprint_presence_indicator": "NEW", "fingerprint": "string", "reference": "CustABC_Card_1", "usage_mode": "SINGLE", "name": "John's payment method", "payer": { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW" }, "card": { "masked_number_last4": "string", "expiry_month": "05", "expiry_year": "25", "brand": "VISA", "network_token": "string", "masked_network_token_last4": "string", "network_token_expiry_month": "05", "network_token_expiry_year": "25" }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "PAYMENT_METHOD_CREATE", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` > Whether you decide to create a token first or create a payer first in Step 1, Step 2, testing and enhancements below are the same for the Payer capability. ## Step 2: Edit a payer You can edit a payer, which allows you to update their details and add or remove stored cards. For more information, see [Payers](https://developer.globalpayments.com/api/payers.md) in the API Explorer. #### Sample request ```JSON { "payment_methods": [ { "id": "PMT_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "default": "NO" }, { "id": "PMT_CHnAH6BClraQWS3Qy07dh7tZAN3X2nW", "default": "YES" } ] } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST }; ServicesContainer.ConfigureService(config); Customer newCustomer = new Customer { Key = "payer-123", Id = "PYR_f29f4f6981114f4ab4a96bd813615e79" }; try { newCustomer.AddPaymentMethod("PMT_7554986a-1e77-4c75-a80f-5889d0621c13", new CreditCardData { Token = "PMT_7554986a-1e77-4c75-a80f-5889d0621c13" }); newCustomer.AddPaymentMethod("PMT_60aac707-e04d-4998-a1c8-1f5b759be389", new CreditCardData { Token = "PMT_60aac707-e04d-4998-a1c8-1f5b759be389" }); Customer payer = newCustomer.SaveChanges(); // API raw response "id" var payerId = payer.Id; // API raw response "reference" var payerRef = payer.Key; //API raw response "first_name" var payerFirstName = payer.FirstName; //API raw response "last_name" var payerLastName = payer.LastName; //API raw response "payment_methods" var paymentMethods = payer.PaymentMethods; } catch (GatewayException e) { Console.WriteLine(e); throw; } $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $newCustomer = new Customer(); $newCustomer->id = "PYR_f29f4f6981114f4ab4a96bd813615e79"; $newCustomer->key = "payer-123"; $card1 = new CreditCardData(); $card1->token = "PMT_60aac707-e04d-4998-a1c8-1f5b759be389"; $newCustomer->addPaymentMethod($card1->token, $card1); $card2 = new CreditCardData(); $card2->token = 'PMT_7554986a-1e77-4c75-a80f-5889d0621c13'; $newCustomer->addPaymentMethod($card1->token, $card2); try { $newCustomer->addPaymentMethod($card1->token, $card1); $newCustomer->addPaymentMethod($card2->token, $card2); /** @var Customer $payer */ $payer = $newCustomer->saveChanges(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "id" $payerId = $payer->id; // API raw response "reference" $payerRef = $payer->key; //API raw response "first_name" $payerFirstName = $payer->firstName; //API raw response "last_name" $payerLastName = $payer->lastName; //API raw response "payment_methods" $paymentMethods = $payer->paymentMethods; ``` ### Sample response ```JSON { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "time_created": "2021-05-03T21:23:39.718Z", "time_last_updated": "2021-05-03T21:23:39.718Z", "merchant_id": "MER_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "merchant_name": "merchant_1", "account_id": "TKA_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "account_name": "Tokenization", "first_name": "John", "last_name": "James", "reference": "payer-123", "payment_methods": [ { "id": "PMT_oOAH6BClraQWS3Qy07dh7tZAN3X2nW", "default": "NO" }, { "id": "PMT_CHnAH6BClraQWS3Qy07dh7tZAN3X2nW", "default": "YES" } ], "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "PAYER_EDIT", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } ``` ## Step 3: Charge a payer Once you’ve created a payer, you can use the returned unique identifier (`PYR_ID`) to charge the payer. This request uses the default payment method stored for a payer to authorize the transaction. Or, you can use a new payment method. #### Sample request ```JSON { "account_name": "transaction_processing", "type": "SALE", "channel": "CNP", "country": "US", "capture_mode": "AUTO", "amount": "100", "currency": "USD", "payer": { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW" }, "payment_method": { "entry_mode": "ECOM" } } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST }; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData(); try { Transaction response = card.Charge(1m) .WithCurrency("USD") .WithCustomerId("PYR_f29f4f6981114f4ab4a96bd813615e79") .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; //API raw response key "batch_id" var batchId = response.BatchSummary.BatchReference; //API raw response key "payment_method->card->avs_postal_code_result" var avsResponseCode = response.AvsResponseCode; //API raw response key "payment_method->card->avs_address_result" var avsAddressResponse = response.AvsAddressResponse; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseCode; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; // capture_mode === 'MULTIPLE' var multiCapture = response.MultiCapture; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "risk_assessment->mode" var fraudResponseMode = response.FraudFilterResponse.FraudResponseMode; //API raw response key "risk_assessment->result" var fraudResponseResult = response.FraudFilterResponse.FraudResponseResult; //API raw response key "risk_assessment->rules" var fraudResponseRules = response.FraudFilterResponse.FraudResponseRules; //API raw response key "payment_method->card->brand_reference" var brandReference = response.CardBrandTransactionId; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; //API raw response key "payment_method->card->provider->cvv_result" var cardIssuerCvv = response.CardIssuerResponse.CvvResult; //API raw response key "payment_method->card->provider->avs_address_result" var cardIssuerAvsAddressResult = response.CardIssuerResponse.AvsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" var cardIssuerAvsPostalCodeResult = response.CardIssuerResponse.AvsPostalCodeResult; //API raw response key "payer->id" var payerId = response.PayerDetails.Id; } catch (GatewayException e) { Console.WriteLine(e); throw; } $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); try { $response = $card->charge(1) ->withCurrency("USD") ->withCustomerId('PYR_f29f4f6981114f4ab4a96bd813615e79') ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response key "id" $transactionId = $response->transactionId; // API raw response key "amount" $amount = $response->authorizedAmount; //API raw response key "batch_id" $batchId = $response->batchSummary->batchReference; //API raw response key "type" $transactionType = $response->originalTransactionType; //API raw response key "payment_method->card->avs_postal_code_result" $avsResponseCode = $response->avsResponseCode; //API raw response key "payment_method->card->->avs_address_result" $avsAddressResponse = $response->avsAddressResponse; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; // capture_mode === 'MULTIPLE' $multiCapture = $response->multiCapture; // API raw response key "reference" $referenceNumber = $response->referenceNumber; // API raw response key "action->result_code" $responseCode = $response->responseCode; // API raw response key "status" $transactionStatus = $response->responseMessage; // API raw response key "time_created" $timeCreated = $response->timestamp; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; //API raw response key "payer->id" $payerId = $response->payerDetails->id; ``` ### Sample response ```JSON { "id": "TRN_7WxrYwWH0xCFZOh2BiK8UG3NDKeDot_67708081", "time_created": "2024-03-19T01:52:30.848Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "USD", "country": "US", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "reference": "67708081", "payer": { "id": "PYR_oOAH6BClraQWS3Qy07dh7tZAN3X2nW" }, "payment_method": { "result": "00", "message": "(00)[ test system ] Authorised", "entry_mode": "ECOM", "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX4242", "authcode": "123456", "brand_reference": "EgS4QRX08g1QT0sF", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "risk_assessment": [ { "mode": "ACTIVE", "result": "ACCEPTED", "rules": [ { "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd", "description": "Cardholder Name Rule", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3", "description": "CardNumber block", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e", "description": "Amount test", "mode": "ACTIVE", "result": "ACCEPTED" } ] } ], "batch_id": "BAT_1369395", "action": { "id": "ACT_7WxrYwWH0xCFZOh2BiK8UG3NDKeDot", "type": "AUTHORIZE", "time_created": "2024-03-19T01:52:30.848Z", "result_code": "SUCCESS", "app_id": "rAprmx5lKNheCe5T1LKYjdNiCPLOi0bG", "app_name": "payers_test" } } ``` ## Testing Payers Our Payers solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. # Digital Wallets - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md Section: Payments Description: Let customers pay securely with just a scan, tap, or click We offer merchants several ways to integrate digital wallets into their application or website to make the checkout experience secure, fast, and convenient. ## What is it? Digital wallets can store a customer’s payment and personal information on an app or browser for quick payments in-person, online, or on a mobile device. Customers pay securely with just a scan, tap, or click. The benefits of having digital wallets in your ecommerce store include: * _A seamless customer experience with minimal friction_ – Digital wallets are easy to use and access from any device. And they make paying fast. * _Enhanced security_ – Digital wallets use tokenization, which protects sensitive card data by replacing it with secure substitute data called a _token_. * _Better authorization rates_ – Replacing sensitive card data reduces the risk associated with ecommerce transactions and can increase authorization rates as a result. * _Faster online checkouts_ – When customers pay with their digital wallets, they pay directly in a couple of clicks, with no need to re-enter their credit card information online. For information on alternative or local digital wallets, see our [Supported Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/supported-payment-methods) page and filter by _Digital Wallets_. ## Next steps Our guides below provide steps for integrating using our REST API directly or by using one of the ready-made payment forms we offer such as Drop-In UI (used with Hosted Fields) or Hosted Payment Page. ### [Apple Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md) Provide an instant payment experience for users to securely store their card details on a Secure Element built into their Apple product. ### [Google Pay](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/google-pay.md) Allow customers to use the details they store on other Google apps such as Play Store, YouTube, and Chrome web browser. ### [Decrypted Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/decrypted-wallets.md) Gain more control over which stored cards customers use by viewing card details before submitting the transaction. # Apple Pay Integration Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/apple-pay.md Section: Payments Description: For merchants using Global Payments API ## **Introduction to Apple Pay** Apple Pay is a digital wallet service that allows cardholders to store payment cards securely on their Apple devices and make transactions. Apple Pay leverages the device’s secure hardware and tokenization standards defined by the card schemes to replace the actual Primary Account Number (PAN) with a device-specific token. From a payments perspective, Apple Pay enables: * **Card Provisioning** – Issuers and acquirers work with the schemes to provision cards into the wallet through a certified process. * **Transaction Security** – Each payment uses a dynamic cryptogram and device-specific credentials, ensuring sensitive data is never exposed to merchants. * **Merchant Acceptance** – For merchants, Apple Wallet transactions are processed like any other card-present or card-not-present transaction, with no change to settlement flows. Apple Pay supports both **in-store** transactions (via NFC contactless) and **in-app/web** transactions (via Apple Pay APIs). For acquirers, gateways, and merchants, integration ensures compliance with scheme and Apple requirements while delivering a frictionless checkout experience to cardholders. #### API ## Learn how to integrate with Apple Pay This document covers the **end-to-end Apple Pay integration process** for merchants using the **Global Payments API**. It explains what the required certificates are, why they're needed, and what to do with them at each step. ## Overview of the integration flow | Phase | Purpose | | ----- | ----- | | 1. Create merchant ID | Apple Developer Portal setup | | 2. Provision certificates | Merchant identity & payment processing certifications | | 3. Host verification file | Domain verification required by Apple | | 4. Backend session validation | Authenticate with Apple via your certificate & key | | 5. Token handling | Global Payments decrypts the Apple Pay token | ## Recommended structure for merchant IDs and certificates To ensure safe, isolated testing and production operation, merchants should adopt the following structure: * **Use distinct merchant IDs (MIDs)**: Use one MID for the Sandbox (testing environment) and another for production (live transactions). * **Assign separate payment processing certificates for each MID**: This ensures that a certificate used in the sandbox cannot accidentally impact production. * **Create additional MIDs for testing variants (optional)**: For example, create one MID for 3DS testing, one for wallets only, and so forth. This is recommended for testing under different configurations without affecting baseline flows. ## Step 1. Apple Pay merchant ID setup A) Log into your [Apple Developer account](https://urldefense.proofpoint.com/v2/url?u=https-3A__developer.apple.com_account_resources_identifiers_list_merchant&d=DwMFaQ&c=zQ6tLaF7dShu6emFdFLQLeh4ApIjUVDHmN_RmdGFa9g&r=dIAaiHDPGVYJ-RItKqCqRmU_u0JUhwHPq7blqeZINjE&m=RotlfAVCB3Py5J7IYikOCgSlAM-G0DkUTaLbp0xBmWS__PC1pPo5PIcWN0Z90mf2&s=TQ2x-zjJvsZnHCVZPMppGCDeU13MgfX_sOrtE874vtc&e=) and click on the **Identifiers** tab on the top-right corner. B) Click the plus icon "**+**" to add a new Apple Pay merchant ID. C) Use the following format: `merchant.com.yourbrand`. D) **Save this ID**. It will be referenced in certificates and needed for session validation. ## Step 2. Provision the required certificates ### 2.1. Merchant identity certificate (for session validation) The merchant identity certificate is necessary to validate Apple Pay sessions in Safari/iOS. A) Provision the Merchant Identity Certificate: ```shell openssl genrsa -out merchant_id.key 2048 openssl req -new -key merchant_id.key -out merchant_id.csr \ -subj "/CN=Apple Pay Merchant ID: merchant.com.yourbrand" ``` B) Log into your Apple Developer account, click on **Certificates** and then **Merchant Identity Certificate** to upload the Certificate Signing Request (CSR) C) Download the resulting `merchant_id.cer`. D) Use the OpenSSL code below to convert the merchant ID certificate to **.pem** file format. This is necessary because Apple Pay’s default **.cer** file format cannot typically be read by other systems and can create issues. ```javascript openssl x509 -in merchant_id.cer -inform DER -out merchant_id.pem -outform PEM ``` Below, there are two additional, optional steps that you can use if needed. Once you complete Step 1 and 2.1, you’ll have the keys necessary for your backend Apple Pay session validations. > Keep these secure. They are used only for backend Apple Pay session validation. #### Create a combined file (Optional) While merchant setup is outside of the scope of Global Payments' API, if your backend requires a combined file, you can use the following step to create it. ```shell cat merchant_id.pem merchant_id.key > merchant_combined.pem ``` #### Check your **.key** and **.pem** combination (Optional) This is an optional step that allows you to ensure you’re using the right **.key** and **.pem** combination. They should match: * `openssl rsa -noout -modulus -in merchant_id.key | openssl md5` * `openssl x509 -noout -modulus -in merchant_id.pem | openssl md5` Both returned values should be identical. ### 2.2. Payment processing certificate (for token encryption) Apple Pay requires a payment processing certificate to encrypt the payment token. The certificate owner then uses the same certificate to decrypt the payment token and process the transaction. There are two options for handling decryption. #### Option 1. Global Payments is handling decryption and generates CSR (preferred) With this option, Global Payments generates the CSR and stores the related private key. A) Log in to Realcontrol in [Sandbox](https://realcontrol.sandbox.realexpayments.com/) or [Production](https://realcontrol.realexpayments.com/). B) On the **Client Settings** tab, navigate to the **Apple Pay** section. Click the **Obtain CSR** button to generate and download a new certificate. Note that generating one CSR per client is recommended. C) Log into your [Apple Developer Account](https://urldefense.proofpoint.com/v2/url?u=https-3A__developer.apple.com_account_resources_identifiers_list_merchant&d=DwMFaQ&c=zQ6tLaF7dShu6emFdFLQLeh4ApIjUVDHmN_RmdGFa9g&r=dIAaiHDPGVYJ-RItKqCqRmU_u0JUhwHPq7blqeZINjE&m=RotlfAVCB3Py5J7IYikOCgSlAM-G0DkUTaLbp0xBmWS__PC1pPo5PIcWN0Z90mf2&s=TQ2x-zjJvsZnHCVZPMppGCDeU13MgfX_sOrtE874vtc&e=) and click on the **Identifiers** tab on the top-right corner. D) Select **Merchant IDs** → your **Merchant ID** → **Apple Pay Payment Processing Certificate** and upload the CSR you downloaded in Step 2 with this option. E) Download the **.cer** file. F) Return to your Global Payments Portal and upload the **.cer** file to the **Apple Pay** section. #### Option 2. Merchant is handling decryption and generates the CSR manually With this option, the whole wallet process occurs outside the Global Payments environment, and we will only receive an `Auth` request. A) Use the code below to decrypt the token and generate the CSR. ```shell openssl ecparam -name prime256v1 -genkey -noout -out payment.key openssl req -new -key payment.key -out payment.csr \ -subj "/CN=Apple Pay Merchant ID: merchant.com.yourbrand" ``` B) Log into your Apple Developer account, select **Certificates**, then **Payment Processing Certificate** to upload the CSR. C) Download the payment **.cer** file. D) Apple frequently serves **.cer** files as **.der** files. So it's best to convert to **.pem** format if you're going to combine. ```shell openssl x509 -in payment.cer -inform DER -out payment.pem -outform PEM ``` ## Step 3. Verify the domain Apple requires domain verification. A) Add your domain to the **Domain Verification** section in your Apple Developer account. Do not use `https://`. The domain name (e.g., `test.com`) is all that is expected. B) Log into your Apple Developer account, select your **Merchant ID**, then click **Add Domain**, to access and download the domain verification file. C) Host the file at the domain location as shown: [`https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association`](https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association). D) Be aware that the file: * Must be a plain text file (**.txt**) * Must be served over HTTPS * Cannot have any redirects E) Once you've checked to make sure your file meets the above requirements, click **Verify** in your Apple Developer Account. ## Step 4. Backend Apple Pay session validation This step is required for Safari/iOS to activate the Apple Pay session securely. The following call returns a valid `applePaySession` that your frontend uses for validation: ```py requests.post(validation_url, cert=('merchant_id.pem', 'merchant_id.key'), json={ "merchantIdentifier": "merchant.com.yourbrand", "displayName": "Your Store", "initiative": "web", "initiativeContext": "yourdomain.com" }) ``` #### Node.js example ```rust const https = require('https'); const agent = new https.Agent({ cert: fs.readFileSync('merchant_combined.pem'), key: fs.readFileSync('merchant_combined.pem') }); ``` ## Step 5. Payment token handling (Global Payments) After the Apple Pay JS returns the token, you send the **entire token payload** to Global Payments: ```shell { "source": { "type": "applepay", "token": { "version": "EC_v1", "data": "...", "signature": "...", "header": { ... } } }, "amount": 1000, "currency": "EUR", "reference": "ORDER-1234" } ``` Global Payments uses the previously provided **payment processing cert** generated in Step 2.2 to decrypt the token and process the payment. ## File summary | File | Needed For | Share with Global Payments? | ----- | ----- | ----- | | merchant_id.key | Apple session validation | No - Keep secure | | merchant_id.pem | Apple session validation | No - Keep secure | | merchant_combined.pem | Optional for certain SDKs | No - Keep secure | | payment.cer | Public certificate from Apple | Yes - Required | | apple-developer-merchantid-domain-association | Domain verification | No - Keep secure | ## Troubleshooting ### Apple Pay setup verification commands This guide contains OpenSSL and curl commands to verify: * Merchant Identity Certificate * Payment Processing Certificate * Certificate Signing Request (CSR) * Apple Pay Domain Association Change the names, bolded in the commands below, to match your files. #### 1. Verify merchant identity certificate To verify the merchant identity certificate, change `merchant_id.pem` to match your file. Make sure each certificate is used with the correct AMID: You can verify this using OpenSSL as shown below. ```shell openssl x509 -in ./certs/merchant_id.pem -noout -subject -issuer -serial -fingerprint -enddate ``` Expected output includes: * `subject=UID=merchant.newdocs.gp, CN=merchant.newdocs.gp` * `issuer=Apple Inc.` * Valid `serial`, `fingerprint`, and `notAfter` date #### 2. Verify payment processing certificate ```shell openssl x509 -in apple_pay.cer -inform DER -out apple_pay.pem -outform PEM openssl x509 -in ./apple_pay.pem -noout -subject -issuer -serial -fingerprint -enddate ``` Expected output includes: * `subject=UID=merchant.newdocs.gp, CN=Apple Pay Payment Processing:merchant.newdocs.gp` * `issuer=Apple Inc.` * Valid `serial`, `fingerprint`, and `notAfter` date #### 3. Verify CSR (optional) If using a `.csr` generated by RealControl or another system: ```shell openssl req -in ./Realex.certSigningRequest -noout -text ``` Expected output includes: * `Subject: CN=realex payments user` * `Public Key Algorithm: id-ecPublicKey` * `ASN1 OID: prime256v1` #### 4. Check Apple Pay domain association file ```shell curl -s -o - https://test.org/.well-known/apple-developer-merchantid-domain-association ``` Expected output: `["merchant.newdocs.gp"]` To check for HTTP 200: ```shell curl -s -o /dev/null -w "%{http_code}" https://test.org/.well-known/apple-developer-merchantid-domain-association ``` ## Final merchant checklist If all of these are true, you should be ready to go: * You have created an Apple Pay Merchant ID in my Apple Developer account. * You have generated the Merchant Identity Certificate and uploaded it to Apple. * You have converted the `.cer` file to `.pem` and integrated it into my backend. * You have provisioned the Payment Processing Certificate via Global Payments or OpenSSL. * You have hosted the Apple domain verification file and verified ownership. * You have implemented backend Apple Pay session validation using the correct cert and key. * You have tested the `startSession` response from Apple and verified it loads in the frontend. * You have received a live token from Apple Pay and successfully passed it to Global Payments. * You have verified that Global Payments processed the token without errors. #### HPP Apple Pay can be used on the Hosted Payment Page (HPP) to provide payment for real-world goods and services. This guide focuses on implementing Apple Pay on the HPP via full-page redirect or iFrame and Lightbox, with steps for both SDK and non-SDK integrators. We also provide information on disabling Apple Pay for certain transactions, how to test your integration, and a preview of what Apple Pay looks like once successfully implemented (rollout). ## Prerequisites To use Apple Pay on the HPP: * You must be using one of these certified acquirers: * Global Payments, Amex, or Barclays * Your device must be either an: * iPhone, iPad, or Macbook * Your web browser must be: * Safari, Chrome, or Mozilla ## Implement Apple Pay There are several ways to implement Apple Pay on the HPP: full-page redirect or iFrame and Lightbox. ### Full-page redirect To add Apple Pay as a payment option using full-page redirect (checkout starts and finishes on our domain), you simply need to contact customer support to enable the feature. The implementation process typically includes the following steps: * Contact customer support – Reach out to customer support or your account manager to initiate the request to enable Apple Pay for your account. Be sure to provide the client IDs and the sub accounts you want to enable, along with your website for registration. * Enable Apple Pay feature – Upon receiving the request, customer support will proceed to enable Apple Pay support for your account. This involves backend configurations and activations to ensure that your payment processing system is compatible with Apple Pay transactions. ### iFrame and Lightbox To integrate Apple Pay with a checkout using an iFrame or Lightbox, there are extra steps to take to ensure that your domain is registered with Apple. For SDK integrators: * Ensure that you are using the most up-to-date version of our [SDK](https://developer.globalpay.com/ecommerce/payments/sdk/overview). * Create a .txt file and name it: `_apple-developer-merchantid-domain-association_` * Add the certification contents of [this file](https://pay.realexpayments.com/.well-known/apple-developer-merchantid-domain-association) to the file, and then upload to the *.well-known* folder in any/every root domain that hosts the HPP’s iFrame. The URL should look like this: `https://YOURWEBSITE.COM/.well-known/apple-developer-merchantid-domain-association` Where `YOURWEBSITE.COM` is the root URL of your website. * Once this is complete, contact customer support with your URL so we can add it to our list of accepted domains for Apple Pay. In most cases, we can do this instantly, but if not, we'll contact you when it’s complete. It’s possible to add multiple URLs to your account as long as each root url contains a /.well-known file that follows the processes above. ### For non-SDK integrators: Payment processing with Apple Pay within a cross-origin iFrame requires a Permissions Policy and requires the payment page to allow third-party payments. If this is not done, the button won’t show in the iFrame. For this reason, it’s important to ensure that your checkout iFrame is structured like so: ``` ``` Where checkout\_URL is the URL dynamically generated by us. Sandbox example: ``` ``` Production example: ``` ``` The *src* attribute values dynamically change on each checkout. Once this is complete, you can follow the steps above [for SDK integrators](https://developer.globalpay.com/ecommerce/expand-your-integration/applepay#for-sdk-integrators) to register your domain. For information on cross-origin resource sharing (CORS), see the [**definition**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) on Mozilla’s MDN website. ## Disable for some transactions In certain circumstances, merchants enabled for Apple Pay may not want to offer this option at all times. To achieve this, you can hide the Apple Pay option displayed on the HPP for a particular request by sending `HPP_ENABLE_APPLEPAY = False` in the HPP POST request. | Field | Description | | :---- | :---- | | HPP\_ENABLE\_APPLEPAY | Determines whether the Apple Pay button displays on the HPP. Works only when Apple Pay is enabled. Allowed value: False \- Hides the Apple Pay button on the HPP. | ## Testing and integration Apple Pay is available for testing in our Sandbox environment. For the full list of Apple Pay test values, see our [Test Cards](https://developer.globalpay.com/resources/test-card-numbers#card-apple-pay) article. To complete testing in Apple’s sandbox and access their test cards, you first need to set up an Apple account. More information can be found on [**Apple's website**](https://developer.apple.com/apple-pay/sandbox-testing/). The amount specified in the request will map the tokenized data in the transaction to one of Apple's test values. For example, an amount of 10.00 will map to the successful Visa test card. Once Apple Pay support is enabled, you should conduct testing in our Sandbox to ensure that your integration is seamless and functional. This may involve testing transactions using Apple devices at the point of sale on the HPP. ## Rollout After successful testing, you can proceed with the rollout of Apple Pay as a payment option for customers. ![Rollout image](https://developer.globalpayments.com/gh-assets/rollout.png) HPP \- Apple Pay Option ![HPP Apple Pay image](https://developer.globalpayments.com/gh-assets/HPP-Apple.png) HPP \- Apple Pay Option Selected ## Enhance your solution Explore more functionality to enrich your application or website. For the detailed HPP specification and a full list of features, see the [HPP Reference](https://developer.globalpay.com/ecommerce/hpp-reference/overview) section. #### [Alternative Payment Methods](https://developer.globalpay.com/ecommerce/expand-your-integration/payment-methods) [Integrate with alternative and local payment methods.](https://developer.globalpay.com/ecommerce/expand-your-integration/payment-methods) #### [3D Secure and SCA](https://developer.globalpay.com/ecommerce/risk-management/3ds/overview) [Add strong customer authentication to your online payment flow.](https://developer.globalpay.com/ecommerce/risk-management/3ds/overview) #### [Fraud Management](https://developer.globalpay.com/ecommerce/risk-management/fraud/overview) [Better identify customers and reduce fraud.](https://developer.globalpay.com/ecommerce/risk-management/fraud/overview) # Google Pay Source: https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/google-pay.md Section: Payments Description: Let customers pay with their saved cards > Google Pay is not supported by all acquirers and not enabled by default on your account. For more information, contact a member of our support team. Google Pay enables customers to use the cards they have stored with Google to make quick, easy purchases on merchant websites or in-app. Customers can use the details they store on other Google applications such as Play Store, YouTube, and Chrome web browser. #### API This guide focuses on integrating Google Pay directly using our [REST API](https://developer.globalpayments.com/docs/integration-options/api.md). You'll learn how to obtain the Google Pay token, including complying with 3D Secure authentication standards, as well as how to process an authorization. ## Obtain the Google Pay token To offer Google Pay from your website or in-app, refer to the Google Pay API website for the integration steps. To integrate with our platform, specific parameters must be passed in the `PaymentData` request to Google. When you submit a `PaymentData` request to the Google API, be sure to include the following parameters: * `'gateway': 'globalpayments'` * `'gatewayMerchantId': ''` ## SCA and 3DS compliance Google Pay on the web may expose the Funding PAN (FPAN) depending on the parameters passed from the Google Pay API. Google provides two options through the `allowedAuthMethods` object: * `PAN_ONLY` – This authentication method is associated with payment cards stored on file with the user's Google account. Returned payment data includes the FPAN with the expiration month and the expiration year. * `CRYPTOGRAM_3DS` – This authentication method is associated with cards stored as Android device tokens. Returned payment data includes a 3D Secure (3DS) cryptogram generated on the device. `PAN_ONLY` can expose the FPAN, which requires an additional Strong Customer Authentication (SCA) step up to a 3DS check. Currently, we don't support the Google Pay SCA challenge with an FPAN. For the best acceptance, we recommend that you provide only the `CRYPTOGRAM_3DS` option. #### Website example ```markup { 'type': 'CARD', 'parameters': { 'allowedAuthMethods': ['PAN_ONLY', 'CRYPTOGRAM_3DS'], 'allowedCardNetworks': ['AMEX', 'DISCOVER', 'JCB', 'MASTERCARD', 'VISA'] }, 'tokenizationSpecification': { 'type': 'PAYMENT_GATEWAY', 'parameters': { 'gateway': 'globalpayments', 'gatewayMerchantId': '' } } } ``` #### Extract the payload (JavaScript) ```markup function onGooglePaymentButtonClicked() { const paymentDataRequest = getGooglePaymentDataRequest(); paymentDataRequest.transactionInfo = getGoogleTransactionInfo(); const paymentsClient = getGooglePaymentsClient(); paymentsClient.loadPaymentData(paymentDataRequest) .then(function(paymentData) { // handle the response processPayment(paymentData); }) .catch(function(err) { // show error in developer console for debugging console.error(err); }); } function processPayment(paymentData) { // show returned data in developer console for debugging console.log(paymentData); ``` #### In-app example ```java private PaymentDataRequest createPaymentDataRequest() { PaymentDataRequest.Builder request = PaymentDataRequest.newBuilder() .setTransactionInfo( TransactionInfo.newBuilder() .setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL) .setTotalPrice("10.00") .setCurrencyCode("USD") .build()) .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD) .addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD) .setCardRequirements( CardRequirements.newBuilder() .addAllowedCardNetworks( Arrays.asList( WalletConstants.CARD_NETWORK_VISA, WalletConstants.CARD_NETWORK_MASTERCARD)) .build()); PaymentMethodTokenizationParameters params = PaymentMethodTokenizationParameters.newBuilder() .setPaymentMethodTokenizationType( WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY) .addParameter("gateway", "globalpayments") .addParameter("", "") .build(); request.setPaymentMethodTokenizationParameters(params); return request.build(); } ``` #### Extract the payload (Java) ```java public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case LOAD_PAYMENT_DATA_REQUEST_CODE: switch (resultCode) { case Activity.RESULT_OK: PaymentData paymentData = PaymentData.getFromIntent(data); String token = paymentData.getPaymentMethodToken().getToken(); JSONObject obj = new JSONObject(token); // Data below goes into the JSON message string signature = obj.getString("signature"); string protocolVersion = obj.getString("protocolVersion"); string signedMessage = obj.getString("signedMessage"); ``` Google will respond with the `PaymentData` response, which includes the encrypted payload (token). They provide two environments: `ENVIRONMENT_TEST` and `ENVIRONMENT_PRODUCTION`. You can process either token type on our platform. You must contact Google before being able to process Production tokens. For more information, see the [Google Pay website](https://developers.google.com/payments/test-and-deploy). ## Process a Google Pay authorization When creating a transaction, use the `digital_wallet` object to include the payment token instead of the standard card details. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer QeG7aqwDXxyAkqAbOBoDDX5szeC1' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2020-12-22' \ --data-raw '{ "account_name": "Transaction_Processing", "channel": "CNP", "type": "SALE", "amount": "5", "currency": "EUR", "reference": "64970211", "country": "US", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "digital_wallet": { "provider": "PAY_BY_GOOGLE", "payment_token": { { "signature": "MRUCICT82ONC1THeYgGpgj5ruDKZT2o4YaHV2HXPh4RzPZ7UAiEAkp1E8KQxzCN40PPRhvV5gZFacTOuNxm5GWu0oM9x+Kk=", "protocolVersion": "ECv1", "signedMessage": "{\"encryptedMessage\":\"2e/wvcUDfyIYzf6vyc7bVBJwQTWlW6eKkyylR1+Fvs/2zIqOy+7NlSKkbSaUb926VO6bi1yHfnTDoKqo5LLSqKqo3k6kVsqlyCzLjmMO7ns3YlggKeqI39h16cXRB+qzLbKcrIHJEL/A+pBoAEElSoUYN7nVCdDE6bQbhiUg6zqYOMhXQS/6Kfe1HaYYO8q3nycpieW8mN68iAyQwplwp4LuFOaIWOT8IxBl1y1rAikaPEMptVXVAax2kIesiYhfmcaHBpOdq8fdOIl5VkHtRgSKwvsB1RJQtn3W6/Ovldt1h543Ly1ZYWsJwRyw1wBjhBzniRoJMMNA5BDnwXXb6qQ0Kt2DfJx33zerpOH4bd78EpTRXkQUN+Y2NZ+xYRKwc4xoanA6sOJUJMXQeRZ8PNFCcI7djj/iNlvNYCgMUG/P3ylAPdOc/e9dAUwyR9joJM0C\",\"ephemeralPublicKey\":\"BDVZdkLkavmd3kkBKgNgMW5KF7a6GKXATboPoHUzVJXD3bHz/hAWIBY3dvoM6bWN9W2R1QrdjsGRgSYblDg+cyA\\u003d\",\"tag\":\"G3AOG9uYEeFpd6+lsLA+FTYek+8Pi8ELkSqzLo4XKP8\\u003d\"}" } ``` ## Testing Google Pay You can test Google Pay in our Sandbox environment. The amount specified in the request will map the tokenized data in the transaction to one of our test cards. For example, an amount of 10.00 will map to the successful Visa test card. For further details, see our test cards for [Google Pay](https://developer.globalpayments.com/resources/test-card-numbers#google-pay). ### [SDK Quickstart](https://github.com/globalpayments-samples/starter-template) Starter kit for payment integrations. ### [Google Pay SDK Sample](https://github.com/globalpayments-samples/google-pay-payments) Guide for Google Pay integration. ## Brand guidelines For Google Pay branding guidelines and to download assets, see [Brand Guidelines](https://developers.google.com/payments/brand-guidelines) on their website. ## Enhance your solution For the detailed API specification and a full list of features, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [Create a Transaction](https://developer.globalpayments.com/api/transactions.md#/Create%20a%20Sale%20or%20Refund/createSaleOrRefundTransaction) Use our API Explorer code playground to try it out. ### [Decrypted Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/decrypted-wallets.md) Set up payload decryption to preview card data. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) Integrate with alternative and local payment methods. #### HPP This guide focuses on integrating Google Pay with our [Hosted Payment Page](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-overview.md) (HPP), which is our low-code PCI DSS–compliant payment form. We provide information on the implementation process and the different ways the Google Pay button can be displayed. > Google Pay is only available in-app for merchants using our HPP integration and is not currently available on browsers in the Production environment. ## Implementation process To add Google Pay as a payment option, you first need to contact us to enable it. Also, you need to ensure that your acquirer is certified to support Google Pay. Your account manager with us can check this for you and then enable Google Pay on your account. ## Google Pay button The following images show the different ways the Google Pay button can be displayed: Full Redirect, iFrame, and Lightbox. ![HPP payment form using full redirect.](https://developer.globalpayments.com/gh-assets/ecommerce/google-pay_hpp-redirect.png) **Full Redirect Example** ![HPP payment form using an iFrame.](https://developer.globalpayments.com/gh-assets/ecommerce/google-pay_hpp-iframe.png) **iFrame Example** ![HPP payment form using Lightbox.](https://developer.globalpayments.com/gh-assets/ecommerce/google-pay_hpp-lightbox.png) **Lightbox Example** ## Google wallet After a customer clicks the Google Pay button, they can then select a saved card from their Google wallet to use for payment, as shown below. ![Example of Google Pay Wallet with a choice of Visa credit card.](https://developer.globalpayments.com/gh-assets/ecommerce/google-pay_hpp-wallet.png) **Google Pay Wallet Example** ## Testing Google Pay Google Pay will appear in browsers in our Sandbox environment. For testing, you can check out using a normal Google account using live cards. Your cards will not be charged. ## Enhance your solution Explore more functionality to enrich your application or website. For more information on the HPP, see our [Overview](https://developer.globalpayments.com/docs/payments/online/hosted-payment-page-overview.md). ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) Integrate with alternative and local payment methods. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) Securely store card data with no increased PCI DSS requirements. ### [Fraud Management](https://developer.globalpayments.com/docs/risk-management/fraud-management/overview.md) Better identify customers and reduce fraud. #### Drop-In UI This guide focuses on integrating Google Pay with our Drop-In User Interface (UI), which is a ready-made payment form using our [Hosted Fields solution](https://developer.globalpayments.com/docs/payments/online/hosted-fields-overview.md). You’ll learn how to add Google Pay to your payment form using our JavaScript Library and then charge it within your app or as a standalone payment method. To learn how to use the Hosted Fields components on their own with your existing payment form, see our [Hosted Fields guide](https://developer.globalpayments.com/docs/HF-guide). ## Step 1: Create an access token > Our API endpoints: > > > Sandbox: https://apis.sandbox.globalpay.com > > Production: https://apis.globalpay.com Before testing or implementing Google Pay via the Drop-In UI, you first need to create an access token, which is required to execute any API requests. The token contains the actions that are permitted for your application. For added security and integrity, we recommend that you create one access token for each user session, and set the "time to expire" to 10 minutes. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Accept: application/json' \ --header 'Accept-Encoding: gzip' \ --header 'Content-Type: application/json' \ --data-raw '{ "app_id": "appId", "nonce": "2022-04-21T15:12:44.390Z", "secret": "999585dc140865524c4d95f3fa0ce0eb5e2b565b95c67dd43425c4e16d0671cafe89e6e730992911cdf047c7f2f6ac8cc6486311a73dfcc81c763ccb24d0ed4c", "grant_type": "client_credentials". "permissions": [ "PMT_POST_Create_Single" ], "interval_to_expire": "10_MINUTES" }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent.getValue()); config.setPermissions(new String[] { "PMT_POST_Create_Single" }); config.setIntervalToExpire(IntervalToExpire.TEN_MINUTES); AccessTokenInfo info = GpApiService.generateTransactionKey(config); config.setAccessTokenInfo(info); ServicesContainer.configureService(config); ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Permissions = new string[] { "PMT_POST_Create_Single" }; config.IntervalToExpire = IntervalToExpire.TEN_MINUTES; var info = GpApiService.GenerateTransactionKey(config); config.AccessTokenInfo = info; ServicesContainer.ConfigureService(config); ``` ```php appId = "APP_ID"; $config->appKey = "APP_KEY"; $config->channel = Channel::CardNotPresent; $config->permissions = ["PMT_POST_Create_Single"]; $config->intervalToExpire = IntervalToExpire::TEN_MINUTES; $accessTokenInfo = GpApiService::generateTransactionKey($config); $accessToken = $accessTokenInfo->accessToken; ``` ## SCA and 3DS compliance Google Pay on the web may expose the Funding PAN (FPAN), depending on the parameters passed from the Google Pay API. Google provides two options through the `allowedAuthMethods` object: * `PAN_ONLY` – This authentication method is associated with payment cards stored on file with the user's Google account. Returned payment data includes the FPAN with the expiration month and year. * `CRYPTOGRAM_3DS` – This authentication method is associated with cards stored as Android device tokens. Returned payment data includes a 3D Secure (3DS) cryptogram generated on the device. `PAN_ONLY` can expose the FPAN, which requires an additional Strong Customer Authentication (SCA) step-up to a 3DS check. Currently, we don’t support the Google Pay SCA challenge with an FPAN. For the best acceptance, we recommend that you provide only the `CRYPTOGRAM_3DS` option. ## Step 2: Configure JavaScript Once you’ve created the access token, you can now configure the JavaScript Library to enable Google Pay in your payment form. Add a `
` tag to render the Drop-In UI payment form to the customer. ```markup
``` Next, we configure our JavaScript Library with the transaction details required for Google Pay. ```markup ``` ### JavaScript configuration (Google Pay specific parameters) _Type_ indicates whether the element is Mandatory (M), Optional (O), or Conditional (C)—dependent on another field or regional requirement. | Name | Format | Type | Description | | --- | --- | --- | --- | | currencyCode | string | M | Currency of the amount in ISO-4217 (alpha-3) format. | | countryCode | string | M | The country in ISO-3166-1(alpha-2 code) format. | | merchantName | string | M | Merchant name that appears on the Google Payment sheet. | | merchantID | string | M | Merchant ID issued by Google. | | allowedAuthMethods | string | M | Fields supported to authenticate a card transaction. Allowed values: **PAN\_ONLY CRYPTOGRAM\_3DS** | | allowedCardNetworks | string | M | Indicates the card brands the merchant accepts for Google Pay. | | buttonType | string | O | Button option type for Google Pay. Allowed values: **book**: The "Book with Google Pay" payment button. **buy**: The "Buy with Google Pay" payment button (default). **checkout**: The "Checkout with Google Pay" payment button. **donate**: The "Donate with Google Pay" payment button. **order**: The "Order with Google Pay" payment button. **pay**: The "Pay with Google Pay" payment button. **plain**: The Google Pay payment button without the added text. **subscribe**: The "Subscribe with Google Pay" payment button. | | buttonColor | string | O | Button color option for Google Pay. Allowed values: **black white** | | globalPaymentsClientID | string | M | Your Client ID assigned by us. | ### Google Pay added to payment form In this example, Google Pay is included as an option above the section to manually enter the card details. ![Google Pay added to payment form built by Drop-In UI](https://developer.globalpayments.com/gh-assets/google-pay_drop-in-ui.png) **Google Pay Added to Payment Form** ### Google Pay additional fields and data When a successful Google Pay authorization is completed, the Javascript Library exposes the Google Pay token and any additional information that can be used to complete the transaction. The following table describes the fields and data available from Google Pay. | Name | Description | | --- | --- | | details.apmProvider | The payment method used to execute the transaction. | | details.billingAddress.addressLine | The address line of the payer’s billing address. | | details.billingAddress.city | The city of the payer’s billing address. | | details.billingAddress.country | The country of the payer’s billing address. | | details.billingAddress.postalCode | The postal code of the payer's billing address. | | details.billingAddress.phone | The payer’s billing phone number. | | payerEmail | The payer’s email address. | | payerPhone | The payer’s phone number. | | paymentReference | A token that represents, or is the payment method, stored with the digital wallet. | | shippingAddress.addressLine | The address line of the payer’s shipping address. | | shippingAddress.city | The city of the payer’s shipping address. | | shippingAddress.country | The country of the payer’s shipping address. | | shippingAddress.phone | The postal code of the payer's shipping address. | | shippingAddress.postalCode | The payer’s shipping address phone number. | ## Step 3: Charge the payment method To charge the payment method from Google Pay, you need to send a Create Transaction request to our REST API. This request is the standard payment request or sale processed by us. Instead of submitting the customer’s card information in the request, you simply pass the unique identifier for the Google Pay payment method. The transaction now proceeds to authorization as normal and may be successful or declined based on standard criteria such as sufficient funds available and so on. For more information on creating a Sale transaction with REST API, see the API Explorer for [Transactions](https://developer.globalpayments.com/api/transactions.md#/Create%20a%20Sale%20or%20Refund/createSaleOrRefundTransaction). #### Sample request ```json { "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "digital_wallet": { "provider": "PAY_BY_GOOGLE", "payment_token": {"googlepaytoken"} } } } ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent.getValue()); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setCardHolderName("googlepaytoken"); card.setMobileType(MobilePaymentMethodType.GOOGLEPAY); try { Transaction transaction = card .charge(new BigDecimal("10")) .withCurrency("EUR") .withModifier(TransactionModifier.EncryptedMobile) .execute(); } catch (GatewayException ex) { throw ex; } ``` ```dotnet var config = new GpApiConfig(); config.AppId = AppId; config.AppKey = AppKey; config.Channel = Channel.CardNotPresent; ServicesContainer.ConfigureService(config); var card = new CreditCardData(); card.CardHolderName = "googlepaytoken"; card.MobileType = EncyptedMobileType.GOOGLE_PAY; try { var transaction = card.Charge(10m) .WithCurrency("EUR") .WithModifier(TransactionModifier.EncryptedMobile) .Execute(); } catch (GatewayException ex) { throw ex; } ``` ```php $config = new GpApiConfig(); $config->appId = "APP_ID; $config->appKey = APP_KEY; $config->channel = Channel::CardNotPresent; $config->country = "IE"; ServicesContainer::configureService($config); $card = new CreditCardData(); // this is the Google Pay token received from the JS library at step 2 $card->token = 'googlepaytoken'; $card->mobileType = EncyptedMobileType::GOOGLE_PAY; $card->cardHolderName = "James Mason"; try { $transaction = $card->charge(10) ->withCurrency("EUR") ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) ->execute(); } catch (GatewayException $e) { //@TODO handle exception } $responseCode = $transaction->responseCode; // SUCCESS $transactionStatus = $transaction->responseMessage; //CAPTURED $transactionId = $transaction->transactionId; ``` ## Google Pay standalone In addition to enabling Google Pay on the payment form, you can also enable Google Pay as a standalone payment method. This allows you to initialize Google Pay at any stage of the checkout journey — for example, adding Google Pay on the product page for a quick checkout. To set up a standalone instance of Google Pay, we initialize the Alternative Payment Method (APM) form instead of the Card form as shown in the code sample below. Once initialized, Google Pay will render within your specified `
` tag. ```markup // creating an instance of standalone Google Pay var apmForm = GlobalPayments.apm.form('#google-pay', { amount: "19.99", style: "gp-default", apms: ["google-pay"] }); ``` ## Testing Google Pay You can test Google Pay in our Sandbox environment. The amount specified in the request will map the tokenized data in the transaction to one of our test cards. For example, an amount of 10.00 will map to the successful Visa test card. For further details, see our test cards for [Google Pay](https://developer.globalpayments.com/resources/test-card-numbers#google-pay). ## Brand guidelines For Google Pay branding guidelines and to download assets, see [Brand Guidelines](https://developers.google.com/payments/brand-guidelines) on their website. ## Enhance your solution For the detailed API specification and a full list of features, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [Create a Transaction](https://developer.globalpayments.com/api/transactions.md#/Create%20a%20Sale%20or%20Refund/createSaleOrRefundTransaction) Use our API Explorer code playground to try it out. ### [Decrypted Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/decrypted-wallets.md) Set up payload decryption to preview card data. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) Integrate with alternative and local payment methods. # Decrypted Digital Wallets Source: https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/decrypted-wallets.md Section: Payments Description: Set up payload decryption to preview card data Decrypted digital wallets allow you to view the card data before submitting the transaction. This option gives full control of your payment journey. For example, you can block specific cards or make informed decisions for subsequent payment actions. > **PCI Compliance Notice**: Decrypted wallet data — including the Device Primary Account Number (DPAN), expiration date, and cryptogram — must be treated as sensitive cardholder data under PCI DSS. Ensure your system is compliant before handling decrypted values. > > For official requirements, see: > * [PCI DSS v4.0 Documentation](https://www.pcisecuritystandards.org/document_library) > * [PCI DSS Tokenization Guidelines](https://www.pcisecuritystandards.org/documents/Tokenization_Guidelines_Info_Supplement.pdf) ## Key definitions * **FPAN (Funding Primary Account Number):** The actual card number printed on a physical card. * **DPAN (Device Primary Account Number):** A tokenized card number issued by a wallet provider, representing the FPAN and used in transactions. ## Supported tokens Use the `TOKENIZED_CARD` source type when processing decrypted tokens from Apple Pay or Google Pay. Set the `provider` field to `apple-pay` or `pay-with-google`, and provide the DPAN, expiration, and cryptographic values. ## Decryption requirements Each wallet provider has distinct setup steps: * **Apple Pay:** Upload a CSR and public key to the Apple Pay developer portal. [Apple Pay Token Format](https://developer.apple.com/documentation/passkit/apple_pay/payment_token_format_reference) * **Google Pay:** Follow Google’s encryption/decryption guide. [Google Pay Cryptography Guide](https://developers.google.com/pay/api/web/guides/resources/payment-data-cryptography) ## Step 1: Decrypt and map fields #### Example of a decrypted wallet payload ```json { "applicationPrimaryAccountNumber": "4895370012003478", "applicationExpirationDate": "1226", "currencyCode": "840", "transactionAmount": "1999", "cardholderName": "James Mason", "onlinePaymentCryptogram": "Af9x83xkzKJ3Jidv4xj2AwAAABk=", "eciIndicator": "5" } ``` > **Important: Only DPANs are returned, along with accompanying transaction fields. FPANs are never returned in decrypted wallets.** You’ll typically receive: * `applicationPrimaryAccountNumber` (DPAN) * `applicationExpirationDate` (MMYY) * `onlinePaymentCryptogram` * `eciIndicator` * `currencyCode`, `transactionAmount` * `cardholderName` (*optional, often not included*) ### Required fields: * DPAN * Expiry * Currency * Amount * Cryptogram (*recommended*) * ECI (*recommended*) | Wallet Field | API Field | Notes | | :---- | :---- | :---- | | `applicationPrimaryAccountNumber` | `token` | Use DPAN here. | | `currencyCode` | `currency` | ISO 4217 format | | `applicationExpirationDate` | `expiry` | Format MMYY | | `transactionAmount` | `amount` | | | `cardholderName` | `name` | Optional | | `onlinePaymentCryptogram` | `cryptogram` | | | `eciIndicator` | `eci` | | ## Step 2: Process request Change the `item type` field to the appropriate wallet provider: `apple-pay` or `pay-with-google`. If the response does not include the cryptogram and Electronic Commerce Indicator (ECI), these can be removed and sent without the values. However we strongly advise against that as the two values are typically expected for the best acceptance rates. ### DPAN - Including ECI and cryptogram In this scenario, the customer’s DPAN is used, along with the ECI and cryptogram. #### Sample request ```json { "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "USD", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "US", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "digital_wallet": { "token": "5167300431085507", "token_format": "CARD_TOKEN", "expiry_month": "12", "expiry_year": "20", "cryptogram": "234234234", "provider": "APPLEPAY OR PAY_BY_GOOGLE", "eci": "5" } } } ``` ### FPAN - Google Pay web flows Some Google Pay web flows return `CARD_NUMBER` — the FPAN — instead of a token (DPAN). These transactions: * Are **not decrypted wallet transactions** * Require full PCI DSS compliance * Must use 3D Secure if applicable > **Use this only when the customer selects a saved card that isn’t tokenized.** #### Sample request (for information only) ```json { "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "USD", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "US", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "digital_wallet": { "token": "5167300431085507", "token_format": "CARD_NUMBER", "expiry_month": "12", "expiry_year": "20", "cryptogram": "234234234", "provider": "PAY_BY_GOOGLE", "eci": "5" } } } ``` #### Sample response ```json { "id": "TRN_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "time_created": "2021-03-20T13:44:14.327Z", "type": "SALE", "status": "CAPTURED", "channel": "CP", "capture_mode": "AUTO", "amount": "20045", "currency": "CAD", "merchant_id": "MER_8096479c606f4deb93dfab49e7bfea28", "merchant_name": "SANDBOX_MERCHANT", "account_id": "TRA_0b1fcc7cceea48dea38d044bae4295c2", "account_name": "Termiinal_55", "reference": "03559571", "payment_method": { "result": "00", "message": "APPROVAL", "entry_mode": "MANUAL", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX4242", "authcode": "351404", "brand_reference": "772201652998701", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "0", "avs_postal_code_result": "0", "avs_action": "" } }, "batch_id": "BAT_353445", "action": { "id": "ACT_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "type": "AUTHORIZE", "time_created": "2021-03-20T13:44:14.327Z", "result_code": "SUCCESS", "app_id": "APP_MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "my_sandbox_app" } } ``` ## Repeat MIT payments With a decrypted setup, you can process repeat Merchant-Initiated Transactions (MITs) for both Google Pay and Apple Pay. Repeat MITs include the following payment types: * Recurring * Installment * Unscheduled To process a recurring payment, the first payment must originate from a successful customer-initiated transaction. Only the `brand_reference` from the initial transaction may be stored. Do not retain decrypted fields like DPAN, ECI, or cryptogram. > **Recurring payments for Apple Pay will require use of Merchant Tokens (MPANs). For more information, see their [Apple Merchant Token Guide](https://developer.apple.com/apple-pay/merchant-tokens/)**. > **You’ll need to comply with the stored credential mandate of card brands like Visa or Mastercard. For more information, see our [Recurring Payments - Credential on File](https://developer.globalpayments.com/docs/payments/recurring/credentials-on-file.md) guide.** | Wallet Provider Field | Our API Field | Notes | | :---- | :---- | :---- | | `applicationPrimaryAccountNumber` | `token` | | | `currencyCode` | `currency` | 3 digit ISO 4217 code, i.e., “GBP” | | `applicationExpirationDate` | `expiry_month` & `expiry_year` | | | `transactionAmount` | `amount` | | | `cardholderName` | Not appicable | | | `Model` | `model` | `recurring`: Use for payments with no fixed duration that continues until the customer cancels. `installment`: Use for payments of an agreed amount on the same day each month until the fixed duration ends. `oneoff`: Use for unscheduled payments with no fixed duration. | | `Initiator` | `initiator` | Set to `merchant` for MIT transactions. | | `Sequence` | `sequence` | Set to `subsequent` for MIT transactions. | # Click to Pay - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/click-to-pay.md Section: Payments Description: Merchant Integration Overview ## What Is Click to Pay? Click to Pay (CtP) is a fast, secure checkout experience that allows customers to use stored cards across major card networks (Visa, Mastercard, American Express, etc.) — without manually entering card details at checkout. > **No re-entered card numbers. No passwords. One consistent, fast experience.** Through our partnership with **Netcetera**, Global Payments brings this modern checkout option to merchants **with no code changes required** for existing Hosted Payment Page (HPP) integrations. ## Key Benefits for Your Business | Benefit | What It Means for You | | :---- | :---- | | **No Dev Work Needed** | Your current HPP setup will support Click to Pay. | | **Fast Checkout** | Cards are registered by the issuers so customers can pay with cards in just a few clicks. | | **Reduced Cart Abandonment** | Streamlined flow improves conversion. | | **Secure & Compliant** | Card and identity info never touches your environment. | | **One Setup for All Cards** | Works across Visa, Mastercard, Amex, and more. | ## How It Works (Behind the Scenes) 1. **The customer selects “Click to Pay”** at checkout. 2. **identity check and card selection is handled in the background.** 3. **Global Payments processes the payment using the selected card.** 4. **The customer is returned to your site with a payment confirmation.** You don’t need to implement anything new. The full flow is handled by Netcetera and Global Payments. ## Integration Impact | Area | Action Required | | :---- | :---- | | Hosted Payment Page | No changes | | Payment Flow | Unchanged | | PCI Compliance | Reduced scope | | Testing | Optional (via sandbox) | --- ## Testing Click to Pay (Optional) If you’d like to test Click to Pay before going live: - We can enable **sandbox mode** for your merchant ID. - You'll use scheme-provided test cards and simulate customer flows. - No front-end work required — we handle routing and responses. --- ## How to Enable Click to Pay Just contact your Global Payments representative with the following: - Your **Merchant ID** - **Account Name** - Your **storefront/domain name(s)** - The **card schemes** you want to support (currently restricted to Visa, Mastercard.) We will: 1. Onboard you on an account level. 2. Register your profile with the supported schemes. 3. Enable Click to Pay support in both sandbox and production. Once confirmed, Click to Pay will appear automatically for eligible customers. ## What You’ll See - Your HPP integration remains the same. - Payments made with Click to Pay appear like any other transaction. - Optional: Click to Pay indicators can be included in your reporting. --- ## Questions? Contact your Global Payments onboarding manager or support team to get started. Click to Pay can usually be activated in just a few business days — and your customers will be ready to check out faster and more securely. # Click to Pay - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/click-to-pay-guide.md Section: Payments Description: Enable Click to Pay #### API This integration gives you: - Full control over the frontend experience via Netcetera’s SDK. - Zero responsibility for authorization logic — Global Payments handles that for you. ## Key Architecture Flow 1. Merchant integrates Netcetera SDK 2. Customer uses Click to Pay and selects a stored card 3. Netcetera completes 3DS and generates a signed JWS token 4. Netcetera sends the JWS to Global Payments as a `ctp-request` 5. Global Payments decrypts it and converts it to a standard authorization 6. Global Payments returns the result to the merchant ## Benefits of This Setup | Benefit | Description | | :---- | :---- | | Fast, Frictionless Checkout | Stored cards and scheme-side flows improve UX. | | Netcetera Manages Click to Pay | Identity, card selection, and 3DS handled by their SDK. | | Global Payments Handles Auth | You never build auth logic or touch PAN/token. | | Cleaner Compliance | Less PCI exposure and reduced scope. | ## Integration You, as the merchant are responsible for integrating the Click to Pay frontend and ensuring the transaction flow completes. Below are your integration steps. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ### Step 1: Integrate Netcetera SDK Use the [official SDKs](http://npmjs.com/package/@netceterapx/click-to-pay-sdk?activeTab=readme) provided by Netcetera: These SDKs: - Load the Click to Pay button and scheme-branded UI - Handle customer identity, card selection, and 3D Secure (v2) - Generate a signed JWS token (`ctp-request` payload) **You never handle raw card details.** ### Step 2: Configure SDK with Merchant-Specific Values (TBC) The following values are needed to initialize the Netcetera SDK. Some come from you, the merchant; others are provided during Click to Pay onboarding by Global Payments. | Field | Who Provides It | Purpose | | :---- | :---- | :---- | | `srcInitiatorId` | Global Payments | Identifies Global Payments to schemes. Shared across all GP merchants. | | `acquirerBin` | Global Payments | Used to route the transaction through the scheme. | | `merchantName` | Merchant | Displayed to cardholders during checkout. | | `merchantCountryCode` | Merchant | ISO 3166-1 alpha-2 country code (e.g. `IE`, `DE`). | | `merchantUrl` | Merchant | Used for scheme registration and domain binding. | | `notificationUrl` | Merchant (optional) | For async notifications (if supported). | | `srcDpaId` | Global Payments (via Netcetera) | SDK init token; specific to the merchant and environment (sandbox/production). | --- ## What’s Handled for You These values are provisioned and managed behind the scenes — you do **not** need to configure or request them manually: - **`threeDSRequestorId`**: Used in 3DS flows; embedded by Netcetera. - **DPAID**: A scheme-issued merchant identifier; managed by Global Payments. - **3DS logic**: Fully handled by Netcetera — no manual challenge handling is required. ## In the background: ### 1. Netcetera handles the initial flow After 3DS is completed: - Netcetera generates a signed JWS token (the `ctp-request`) - This token contains the encrypted payload with all transaction data (PAN/token, ECI, CAVV, 3DS ID, etc.) - Netcetera generates a ctp-request and then hands it back to the payment page, the payment page uses that ctp-request to build an auth-ctp. **You do not need to parse, decrypt, or forward this payload.** ### 2. Global payments handles the payment result Global Payments: - Decrypts the `ctp-request` - Builds a traditional authorization message (ISO 8583 or internal API) - Sends to the issuer - Returns the result (approved/declined) to you You’ll receive the final result via: - Your existing API callback - Or as part of your redirect/confirmation page ## What Will Be Returned (TBC) | Field | Description | | :---- | :---- | | `result` | Success or failure | | `orderId` | Your transaction reference | | `authCode` | Issuer-provided authorization code | | `eci`, `cavv` | 3DS authentication values (if requested) | | `status` | Optional – includes CtP-specific success metadata | ## Testing Click to Pay We recommend a full end-to-end test before going live. | Test Area | What You Do | | :---- | :---- | | SDK Setup | Use Netcetera sandbox SDK and test config | | Scheme Testing | Use [test cards](https://developer.globalpay.com/resources/test-cards) provided | | Callback Handling | Ensure you can receive and process final result | ## Go-Live Checklist 1. Integrate SDK into frontend 2. Confirm sandbox payment success 3. Share final domain/merchant info with Global Payments 4. Global Payments onboards you to the CtP service 5. Production keys enabled 6. Go live #### HPP ## HPP Integration For Hosted Payment Page (HPP) merchants, this entire process is **zero-effort and requires no code changes**. CtP enables upgrading seamlessly to a modern checkout flow without any development effort. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## End-to-End Flow 1. Customer selects **Click to Pay** at checkout. 2. Global Payments Hosted Payments Page hands off to the embedded SDK provided by Netcetera Netcetera, which handles: - Consumer identity lookup - Card selection - 3DS authentication 3. A Netcetera SDD creates a JWT token which is created and is returned to the payment page through an event listener and an `auth-ctp` request is then sent to Global Payments. 4. Global Payments decrypts and validates the payload. 5. Global Payments constructs a traditional authorization request using the decrypted data. 6. Authorization is processed and approved/declined by the issuer. 7. Global Payments returns a standard HPP response to the merchant. ## Key Benefits | Benefit | Explanation | | :---- | :---- | | No Merchant Changes | Existing Global Payments HPP integrations remain unchanged. | | Zero Integration Effort | CtP is triggered and handled by Global Payments backend. | | Secure by Design | Card and identity data is securely handled by the card networks. | | Seamless Testing & Production | The onboarding process is consistent across both environments. | | Reduced PCI Scope | Cardholder data never enters the merchant environment. | | Enhanced User Experience | One-click checkout increases conversion and customer satisfaction. | ## Merchant Technical Impact | Area | Change | | :---- | :---- | | Front-End | None | | Backend/API | None | | Reporting | Optional flag for CtP transactions | | PCI Compliance | Reduced scope (no PAN handling by merchant) | ## Onboarding Process | Step | Description | | :---- | :---- | | 1\. Merchant Setup | Merchant info submitted by Global Payments | | 2\. Scheme Configuration | Merchant is registered with the schemes | | 3\. Environment Enablement | Merchant is enabled in sandbox or production | | 4\. Go-Live | `auth-ctp` requests begin flowing to Global Payments once live | **Same onboarding steps apply for both sandbox and production environments**. ## HPP Response to Merchant The HPP response returned by Global Payments remains consistent: ## Merchant Activation To enable Click to Pay: 1. **Merchant contacts Global Payments support** or their account manager. 2. Provide: - Merchant ID - Account name - Supported domains - Required schemes (Visa, Mastercard, etc.) 3. Global Payments handles onboarding on an account level. 4. Once confirmed, **Click to Pay is live for all eligible HPP transactions** on that account — no further action required by the merchant. ## Testing Click to Pay We recommend a full end-to-end test before going live using our [test cards](https://developer.globalpay.com/resources/test-cards) # Buy Now Pay Later - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/buy-now-pay-later-overview.md Section: Payments Description: Allow customers to repay the cost of their purchase over time The Buy Now Pay Later (BNPL) payment method allows customers to repay the cost of their purchase over time instead of all at once. This payment flexibility typically leads to better conversion rates as well as higher cart values. Using our API, you can offer your customers a range of BNPL payment options using a single integration. We support several BNPL providers in multiple markets, such as Klarna, Affirm, Sezzle, and ZIP. With our flexible API, your integration will automatically support any new BNPL providers that we add over time. You just need to pass the new provider name in the request. Our BNPL solution offers: * Choice of multiple BNPLs providers in a number of markets * Single point of integration to process all supported BNPL providers * Ability to offer different BNPL providers to target specific global markets * Consolidated reporting via our API and Reporting tool ## How does it work? With BNPL, you receive your funds directly from the BNPL provider the customer selects. Although the customer pays for their purchase over time, you receive the full funds up front, minus incurred fees. All transaction data, including authorization and settlement data, is available from us using our APIs and Merchant Portal reporting tool. With most BNPL providers, the payment process works like this: 1. Initiate the payment. 2. Redirect the customer to their payment method of choice. 3. Receive the initial response while the customer is redirected back to your app or website. 4. Verify the final status update from the payment method. At a high level, Buy Now Pay Later works like this using our API: ![Diagram flow showing interaction between the merchant website, our API, and the BNPL Provider to pay with Buy Now Pay Later.](https://developer.globalpayments.com/gh-assets/bnpl_flow.png) **Buy Now Pay Later Typical Flow** ## Next steps To get familiar with how BNPL works, see our [guide](https://developer.globalpayments.com/docs/payments/payment-methods/buy-now-pay-later-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Buy Now Pay Later - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/buy-now-pay-later-guide.md Section: Payments Description: Learn how to let customers repay the cost of their purchase over time In this guide, you’ll learn how to create a transaction that uses Buy Now Pay Later (BNPL). This includes initiating the payment, redirecting the customer, handling the redirect, checking the status, and capturing the transaction. For an overview of BNPL, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/buy-now-pay-later-overview.md) page. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Initiate the payment In this step, we create a transaction using the Initiate call. This will specify which BNPL provider the customer wants to pay with and includes the various data elements needed by the BNPL provider to validate and authorize the transaction. The Initiate call will also retrieve some necessary information to facilitate the redirect and authentication of the customer. In the request, You must specify the corresponding BNPL provider (for example, KLARNA, AFFIRM, ZIP) in the `payment_method.bnpl.provider` field. #### Sample request ```JSON curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer RyVpwpFYkuHowpkkMI3joCn0AB13' \ --data-raw '{ "account_name": "Transaction_Processing", "channel": "CNP", "capture_mode": "LATER", "type": "SALE", "amount": "55000", "net_amount": "55000", "currency": "USD", "reference": "TRANS-123", "country": "US", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "bnpl": { "provider": "AFFIRM" } }, "order": { "shipping_method": "DELIVERY", "items": [ { "reference": "92ebf294-f3ef-4aba-af30-6ebaf747de8f", "label": "iPhone 13", "description": "iPhone 13", "quantity": "1", "unit_amount": "55000", "total_amount": "55000", "tax_amount": "0", "discount_amount": "0", "tax_percentage": "0", "net_unit_amount": "55000", "gift_card_currency": "USD", "url": "https://www.example.com/iphone.html", "image_url": "https://www.example.com/iphone.png" } ], "shipping_address": { "first_name": "James", "last_name": "Mason", "line_1": "10 Glenlake Pkwy NE", "line_2": "", "city": "Atlanta", "postal_code": "30328", "state": "GA", "country": "US", "address_type": "HOME" }, "shipping_phone": { "country_code": "1", "subscriber_number": "123456789" } }, "payer": { "reference": "d78f06cf-7ad5-4a60-8507-ab8d5fc40787", "email": "james.mason@example.com", "date_of_birth": "1993-08-24", "billing_address": { "line_1": "10 Glenlake Pkwy NE", "line_2": "", "city": "Atlanta", "postal_code": "30328", "state": "GA", "country": "US" }, "contact_phone": { "country_code": "1", "subscriber_number": "123456789" }, "documents": [ { "type": "PASSPORT", "reference": "123456789", "issuer": "US" } ] }, "notifications": { "return_url": "https://www.example.com/returnUrl", "cancel_url": "https://www.example.com/cancelUrl", "status_url": "https://www.example.com/statusUrl" } }' ``` ### Sample Response ```JSON { "id": "TRN_3TSj7R20hI45oaYHoWsaljY8ZhH4tV", "time_created": "2025-11-13T22:22:25.835Z", "type": "SALE", "status": "INITIATED", "channel": "CNP", "capture_mode": "LATER", "amount": "56700", "currency": "GBP", "country": "GB", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "TRA_27c901760029495f813afbb0dab197ef", "account_name": "transaction_processing", "reference": "25966821", "payment_method": { "result": "0", "message": "REQUEST_SUCCESS", "entry_mode": "ECOM", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_3TSj7R20hI45oaYHoWsaljY8ZhH4tV/redirect/eyJtZXJjaGFudF9tYW5hZ2VtZW50X2lkIjpudWxsLCJtZXJjaGFudF9pZCI6Ik1FUl9jNWQzN2VhZjBlMzg0MWUwODNjMjMyYjIzMThhZjU1YyIsImFjY291bnRfaWQiOiJUUkFfMjdjOTAxNzYwMDI5NDk1ZjgxM2FmYmIwZGFiMTk3ZWYiLCJhcHBfaWQiOiJUNm9nMXRiRUNwSEZlTzEwNHFVTTM4M29xNWJPSjEyciIsIlgtR1AtVmVyc2lvbiI6IjIwMjEtMDMtMjIifQ==", "bnpl": { "provider": "KLARNA" } }, "batch_id": "", "action": { "id": "ACT_3TSj7R20hI45oaYHoWsaljY8ZhH4tV", "type": "INITIATE", "time_created": "2025-11-13T22:22:25.835Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Step 2: Redirect the customer Once the transaction is initiated, the customer must be redirected to the BNPL checkout flow using the URL returned in the Initiate response to facilitate authorization and authentication. To do this, use a simple JavaScript redirect or HTTP GET (302 redirect). In our example, we redirect the customer to the URL returned in the field 'payment_method.redirect_url' of the Initiate response using JavaScript. #### Sample redirect code ```xml Sample APM Redirect ``` ## Step 3: Handle the redirect and check the status Once the customer completes the transaction with the BNPL provider, they are redirected back to your app or website based on transaction success/failure using the URLs specified in the Initiate request. The unique transaction identifier is also returned, allowing you to check the status of the payment. When the customer is redirected back to your app or website, you can provide additional messaging depending on the BNPL provider used. Each BNPL provider has relevant marketing assets available that can be added to your app or webpages to enhance the customer experience. #### Sample Return URL parameters ``` X-GP-Signature=88b9d04eaa711f0f1595c9eb78458c1d23efc483aac419d3b86905de62fb97242f67a413c0e444250fd8c58384b86a90d0030f8fba4b111399551da54ac21f38 id=TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ&payer_reference=TRANS-123 action_type=REDIRECT_FROM action_id=ACT_0noTmweklBS8W2KENpxMZNqoRcyP0d ``` #### Sample URL ```JSON https://www.example.com/returnUrl/?X-GP-Signature=88b9d04eaa711f0f1595c9eb78458c1d23efc483aac419d3b86905de62fb97242f67a413c0e444250fd8c58384b86a90d0030f8fba4b111399551da54ac21f38&id=TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ&payer_reference=TRANS-123&action_type=REDIRECT_FROM&action_id=ACT_0noTmweklBS8W2KENpxMZNqoRcyP0d ``` The ID that is passed as a URL parameter is the `TRN_ID` and should be used to check the status of the transaction. A status of PREAUTHORIZED indicates that the amount indicated can now be captured by the merchant (see [Step 4 - Capture the transaction](#step-4-capture-the-transaction)). #### Sample request ```JSON curl --location --request GET 'https://https://apis-sandbox.globalpay.com/ucp/transactions/TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer eDgd0njOaUMAtjzn58ABxglxubyP' \ --data-raw '' ``` #### Sample response ```JSON { "id": "TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ", "time_created": "2022-03-24T18:37:31.109Z", "time_last_updated": "2022-03-24T18:57:35.272Z", "status": "PREAUTHORIZED", "type": "SALE", "merchant_id": "MER_1b64665c7a3e48989e75e6f33af03f7b", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_f623dc47576944129029696bf6be41bc", "account_name": "Transaction_Processing", "channel": "CNP", "amount": "55000", "merchant_amount": "", "partner_amount": "", "currency": "USD", "reference": "TRANS-123", "description": "", "order_reference": "", "time_created_reference": "", "batch_id": "", "initiator": "", "country": "US", "language": "", "ip_address": "37.228.242.98", "site_reference": "", "payment_method": { "result": "0", "message": "REQUEST_SUCCESS", "entry_mode": "ECOM", "fingerprint": "", "fingerprint_presence_indicator": "", "name": "James Mason" }, "action_create_id": "ACT_vxeNsN6B9JKnjiIyz4tvrikc6skGPR", "parent_resource_id": "TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ", "action": { "id": "ACT_ancrTzNwEfEPAztBi2KuIfFxRzweO4", "type": "TRANSACTION_SINGLE", "time_created": "2022-03-24T18:59:28.779Z", "result_code": "SUCCESS", "app_id": "gkXGvDH5FPvgUyDw9egbQSrHgu4GJYT0", "app_name": "demo_app" } } ``` ## Step 4: Capture the transaction Any transaction that is successfully PREAUTHORIZED can be captured. Depending on if the capture mode is LATER or MULTIPLE, the transaction can be captured once or multiple times, respectively. | Capture mode from payment initiation request | Status TRN_ID after capture | | -------- | ------- | | LATER | Original TRN - CAPTURED | | MULTIPLE | Original TRN - PREAUTHORIZED New TRNs created for each capture request - CAPTURED | Once the capture is complete, you can display a success message to the customer and update your app or website accordingly. You can also initiate the dispatch of items to the customer. Once the transaction is captured, you can expect to receive settlement directly from the BNPL provider. Refer to documentation for the individual BNPL provider for settlement timeframes. At any point in the process, you can call the Transactions endpoint for a status on the transaction and use the Settlement endpoint to check the final status. Settlement data is available via our API after the transaction is settled by the BNPL provider. #### Sample request ```JSON curl --location --request GET 'https://https://apis.sandbox.globalpay.com/ucp/transactions/TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ/capture' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer eDgd0njOaUMAtjzn58ABxglxubyP' ``` #### Sample response ```JSON { "id": "TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ", "time_created": "2022-03-24T18:37:31.109Z", "type": "SALE", "status": "CAPTURED", "amount": "55000", "currency": "USD", "country": "US", "reference": "TRANS-123", "payment_method": { "result": "0", "message": "REQUEST_SUCCESS", "bnpl": { "provider": "AFFIRM", "result": "201 CREATED" } }, "batch_id": "", "action": { "id": "ACT_vxeNsN6B9JKnjiIyz4tvrikc6skGPR", "type": "CAPTURE", "time_created": "2022-03-24T18:57:35.272Z", "result_code": "SUCCESS", "app_id": "gkXGvDH5FPvgUyDw9egbQSrHgu4GJYT0", "app_name": "GPAPI_Affirm_App" } } ``` ## Refunds To make a refund, follow the steps in our [Refund guide](https://developer.globalpayments.com/docs/payments/manage-payments/refund-guide.md) or see [Transactions](https://developer.globalpayments.com/api/transactions.md#/Capture%20a%20Sale/captureSaleTransaction) in API Explorer. Remember that for transactions initiated in MULTIPLE capture mode, each capture request generates a new `TRN_ID` that is returned in the request’s response. To make a refund for a particular capture request, the corresponding `TRN_ID` needs to be submitted as the id parameter path of the refund request. That is, `https://apis.sandbox.globalpay.com/ucp/transactions/{id}/refund` replaces `{id}` with the `TRN_ID` of the capture request you want to refund. #### Sample request ```JSON curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_hgokzKko3EFJpkL5BVBKoRfiJh6kEJ/refund' \ --header 'content-type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: eDgd0njOaUMAtjzn58ABxglxubyP' \ --data '{ "amount": "1199" }' ``` | Capture mode from payment initiation request | id parameter path | | -------- | ------- | | LATER | Original _TRN_ID_. | | MULTIPLE | _TRN_ID_ returned in the corresponding capture request. | ## Testing BNPL Our BNPL solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. # Alternative Payment Methods Source: https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md Section: Payments Description: Learn how to integrate and display other payment methods You can accept transactions from a number of worldwide local and alternative payment methods. This not only widens your customer base to more shoppers across the globe, but also provides the added benefit of managing all your payments through our Reporting tool. #### API In this guide, we set up the request, which gives you access to over 20 alternative payment methods (APMs). At a high level, the majority of APMs work like this: ![Diagram flow showing interaction between the customer, our API, and the merchant to use an alternative payment method.](https://developer.globalpayments.com/gh-assets/apm_flow.png) **Typical API Integration for an APM** ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Initiate the payment In an APM transaction, the first request is a Transactions Create. This is used to advise the payment method of the details of a new transaction and to retrieve the necessary information required to facilitate authentication. In this example, we set up a TestPay transaction. #### Sample request ```json curl -L -X POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ -H 'Authorization: Bearer NEKp7fES1nBQr8C9OV1ltsaJ9Fmc' \ -H 'X-GP-Version: 2021-03-22' \ -H 'Accept: application/json' \ -H 'Content-type: application/json' \ -H 'Accept-Encoding: gzip' \ -d '{ "account_name": "Transaction_Processing", "channel": "CNP", "amount": "1999", "type": "SALE", "currency": "EUR", "reference": "APM-20200417", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "apm": { "provider": "testpay" } }, "notifications": { "return_url":"https://www.example.com/returnUrl", "status_url": "https://www.example.com/statusUrl" } }' ``` ```java GpApiConfig config = new GpApiConfig(); config .setAppId(APP_ID) .setAppKey(APP_KEY) .setChannel(Channel.CardNotPresent.getValue()); ServicesContainer.configureService(config); AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod() .setAlternativePaymentMethodType(AlternativePaymentType.TESTPAY) .setReturnUrl("https://example.com/returnUrl") .setStatusUpdateUrl("https://example.com/statusUrl") .setCancelUrl("https://example.com/cancelUrl") .setDescriptor("Test Transaction") .setCountry("GB") .setAccountHolderName("Jane Doe"); try { Transaction transaction = paymentMethod .charge(new BigDecimal("19.99")) .withCurrency("EUR") .execute(); } catch (Exception ex) { // TODO: add your error handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = AppId; config.AppKey = AppKey; config.Channel = Channel.CardNotPresent; ServicesContainer.ConfigureService(config); var paymentMethod = new AlternativePaymentMethod { AlternativePaymentMethodType = AlternativePaymentType.TESTPAY, ReturnUrl = "https://example.com/returnUrl", StatusUpdateUrl = "https://example.com/statusUrl", CancelUrl = "https://example.com/cancelUrl", Country = "GB", AccountHolderName = "Jane Doe" }; try { var transaction = paymentMethod.Charge(19.99m) .WithCurrency("EUR") .Execute(); } catch (Exception ex) { // TODO: add your error handling here } ``` ```php $config = new GpApiConfig(); $config->appId = APP_ID; $config->appKey = APP_KEY; $config->channel = Channel::CardNotPresent; $config->country = 'GB'; ServicesContainer::configureService($config); $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::TEST_PAY); $paymentMethod->returnUrl = 'https://example.com/returnUrl'; $paymentMethod->statusUpdateUrl = 'https://example.com/statusUrl'; $paymentMethod->cancelUrl = 'https://example.com/cancelUrl'; $paymentMethod->country = 'GB'; $paymentMethod->accountHolderName = 'Jane Doe'; try { $response = $paymentMethod->charge(19.99) ->withCurrency('EUR') ->withClientTransactionId('APM-20200417') ->execute(); } catch (GatewayException $e) { // TODO: add your error handling here } $responseCode = $response->responseCode; // SUCCESS $transactionId = $response->transactionId; $transactionStatus = $response->responseMessage; // TransactionStatus::INITIATED $redirectUrl = $response->alternativePaymentResponse->redirectUrl; ``` ## Step 2: Redirect to the payment method Following a successful initiation of the transaction, the next step is to redirect the customer to the payment scheme to facilitate authentication and authorization. This can be achieved, for example, using a simple JavaScript redirect. You could also use a HTTP GET (302 redirect). In this example, we redirect the customer to the URL returned in the response using JavaScript. ### Sample redirect code ```html Sample APM Redirect ``` Once the customer completes their transaction with the payment method, they are redirected to the Return URL of the initial request. The current status of the transaction will also be returned. Your application might put the customer on hold for a few seconds while it checks to see if the Status URL was sent a final update. You can then redirect the customer to a final success or failure page. #### Sample Return URL parameters ```html X-GP-Signature=a86a2c3550c4228263fbd8cf0b4bd7c29ca453881495d1236507fe0bab9ce300dfba6dd12b308cc7b0d9d88cfb956a48c5fcd205579fda47e88b83a80fe9030b& id=TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM& status=PENDING& reference=APM-20200417& payment_method_result=01& payment_method_message=PENDING& provider=testpay& apm_wait_notification=0& apm_optional_redirect=0& apm_fund_status=NOT_EXPECTED& apm_payment_description=2NFQYHC& apm_confirmed_accountholder=Jane Doe& apm_account_number=93722& country=GB& apm_bank_iban=& apm_bank_identifier_code=& apm_bank_name=& apm_bank_code=& action_id=ACT_x0xHTCKj7gLDjJ0Om7r8lJ8lMo7nwy& action_type=RETURN_NOTIFICATION& action_time_created=2020-04-20T13:17:21.914Z ``` ## Step 3: Receive the final status The URL specified in the Status URL element in the initial request will receive the final status. Depending on the payment method used, this can happen at the same time as the customer is redirected to your Return URL, moments after — or, potentially, the final status update might come days later. For payment methods in which you expect the final status update to come days later, your Status URL will need to accept the message sent by us, find the correct order in your application, and update the status accordingly. You may want to inform the customer at this point that their payment was finally accepted. You can also initiate the dispatch of items to the customer. #### Sample status update ```json { "id":"TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM", "time_created":"2020-04-20T13:17:21.914Z", "type":"SALE", "status":"CAPTURED", "channel":"CNP", "capture_mode":"AUTO", "amount":"1999", "currency":"EUR", "country":"GB", "merchant_id":"MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name":"Sandbox_merchant_2", "account_id":"TRA_6716058969854a48b33347043ff8225f", "account_name":"Transaction_Processing", "reference":"APM-20200417", "payment_method":{ "result":"00", "message":"SUCCEEDED", "entry_mode":"ECOM", "apm":{ "provider":"testpay", "wait_notification":"", "fund_status":"NOT_EXPECTED", "payment_description":"3K1TRAA", "confirmed_accountholder":"Former Glory", "account_number":"93722", "iban":"DE25700251750322205970", "bank_identifier_code":"HYVEDEMM643", "bank_name":"HypoVereinsbank Penzberg", "bank_address":"", "optional_redirect":"" } }, "batch_id":"", "action":{ "id":"ACT_mkP7xm9u47kLgTwTKhYfQXRvfynwjP", "type":"STATUS_NOTIFICATION", "time_created":"2020-04-20T14:36:58.193Z", "result_code":"SUCCESS", "app_id":"jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name":"sample_app" } } ``` ## Supported payment methods Browse the APMs we support or search for a specific one. If additional fields are required, these will be documented along with the countries and currencies that are available with the payment method. ## Enhance your solution Explore more functionality to enrich your application. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) Get the full Transaction endpoint. ### [3D Secure & SCA](https://developer.globalpayments.com/docs/3DS-overview) Add 3D Secure authentication to reduce fraud risk. ### [Manage Payments](https://developer.globalpayments.com/docs/payments/manage-payments/overview) Discover additional transaction options. ### [Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md) Let customers pay with their smartphone. #### HPP Alternative payment methods (APMs) available on your account can be displayed on the Hosted Payment Page (HPP). In this guide, we show you how they appear by default and also how to display only those available in certain countries or ones that you consider most relevant to the customer. ## How they display The HPP displays whatever APMs are available on your account. In addition, it displays only those payment methods that are available in the country submitted in the `order.transaction_configuration.country` field. ![Hosted Payment Page showing alternative payment methods.](https://developer.globalpayments.com/gh-assets/apm_hpp-example.png) **Alternative Payment Method Example (HPP)** ## Pre-select most relevant To present the most relevant payment methods to your customer, you can pre-select one or more in the request. To do this, include the optional `allowed_payment_methods` field. #### Sample request ```json curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7V5XtjLBHLN1h' \ --data-raw 'account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-549d-4967-aeea-51b3f320046a", "payer": { "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "44", "subsriber_number": "1801555888, "billing_address": line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Halifax", "postal_code": "44", "country": "GB }, "order": amount": "1000", "currency": "EUR", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "GB", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD", "testpay", "sepapm", "sofort" ] }, "payment_method_configuration": { "authentications": { "preference": "CHALLENGE_PREFERRED } }, "notifications": return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url }' ``` ## Additional request fields | Element/Field | Category | Format | Type | Length | Description | | --- | --- | --- | --- | --- | --- | | order.transaction_ , configuration.allowed_ , payment_methods | string | alphanumeric | O | 1-50 | Indicates which payment method(s) to offer the customer or route customers to a specific one. For example: cards|paypal|sofort | | payer.first_name | string | alphanumeric | O | 1-50 | The first name of the payer. | | payer.last_name | string | alphanumeric | O | 1-50 | The last name of the payer. | | order.transaction_ , configuration.country | string | ISO-3166-1 | O | | Country code in ISO-3166-1 (alpha-2 code) format. **minLength: 2 maxLength: 2** | ## Supported payment methods Browse the APMs we support or search for a specific one. If additional fields are required, these will be documented along with the countries and currencies that are available with the payment method. ## Enhance your integration Below are value-added services you can enable for the HPP. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) Tokenize card details to charge customers later. ### [Dynamic Currency Conversion](https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md) Discover additional transaction options. ### [Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md) Let customers pay securely with just a scan, tap, or click. # QR Code Payments for Alipay and WeChat Pay - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/qr-codes-overview.md Section: Payments Description: Let customers use these payment methods via QR code > This feature is currently only available in the Asia Pacific region. For more information, check with your account manager. Alipay and WeChat Pay are the two most prominent digital wallets in China, both of which have become integral parts of daily life for Chinese customers and are widely used across Asia, with more than 2 billion users combined worldwide. They enable customers to make payments with QR codes through their mobile app. This provides a fast, secure, and convenient checkout experience. Our solution provides various ways to use both Alipay and WeChat Pay in-store and online. For merchants, the benefits of Alipay and WeChat Pay include: * Highly popular payment method trusted by users * Simplified checkout process with QR-code scanning * User-friendly mobile interface that can reduce friction and boost conversion rates * An extensive user base, including both the local market in China and tourists traveling abroad ## Use cases In this section, we present some “real world” examples that can be enabled through our QR Code Payment solution. Keep in mind that this section doesn’t cover all use cases. ##### Use case #1: Expand to new markets An international airline is looking to expand its routes and wants to include China as a new destination. They want to make sure that their online checkout experience is inclusive of local payment methods that will attract and enable customers to pay with ease. For this reason, they include Alipay and WeChat Pay as payment options on their online website, as this is a popular payment method in the Chinese market. ##### Use case #2: Quick payments A merchant with a physical store wants to allow customers to quickly make payments due to the very high demand at peak hours. They decide to include Alipay and WeChat Pay as payment options due to the quick QR-scanning process making payments easier and faster. ##### Use case #3: Convenient A merchant wants to allow their customers to complete online transactions regardless of whether they have their credit card or not. If their customers urgently need to complete an online transaction, they can select Alipay or WeChat Pay and simply scan the QR code with their mobile device. ## Supporting countries Alipay and WeChat Pay are currently supported in the following countries. | Country | Currency | Supported Channel(s) | | :---- | :---- | :---- | | Hong Kong SAR | HKD | In-Store, Online | | Macau | MOP | In-Store, Online | | Singapore | SGD | In-Store | | Malaysia | MYR | In-Store | | Philippines | PHP | In-Store | | Maldives | MVR | In-Store | | Sri Lanka | LKR | In-Store | ## How does it work? There are two main modes in which Alipay and WeChat Pay payments can be made: customer presented and merchant presented. This section describes each one and presents a typical flow diagram. The following table shows how each mode can be used in different payment scenarios. | Mode | In-Store | Online | | :---- | :---- | :---- | | Customer presented | ✅ | | | Merchant presented | ✅ | ✅ | ### Customer-presented mode (in-store) With this mode, the customer presents their wallet QR code on their mobile device for the merchant to scan and therefore make the payment. This is only applicable in an in-store scenario. ![Diagram flow showing the in-store payment flow between the customer, merchant, our API, and Alipay.](https://developer.globalpayments.com/gh-assets/qr-code_flow-in-store.png) **QR Code Payment Flow - Customer-Presented (In-Store)** ### Merchant-presented mode (online) With this mode, the merchant generates and displays a dynamic QR code for the customer to scan and make a payment on their own device. ![Diagram flow showing the online payment flow between the customer, merchant, our API, and Alipay.](https://developer.globalpayments.com/gh-assets/qr-code_flow-online.png) **QR Code Payment Flow - Merchant-Presented (Online)** ## Ready to get started? To get started with adding Alipay and WeChat Pay as payment methods, see the steps and code samples in our [guide](https://developer.globalpayments.com/docs/payments/payment-methods/qr-codes-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # QR Code Payments for Alipay and WeChat Pay - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/qr-codes-guide.md Section: Payments Description: Learn how to add these payment methods via QR code > This feature is currently only available in the Asia Pacific region. For more information, check with your account manager. This guide focuses on how to use direct API integration to add Alipay and WeChat Pay as payment methods via our QR Code Payment solution. We provide information for both customer-presented mode (CPM) for in-store payments and merchant-presented mode (MPM) for online payments. For more information on integrating QR code payments, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/qr-codes-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Initiate payment Select the applicable tab to see the code sample(s) for this step. #### Alipay ### Alipay (CPM) The QR code is initiated by the merchant scanning the QR code from the customer and adding the payment code to the transaction request. #### Sample request ```json { "account_id": "TRA_a4ae6dedbaaf4e7eb059265244383157", "account_name": "apm_cp_ap", "channel": "CP", "type": "SALE", "amount": "100", "currency": "HKD", "reference": "1234567890", "country": "HK", "capture_mode": "AUTO", "merchant_category_code": "5411", "merchant_category": "OTHER", "payment_method": { "name": "John Doe", "entry_mode": "MANUAL", "apm": { "brand": "ALIPAY", "provider": "ALIPAY", "category": "E_WALLET", "payment_code_initiator": "PAYER", "payment_code": "******************", "seconds_to_expire": "3000" } }, "notifications": { "return_url": "https://en7kxokn8pci.x.pipedream.net/", "status_url": "https://en7kxokn8pci.x.pipedream.net/" }, "device": { "os": "ANDROID", "application_version": "123", "reference": "android-13.1", "ip_address": "123.1.1.8000", "terminal_id": "16818700" } } ``` #### Sample response ```json { "id": "TRN_bWWMB5iSHRz20240109144602638", "time_created": "2024-01-09T14:46:05.743Z", "type": "SALE", "status": "INITIATED", "channel": "CP", "capture_mode": "AUTO", "amount": "100", "currency": "HKD", "country": "HK", "merchant_id": "MER_fba638a644644c7ab1fb8c148289452d", "merchant_name": "product_production_test", "account_id": "TRA_a4ae6dedbaaf4e7eb059265244383157", "account_name": "apm_cp_ap", "reference": "1234567890", "payment_method": { "result": "S0000", "message": "Success", "entry_mode": "ECOM", "apm": { "provider": { "result": "SUCCESS", "brand": "ALIPAY", "action": "PAYMENT", "reference": "2024010922001430521442666661", "time_created_reference": "2024-01-09T14:46:05Z", "name": "Alipay", "merchant_identifier": "2088331349414590" }, "category": "E_WALLET", "seconds_to_expire": "3000" } }, "action": { "id": "ACT_QgLhUldPX5Q4h56MsTb7GA74C8mYtA", "type": "INITIATE", "time_created": "2024-01-09T14:46:05.743Z", "result_code": "SUCCESS", "app_id": "pwgpvp0ictNp99MEZebNLy2wSHgKZ1Hd", "app_name": "product_production_ap_apm" } } ``` ### Alipay (MPM) The dynamic QR code is generated by the merchant and presented to the customer. #### Sample request ```json { "account_id": "TRA_13355df5a2f14e6eb5d4f707058bd9ff", "channel": "CP", "type": "SALE", "amount": "1", "currency": "HKD", "reference": "{{reference}}", "country": "HK", "merchant_category":"HOTEL", "lodging":{ "date_checked_in":"2024-12-20", "time_checked_in": "15:04:05+07:00", "date_checked_out":"2024-12-25", "time_checked_out": "15:04:05+07:00", "establishment_name":"Hilton Hotel" }, "payment_method": { "name": "Doe", "entry_mode": "MANUAL", "apm": { "category":"E_WALLET", "brand":"alipay", "provider": "ALIPAY", "seconds_to_expire":"120", "payment_code_initiator":"MERCHANT" } }, "notifications": { "return_url": "https://example.com/Return", "status_url": "https://webhook-test.com/5739fe861cfab27e7ad5625fa02efbfa" } } ``` #### Sample response ```json { "id": "TRN_EWySvv2pgTR20241217150725503", "time_created": "2024-12-17T15:07:27.091Z", "type": "SALE", "status": "INITIATED", "channel": "CP", "capture_mode": "AUTO", "amount": "1", "currency": "HKD", "country": "HK", "merchant_id": "MER_3b208b95ae534523ac6a16848b42b58b", "merchant_name": "Nucleus UPA Singapore", "account_id": "TRA_13355df5a2f14e6eb5d4f707058bd9ff", "account_name": "SG_HK_HKD", "reference": "30904621", "payment_method": { "result": "S0000", "message": "Waiting for user to make payment", "entry_mode": "MANUAL", "apm": { "provider": { "result": "SUCCESS", "brand": "ALIPAY", "action": "PAYMENT", "time_created_reference": "2024-12-17T15:07:25Z", "name": "Alipay", "merchant_identifier": "2088021966388155" }, "category": "E_WALLET", "seconds_to_expire": "120", "next_action": "PRESENT_QR_CODE" }, "qr_code": "https://qr.alipay.com/bax00452f3czlend3iex550b" }, "action": { "id": "ACT_1qpGElmUjrvlmoNZqf4u5KINSf4cxH", "type": "INITIATE", "time_created": "2024-12-17T15:07:27.091Z", "result_code": "SUCCESS", "app_id": "rGS771UBnWyI899SJ0TmICkJqqjNCtMg", "app_name": "UPA_Singapore_7CC" } } ``` #### WeChat Pay ### WeChat Pay (CPM) The QR code is initiated by the merchant scanning the QR code from the customer and adding the payment code to the transaction request. #### Sample request ```json { "account_id": "TRA_a4ae6dedbaaf4e7eb059265244383157", "account_name": "apm_cp_ap", "channel": "CP", "type": "SALE", "amount": "100", "currency": "HKD", "reference": "1234567890", "country": "HK", "capture_mode": "AUTO", "merchant_category_code": "5411", "merchant_category": "OTHER", "payment_method": { "name": "John Doe", "entry_mode": "MANUAL", "apm": { "brand": "WECHAT", "provider": "WECHAT", "category": "E_WALLET", "payment_code_initiator": "PAYER", "payment_code": "******************", "seconds_to_expire": "3000" } }, "notifications": { "return_url": "https://en7kxokn8pci.x.pipedream.net/", "status_url": "https://en7kxokn8pci.x.pipedream.net/" }, "device": { "os": "ANDROID", "application_version": "123", "reference": "android-13.1", "ip_address": "123.1.1.8000", "terminal_id": "16818700" } } ``` #### Sample response ```json { "id": "TRN_bWWMB5iSHRz20240109144602638", "time_created": "2024-01-09T14:46:05.743Z", "type": "SALE", "status": "INITIATED", "channel": "CP", "capture_mode": "AUTO", "amount": "100", "currency": "HKD", "country": "HK", "merchant_id": "MER_fba638a644644c7ab1fb8c148289452d", "merchant_name": "product_production_test", "account_id": "TRA_a4ae6dedbaaf4e7eb059265244383157", "account_name": "apm_cp_ap", "reference": "1234567890", "payment_method": { "result": "S0000", "message": "Success", "entry_mode": "ECOM", "apm": { "provider": { "result": "SUCCESS", "brand": "WECHAT", "action": "PAYMENT", "reference": "2024010922001430521442666661", "time_created_reference": "2024-01-09T14:46:05Z", "name": "WeChat_Pay", "merchant_identifier": "2088331349414590" }, "category": "E_WALLET", "seconds_to_expire": "3000" } }, "action": { "id": "ACT_QgLhUldPX5Q4h56MsTb7GA74C8mYtA", "type": "INITIATE", "time_created": "2024-01-09T14:46:05.743Z", "result_code": "SUCCESS", "app_id": "pwgpvp0ictNp99MEZebNLy2wSHgKZ1Hd", "app_name": "product_production_ap_apm" } } ``` ## Step 2: Scan QR code, complete payment ### Alipay (MPM) Next, the customer scans the QR code on the screen, which will direct them to the Alipay mobile application. 1. The customer is directed to the Alipay Mobile app to complete payment. ![Alipay mobile app screen.](https://developer.globalpayments.com/gh-assets/qr-code_alipay-1-mobile.png) 2. The customer enters a secure PIN. ![Alipay mobile app screen to enter pin.](https://developer.globalpayments.com/gh-assets/qr-code_alipay-2-pin.png) 3. The payment is successful. ![Alipay success mobile app screen.](https://developer.globalpayments.com/gh-assets/qr-code_alipay-3-success.png) ## Step 3: Receive payment notification You can receive notifications to let you know when the QR code payment is complete. #### Sample response ```json { "id": "TRN_CbouI7GWlhP20241217151518821", "time_created": "2024-12-17T15:15:20.209Z", "type": "SALE", "channel": "CP", "status": "CAPTURED", "amount": "1", "initial_amount": "1", "currency": "HKD", "country": "HK", "merchant_id": "MER_3b208b95ae534523ac6a16848b42b58b", "merchant_name": "Nucleus UPA Singapore", "account_id": "TRA_13355df5a2f14e6eb5d4f707058bd9ff", "account_name": "SG_HK_HKD", "reference": "18818971", "payment_method": { "entry_mode": "MANUAL", "apm": { "provider": { "brand": "ALIPAY", "action": "PAYMENT", "reference": "2024121722001493131409351446", "time_created_reference": "2024-12-17T23:17:13+08:00", "name": "Alipay" }, "category": "E_WALLET" } }, "action": { "id": "ACT_TUSeJIcF96wa4RkfcYrTvKkDYcEOn9", "type": "STATUS_NOTIFICATION", "time_created": "2024-12-17T15:17:16.272Z", "result_code": "SUCCESS", "app_id": "rGS771UBnWyI899SJ0TmICkJqqjNCtMg", "app_name": "UPA_Singapore_7CC" } } ``` ## Refunds You can initiate refunds for Alipay and WeChat Pay transactions. #### Sample response ```json { "id": "TRN_lmwlKKWm0QY20241217151858471", "time_created": "2024-12-17T15:18:59.492Z", "type": "REFUND", "status": "PENDING", "amount": "1", "currency": "HKD", "country": "HK", "reference": "27144201", "payment_method": { "result": "S0000", "message": "Success", "apm": { "provider": { "brand": "ALIPAY", "status": "Received", "action": "REFUND", "reference": "2024121722001493131409351446", "time_created_reference": "2024-12-17T15:17:13Z", "name": "Alipay" }, "category": "E_WALLET" } }, "action": { "id": "ACT_NToG4wb4YuourzfLVMwmrWdMyE5e5n", "type": "REFUND", "time_created": "2024-12-17T15:18:59.492Z", "result_code": "PENDING", "app_id": "rGS771UBnWyI899SJ0TmICkJqqjNCtMg", "app_name": "UPA_Singapore_7CC" } } ``` ## Additional information This section contains additional QR code payment information: * [Key payment request fields](#key-payment-request-fields) * [QR wallet default time to expire](#qr-wallets-default-time-to-expire) ### Key payment request fields The following table provides the description, enums, and conditions for QR Code related fields. To see a particular field in the API Explorer, click its Field Name link in the first column. | Field Name | Description | Enums | Conditions | | ---- | ---- | ---- | ---- | | [payment_code_initiator](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_apm_payment_code_initiator) | Indicates who initiated the payment method code to execute the transaction. | **PAYER** The customer who is paying the merchant. **MERCHANT** The business who is providing goods or services to the payer. | If **PAYER**, the following field is mandatory: `payment_code` | | [entry_mode](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_payment_method_entry_mode) | Indicates how the payment method information was obtained by the merchant for this transaction. | **MOTO** **ECOM** **IN_APP** **CHIP** **SWIPE** **MANUAL** **PHONE** **MAIL** **CONTACTLESS_CHIP** **CONTACTLESS_SWIPE** **PRESENT** **IN_WALLET_WEB** **UNKNOWN** | | | [merchant_category](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request__merchant_category_code) | Indicates what industry the merchant belongs to. | **HOTEL** **AIRLINE** **RETAIL** **TOP_UP** **GAMING** **VOUCHER** **OTHER** | Mandatory for all Alipay transactions (in-store and online). Additional data points are required based on the merchant_category your business falls under. If your business category is not listed here, use **OTHER**. If **HOTEL**, the following fields are mandatory: `lodging.establishment_name` `lodging.date_checked_in` `lodging_date_checked_in` `lodging.time_checked_in` `lodging.date_checked_out` `lodging.time_checked_out` If **AIRLINE**, the following fields are mandatory: `airline.legs.flight\_number` `airline.legs.time\_of\_departure` If **RETAIL**, the following fields are mandatory: `order.items.label` `order.items.description` `order.item\_quantity` If **TOP\_UP**, the following field is mandatory: `order.items.description` If **GAMING**, the following field is mandatory: `order.items.description` If **VOUCHER**, the following field is mandatory: `order.items.description` | | [brand](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_apm_brand) | A string used to identify the payment method brand used for this transaction. | **ALIPAY** **WECHAT** **ALIPAYHK** | | | [provider](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_apm_provider) | A string used to identify the payment method provider used for this transaction. | **ALIPAY** **WECHAT** | | | [category](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_apm_category) | Indicates the category of the alternate payment method. | **E\_WALLET** | | | [payment\_code](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_apm_payment_code) | The payment code generated by the initiator for the transaction. | | | | [seconds\_to\_expire](https://developer.globalpayments.com/api/transactions.md#/transactions_post_request_apm_seconds_to_expire) | The time in seconds that the QR code or redirect URL is valid for. | | | ### QR Wallets default time to expire #### Alipay / Alipay HK The following table shows the default expiry times by the entry mode provided in the payment request for Alipay and Alipay HK. | Entry Mode | Max | Min | Default | | :---- | ----- | ----- | ----- | | ECOM | 30 days | 0\* | 12 hours | | PHONE | 15 days | 1 minute | 12 hours | | IN\_WALLET\_WEB | 15 days | 1 minute | 12 hours | | IN\_APP | 15 days | 1 minute | 12 hours | \* Alipay suggests setting the minimum value at 5 minutes. #### WeChat Pay The following table shows the default expiry times by the entry mode provided in the payment request for WeChat Pay. | Entry Mode | Max | Min | Default | | :---- | ----- | ----- | ----- | | ECOM | 2 hours | 1 minute | 2 hours | | PHONE | 2 hours | 5 minutes | 2 hours | | IN\_WALLET\_WEB | 2 hours | 1 minute | 2 hours | | IN\_APP | 2 hours | 1 minute | 2 hours | ## Testing Our QR Code Payments solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Explore more functionality to enrich your application or website. For the detailed API specification and a full list of features, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [API/transactions](https://developer.globalpayments.com/api/transactions.md) See the full specification for transferring funds. ### [Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md) Let customers pay securely with just a scan, tap, or click. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) Learn how to integrate and display other payment methods. # Open Banking - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/open-banking-overview.md Section: Payments Description: Allow customers to pay using their bank account > We currently support Open Banking transactions in GBP and EUR currencies. The full list of EUR countries supported by our Open Banking partner [Token.io](http://token.io/) can be found on their [coverage page](https://token.io/coverage). With our Open Banking solution, merchants can allow customers to pay for goods and services directly from their bank account. For example, customers can authorize a third party to make payments from their bank account on their behalf. You can easily add Open Banking to a new or existing integration, including with our hosted solutions. For merchants, the benefits of Open Banking include: * No card brand or interchange fees * Faster settlement — obtain funds in real time * No chargebacks * No customer onboarding or registration required * Faster allocation of incoming funds * Better screening, fewer false declines, and higher success rates — by leveraging bank authentication ## Use cases In this section, we present some “real world” examples that can be enabled through our Bank Payment service for Open Banking. Keep in mind that this section doesn’t cover all of the use cases. ##### Use Case #1: Invoicing software An invoice software platform wants to allow its merchants to enable Bank Payments as a payment option so that they get paid faster. In addition, the platform wants to reduce the processing fees associated with traditional card payments. Another advantage for the platform’s merchants is that with the in-app payment flow, they can settle invoices in just a few clicks. ##### Use Case #2: Wallet or account top-up A digital wallet provider wants to allow their customers to top up their wallet, or a customer wants to top up an investment account. Bank Payment can be used as an alternative to card top-ups so the digital wallet provider or investment company pays less in processing fees. ##### Use Case #3: High-ticket items Car dealerships and jewelry shops often deal with significant transaction values. The instant settlement of funds that comes with using Bank Payment would give these merchants of high-ticket items the confidence to release the product knowing the funds were received and that there can’t be a fraudulent chargeback. ##### Use Case #4: Regular money movement A financial institution wants to make the moving of money and the repayments of credit card balances easier and cheaper than card payments since these activities are the core of their business, so it uses Bank Payment instead. It’s also a better option than paying with bank transfers, personal checks, and cash—all of which can be prone to error, come with significant overhead costs, or involve an inconsistent and time-consuming reconciliation process. ##### Use Case #5: Monthly utility bills A utility company wants a better process for collecting payment for their services regularly. Traditional ways of paying like direct debit and bank transfers require a higher operational cost (for example, fraud compliance) and longer settlement times, not to mention tedious data entry for the customer — which can lead to increased drop-off rates and even missed payments. So, instead, the company leverages Bank Payment to give customers an easy way to pay online, on invoices, or via QR codes, including form fields that are pre-filled with the customer’s bank details. Customers can also pay multiple bills in bulk or top up their accounts to pay off balances. ## What is Open Banking? Open Banking is the process through which banks allow third-party financial service companies to access a customer's financial data via APIs (with the customer’s permission). To facilitate Open Banking purchases on merchant ecommerce sites, we built a service called _Bank Payment_ in collaboration with our technology partner, Token.io (Token). Token serves as an intermediary and has an API integration with participating banks. This API is called when a customer using Bank Payment is redirected to their bank for authentication. For our hosted solutions, Bank Payment appears as another payment option alongside non-card payment methods like PayPal or local payment methods. Bank Payment transactions display in Merchant Portal reporting with a Bank Payment icon in the Payment Method column. ![Bank payment icon](https://developer.globalpayments.com/sites/default/files/2022-05/bank-payment-logo.png) **Bank Payment Icon** ### Settlement options Open Banking transactions allow the funds to transfer directly from a customer’s account into your account (_Direct Settlement_). This gives fast access to the money but may be difficult for reconciliation of every individual transaction on your bank statement and funds arriving throughout the day. To overcome this issue, we offer a managed service (_Managed Settlement_) where we collect the funds on your behalf throughout the day and then make a batch settlement (the same as for card transactions). Reporting and reconciliation tools are available in our Merchant Portal. #### Direct Settlement For Direct Settlement, you can either store the bank account details in your account or pass them through in the payment request. You may want to use different accounts for receiving funds in different currencies—for example, one for British pounds (GBP) and another for euro (EUR) transactions. If you have the bank account details stored with us, you can choose to supersede this on a transaction-by-transaction basis by supplying the details in the request. > If you’re using an HSBC Payment Initiation Service Provider (PISP), the beneficiary accounts must be an HSBC account and must be stored by us. Also, the accounts must be allowlisted and can’t be sent in the request. You’ll need to submit these accounts to us during boarding so we can allowlist them. #### Managed Settlement Receiving bank account information (that is, beneficiary account) is not required in the payment request. We will append our own beneficiary account details to the transaction request before it’s sent to the bank for the customer to authenticate and confirm the payment. ### Currency selection Where possible, a customer should be able to select the currency that they want to pay in. Many banks use the SWIFT network to route cross-border and trans-currency payments. However, this can trigger significant transaction fees, which can lead to a poor user experience and less ongoing conversion. You can initiate cross-border payments with our Open Banking solution. However, there is a lack of consistency in how this works across the banks that our technology partner Token provides connectivity to. Your incorporation location as a merchant is not important when collecting cross-border payments via Open Banking, but the beneficiary accounts you use are. These accounts dictate the currency and payment method types (Single Euro Payments Area [SEPA] or Faster Payments) that can be received and used. * For payments in euros, use a euro-denominated beneficiary account at an institution that is connected to the SEPA network. * For payments in British pounds, use a GBP-denominated beneficiary account at an institution that is connected to the Faster Payments network. ## How does it work? The Open Banking transaction is initiated when the customer selects the Bank Payment button as the payment method. The customer is then redirected to Token’s Bank Payment web app to find their bank. Once their bank account is selected, the customer accepts the bank’s terms and conditions (T&Cs). The customer is then redirected to the bank’s website or mobile app where they can log in and confirm the payment. They are then redirected to your Return URL where you can hold them temporarily until you call and receive the final status of the transaction. In the following sections, we provide more details for each of these steps. ### Redirect the customer to bank selection After initiating the Open Banking transaction, the customer is redirected to the Bank Payment web app to select their bank, which is hosted by our technology partner Token. The customer is presented with a list of supported banks based on the country and the currency of the transaction. After selecting their bank, the customer then confirms the payment details and continues to the bank’s T&Cs page. ![](https://developer.globalpayments.com/sites/default/files/2024-05/redirect-customer_cropped.png) **Bank Selection and Payment Details Screens** ### Customer accepts T&Cs After the customer selects the bank they want to use to pay, they will need to accept the T&Cs of the Open Banking transaction. These terms are governed by the PISP—that is, the regulated entity that is authorized by the Financial Conduct Authority, or equivalent authority, to provide Open Banking services. This is a required step in Open Banking so that the customer is fully aware of the conditions of the transaction. Either we or our partners Token or HSBC UK will serve as the PISP. It depends on the settings agreed to and configured when you set up Open Banking with us. ![Terms and conditions screen](https://developer.globalpayments.com/sites/default/files/2024-05/%20customer-accepts-terms-cropped.png) **Terms and Conditions Screen** ### Customer is redirected to their bank At the next step, the customer is redirected to their bank to log in and confirm the payment. If they are transacting on a mobile device that has their bank app installed, they will be prompted to use the app (_Decoupled Model_); otherwise, they will be redirected to a web app (_Redirect Model_) hosted and controlled by the bank. The customer will log in using their online or mobile banking credentials (this may include multi-factor authentication if required by their bank). They will then see all the transaction details (including amount, payee, and remittance reference) automatically populated. The customer simply selects the account they want to pay from and confirms the transaction. #### Decoupled Model ![Decoupled model for open banking on a mobile device app.](https://developer.globalpayments.com/sites/default/files/2023-01/Model-Decoupled.png) **Open Banking - Decoupled Model (Mobile Device App)** #### Redirect Model ![Redirect model for open banking on a web app.](https://developer.globalpayments.com/sites/default/files/2023-01/Model-Redirect.png) **Open Banking - Redirect Model (Web App)** ### Customer is redirected back to the merchant Before the customer is redirected back to your website, they will be presented with the Payment Confirmation screen. This is another required step in Open Banking so the customer is fully aware of the conditions of the transaction. At this point, the customer is shown four potential outcomes: * Success * Submitted * Technical Error * Unsuccessful After 10 seconds, the customer will then be able to click Return to Merchant where they will see their final confirmation and summary. #### Payment confirmation ![Payment Status Potential Outcomes.](https://developer.globalpayments.com/sites/default/files/2024-05/Pay-Confirmation_cropped.png) **Payment Status Potential Outcomes** ### Receive the customer back to your app The browser will be redirected back to the Return URL (`return_url`) that you specify. The redirection includes the Open Banking Transaction ID (`&id`) as a URL parameter. At this point, you’ll need to hold the customer temporarily while you query the final status of the transaction. To query the transaction, do a GET call to get the status of the transaction. Depending on the status that is returned, there may be a subsequent webhook notification sent to the `status_url` you provided. The following table shows a few examples of when an additional webhook could be sent, but doesn’t list them all. | Status | Additional Webhook | Reason | | -------- | ------- | ------- | | SUCCESS/CAPTURED | No | Transaction is complete. | | SUBMITTED/PENDING | Yes | Original transaction was not fully complete at the time, and the bank needs to send a subsequent notification of the result. We recommend using caution when shipping goods or releasing funds before a SUCCESS status is given by the asynchronous webhook. | | DECLINED/ERROR | No | Transaction has ended. | ## Next steps To get familiar with how Open Banking works, see our [guide](https://developer.globalpayments.com/docs/payments/payment-methods/open-banking-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Open Banking - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/open-banking-guide.md Section: Payments Description: Learn how to let customers pay using their bank account #### API In this guide, you’ll learn how to process a transaction with the Bank Payment payment method via direct API integration or Hosted Fields using our Open Banking infrastructure. For more information about Open Banking, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/open-banking-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Initiate the payment First, we submit a mandatory request to initiate an Open Banking transaction. It needs to include the transaction’s core parameters so that we have enough information to create the payment with our technology partner and the customer’s bank. A successful transaction request will return a unique transaction identifier `TRN_ID` and a redirect URL, which you’ll use to facilitate the customer confirmation of the transaction [Step 2](#step-2-redirect-the-customer). At a high level, initiating an Open Banking transaction works like this: ![Diagram flow between the customer, merchant, and our API to initiate an Open Banking transaction](https://developer.globalpayments.com/gh-assets/open-banking_flow1.png) The first step is to create a transaction using the Initiate call. This will specify the amount, currency, and data elements needed to process an Open Banking transaction. Where the payment.scheme is FASTER PAYMENTS, the available `payment_method` fields (the destination bank account fields) will be: * payment_method.bank_transfer.account_number * payment_method.bank_transfer.bank.code * payment_method.bank_transfer.bank.name Where the `payment.scheme` is SEPA, the available `payment.destination` fields will be: * `payment_method.bank_transfer.iban` * `name` #### Sample request ```json { "merchant_id":"MER_43d5c7b98fe44d8c80d915c6422e83ee", "account_id":"TRA_956309a58ea14d75839ca8b1cfa48ff4", "channel":"CNP", "amount":"10000", "type":"SALE", "currency":"GBP", "reference":"becf9f3e-4d33-459c-8ed2-0c4affc9555e", "country":"GB", "payment_method":{ "name":"Jane Doe", "entry_mode":"ECOM", "apm":{ "provider":"OPEN_BANKING" "countries": [ "GB", "IE" ] }, "bank_transfer":{ "account_number": "99999999", "bank": { "code": "407777", "name": "Merchant Name" }, "remittance_reference":{ "type":"TEXT", "value":"Product Name" } } }, "notifications":{ "return_url":"https://www.example.com/return", "status_url":"https://www.example.com/status/" } } ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("APP_ID"); config.setAppKey("APP_KEY"); config.setChannel(Channel.CardNotPresent); config.setCountry("GB"); ServicesContainer.configureService(config); BankPayment bankPayment = new BankPayment(); bankPayment.setAccountNumber("99999999"); bankPayment.setSortCode("407777"); bankPayment.setAccountName("Merchant Name"); List countryList = new ArrayList<>(); countryList.add("GB"); countryList.add("IE"); bankPayment.setCountries(countryList); bankPayment.setReturnUrl("https://www.example.com/return"); bankPayment.setStatusUpdateUrl("https://www.example.com/status"); Transaction response = null; try { response = bankPayment.charge(new BigDecimal(100)) .withCurrency("GBP") .withRemittanceReference(RemittanceReferenceType.TEXT, "Product Name") .execute(); } catch (GatewayException ex) { // TODO: Add your exception handling here } String responseCode = response.getResponseCode(); // SUCCESS String trnStatus = response.getResponseMessage(); // INITIATED String trnId = response.getTransactionId(); String redirectUrl = response.getBankPaymentResponse().getRedirectUrl(); ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "APP_ID"; config.AppKey = "APP_KEY"; config.Channel = Channel.CardNotPresent; config.Country = "GB"; ServicesContainer.ConfigureService(config); BankPayment bankPayment = new BankPayment(); bankPayment.AccountNumber = "99999999"; bankPayment.SortCode = "407777"; bankPayment.AccountName = "Merchant Name"; bankPayment.Countries = new List() {"GB", "IE"}; bankPayment.ReturnUrl = "https://www.example.com/return"; bankPayment.StatusUpdateUrl = "https://www.example.com/status"; try { var response = bankPayment.Charge(100) .WithCurrency("GBP") .WithRemittanceReference(RemittanceReferenceType.TEXT, "Product Name") .Execute(); var responseCode = response.ResponseCode; // SUCCESS var trnStatus = response.ResponseMessage; // INITIATED var trnId = response.TransactionId; var redirectUrl = response.BankPaymentResponse.RedirectUrl; } catch (GatewayException ex){ // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'APP_ID'; $config->appKey = 'APP_KEY'; $config->channel = Channel::CardNotPresent; $config->country = 'GB'; ServicesContainer::configureService($config); $bankPayment = new BankPayment(); $bankPayment->accountNumber = '99999999'; $bankPayment->sortCode = '407777'; $bankPayment->accountName = 'Merchant Name'; $bankPayment->countries = ['GB', 'IE']; $bankPayment->returnUrl = 'https://www.example.com/return'; $bankPayment->statusUpdateUrl = 'https://www.example.com/status'; try { $response = $bankPayment->charge(100) ->withCurrency('GBP') ->withRemittanceReference(RemittanceReferenceType::TEXT, 'Product Name') ->execute(); } catch (GatewayException $ex){ // TODO: Add your exception handling here } $responseCode = $response->responseCode; // SUCCESS $trnStatus = $response->responseMessage; // INITIATED $trnId = $response->transactionId; $redirectUrl = $response->bankPaymentResponse->redirectUrl; ``` #### Request syntax | Name | Format | Type | Description | | -------- | ------- | ------- | ------- | | channel | string | M | Describes whether the transaction was processed in a customer present (CP) or customer not present (CNP) scenario. Must always be CNP for Open Banking. | | type | string | M | Describes whether the transaction is a SALE or REFUND. **SALE** indicates the movement of funds (or attempt to) from payer to merchant. **REFUND** indicates the movement of funds (or attempt to) from merchant to payer. | | reference | string | O | Information that some banks may record and display on the account of the customer or merchant. | | **payment_method** | | | | | name | string | M | Name of the payer. | | **bank_transfer** | | | | | account_number | string | C | Number of the destination account where the funds will be transferred to. Optional for Direct Settlement transactions (if not saved during boarding with us) and if the method type is FASTERPAYMENTS. | | bank.code | string | C | Sort code of the destination account. Optional for Direct Settlement transactions (if not saved during boarding with us) and if the method type is FASTERPAYMENTS. | | iban | string | C | International Bank Account Number (IBAN) of the destination account. Optional for Direct Settlement transactions (if not saved during boarding with us ) and if the method type is SEPA. | | **remittance_reference** | | | | | type | string | M | Type of remittance reference. Allowed values: TEXT | | value | string | M | If type is TEXT: a description for the transaction. Most banks will record and display this reference on the customer’s account. For Direct Settlement, it will also show on the customer’s bank statement when the funds are received. If type is PAN: allows the cardholder’s Primary Account Number (PAN) to be securely passed depending on the merchant use case. | | **bank** | | | | | name | string | M | Name of the merchant. Underscore character [ _ ] not permitted. Spaces are allowed, and acceptable special characters are -. ,'’‘`()*&@/. | | **apm** | | | | | provider | string  | M | Used to identify the payment method provider being used to execute this transaction. For example: OPEN_BANKING | | countries | array | O | The countries’ banks that are displayed to the payer. | | **notifications** | | | | | return_url | string | M | URL to return the customer’s browser to once the transaction is complete. | | status_url | string | O | Webhook URL that an asynchronous webhook will be sent to by some banks after the initial transaction is carried out to update the status of the transaction. | ## Step 2: Redirect the customer Once the transaction is initiated, the customer must be redirected to the Open Banking checkout flow using the URL returned in the Initiate response to facilitate authorization and authentication. To do this, use a simple JavaScript redirect or HTTP GET (302 redirect). At a high level, redirecting the customer works like this: ![Diagram flow between the customer, merchant, and our API to redirect the customer](https://developer.globalpayments.com/gh-assets/open-banking_flow2.png) In our example, we redirect the customer to the URL returned in the Initiate response using JavaScript. ```xml window.location = "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_IDhttps://apis.globalpay.com/ucp/postback/transactions/TRN_CJtYAlPtbhbikIfcZCNTy3CVCBwfUK_sdgpoh123456/redirect/eyJtbWEiOm51bGwsIm1pZCI6Ik1FUl80M2Q1YzdiOThmZTQ0ZDhjODBkOTE1YzY0MjJlODNlZSIsInhnIjoiMjAyMS0wMy0yMiJ9"; ``` ## Step 3: Handle the redirect and check the status Once the customer completes the transaction with the Open Banking provider, they are redirected back to your app or website based on transaction success/failure using the Return URL specified in the Initiate request. The unique transaction identifier is also returned as part of the parameters in the URL. You should use this to check the status of the payment (see [Step 4](#step-4-get-transaction-status)). The ID that is passed as a URL parameter is the `TRN_ID` and should be used to check the status of the transaction (see example below). #### Sample Return URL parameters ```xml https://www.example.com/return?X-GP-Signature=399af8063773573040b3d1e76ccf313ed40491e61b3fe768390d7a1da925506c3908405f17be8fb82b978ab4790f76cdeb7b292b48dce716903c36eab57580a9&id=TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456&payer_reference=asdgpoh123456&action_type=REDIRECT_FROM&action_id=ACT_J8pXg8cjUuOltUHovOAGpqUooy7XZD ``` #### Checking the signature The Return URL contains a signature made up of the key transaction fields. This includes the Transaction ID (`TRN_ID`), Payer Reference, Action Type, and Action ID. Your application must construct and check the signature to ensure the response wasn’t tampered with. To construct the signature, take the string containing the above fields from the Return URL, excluding the signature itself. ``` id=TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456&payer_reference=asdgpoh123456&action_type=REDIRECT_FROM&action_id=ACT_J8pXg8cjUuOltUHovOAGpqUooy7XZD ``` Concatenate your app key to the end of this string. ``` id=TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456&payer_reference=asdgpoh123456&action_type=REDIRECT_FROM&action_id=ACT_J8pXg8cjUuOltUHovOAGpqUooy7XZD.app_key ``` The signature should be a Sha512 hash of the concatenated string. For example: ``` 399af8063773573040b3d1e76ccf313ed40491e61b3fe768390d7a1da925506c3908405f17be8fb82b978ab4790f76cdeb7b292b48dce716903c36eab57580a9 ``` ## Step 4: Get transaction status In this step, we get the transaction details and receive the webhook notification. As mentioned previously, the `TRN_ID` field should be used to check the status of the transaction. At a high level, getting the transaction status works like this: ![Diagram flow between the customer, merchant, and our API to get the transaction status.](https://developer.globalpayments.com/gh-assets/open-banking_flow3.png) #### Sample request The following sample is for the GET request. ``` curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer pJ2An7thGclc8UUVZSntPRmsAUrR' \ ``` ``` GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); // config.setAppId("APP_ID"); config.setAppKey(APP_KEY); // config.setAppKey("APP_KEY"); config.setChannel(Channel.CardNotPresent); ServicesContainer.configureService(config); // the id of the transaction to fetch its details String transactionId = "TRN_2mz2U86WWSEWSgV5HUN25LrzpbdBIU_a2417fd45ea4"; TransactionSummary response = null; try { response = ReportingService.transactionDetail(transactionId) .execute(); } catch (GatewayException ex) { // TODO: Add your exception handling here } transactionId = response.getTransactionId(); String trnStatus = response.getTransactionStatus(); DateTime trnDate = response.getTransactionDate(); String trnType = response.getTransactionType(); BigDecimal trnAmount = response.getAmount(); String trnCurrency = response.getCurrency(); String sortCode = response.getBankPaymentResponse().getSortCode(); String accountNumberLast4 = response.getAccountNumberLast4(); ``` ``` GpApiConfig config = new GpApiConfig(); config.AppId = "APP_ID"; config.AppKey = "APP_KEY"; config.Channel = Channel.CardNotPresent; ServicesContainer.ConfigureService(config); var transactionId = "TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456"; try { var response = ReportingService.TransactionDetail(transactionId) .Execute(); var transId = response.TransactionId; var trnStatus = response.TransactionStatus; var trnDate = response.TransactionDate; var trnType = response.TransactionType; var trnAmount = response.Amount; var trnCurrency = response.Currency; var sortCode = response.BankPaymentResponse.SortCode; var accountNumberLast4 = response.AccountNumberLast4; } catch (GatewayException ex){ // TODO: Add your exception handling here } ``` ``` $config = new GpApiConfig(); $config->appId = 'APP_ID'; $config->appKey = 'APP_KEY'; $config->channel = Channel::CardNotPresent; ServicesContainer::configureService($config); $transactionId = 'TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456'; try { $response = ReportingService::transactionDetail($transactionId) ->execute(); } catch (GatewayException $ex){ // TODO: Add your exception handling here } $transactionId = $response->transactionId; $trnStatus = $response->transactionStatus; $trnDate = $response->transactionDate->format("d/m/Y H:i:s"); $trnType = $response->transactionType; $trnAmount = $response->amount; $trnCurrency = $response->currency; $sortCode = $response->bankPaymentResponse->sortCode; $accountNumberLast4 = $response->accountNumberLast4; ``` ## **Step 5: Refund a Transaction** Once a transaction is captured and the funds are deducted from the customer’s account, you can refund the full or partial amount back to them. When using Open Banking, refunds can only be used if you are using Managed Settlement as your settlement option. To initiate a refund, you must use the `TRN\_ID` ( `TRN\_U5cRgH1nfubpsDSlrM67iz8hNj7cF9\_sdgpoh` ) from the initial transaction. A refund can be full or partial (up to 100% of the initial transaction amount). Refund transactions appear as “BANK PAYMENT REFUND” on the customer’s bank account statement. Refund transactions will generate a new `TRN\_ID` ( `TRN\_k0ljUGPtITG0dN4gfAh4Qh86hRYMtj\_sdgpoh` ). ### Request ``` curl --location --request POST 'https://{}/ucp/transactions/{}/refund' \ --header 'Accept: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer pJ2An7thGclc8UUVZSntPRmsAUrR' --header 'Content-Type: application/json' \ ``` ### Response ``` id": "TRN_k0ljUGPtITG0dN4gfAh4Qh86hRYMtj_sdgpoh", "time_created": "2024-10-03T10:33:52.003Z", "type": "REFUND", "status": "CAPTURED", "amount": "1999", "currency": "GBP", "country": "GB", "reference": "sdgpoh", "payment_method": { "message": "INITIATION_PROCESSING", "apm": { "provider": "open_banking, "bank_transfer": bank": {} } }, "action": { "id": "ACT_k0ljUGPtITG0dN4gfAh4Qh86hRYMtj", "type": "REFUND", "time_created": "2024-10-03T10:33:52.003Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test } ``` ## **Step 6: Get Refund Status** Refunds are usually successful and are given `CAPTURED` as the status in the response. Sometimes `PENDING` is returned indicating that the bank is carrying out some additional checks before refunding the funds. If this happens, we recommend that you send a Get transaction status request using the `trn\_id` generated in the response as outlined in step 4 above. ### Request ### Request ``` curl --location --request GET 'https://{}/ucp/transactions/TRN_k0ljUGPtITG0dN4gfAh4Qh86hRYMtj_sdgpoh’ \ --header 'Accept: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer pJ2An7thGclc8UUVZSntPRmsAUrR' --header 'Content-Type: application/json' \ ``` ### Response ``` id": "TRN_qkDsyzid0HciYULvwLuSB6AAIomxqz_99977641", "time_created": "2025-03-28T11:24:19.982Z", "time_last_updated": "2025-03-28T11:24:19.982Z", "status": "CAPTURED", "type": "REFUND", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "TRA_55cf70132893425c9e950b7254ca0a64", "account_name": "transaction_processing_ob", "channel": "CNP", "amount": "", "merchant_amount": "", "partner_amount": "", "gratuity_amount": "", "surcharge_amount": "", "surcharge_type": "", "currency": "GBP", "reference": "99977641", "description": "", "order_reference": "", "order": { "reference": ", "time_created_reference": "", "batch_id": "", "initiator": "", "country": "GB", "language": "", "ip_address": "165.225.199.17", "site_reference": "", "payment_method": result": "", "message": "INITIATION_FAILED", "entry_mode": "ECOM", "name": "Jane Doe", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_W7P6Laro8zZDcWEfoL4wAazsN8q2rf_99977641/redirect/eyJtbWEiOm51bGwsIm1pZCI6Ik1FUl9jNWQzN2VhZjBlMzg0MWUwODNjMjMyYjIzMThhZjU1YyIsInhnIjoiMjAyMS0wMy0yMiJ9", "apm": { "provider": "open_banking", "countries": [ "GB" ] }, "bank_transfer": { "remittance_reference": { "type": "TEXT", "value": "Nike Bounce Shoes } }, "installment": id": "", "program": "", "terms": { "id": "", "time_unit": "", "time_unit_number": "", "interest_rate": "", "first_amount": "", "subsequent_amount": "", "last_amount": "", "total_amount": "", "reference": "", "mode": "", "total_time_unit_count": "", "time_unit_amount": "", "currency": "", "description": "", "expiration_date": "", "expiration_interest_rate": "", "terms_and_conditions_url": ", "mode": "", "count": "", "grace_period_count": "" }, "action_create_id": "ACT_qkDsyzid0HciYULvwLuSB6AAIomxqz", "parent_resource_id": "TRN_W7P6Laro8zZDcWEfoL4wAazsN8q2rf_99977641", "system": mid": "123456789", "tid": "0149210014212599819744106286698950319218", "name": "ecomtest1, "action": id": "ACT_akm3Mb8ud6S6voi2K7a1ZHRJ1gfFTx", "type": "TRANSACTION_SINGLE", "time_created": "2024-10-03T11:24:35.730Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test } ``` ## Testing Open Banking Our Open Banking solution is available for testing in our Sandbox environment for registered users of this developer portal. For Open Banking, we provide "test banks" instead of test cards. Each one provides a different outcome. For more information, see the [Open Banking](https://developer.globalpayments.com/resources/test-cards.md#open-banking) section of our Test Cards article. This guide focuses on integrating Open Banking with our Drop-In User Interface (UI), which is a ready-made payment form using our Hosted Fields solution. You’ll learn how to add Open Banking to your payment form using our JavaScript Library. To learn how to use the Hosted Fields components on their own with your existing payment form, see our [Hosted Fields Guide](https://developer.globalpayments.com/docs/payments/online/hosted-fields-guide.md). For more information about Open Banking, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/open-banking-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Configure with Open Banking Once you’ve created the access token, you can now configure the JavaScript Library to enable Open Banking in your payment form. Add a `
` tag to render the Drop-In UI payment form to the customer. ``` ```

Next, we configure our JavaScript Library with the transaction details required for Open Banking. ``` GlobalPayments.configure({ accessToken: "accessToken", env: "sandbox", apiVersion: "2021-03-22", language: "en", account: "accountId", apms: { currencyCode: "GBP", countryCode: "GB", nonCardPayments: { allowedPaymentMethods: [{ provider: GlobalPayments.enums.ApmProviders.OpenBanking, }] } }, }); const cardForm = GlobalPayments.creditCard.form( '#credit-card-form', { amount: "800", style: "gp-default", apms: [ GlobalPayments.enums.Apm.OpenBankingPayment], } ); cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const = paymentProviderData; console.log('Selected provider: ' + provider); if (provider === GlobalPayments.enums.ApmProviders.OpenBanking) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "https://fluentlenium.com/", } }); window.dispatchEvent(merchantCustomEventProvideDetails); } }); ```





**

Drop-In UI with Open Banking button

**

#### JavaScript configuration (Open Banking specific parameters) *Type* indicates whether the element is Mandatory (M), Optional (O), or Conditional (C)—dependent on another field or regional requirement. | Name | Format | Type | Description | | -------- | -------- | -------- | -------- | | currencyCode | string | M | Currency of the amount in ISO-4217 (alpha-3). | | countryCode | string | M | The country in ISO-3166-1(alpha-2 code) format. | | provider | string | M | The string used to identify the payment method provider being used to execute this transaction. | ## Step 2: Capture customer selection Now that we have configured Open Banking and it's displayed on the Drop-In UI, when a customer selects Open Banking as the payment method, the Drop-In UI returns this selection in an event. For example, the Drop-In UI returns: _Selected provider: OpenBanking_. Below is the code snippet of how the Drop-In UI returns this event. ``` cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const = paymentProviderData; console.log('Selected provider: ' + provider); ... //continued in Step 4 - Redirect customer to Open Banking ``` ## Step 3: Initiate the Open Banking transaction Now that we know what payment method the customer has selected, we can initiate the payment to complete the transaction. First, we submit a mandatory request to initiate an Open Banking transaction. It needs to include the transaction’s core parameters so that we have enough information to create the payment with our technology partner and the customer’s bank. A successful transaction request returns a unique transaction identifier (`TRN_ID`) and a redirect URL, which you’ll use to facilitate the customer confirmation of the transaction ([Step 4](#step-4-redirect-customer-to-open-banking)). #### Sample request ``` merchant_id":"MER_43d5c7b98fe44d8c80d915c6422e83ee", "account_id":"TRA_956309a58ea14d75839ca8b1cfa48ff4", "channel":"CNP", "amount":"10000", "type":"SALE", "currency":"GBP", "reference":"becf9f3e-4d33-459c-8ed2-0c4affc9555e", "country":"GB", "payment_method":{ "name":"Jane Doe", "entry_mode":"ECOM", "apm":{ "provider":"OPEN_BANKING" "countries": [ "GB", "IE" ] }, "bank_transfer":{ "account_number": "99999999", "bank": { "code": "407777", "name": "Merchant Name, "remittance_reference":type":"TEXT", "value":"Product Name } }, "notifications":return_url":"https://www.example.com/return", "status_url":"https://www.example.com/status/ } ``` ``` GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); config.setCountry("GB"); ServicesContainer.configureService(config); BankPayment bankPayment = new BankPayment(); bankPayment.setAccountNumber("99999999"); bankPayment.setSortCode("407777"); bankPayment.setAccountName("Merchant Name"); bankPayment.setCountries(Arrays.asList("GB", "IE")); bankPayment.setReturnUrl("https://www.example.com/return"); bankPayment.setStatusUpdateUrl("https://www.example.com/status"); try { Transaction response = bankPayment.charge(new BigDecimal("100")) .withCurrency("GBP") .withRemittanceReference(RemittanceReferenceType.TEXT, "Product Name") .execute(); BankPaymentResponse bankPaymentResponse = response.getBankPaymentResponse(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // capture_mode == "MULTIPLE" boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->redirect_url" String redirectUrl = bankPaymentResponse.getRedirectUrl(); // API raw response key "payment_method->message" String paymentStatus = bankPaymentResponse.getPaymentStatus(); // API raw response key "payment_method->bank_transfer->bank->code" String sortCode = bankPaymentResponse.getSortCode(); // API raw response key "payment_method->bank_transfer->bank->name" String accountName = bankPaymentResponse.getAccountName(); // API raw response key "payment_method->bank_transfer->masked_account_number_last4" } catch (ApiException e) { // TODO: Add your exception handling here } ``` ``` GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST, Country = "GB", }; ServicesContainer.ConfigureService(config); BankPayment bankPayment = new BankPayment { AccountNumber = "99999999", SortCode = "407777", AccountName = "Merchant Name", Countries = new List() GB", "IE, ReturnUrl = "https://www.example.com/return", StatusUpdateUrl = "https://www.example.com/status" }; try { Transaction response = bankPayment.Charge(100m) .WithCurrency("GBP") .WithRemittanceReference(RemittanceReferenceType.TEXT, "Product Name") .Execute(); // API raw response key "id" var id = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; // capture_mode === 'MULTIPLE' var multiCapture = response.MultiCapture; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; //API raw response key "payment_method->redirect_url" var redirectUrl = response.BankPaymentResponse.RedirectUrl; //API raw response key "payment_method->message" var paymentStatus = response.BankPaymentResponse.PaymentStatus; //API raw response key "payment_method->bank_transfer->bank->code" var sortCode = response.BankPaymentResponse.SortCode; //API raw response key "payment_method->bank_transfer->bank->name" var accountName = response.BankPaymentResponse.AccountName; } catch (GatewayException ex) { Console.WriteLine(ex); throw; } ``` ``` $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->country = 'GB'; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $bankPayment = new BankPayment(); $bankPayment->accountNumber = '99999999'; $bankPayment->sortCode = '407777'; $bankPayment->accountName = 'Merchant Name'; $bankPayment->countries = ['GB', 'IE']; $bankPayment->returnUrl = 'https://www.example.com/return'; $bankPayment->statusUpdateUrl = 'https://www.example.com/status/'; try { /** @var \GlobalPayments\Api\Entities\Transaction $response */ $response = $bankPayment->charge(100) ->withCurrency('GBP') ->withRemittanceReference(RemittanceReferenceType::TEXT, 'Product Name') ->execute(); } catch (GatewayException $ex) { // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" // API raw response key "action->result_code" $responseCode = $response->responseCode; $trnStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" //API raw response key "payment_method->redirect_url" $redirectUrl = $response->bankPaymentResponse->redirectUrl; //API raw response key "payment_method->message" $paymentStatus = $response->bankPaymentResponse->paymentStatus; //API raw response key "payment_method->bank_transfer->bank->code" $sortCode = $response->bankPaymentResponse->sortCode; //API raw response key "payment_method->bank_transfer->bank->name" $accountName = $response->bankPaymentResponse->accountName; //API raw response key "payment_method->bank_transfer->masked_account_number_last4" $accountNumberLast4 = $response->accountNumberLast4; ``` #### Sample response ``` id": "TRN_1NwUgkvbEcNUJhymCk96ON9HDu0HkY_sdgpoh123456", "time_created": "2023-07-13T16:17:55.251Z", "type": "SALE", "status": "INITIATED", "channel": "CNP", "capture_mode": "AUTO", "amount": "10000", "currency": "GBP", "country": "GB", "merchant_id": "MER_461194d8057842708ca360e252da8270", "merchant_name": "QA_Sandbox_Merchant_02", "account_id": "TRA_08e5bac604954796ad0d633ee223fbba", "account_name": "Open_Banking_Testing_account", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "payment_method": { "message": "PAYMENT_INITIATED", "entry_mode": "ECOM", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_1NwUgkvbEcNUJhymCk96ON9HDu0HkY_sdgpoh123456/redirect/eyJtbWEiOm51bGwsIm1pZCI6Ik1FUl80NjExOTRkODA1Nzg0MjcwOGNhMzYwZTI1MmRhODI3MCIsInhnIjoiMjAyMS0wMy0yMiJ9", "apm": { "provider": "open_banking, "bank_transfer": masked_account_number_last4": "XXXX9999", "bank": { "name": "Merchant Name", "code": "407777 } }, "action": id": "ACT_1NwUgkvbEcNUJhymCk96ON9HDu0HkY", "type": "INITIATE", "time_created": "2023-07-13T16:17:55.251Z", "result_code": "SUCCESS", "app_id": "JtivfTN6wN6lPLDA0eiRlbuqIB5AkKl7", "app_name": "testing_app } ``` #### Open Banking statuses The following table describes the various Open Banking statuses. | Status | Description | | -------- | ------- | | INITIATED | Payment was created. All Open Banking payments are set to this initially. | | CAPTURED | Funds have been sent. | | DECLINED | Payment was declined or failed. | | PENDING | Payment is being processed by the bank. Whether it appears depends on the bank. | ## Step 4: Redirect customer to Open Banking The next step is to redirect the customer to Open Banking using the URL provided in the response field of the previous step (`payment_method.redirect_url`) to facilitate authentication with Open Banking. To do this, we pass the `redirect_url` return in the response to the Drop-In UI. #### Sample redirect ``` ... // Continuation from Step 2 - Capture Customer Selection if (provider === GlobalPayments.enums.Apm.OpenBankingPayment) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_I559ttj6HiSaE99u0Th7jptJNthLN5_sdgpoh123456/redirect/eyJtbWEiOm51bGwsIm1pZCI6Ik1FUl80NjExOTRkODA1Nzg0MjcwOGNhMzYwZTI1MmRhODI3MCIsInhnIjoiMjAyMS0wMy0yMiJ9", } }); window.dispatchEvent(merchantCustomEventProvideDetails); } }); ``` ## Step 5: Handle the redirect and check the status Once the customer completes the transaction with the Open Banking provider, they are redirected back to your app or website based on transaction success/failure using the Return URL specified in the Initiate request. The unique transaction identifier is also returned as part of the parameters in the URL. You should use this to check the status of the payment (see [Step 6](#step-6-get-transaction-status)). The ID that is passed as a URL parameter is the `TRN_ID` and should be used to check the status of the transaction (see example below). #### Sample Return URL parameters ``` https://www.example.com/return?X-GP-Signature=399af8063773573040b3d1e76ccf313ed40491e61b3fe768390d7a1da925506c3908405f17be8fb82b978ab4790f76cdeb7b292b48dce716903c36eab57580a9&id=TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456&payer_reference=asdgpoh123456&action_type=REDIRECT_FROM&action_id=ACT_J8pXg8cjUuOltUHovOAGpqUooy7XZD ``` #### Checking the signature The Return URL contains a signature made up of the key transaction fields. This includes the Transaction ID (`TRN_ID`), Payer Reference, Action Type, and Action ID. Your application must construct and check the signature to ensure the response wasn’t tampered with. To construct the signature, take the string containing the above fields from the Return URL, excluding the signature itself. ``` id=TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456&payer_reference=asdgpoh123456&action_type=REDIRECT_FROM&action_id=ACT_J8pXg8cjUuOltUHovOAGpqUooy7XZD ``` Concatenate your app key to the end of this string. ``` id=TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456&payer_reference=asdgpoh123456&action_type=REDIRECT_FROM&action_id=ACT_J8pXg8cjUuOltUHovOAGpqUooy7XZD.app_key ```

The signature should be a Sha512 hash of the concatenated string. For example: ``` 399af8063773573040b3d1e76ccf313ed40491e61b3fe768390d7a1da925506c3908405f17be8fb82b978ab4790f76cdeb7b292b48dce716903c36eab57580a9 ``` ## Step 6: Get transaction status In this step, we get the transaction details and receive the webhook notification. As mentioned previously, the `TRN_ID` field should be used to check the status of the transaction. At a high level, getting the transaction status works like this: ![Diagram flow between the customer, merchant, and our API to get the transaction status.](https://developer.globalpayments.com/gh-assets/open-banking_flow3.png) #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer pJ2An7thGclc8UUVZSntPRmsAUrR' \ ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); // config.setAppId("APP_ID"); config.setAppKey(APP_KEY); // config.setAppKey("APP_KEY"); config.setChannel(Channel.CardNotPresent); ServicesContainer.configureService(config); // the id of the transaction to fetch its details String transactionId = "TRN_2mz2U86WWSEWSgV5HUN25LrzpbdBIU_a2417fd45ea4"; TransactionSummary response = null; try { response = ReportingService.transactionDetail(transactionId) .execute(); } catch (GatewayException ex) { // TODO: Add your exception handling here } transactionId = response.getTransactionId(); String trnStatus = response.getTransactionStatus(); DateTime trnDate = response.getTransactionDate(); String trnType = response.getTransactionType(); BigDecimal trnAmount = response.getAmount(); String trnCurrency = response.getCurrency(); String sortCode = response.getBankPaymentResponse().getSortCode(); String accountNumberLast4 = response.getAccountNumberLast4(); ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "APP_ID"; config.AppKey = "APP_KEY"; config.Channel = Channel.CardNotPresent; ServicesContainer.ConfigureService(config); var transactionId = "TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456"; try { var response = ReportingService.TransactionDetail(transactionId) .Execute(); var transId = response.TransactionId; var trnStatus = response.TransactionStatus; var trnDate = response.TransactionDate; var trnType = response.TransactionType; var trnAmount = response.Amount; var trnCurrency = response.Currency; var sortCode = response.BankPaymentResponse.SortCode; var accountNumberLast4 = response.AccountNumberLast4; } catch (GatewayException ex){ // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $trnId = 'TRN_qBh60Xxj5zLDyGWSSqCtjLqFCdiitN_1703ec14a76d'; try { /** @var \GlobalPayments\Api\Entities\Reporting\TransactionSummary $response */ $response = ReportingService::transactionDetail($trnId) ->execute(); } catch (GatewayException $ex) { // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->amount; //API raw response key "amount" $currency = $response->currency; // "currency" $merchantName = $response->merchantName; // "system->mid" $channel = $response->channel; // "channel" $reference = $response->referenceNumber; // "reference" $gatewayResponseMessage = $response->gatewayResponseMessage; // "payment_method->message" $transactionType = $response->transactionType; // "type" $transactionDate = $response->transactionDate; // "time_created" $transactionStatus = $response->transactionStatus; // "status" $country = $response->country; // "country" $entryMode = $response->entryMode; // "payment_method->entry_mode" $redirectUrl = $response->bankPaymentResponse->redirectUrl; //API raw response key "payment_method->redirect_url" //API raw response key "payment_method->bank_transfer->masked_account_number_last4" $accountNumberLast4 = $response->accountNumberLast4; //API raw response key "payment_method->bank_transfer->bank->code" $sortCode = $response->bankPaymentResponse->sortCode; //API raw response key "payment_method->bank_transfer->bank->name" $accountName = $response->bankPaymentResponse->accountName; //API raw response key "payment_method->bank_transfer->remittance_reference->value" $remittanceReferenceValue = $response->bankPaymentResponse->remittanceReferenceValue; //API raw response key "payment_method->bank_transfer->remittance_reference->type" $remittanceReferenceType = $response->bankPaymentResponse->remittanceReferenceType; ``` #### Sample response ```JSON { "id": "TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456", "time_created": "2023-07-13T16:23:02.138Z", "time_last_updated": "2023-07-13T16:23:30.552Z", "status": "CAPTURED", "type": "SALE", "merchant_id": "MER_461194d8057842708ca360e252da8270", "merchant_name": "QA_Sandbox_Merchant_02", "account_id": "TRA_08e5bac604954796ad0d633ee223fbba", "account_name": "Open_Banking_Testing_account", "channel": "CNP", "amount": "10000", "merchant_amount": "", "partner_amount": "", "surcharge_amount": "", "surcharge_type": "", "currency": "GBP", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "description": "", "order_reference": "", "order": { "reference": "" }, "time_created_reference": "", "batch_id": "", "initiator": "", "country": "GB", "language": "", "ip_address": "11.111.11.111", "site_reference": "", "payment_method": { "result": "", "message": "SUCCESS", "entry_mode": "ECOM", "name": "Jane Doe", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456/redirect/eyJtbWEiOm51bGwsIm1pZCI6Ik1FUl80NjExOTRkODA1Nzg0MjcwOGNhMzYwZTI1MmRhODI3MCIsInhnIjoiMjAyMS0wMy0yMiJ9", "apm": { "provider": "open_banking", "countries": [ "GB", "IE" ] }, "bank_transfer": { "masked_account_number_last4": "XXXX9999", "bank": { "code": "407777", "name": "Merchant Name" }, "remittance_reference": { "type": "TEXT", "value": "Product Name" } } }, "mode": "", "count": "", "grace_period_count": "" }, "action_create_id": "ACT_Knt3NHCqUlifGAcYaUje62hRzTK7V1", "parent_resource_id": "TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123455", "platforms": [ { "type": "ECOM", "transaction_id": "oNorLmfYiphynluhAF", "order_id": "TRN_U5cRgH1nfubpsDSlrM67iz8hNj7cF9_sdgpoh123456", "authcode": "", "pasref": "" } ], "system": { "mid": "", "tid": "0187842062175448386901265234938560244584", "name": "" }, "action": { "id": "ACT_DuT6lBQW9UdgovvqfxLX0GOZyqgZ4x", "type": "TRANSACTION_SINGLE", "time_created": "2023-07-13T16:26:23.131Z", "result_code": "SUCCESS", "app_id": "JtivfTN6wN6lPLDA0eiRlbuqIB5AkKl7", "app_name": "test_app" } } ``` ## Testing Open Banking Our Open Banking solution is available for testing in our Sandbox environment for registered users of this developer portal. For Open Banking, we provide "test banks" instead of test cards. Each one provides a different outcome. For more information, see the [Open Banking](https://developer.globalpayments.com/resources/test-cards.md#open-banking) section of our Test Cards article. # PayPal - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/paypal-overview.md Section: Payments Description: Allow customers to pay using this popular payment method PayPal is a digital wallet that can store a customer’s payment and personal information on an app or browser for quick payments in-person, online, or on a mobile device. Customers use saved funding sources to pay securely online or to “top up” their wallet balance. We offer merchants several ways to integrate PayPal into their app or website to make the checkout experience secure, fast, and convenient. For merchants, the benefits of PayPal include: * One of the most recognized and trusted names in the digital payment industry. Its brand reputation instills confidence in users. * Allows you to easily take international payments, since it’s available in more than 200 countries and can accept payments using more than 20 currencies. * Provides a seller protection program. Merchants are protected against fraudulent chargebacks. * A simplified checkout process by reducing friction and boosting conversion rates. ## Use cases In this section, we present some “real world” examples that can be enabled through our PayPal solution. Keep in mind that this section doesn’t cover all of the use cases. ##### Use Case #1: Secure A merchant wants to accommodate their customers who are worried about sharing their credit card information. For this reason, they include PayPal as a payment method because it encrypts the bank information. ##### Use Case #2: Fast A merchant wants to enable their customers to complete their online transaction quickly and efficiently. For this reason, they include PayPal as a payment method because customers will not have to fill in all of their credit card details in the form. ##### Use Case #3: Convenient A merchant wants to allow their customers to complete online transactions regardless of if they have their credit card or not. If their customer urgently needs to complete an online transaction they can select PayPal as an alternative payment method. ## Product details ##### Advantages of using PayPal * A recognised and trusted name * Seller protection program * 200+ countries and 20+ currencies * Simplified checkout ##### Integration options * SDK or API * Drop-In UI * Shopping Carts and Platforms ##### Regions where you can use PayPal * Europe * Middle East * Africa * North America * Latin America * Asia-Pacific ## How does it work? When a customer chooses to pay using PayPal at checkout, they are redirected to the PayPal portal (or PayPal app) to authenticate and authorize the transaction. Within the PayPal portal or app, the customer can choose between a variety of payment methods to make the payment. The choices depend on a number of factors, such as the transaction amount and the funding sources that the customer has linked to their PayPal account. These payment methods might include: * Debit card * Credit card * Bank account * PayPal balance * Buy Now Pay Later * PayPal credit The funds are deposited into your PayPal Business account. You can then transfer the funds to your bank account through the PayPal portal. You can also set up automatic (periodic) transfers within the PayPal portal. There are several PayPal transaction types. Their use cases are described in the table below. | PayPal Transaction Type | Use Case | | --- | --- | | AUTO | You want to charge the customer right after they authorized the payment. | | LATER | You want to charge the customer at a later time after their authorization, e.g., when your product is ready to be shipped. | | MULTI | You want to charge the customer at a later time after their authorization and in multiple installments, e.g., if an order is composed of multiple items that you will ship separately, and you want to charge for each item individually as it is shipped. | AUTO capture is the most common PayPal transaction type. It has four mandatory steps and one optional one: 1. Initiate the transaction 2. Redirect the customer to PayPal 3. Receive the PayPal response 4. [OPTIONAL] Retrieve transaction information 5. Confirm the transaction At a high level, a typical flow for a PayPal AUTO capture transaction works like this: ![Diagram flow of how PayPal works at a high level.](https://developer.globalpayments.com/gh-assets/paypal_flow.png) **PayPal Typical Flow** ## Next steps To try PayPal, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/payments/payment-methods/paypal-guide.md). We provide steps for both direct API integration and for our hosted solution, Drop-In User Interface (UI). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # PayPal - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/paypal-guide.md Section: Payments Description: Learn how to add PayPal as a payment method for your integration For more information about our PayPal solution, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/paypal-overview.md). #### API This guide focuses on adding PayPal as a payment method using direct API integration. We provide a full suite of APIs that allow you to process and manage PayPal transactions. Requests to [initiate](#payment-initiate-request), [reverse](#payment-reversal-request), [confirm](#payment-confirm-request), [capture](#payment-capture-request), and [refund](#payment-refund-request) PayPal transactions are supported. Sample code and responses for these requests are provided in the [Message flows](#message-flows) section. Each PayPal transaction consists of at least two requests — Payment Initiate and Payment Confirm — but the full lifecycle of a PayPal transaction, including capturing amounts and refunding transactions, might consist of up to five requests. To complete transaction authorization, the customer must be redirected to PayPal between the initiation and confirmation of the transaction. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Supported requests The following table describes the requests we support for PayPal. *Type* indicates whether the element is Mandatory (M), Optional (O), or Conditional (C) – dependent on another field. | Request | Type | Description | | --- | --- | --- | | Payment Initiate | M | Used to initiate a PayPal transaction, obtain the redirection URL, advise PayPal of the details of a new transaction, and retrieve the necessary details for customer authorization of the transaction. | | Payment Describe | O | Used to retrieve data about the PayPal transaction, in particular, shipping information. | | Payment Confirm | M | Required to confirm the PayPal transaction after customer authorization. For transactions initiated as AUTO settlement, this request initiates the transfer of funds. | | Payment Capture | C | Used to initiate the transfer of funds for the amount specified. Used only for transactions that are not set for AUTO settlement in the Payment Initiate request. | | Payment Reversal | O | Used to void a PayPal transaction. Used only for transactions that are not set for AUTO settlement in the Payment Initiate request. | | Payment Refund | O | Used to return funds to a customer. | ## Message flows There are three types of PayPal transactions: AUTO, LATER, and MULTI. The use case and applicable message flow for each transaction type are described in the following table. | Transaction Type | Use Case | Message Flow | | --- | --- | --- | | AUTO | You want to charge the customer right after they authorized the payment. | 1 - Payment Initiate  2 - Redirect to PayPal 3 - Receive PayPal Response \[OPTIONAL\] Describe (retrieve transaction information) 4 - Payment Confirm | | LATER | You want to charge the customer at a later time after their authorization, e.g., when your product is ready to be shipped. | 1 - Payment Initiate  2 - Redirect to PayPal 3 - Receive PayPal Response \[OPTIONAL\] Describe (retrieve transaction information) 4 - Payment Confirm 5 - Capture | | MULTI | You want  to charge the customer at a later time after their authorization and in multiple installments, e.g., if an order is composed of multiple items that you will ship separately, and you want to charge for each item individually as it is shipped. | 1 - Payment Initiate  2 - Redirect to PayPal 3 - Receive PayPal Response \[OPTIONAL\] Describe (retrieve transaction information) 4 - Payment Confirm 5 - Capture (multiple requests allowed) | The following sections contain more details on the various steps of the message flows, including sample requests and responses for each. ### Payment Initiate request The request must contain the following URLs: * **Return URL** – The URL on your website to which the customer should be redirected if the PayPal authentication attempt is successful. * **Cancel URL** – The URL on your website to which the customer should be redirected in the event of the customer canceling the transaction. Every transaction initiation needs to have a different `order.reference`. This reference cannot be duplicated. > A successful PayPal transaction will return a **00** success code, even though standard non-card transactions usually return a **01** success code. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TsgUfhGDmdYWS9W8SFM9lfzAiMk3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "account_name": "transaction_processing", "channel": "CNP", "type": "SALE", "amount": "1000", "currency": "GBP", "reference": "transaction reference", "country": "GB", "description": "description", "order":{ "reference": "unique order reference" }, "payer": { "reference": "payer reference" }, "payment_method": { "name": "Doe", "entry_mode": "ECOM", "apm": { "provider": "paypal" } }, "notifications": { "return_url": "https://www.example.com/returnUrl", "cancel_url": "https://www.example.com/cancelUrl" } }' ``` #### Sample response ```json { "id": "TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference", "time_created": "2024-01-17T11:40:42.567Z", "type": "SALE", "status": "INITIATED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1000", "currency": "GBP", "country": "GB", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "reference": "transaction reference", "payment_method": { "result": "00", "message": "SUCCESS", "entry_mode": "ECOM", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference/redirect/eyJtZXJjaGFudF9tYW5hZ2VtZW50X2lkIjpudWxsLCJtZXJjaGFudF9pZCI6Ik1FUl83ZTNlMmM3ZGYzNGY0MjgxOWIzZWRlZTMxMDIyZWUzZiIsImFjY291bnRfaWQiOiJUUkFfYzk5NjdhZDdkOGVjNGI0NmI2ZGQ0NGE2MWNkZTlhOTEiLCJtZXJjaGFudF9uYW1lIjoiU2FuZGJveF9tZXJjaGFudF8zIiwiYWNjb3VudF9uYW1lIjoidHJhbnNhY3Rpb25fcHJvY2Vzc2luZyIsInBheXBhbF91cmwiOiJodHRwczovL3d3dy5zYW5kYm94LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3I/Y21kPV9leHByZXNzLWNoZWNrb3V0JnRva2VuPUVDLTY2Vzk0MzI2OEIzNzQzOTJQIiwiYXBwX2lkIjoiNWgyWkR6NDdESG5TUkZGOEVHUzVnb2RJQVVqRVpUTUsiLCJhcHBfbmFtZSI6Imdpb3Zhbm5pc2FwcCIsImFwcF9kZXZlbG9wZXIiOiJzdW1hbm8uZ2lvdmFubmlAZ21haWwuY29tIiwiWC1HUC1WZXJzaW9uIjoiMjAyMS0wMy0yMiJ9", "apm": { "provider_redirect_url": "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-66W943268B374392P", "provider": "paypal", "session_token": "EC-66W943268B374392P", "ack": "SUCCESS", "correlation_reference": "963889dfaa606", "version_reference": "98.0", "build_reference": "58313039" } }, "batch_id": "", "action": { "id": "ACT_KciNriJY2JihUWRnn2BeOn2bdqYeZo", "type": "INITIATE", "time_created": "2024-01-17T11:40:42.567Z", "result_code": "SUCCESS", "app_id": "5h2ZDz47DHnSRFF8EGS5godIAUjEZTMK", "app_name": "myapp" } } ``` ### Redirect to PayPal Following a successful Payment Initiate request, the next step is to redirect the customer to `payment_method.apm.provider_redirect_url` returned in the Payment Initiate response. This can be achieved, for example, using a simple JavaScript redirect. #### Sample redirect > The sample code below is an example only. You may need to modify it to suit your particular needs. ```html Sample PayPal Redirect ``` Upon redirection, the customer will need to log in to their PayPal account and confirm the transaction details. Afterwards, the customer will be redirected back to your application to continue shopping. ### Receive PayPal response There are two possible outcomes of the authentication process: * **Successful Authentication/Authorization** – The customer successfully authenticates and authorizes the transaction. They are then returned to the ReturnURL set in the payment-set request. * **Canceled Transaction** – The customer cancels the transaction on the PayPal page and is returned to the CancelURL set in the payment-set request. For successfully authenticated and authorized transactions where the customer has been redirected to the `ReturnURL`, your application should proceed to process the Payment Describe (optional) and Payment Confirm (mandatory) requests. ### [OPTIONAL] Payment Describe request This optional request is used to retrieve data about the transaction, particularly the customer’s shipping address as stored on PayPal. The Translation ID returned in the Payment Initiate response must be used. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference/describe' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TsgUfhGDmdYWS9W8SFM9lfzAiMk3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '' ``` #### Sample response ```json { "id": "TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference", "time_created": "2024-08-06T15:32:04.969Z", "time_last_updated": "2024-08-06T15:32:04.969Z", "type": "SALE", "status": "PENDING", "amount": "1000", "currency": "GBP", "country": "GB", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "channel": "CNP", "reference": "transaction reference", "description": "Comment 1", "order_reference": "unique order reference", "order": { "reference": "unique order reference" }, "time_created_reference": "", "batch_id": "", "initiator": "", "language": "", "ip_address": "", "site_reference": "", "payment_method": { "result": "00", "message": "SUCCESS", "entry_mode": "ECOM", "name": "Doe", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference/redirect/eyJtZXJjaGFudF9tYW5hZ2VtZW50X2lkIjpudWxsLCJtZXJjaGFudF9pZCI6Ik1FUl83ZTNlMmM3ZGYzNGY0MjgxOWIzZWRlZTMxMDIyZWUzZiIsImFjY291bnRfaWQiOiJUUkFfYzk5NjdhZDdkOGVjNGI0NmI2ZGQ0NGE2MWNkZTlhOTEiLCJtZXJjaGFudF9uYW1lIjoiU2FuZGJveF9tZXJjaGFudF8zIiwiYWNjb3VudF9uYW1lIjoidHJhbnNhY3Rpb25fcHJvY2Vzc2luZyIsInBheXBhbF91cmwiOiJodHRwczovL3d3dy5zYW5kYm94LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3I/Y21kPV9leHByZXNzLWNoZWNrb3V0JnRva2VuPUVDLTRDMTgzNDI4SkYyNjU5OTRWIiwiYXBwX2lkIjoiNWgyWkR6NDdESG5TUkZGOEVHUzVnb2RJQVVqRVpUTUsiLCJhcHBfbmFtZSI6Imdpb3Zhbm5pc2FwcCIsImFwcF9kZXZlbG9wZXIiOiJzdW1hbm8uZ2lvdmFubmlAZ21haWwuY29tIiwiWC1HUC1WZXJzaW9uIjoiMjAyMS0wMy0yMiJ9", "apm": { "provider": "paypal", "provider_redirect_url": "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-4C183428JF265994V", "session_token": "EC-4C183428JF265994V", "provider_reference": "MW44PN3H9PXCY", "seller_reference": "testmerchant@globalpay.com", "time_created_reference": "2024-08-06T15:32:29Z", "ack": "SUCCESS", "version_reference": "98.0", "build_reference": "58576904", "correlation_reference": "176f4e28c8982", "billing_agreement_status": "false", "payer": { "reference": "MW44PN3H9PXCY", "status": "VERIFIED", "name": "Global Pay Buyer", "email": "testbuyer@globalpay.com", "country": "GB", "address": { "name": "John Doe", "status": "Confirmed", "line_1": "Spitalfields Arts Market, 112 Brick Lane", "line_2": "N/A", "city": "London", "postal_code": "E1 6RL", "state": "London", "country": "GB", "country_name": "United Kingdom", "source": "PayPal" }, "billing_address": { "name": "John Doe", "status": "Confirmed", "line_1": "Spitalfields Arts Market, 112 Brick Lane", "city": "London", "postal_code": "E1 6RL", "state": "London", "country": "GB", "country_name": "United Kingdom", "source": "PayPal" } }, "order": { "reference": "unique order reference", "description": "order description", "amount": "10000", "currency": "GBP", "item_amount": "10000", "tax_amount": "0", "insurance_offered": "NO", "shipping_amount": "0", "shipping_discount": "0", "handling_amount": "0", "insurance_amount": "0", "checkout_status": "PaymentActionNotInitiated", "shipping_address": { "name": "John Doe", "status": "Confirmed", "line_1": "Spitalfields Arts Market, 112 Brick Lane", "line_2": "N/A", "city": "London", "postal_code": "E1 6RL", "state": "London", "country": "GB", "country_name": "United Kingdom", "normalization_status": "None", "source": "PayPal" } } } }, "action_create_id": "ACT_plE30CwHDLQWBd7KipVR7H9DFG6Haz", "parent_resource_id": "TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference", "action": { "id": "ACT_LTOFUchOjXSFKg8UZfDrVPUTdhItIb", "type": "TRANSACTION_SINGLE", "time_created": "2024-08-06T15:32:30.057Z", "result_code": "SUCCESS", "app_id": "5h2ZDz47DHnSRFF8EGS5godIAUjEZTMK", "app_name": "myapp" } } ``` ### Payment Confirm request This request is mandatory and used to commit a previously initiated PayPal transaction. For requests initiated with the `capture_mode` field set to AUTO, this request also initiates the transfer of funds. The Transaction ID returned by the Payment Initiate request must be submitted as a parameter in the request’s endpoint as shown below. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference/confirmation' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TsgUfhGDmdYWS9W8SFM9lfzAiMk3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "payment_method": { "apm": { "provider": "paypal" } } } ' ``` #### Sample response ```json { "id": "TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference", "time_created": "2024-01-18T16:32:14.115Z", "type": "SALE", "status": "CAPTURED", "amount": "1000", "currency": "GBP", "country": "GB", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "reference": "transaction reference", "payment_method": { "result": "00", "message": "SUCCESS", "entry_mode": "ECOM", "apm": { "provider": "paypal", "session_token": "EC-2AV990714G0682134", "seller_reference": "testmerchant@globalpay.com", "time_created_reference": "2024-01-18T16:32:13Z", "transaction_reference": "6458857216218215F", "ack": "SUCCESS", "version_reference": "98.0", "build_reference": "58313039", "correlation_reference": "de9171030c89d", "secure_account_reference": "CUEXTCPF4MNQY", "reason_code": "none", "pending_reason": "none", "gross_amount": "1001", "payment_time_reference": "2024-01-18T16:32:13Z", "payment_type": "INSTANT", "payment_status": "COMPLETED", "type": "express-checkout", "protection_eligibilty": "ELIGIBLE" } }, "action": { "id": "ACT_A32IorkZQCCL5XBlMtntE3fJktlXcQ", "type": "CONFIRM", "time_created": "2024-01-18T16:32:14.115Z", "result_code": "SUCCESS", "app_id": "5h2ZDz47DHnSRFF8EGS5godIAUjEZTMK", "app_name": "myapp" } } ``` ### Payment Capture request This request is applicable, and required, only for transactions that were initiated with the capture_mode field set to LATER or MULTIPLE. In these types of transactions, the request is used to initiate the transfer of funds. If no capture request is processed successfully, no funds will be transferred. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference/capture' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TsgUfhGDmdYWS9W8SFM9lfzAiMk3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '' ``` ### Payment Reversal request This request is applicable to transactions in which the `capture_mode` field was set to LATER or MULTIPLE. It can be used to cancel the transaction without settling any funds so long as the transaction was not captured yet. If the transaction was already captured, a Payment Refund request should be used to return funds to the customer. ### Payment Refund request This request is used to refund a transaction that has been initiated, committed, and captured. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_KciNriJY2JihUWRnn2BeOn2bdqYeZo_ionreference/refund' \ --header 'Authorization: Bearer TsgUfhGDmdYWS9W8SFM9lfzAiMk3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --data '{ "amount": "1000", "description": "refund description", "order": { "reference": "refund reference" }, "payer": { "reference": "refund payer reference" } }' ``` #### Sample response ```json { "id": "TRN_HjbI68v1pG6p8QjCp10SiKJZGTjmfS_ionreference", "time_created": "2024-08-06T15:47:45.515Z", "type": "REFUND", "status": "CAPTURED", "amount": "1000", "currency": "GBP", "country": "GB", "reference": "transaction reference", "payment_method": { "result": "00", "message": "SUCCESS", "apm": { "provider": "paypal", "time_created_reference": "2024-08-06T15:47:44Z", "transaction_reference": "49V448067H5095101", "pending_reason": "none", "gross_amount": "10000", "fee_amount": "34", "payment_status": "INSTANT", "ack": "SUCCESS", "version_reference": "98.0", "build_reference": "20240724222844319", "correlation_reference": "90cada9b3dc6e" } }, "batch_id": "", "action": { "id": "ACT_HjbI68v1pG6p8QjCp10SiKJZGTjmfS", "type": "REFUND", "time_created": "2024-08-06T15:47:45.515Z", "result_code": "SUCCESS", "app_id": "5h2ZDz47DHnSRFF8EGS5godIAUjEZTMK", "app_name": "myapp" } } ``` ## Testing PayPal Use your credentials to log in to your PayPal test account. Then you can test the PayPal payment method with the test details available. #### Drop-In UI This guide focuses on integrating PayPal with our Drop-In User Interface (UI), which is a ready-made payment form using our Hosted Fields solution. You’ll learn how to add PayPal to your payment form using our JavaScript Library. To learn how to use the Hosted Fields components on their own with your existing payment form, see our [Hosted Fields Guide](https://developer.globalpayments.com/docs/payments/online/hosted-fields-guide.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Configure with PayPal Once you’ve created the access token, you can now configure the JavaScript Library to enable PayPal in your payment form. Add a `
` tag to render the Drop-In UI payment form to the customer. ```xml
``` Next, we configure our JavaScript Library with the transaction details required for PayPal. ```javascript GlobalPayments.configure({ accessToken: "accessToken", env: "sandbox", apiVersion: "2021-03-22", language: "en", account: "accountId", apms: { currencyCode: "GBP", countryCode: "GB", nonCardPayments: { allowedPaymentMethods: [{ provider: GlobalPayments.enums.ApmProviders.PayPal, }] } }, }); const cardForm = GlobalPayments.creditCard.form( '#credit-card-form', { amount: "800", style: "gp-default", apms: [ GlobalPayments.enums.Apm.PayPal ], } ); cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const { provider } = paymentProviderData; console.log('Selected provider: ' + provider); if (provider === GlobalPayments.enums.ApmProviders.PayPal) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "paypal url returned from API", } }); window.dispatchEvent(merchantCustomEventProvideDetails); } }); ``` ![Drop-In UI with PayPal button.](https://developer.globalpayments.com/gh-assets/paypal.png) **Drop-In UI with PayPal Button** #### JavaScript configuration (PayPal specific parameters) *Type* indicates whether the element is Mandatory (M), Optional (O), or Conditional (C)—dependent on another field or regional requirement. | Name | Format | Type | Description | | -------- | -------- | -------- | -------- | | currencyCode | string | M | Currency of the amount in ISO-4217 (alpha-3). | | countryCode | string | M | The country in ISO-3166-1(alpha-2 code) format. | | provider | string | M | The string used to identify the payment method provider used to execute this transaction. | ## Step 2: Capture customer selection Now that we have configured PayPal and it's displayed on the Drop-In UI, when a customer selects PayPal as the payment method, the Drop-In UI returns this selection in an event. For example, the Drop-In UI returns: _Selected provider: PayPal_. Below is the code snippet of how the Drop-In UI returns this event. ```javascript cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const { provider } = paymentProviderData; console.log('Selected provider: ' + provider); ... //continued in Step 4 - Redirect customer to PayPal ``` The provider that is returned is used to initiate the transaction to retrieve the necessary information to complete the PayPal transaction. ## Step 3: Initiate PayPal transaction Now that we know what payment method the customer has selected, we can initiate the payment to complete the transaction. We create a transaction request with PayPal as the payment method provider and include the transaction information in the request. This returns the necessary details required to facilitate authentication with PayPal. The response contains a specific URL that is passed to the Drop-In UI to redirect the customer to PayPal. #### Sample request ```json POST https://apis.sandbox.globalpay.com/ucp/transactions { "account_name": "Transaction_Processing", "channel": "CNP", "type": "SALE", "amount": "20045", "currency": "EUR", "reference": "Paypal-210420-3", "payment_method": { "first_name": "Jane", "last_name": "Doe", "entry_mode": "ECOM", "apm": { "provider": "paypal" } }, "notifications": { "return_url": "", "cancel_url": "" } } ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod(AlternativePaymentType.PAYPAL); paymentMethod.setReturnUrl("https://www.example.com/return"); paymentMethod.setStatusUpdateUrl("https://www.example.com/status"); paymentMethod.setCancelUrl("https://www.example.com/cancel"); paymentMethod.setCountry("GB"); paymentMethod.setAccountHolderName("James Mason"); try { Transaction response = paymentMethod.charge(new BigDecimal("200.45")) .withCurrency("EUR") .withClientTransactionId("PayPal-210420-3") .execute(); AlternativePaymentResponse alternativePaymentResponse = response.getAlternativePaymentResponse(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->redirect_url" String redirectUrl = alternativePaymentResponse.getRedirectUrl(); // API raw response key "payment_method->apm->provider" String provider = alternativePaymentResponse.getProviderName(); // API raw response key "payment_method->apm->ack" String ack = alternativePaymentResponse.getAck(); // API raw response key "payment_method->apm->session_token" String sessionToken = alternativePaymentResponse.getSessionToken(); // API raw response key "payment_method->apm->correlation_reference" String correlationReference = alternativePaymentResponse.getCorrelationReference(); // API raw response key "payment_method->apm->version_reference" String versionReference = alternativePaymentResponse.getVersionReference(); // API raw response key "payment_method->apm->build_reference" String buildReference = alternativePaymentResponse.getBuildReference(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST }; ServicesContainer.ConfigureService(config); AlternativePaymentMethod paymentMethod = new AlternativePaymentMethod { AlternativePaymentMethodType = AlternativePaymentType.PAYPAL, ReturnUrl = "https://www.example.com/return", StatusUpdateUrl = "https://www.example.com/status", CancelUrl = "https://www.example.com/cancel", Country = "GB", AccountHolderName = "James Mason" }; try { var response = paymentMethod.Charge(200.45m) .WithCurrency("EUR") .WithClientTransactionId("Paypal-210420-3") .Execute(); // API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key payment_method->redirect_url var redirectUrl = response.AlternativePaymentResponse.RedirectUrl; // API raw response key payment_method->apm->provider var provider = response.AlternativePaymentResponse.ProviderName; // API raw response key payment_method->apm->ack var ack = response.AlternativePaymentResponse.Ack; // API raw response key payment_method->apm->session_token var sessionToken = response.AlternativePaymentResponse.SessionToken; // API raw response key payment_method->apm->correlation_reference var correlationReference = response.AlternativePaymentResponse.CorrelationReference; // API raw response key payment_method->apm->version_reference var versionReference = response.AlternativePaymentResponse.VersionReference; // API raw response key payment_method->apm->build_reference var buildReference = response.AlternativePaymentResponse.BuildReference; // API raw response key payment_method->result var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = '4gPqnGBkppGYvoE5UX9EWQlotTxGUDbs'; $config->appKey = 'FQyJA5VuEQfcji2M'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::PAYPAL); $paymentMethod->returnUrl = 'https://www.example.com/return'; $paymentMethod->statusUpdateUrl = 'https://www.example.com/status'; $paymentMethod->cancelUrl = 'https://www.example.com/cancel'; $paymentMethod->country = 'GB'; $paymentMethod->accountHolderName = 'James Mason'; try { $response = $paymentMethod->charge(200.45) ->withCurrency('EUR') ->withClientTransactionId('Paypal-210420-3') ->execute(); } catch (GatewayException $ex) { // TODO: Add your exception handling here } $transactionId = $response->transactionId; // "id" $amount = $response->balanceAmount; // API raw response key "amount" $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" // payment_method->redirect_url $redirectUrl = $response->alternativePaymentResponse->redirectUrl; // payment_method->apm->provider $provider = $response->alternativePaymentResponse->providerName; // payment_method->apm->ack $ack = $response->alternativePaymentResponse->ack; //payment_method->apm->session_token $sessionToken = $response->alternativePaymentResponse->sessionToken; // payment_method->apm->correlation_reference $correlationReference = $response->alternativePaymentResponse->correlationReference; // payment_method->apm->version_reference $versionReference = $response->alternativePaymentResponse->versionReference; // payment_method->apm->build_reference $buildReference = $response->alternativePaymentResponse->buildReference; //payment_method->result $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "TRN_keglsmdsOjeef0g5q5TDO0m8Jqk0uF", "time_created": "2024-09-17T12:53:43.960Z", "type": "SALE", "status": "INITIATED", "channel": "CNP", "capture_mode": "LATER", "amount": "20045", "currency": "EUR", "country": "GB", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "TRA_27c901760029495f813afbb0dab197ef", "account_name": "transaction_processing", "reference": "Paypal-210420-3", "payment_method": { "result": "00", "message": "SUCCESS", "entry_mode": "ECOM", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_keglsmdsOjeef0g5q5TDO0m8Jqk0uF_paypal-123/redirect/eyJtZXJjaGFudF9tYW5hZ2VtZW50X2lkIjpudWxsLCJtZXJjaGFudF9pZCI6Ik1FUl8yNTg0Y2FhYTRiNWI0Zjc3YTkwZTdmMjU4MmVmNTNkZCIsImFjY291bnRfaWQiOiJUUkFfZjEzMDAwNzVjMDkyNDY0MjhhYWYwNmQxNTliM2Y0ZjkiLCJtZXJjaGFudF9uYW1lIjoiamFzb25iYWphcmlhc3Rlc3QiLCJhY2NvdW50X25hbWUiOiJ0cmFuc2FjdGlvbl9wcm9jZXNzaW5nXzIiLCJwYXlwYWxfdXJsIjoiaHR0cHM6Ly93d3cuc2FuZGJveC5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyP2NtZD1fZXhwcmVzcy1jaGVja291dCZ0b2tlbj1FQy03Ulk3NzY3OFJGMzkxNjUzUiIsImFwcF9pZCI6Ik8yNVFhT3JPbENrR1JMczdPVXRQemh6b2NGMWJHb3lTIiwiYXBwX25hbWUiOiJqYXNvbl9iYWpfdGVzdF8yIiwiYXBwX2RldmVsb3BlciI6Imphc29uLmJhamFyaWFzQGdsb2JhbHBheS5jb20iLCJYLUdQLVZlcnNpb24iOiIyMDIxLTAzLTIyIn0=", "apm": { "provider_redirect_url": "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-7RY77678RF391653R", "provider": "paypal", "session_token": "EC-7RY77678RF391653R", "ack": "SUCCESS", "correlation_reference": "3430159d8404c", "version_reference": "98.0", "build_reference": "58613796" } }, "batch_id": "", "action": { "id": "ACT_keglsmdsOjeef0g5q5TDO0m8Jqk0uF", "type": "INITIATE", "time_created": "2024-09-17T12:53:43.960Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Step 4: Redirect customer to PayPal The next step is to redirect the customer to PayPal using the URL provided in the response field of the previous step (`payment_method.redirect_url`) to facilitate authentication with PayPal. To do this, we pass the `redirect_url` returned in the response to the Drop-In UI. ```javascript ... // Continuation from Step 2 - Capture Customer Selection if (provider === GlobalPayments.enums.ApmProviders.PayPal) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "https://apis.sandbox.globalpay.com/ucp/postback/transactions/TRN_keglsmdsOjeef0g5q5TDO0m8Jqk0uF_paypal-123/redirect/eyJtZXJjaGFudF9tYW5hZ2VtZW50X2lkIjpudWxsLCJtZXJjaGFudF9pZCI6Ik1FUl8yNTg0Y2FhYTRiNWI0Zjc3YTkwZTdmMjU4MmVmNTNkZCIsImFjY291bnRfaWQiOiJUUkFfZjEzMDAwNzVjMDkyNDY0MjhhYWYwNmQxNTliM2Y0ZjkiLCJtZXJjaGFudF9uYW1lIjoiamFzb25iYWphcmlhc3Rlc3QiLCJhY2NvdW50X25hbWUiOiJ0cmFuc2FjdGlvbl9wcm9jZXNzaW5nXzIiLCJwYXlwYWxfdXJsIjoiaHR0cHM6Ly93d3cuc2FuZGJveC5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyP2NtZD1fZXhwcmVzcy1jaGVja291dCZ0b2tlbj1FQy03Ulk3NzY3OFJGMzkxNjUzUiIsImFwcF9pZCI6Ik8yNVFhT3JPbENrR1JMczdPVXRQemh6b2NGMWJHb3lTIiwiYXBwX25hbWUiOiJqYXNvbl9iYWpfdGVzdF8yIiwiYXBwX2RldmVsb3BlciI6Imphc29uLmJhamFyaWFzQGdsb2JhbHBheS5jb20iLCJYLUdQLVZlcnNpb24iOiIyMDIxLTAzLTIyIn0=", } }); window.dispatchEvent(merchantCustomEventProvideDetails); } }); ``` When the customer is redirected and is on the PayPal website, they can proceed in two ways: * Complete the transaction – In this scenario, the transaction is processed, and the customer is redirected back to your `notifications.return_url`. * Cancel the transaction – The customer is redirected back to your `notifications.cancel_url`. The payment_method.result is 110. Both the `notifications.return_url` and the `notifications.cancel_url` were set in the API request in Step 1. ## Step 5: Receive the PayPal response The response from PayPal for a completed transaction contains data in the URL query string, which you need for the next request. #### Sample response ```xml https://?X-GP-Signature=99016d93b133a2814f0579e7458473e66c0163f8cb333b91a5b47e7de4fbcb788a66cc36639582f1d6cac7c43d84805b601ab2435aabcb01f008eb380cd4289c&id=TRN_tlEzfFPmB2ZlVMYcvO0X7z86i8QUId_22828941&session_token=EC-09G73155FR885902M&payer_reference=B8J9KSQA5M6S2&pasref=16232310449607197&action_type=REDIRECT_FROM&action_id=ACT_g4zZFihxKQgQU0ttTUwc8WMqTjtL4W ``` #### Parameters | Field | Description | | -------- | ------- | | return_url | Provided in the Initiate the Transaction request (_notifications.return_url_). | | id | Unique reference in our system for the transaction. | ## Step 6: Complete the transaction The final step is to confirm the transaction, which is used to execute a successfully authenticated and authorized transaction. The `ID` from the previous step must be included in the URL. A body is not required, unless you want to change the shipping address or amount at this stage. #### Sample request ```json POST https://apis.sandbox.globalpay.com/ucp/transactions//confirmation { "payment_method": { "apm": { "provider": "PAYPAL" } } } ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); String trnId = "TRN_KJtVKMwFIyZScDOvMkutIkdR7dP2p4_pal-210420-3"; Transaction transaction = Transaction.fromId(trnId, PaymentMethodType.APM); transaction.setAlternativePaymentResponse(new AlternativePaymentResponse()); transaction.getAlternativePaymentResponse().setProviderName(AlternativePaymentType.PAYPAL.name()); transaction.getAlternativePaymentResponse().setProviderReference("string"); try { Transaction response = transaction .confirm() .execute(); AlternativePaymentResponse alternativePaymentResponse = response.getAlternativePaymentResponse(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->redirect_url" String redirectUrl = alternativePaymentResponse.getRedirectUrl(); // API raw response key "payment_method->apm->provider" String provider = alternativePaymentResponse.getProviderName(); // API raw response key "payment_method->apm->ack" String ack = alternativePaymentResponse.getAck(); // API raw response key "payment_method->apm->session_token" String sessionToken = alternativePaymentResponse.getSessionToken(); // API raw response key "payment_method->apm->correlation_reference" String correlationReference = alternativePaymentResponse.getCorrelationReference(); // API raw response key "payment_method->apm->version_reference" String versionReference = alternativePaymentResponse.getVersionReference(); // API raw response key "payment_method->apm->build_reference" String buildReference = alternativePaymentResponse.getBuildReference(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig { AppId = "AppId", AppKey = "AppKey", Channel = Channel.CardNotPresent, Environment = Environment.TEST }; ServicesContainer.ConfigureService(config); var transaction = Transaction.FromId("TRN_KJtVKMwFIyZScDOvMkutIkdR7dP2p4_pal-210420-3", null, PaymentMethodType.APM); transaction.AlternativePaymentResponse = new AlternativePaymentResponse { ProviderName = AlternativePaymentType.PAYPAL.ToString(), ProviderReference = "string" }; try { Transaction response = transaction.Confirm().Execute(); //API raw response key "id" var transactionId = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; //API raw response key payment_method->redirect_url var redirectUrl = response.AlternativePaymentResponse.RedirectUrl; //API raw response key payment_method->apm->provider var provider = response.AlternativePaymentResponse.ProviderName; //API raw response key payment_method->apm->ack var ack = response.AlternativePaymentResponse.Ack; //API raw response key payment_method->apm->session_token var sessionToken = response.AlternativePaymentResponse.SessionToken; //API raw response key payment_method->apm->correlation_reference var correlationReference=response.AlternativePaymentResponse.CorrelationReference; //API raw response key payment_method->apm->version_reference var versionReference = response.AlternativePaymentResponse.VersionReference; //API raw response key payment_method->apm->build_reference var buildReference = response.AlternativePaymentResponse.BuildReference; //API raw response key payment_method->result var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $trnId = "TRN_KJtVKMwFIyZScDOvMkutIkdR7dP2p4_pal-210420-3"; $transaction = Transaction::fromId($trnId, null, PaymentMethodType::APM); $transaction->alternativePaymentResponse = new AlternativePaymentMethod(); $transaction->alternativePaymentResponse->providerName = AlternativePaymentType::PAYPAL; $transaction->alternativePaymentResponse->providerReference = "string"; try { /** @var Transaction $response */ $response = $transaction->confirm()->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } //API raw response key "id" $transactionId = $response->transactionId; // API raw response key "amount" $amount = $response->balanceAmount; // API raw response key "reference" $referenceNumber = $response->referenceNumber; // API raw response key "action->result_code" $responseCode = $response->responseCode; // API raw response key "status" $transactionStatus = $response->responseMessage; // API raw response key "time_created" $timeCreated = $response->timestamp; //API raw response key payment_method->redirect_url $redirectUrl = $response->alternativePaymentResponse->redirectUrl; //API raw response key payment_method->apm->provider $provider = $response->alternativePaymentResponse->providerName; //API raw response key payment_method->apm->ack $ack = $response->alternativePaymentResponse->ack; //API raw response key payment_method->apm->session_token $sessionToken = $response->alternativePaymentResponse->sessionToken; //API raw response key payment_method->apm->correlation_reference $correlationReference = $response->alternativePaymentResponse->correlationReference; //API raw response key payment_method->apm->version_reference $versionReference = $response->alternativePaymentResponse->versionReference; //API raw response key payment_method->apm->build_reference $buildReference = $response->alternativePaymentResponse->buildReference; //API raw response key payment_method->result $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "TRN_L5zXCu1cKs2jkoj71pRXNJXAAUpS8A_83118561", "time_created": "2024-09-17T13:05:19.382Z", "type": "SALE", "status": "CAPTURED", "amount": "20045", "currency": "EUR", "country": "GB", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "TRA_27c901760029495f813afbb0dab197ef", "account_name": "transaction_processing", "reference": "83118561", "payment_method": { "result": "00", "message": "SUCCESS", "entry_mode": "ECOM", "apm": { "provider": "paypal", "session_token": "EC-7FB82811AD668211X", "seller_reference": "testmerchant@globalpay.com", "time_created_reference": "2024-09-17T13:05:19Z", "transaction_reference": "5B097801L4829094B", "ack": "SUCCESS", "version_reference": "98.0", "build_reference": "58613796", "correlation_reference": "8aaf790c20f20", "secure_account_reference": "CUEXTCPF4MNQY", "reason_code": "none", "pending_reason": "none", "gross_amount": "20045", "payment_time_reference": "2024-09-17T13:05:18Z", "payment_type": "INSTANT", "payment_status": "COMPLETED", "type": "express-checkout", "exchange_rate": "0.87785", "protection_eligibilty": "ELIGIBLE" } }, "action": { "id": "ACT_xn2AWGSLfmFWqgyofyLa99fkSKEI19", "type": "CONFIRM", "time_created": "2024-09-17T13:05:19.382Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Testing PayPal Use your credentials to log in to your PayPal test account. Then you can test the PayPal payment method with the test details available. # Dynamic Currency Conversion - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/dynamic-currency-conversion-guide.md Section: Payments Description: Learn how to let international customers pay in their home currency > This feature is currently not available in the United States or Canada. For more information, check with your account manager. Our Dynamic Currency Conversion (DCC) solution enables you to offer cardholders traveling internationally the choice of paying either in the currency of their own card or the currency that the merchant trades in. The customer is offered an exchange rate at the point of sale rather than at the point of settlement, which is what happens if DCC is not present. #### API In this guide, you'll learn how to obtain the relevant currency and exchange rate, present the option to the customer, and process the authorization. We also provide information on complying with requirements to display exchange rates and fees. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Check card currency and exchange rate To start, we need to check if the card is available for DCC and what the current exchange rate is. * If the card is eligible for DCC, you’ll receive an `AVAILABLE` status. * If the card is not eligible for DCC or the card currency is the same as your base currency, you’ll receive a `NOT_AVAILABLE` status. #### Sample request ```json POST https://apis.sandbox.globalpay.com/ucp/currency-conversions { "account_name": "dcc", "channel": "CNP", "amount": "2300", "currency": "EUR", "country": "GB", "reference": "ORDER_35359361", "payment_method": { "entry_mode": "ECOM", "card": { "number": "4006097467207025", "expiry_month": "12", "expiry_year": "25" } } } ``` #### Sample response ```json { "id": "CCS_LUAa1xpkuWeBPuREJXiA7Ua0ySQGHM", "time_created": "2021-06-30T16:05:02.491Z", "model": "FROM_TRANSACTION_CURRENCY", "status": "AVAILABLE", "country": "GB", "transaction_type": "SALE", "amount": "2300", "currency": "EUR", "exchange_rate": "1.6250", "payer_amount": "3738", "payer_currency": "AUD", "margin_rate_percentage": "03.7500", "exchange_rate_source": "REUTERS WHOLESALE INTERBANK", "exchange_rate_time_created": "2018-08-20T11:17", "commission_percentage": "00.0000", "merchant_id": "MER_c11ad71fb6474bb9b8d753e16ef35708", "merchant_name": "DCC_Test", "account_id": "TRA_cb12a5ccd1704066beab6a49d6f39cee", "account_name": "dcc", "reference": "ORDER_35359361", "payment_method": { "result": "00", "message": "Success", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX7025" } }, "action": { "id": "ACT_LUAa1xpkuWeBPuREJXiA7Ua0ySQGHM", "type": "RATE_LOOKUP", "time_created": "2021-06-30T16:05:02.491Z", "result_code": "SUCCESS", "app_id": "L6reqt6WUjenvyQi0PJgUsF6RUXU1tto", "app_name": "DCC_Test" } } ``` ## Step 2: Offer currency choice to customer Now that we have the card currency, exchange rate, and amount, we can present the option to the customer. For this example, the card currency is Swedish Krona (SEK) and our base currency is Euro (EUR). ![Payment screen showing which currency to pay in.](https://developer.globalpayments.com/gh-assets/dcc_select-currency.png) **DCC Choice Example** ## Step 3: Send authorization with DCC details Once the customer selects the currency, you can send the Authorization along with the DCC information to reflect the customer’s choice. ### DCC CHOSEN In this example, the customer has chosen to pay in the currency of their card. You can populate the converted amount, rate, and currency into the request. #### Sample request ```json POST https://apis.sandbox.globalpay.com/ucp/transactions { "account_name": "dcc", "type": "SALE", "channel": "CNP", "amount": "2300", "currency": "EUR", "country": "GB", "reference": "ORDER_35359361", "payment_method": { "first_name": "James", "last_name": "Mason", "entry_mode": "ECOM", "card": { "number": "4006097467207025", "expiry_month": "12", "expiry_year": "25", "cvv": "996" } }, "currency_conversion": { "id": "CCS_g47zV5MsiNjRyX89lCx41xfIfF7G7f" } } ``` ### DCC NOT_AVAILABLE or NOT_CHOSEN In this example, DCC is not available or the customer has not chosen to pay in the currency of their card. No DCC data is submitted as part of the Authorization message. #### Sample request ```json POST https://apis.sandbox.globalpay.com/ucp/transactions { "account_name": "dcc", "type": "SALE", "channel": "CNP", "amount": "2300", "currency": "EUR", "country": "GB", "reference": "ORDER_35359361", "payment_method": { "entry_mode": "ECOM", "card": { "number": "4006097467207025", "expiry_month": "12", "expiry_year": "25", "cvv": "996" } } } ``` ## Compliance with EEA currencies #### Markup transparency rules In April 2020, the European Union introduced new rules governing the transparency of a merchant markup on currency conversions for certain currencies in the European Economic Area (EEA). These currencies include: **EUR**, **BGN**, **HRK**, **DKK**, **HUF**, **PLN**, **CZK**, **RON**, and **SEK**. For merchants utilizing DCC, the EEA rules mean that if the exchange rate offered to the customer has a markup that makes the amount above the European Central Bank (ECB) exchange rate, this percentage rate must be displayed to the consumer. When the customer is presented with the choice to pay in the currency of their card or the merchant’s base currency, the markup amount should be displayed to them. If the exchange rate offered is the same or less than the ECB rate, the markup should be displayed as 0%. The value of the rate field returned in the Rate Lookup response will be the rate provided by the merchant or a third-party Currency Conversion Processor (CCP), inclusive of their markup. The value of the margin percentage field will reflect the markup rate of the merchant or CCP in relation to the current ECB rate. #### HPP Example Either the merchant or CCP provides the interbank exchange rate available at the time of transaction and displays it to the customer. This way, the customer knows the exchange rate before they complete the payment. They can then choose whether to continue with the conversion or pay in the merchant’s base currency. When the customer is presented with the choice to pay in the currency of their card or the merchant’s base currency, the markup percentage and commission applied will be displayed to them. This can alleviate any concerns customers may have about any subsequent processing for foreign-exchange conversion. In this example on our Hosted Payment Page (HPP), the base currency is British pound sterling (GPB) and the card currency is Hong Kong Dollar (HKD). ![Payment screen showing the exchange rate and markup.](https://developer.globalpayments.com/gh-assets/dcc_compliance-info.png) **DCC Section with Compliance Information** #### HPP In this guide, we show you how to enable DCC on the Hosted Payment Page (HPP). We also provide information on complying with requirements to display exchange rates and fees. ## Enable DCC on the HPP To enable DCC, we simply add one field in the Create HPP Link request: * order.transaction_configuration.currency_conversion_mode #### Sample request ```json curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7V5XtjLBHLN1h' \ --data-raw '{ "account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-549d-4967-aeea-51b3f320046a", "payer": { "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "44", "subsriber_number": "1801555888" }, "billing_address": { "line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Halifax", "postal_code": "44", "country": "GB" } }, "order": { "amount": "1000", "currency": "EUR", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "GB", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD" ], "currency_conversion_mode": "YES" }, "payment_method_configuration": { "authentications": { "preference": "CHALLENGE_PREFERRED" } } }, "notifications": { "return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url" } }' ``` ## Additional request fields | Element/Field | Category | Format | Type | Length | Description | | --- | --- | --- | --- | --- | --- | | order.transaction_ , configuration. , currency_ , conversion_ , mode | string | boolean | O | | Determines whether DCC is activated. Allowable values: **YES** **NO** | #### DCC example Now that we enabled DCC on the HPP, the option is displayed to the customer. For this example, our base currency is Euro (EUR) and the card currency is Swedish Krona (SEK). ![Payment screen showing which currency to pay in.](https://developer.globalpayments.com/gh-assets/dcc_select-currency.png) **DCC Choice Example** ## Compliance with EEA currencies #### Markup transparency rules In April 2020, the European Union introduced new rules governing the transparency of a merchant markup on currency conversions for certain currencies in the European Economic Area (EEA). These currencies include: **EUR**, **BGN**, **HRK**, **DKK**, **HUF**, **PLN**, **CZK**, **RON**, and **SEK**. For merchants utilizing DCC, the EEA rules mean that if the exchange rate offered to the customer has a markup that makes the amount above the European Central Bank (ECB) exchange rate, this percentage rate must be displayed to the consumer. When the customer is presented with the choice to pay in the currency of their card or the merchant’s base currency, the markup amount should be displayed to them. If the exchange rate offered is the same or less than the ECB rate, the markup should be displayed as 0%. The value of the rate field returned in the Rate Lookup response will be the rate provided by the merchant or a third-party Currency Conversion Processor (CCP), inclusive of their markup. The value of the margin percentage field will reflect the markup rate of the merchant or CCP in relation to the current ECB rate. #### HPP example Either the merchant or CCP provides the interbank exchange rate available at the time of transaction and displays it to the customer. This way, the customer knows the exchange rate before they complete the payment. They can then choose whether to continue with the conversion or pay in the merchant’s base currency. When the customer is presented with the choice to pay in the currency of their card or the merchant’s base currency, the markup percentage and commission applied will be displayed to them. This can alleviate any concerns customers may have about any subsequent processing for foreign-exchange conversion. For this example, our base currency is British pound sterling (GPB) and the card currency is Hong Kong Dollar (HKD). ![Payment screen showing the exchange rate and markup.](https://developer.globalpayments.com/gh-assets/dcc_compliance-info.png) **DCC Section with Compliance Information** ## Enhance your integration Below are value-added services you can enable for the HPP. ### [Card Storage](https://developer.globalpayments.com/docs/payments/tokenization/card-storage-guide.md) Tokenize card details to charge customers later. ### [Alternative Payment Methods](https://developer.globalpayments.com/docs/payments/payment-methods/alternative-payment-methods-guide.md) Discover additional transaction options. ### [Digital Wallets](https://developer.globalpayments.com/docs/payments/payment-methods/digital-wallets/overview.md) Let customers make quick payments in-person, online, or on a mobile device. # Bank Payment – Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/cz-overview.md Section: Payments Description: Learn about our solution for letting customers in Czechia pay using their bank of choice ## What is Bank Payment? Bank Payment, also known as *Bankovní Platba* in the Czech Republic, is one of the leading bank-to-bank payment methods in Czechia, providing fast, secure, and convenient payment solutions for businesses and consumers. In Czechia, Bank Payment is widely integrated with ecommerce platforms and offers features like recurring payments and multi-currency support. It also provides advanced fraud prevention measures, making it a trusted choice for both merchants and customers throughout the region. Bank Payment’s combination of flexibility, security, and ease of use makes it a popular choice for businesses and customers alike. ### Key benefits for businesses * **Global and local reach**: Offers multi-currency support and local payment methods, helping businesses expand both locally and internationally. * **Fast and reliable**: Facilitates quick payment processing, reducing friction during checkout and improving conversion rates. * **Advanced security**: Implements robust fraud prevention tools and compliance with global standards like PCI DSS, ensuring secure transactions. ### Key benefits for customers * **Convenience**: Offers user-friendly interfaces and quick checkout options. * **Security**: Ensures secure transactions with encryption and fraud protection measures. * **Customer support**: Provides reliable assistance for payment-related issues. Existing and new merchants can easily access bank payment. It will appear as another payment option alongside alternative payment methods like cards, PayPal or any other local payment methods. ![Option for choosing Bankovni Platba.](https://developer.globalpayments.com/gh-assets/logo_cz_bankovni.png) **Payment method option.** ## Next steps Click on the cards below to explore the different options for working with Bank Payment in Czechia. ### [Use our API](https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/cz-guide.md#api) Learn how to integrate Bank Payment using our API. ### [Show APM on your Host Payment Page](https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/cz-guide.md#hpp) Learn how to display Bank Payment on your Hosted Payment Page. ### [Integrate with our Drop-in UI](https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/cz-guide.md#drop-in) Learn how to integrate Bank Payment with our Drop-in UI, a ready-made payment form. # Bank Payment Guide – Czechia Source: https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/cz-guide.md Section: Payments Description: Learn how to let customers in Czechia pay using their bank of choice ## What is Bank Payment? Bank Payment, also known as *Bankovní Platba*, is one of the leading bank-to-bank payment methods in the Czech Republic, providing fast, secure, and convenient payment solutions for businesses and consumers. In this guide, we offer three easy ways to integrate with our Bank Payment solution. Once integrated, Bankovní Platba will appear as another payment option alongside alternative payment methods like cards, PayPal or any other local payment methods. You can learn more about how to use these options by clicking on the tabs below. ![Option for choosing Bankovní Platba.](https://developer.globalpayments.com/gh-assets/logo_cz_bankovni.png) **Payment method option.** #### API ## Learn how to integrate with Bank Payment using our API In this guide, we'll show you how to set up the request, receive the response, and handle the transaction status to give you access to Bank Payment. At a high level, the majority of APMs work like this: 1) The customer initiates the payment, triggering the API call to redirect the customer to a screen that shows all payment method options. 2) When the customer chooses a payment method, the merchant receives the initial response while the customer is redirected back to the merchant's application or website. 3) Then the merchant's application or website receives the final status update from the payment method the customer chose. The diagram below illustrates the interaction between the customer, our API, and the merchant to use an alternative payment method. ![Diagram flow showing interaction between the customer, our API, and the merchant to use an alternative payment method.](https://developer.globalpayments.com/gh-assets/apm_flow.png) **Typical API Integration for Bank Payment** ### Prerequisites * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ### Step 1. Get a bank list Prior to initiating the payment call, the merchant will need to get a list of banks that are available based on the country so that the country and currency details can be sent in the initiation request. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/banks?payment_method=bank_payment&country=CZ¤cy=CZK&account_id=TRA_24bfc3d8513142c8be754003c7c17059' \ --header 'Accept: application/json' \ --header 'Accept-Encoding: gzip' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 8V81ra1cZCUtALpjKnrHu7udsrhA' ``` #### Sample response ```json { "total_record_count": 13, "current_page_size": 13, "merchant_id": "MER_461194d8057xxxx08ca360ea8270", "merchant_name": "Sandbox_Merchant", "account_id": "TRA_08e5bac604xxxx96ad0d623fbba", "account_name": "Open_Banking_account", "filter": { "payment_method": "BANK_PAYMENT", "account_id": "TRA_08e5bac604xxxx96ad0d623fbba", "country": "CZ", "currency": "CZK" }, "paging": { "page_size": 13, "page": 1, "order": "ASC", "order_by": "BANK_NAME" }, "payment_method": { "bank_transfer": { "banks": [ { "code": "qrcz", "name": "QR Platba", "logo_url": "" }, { "code": "ceskasporitelna", "name": "Česká spořitelna", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Aceskasporitelna.svg" }, { "code": "csob", "name": "ČSOB", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Acsob.svg" }, { "code": "komercnibanka", "name": "Komerční banka", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Akomercnibanka.svg" }, { "code": "raiffesenbank", "name": "Raiffesenbank", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Araiffesenbank.svg" }, { "code": "fiobanka", "name": "Fio banka", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Afiobanka.svg" }, { "code": "monetamoneybank", "name": "MONETA Money Bank", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Amonetamoneybank.svg" }, { "code": "airbank", "name": "AirBank", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Aairbank.svg" }, { "code": "mbank", "name": "mBank", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Acz%3Ambank.svg" }, { "code": "postacz", "name": "Česká Pošta", "logo_url": "" }, { "code": "unicredit", "name": "UniCredit", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Aunicreditbank.svg" }, { "code": "creditasbanka", "name": "Banka Creditas", "logo_url": "" }, { "code": "jtbanka", "name": "J&T Banka", "logo_url": "" } ] } }, "action": { "id": "ACT_Zk2AezTYFAe0rXfTt9EOFGYSeDyQCu", "type": "BANK_LIST", "time_created": "2025-05-28T15:38:37.157Z", "result_code": "SUCCESS", "app_id": "JtivfTN6wN6lPLDA0eiRlbuqIB5AkKl7", "app_name": "qa-cert-mindbody" } } ``` ### Step 2: Initiate the payment The first request is a Transaction Create. This is used to advise the payment method of the details of a new transaction and to retrieve the necessary information required to facilitate authentication. In this example, we set up a Bank Payment transaction. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Accept: application/json' \ --header 'Accept-Encoding: gzip' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxx' \ --data '{ "merchant_id": "", "account_id": "TRA_08e5bac604xxxx96ad0d623fbba", "channel": "CNP", "capture_mode": "AUTO", "type": "SALE", "amount": "1000", "currency": "CZK", "country": "CZ", "reference": "59016331", "payment_method": { "name": "Jane", "entry_mode": "ECOM", "apm": { "provider": "bank_payment" }, "bank_transfer": { "bank": { "name": "mbank" } } }, "payer": { "country": "CZ", "email": "" }, "notifications": { "return_url": "https://webhook.site/d76a62ef-4bd1-4a96-b8e2-ef0ea00fd2d4", "status_url": "https://webhook.site/d76a62ef-4bd1-4a96-b8e2-ef0ea00fd2d4", "cancel_url": "https://webhook.site/d76a62ef-4bd1-4a96-b8e2-ef0ea00fd2d4" } }' ``` #### Sample response ```json { "id": "TRN_DN2r7jVy0PGO0qsrct3l3Dj_59016331", "time_created": "2025-04-22T15:42:23.145Z", "type": "SALE", "status": "INITIATED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1000", "currency": "CZK", "country": "CZ", "merchant_id": "MER_461194d8057xxxx08ca360ea8270", "merchant_name": "Sandbox_Merchant", "account_id": "TRA_08e5bac604xxxx96ad0d623fbba", "account_name": "Open_Banking_account", "reference": "59016331", "payment_method": { "result": "01", "message": "PENDING", "entry_mode": "ECOM", "provider_narrative": "", "apm": { "redirect_url": "https://merch-prod.snd.sample.com/info/?orderId=1ZPR16BCPG250422GUEST000P01&token=eyJhbGciOiJIUzI1NiJ9.eyJvcmRlcklkIjoiMVpQUjE2QkNQRzI1MDQyMkdVRVNUMDAwUDAxIiwicG9zSWQiOiI4NXdrMTZNSSIsImF1dGhvcml0aWVzIjpbIlJPTEVfQ0xJRU5UIl0sImV4cCI6MTc0NTQyMjk0MSwiaXNzIjoiUEFZVSIsImF1ZCI6ImFwaS1nYXRld2F5Iiwic3ViIjoiUGF5VSBzdWJqZWN0IiwianRpIjoiMTk3ZWEwNDItNzk2Mi00ZjUwLTg2MGYtZTZjMWMxYjU0MGUyIn0.1sPGsu9IrcQdLSzw-BWDhG3ekNREM9s8qFcUISyjxuw", "provider": "bank_payment", "provider_payer_name": "Jane", "wait_notification": "", "fund_status": "", "optional_redirect": "", "bank": { "account_number": "", "iban": "", "identifier_code": "", "name": "", "code": "" }, "mandate": { "reference": "" } } }, "platforms": [ { "type": "ECOM", "transaction_id": "", "order_id": "TRN_DN2r7jVy0PGO0qsrct3l3Dj_59016331", "authcode": "", "pasref": "17453365403079031000000" } ], "payer": { "country": "CZ", "email": "" }, "batch_id": "", "action": { "id": "ACT_DN2r7jVy0PGO0qsrcsc95En", "type": "INITIATE", "time_created": "2025-04-22T15:42:23.145Z", "result_code": "SUCCESS", "app_id": "p2GgW0PntEU4qXhJHPoDqj", "app_name": "Test_App" } } ``` ### Step 3: Redirect to the payment method Following a successful initiation of the transaction, the next step is to redirect the customer to their bank to facilitate authentication and authorization. This can be achieved in a couple of ways. For example, you could use a simple JavaScript redirect as shown below, or an HTTP GET (302 redirect). #### Sample code ```HTML Sample APM Redirect ``` Once the customer completes their transaction with the payment method, they are redirected to the Return URL of the initial request. The current status of the transaction will also be returned. Your application might put the customer on hold for a few seconds while it checks to see if the Status URL was sent a final update. You can then redirect the customer to a final success or failure page. ### Step 4: Receive the final status The URL specified in the Status URL element in the initial request will receive the final status. Depending on the payment method used, this can happen at the same time as the customer is redirected to your Return URL or within moments. It's also possible that the final status update might come days later. When you receive the final status update, you may want to send the customer a status notification to indicate that the payment was finally accepted. At this point, you can begin the process of shipping the purchased items to the customer. #### Sample status update ```json { "id":"TRN_DN2r7jVy0PGO0qsrct3l3Dj_59016331", "time_created":"2024-01-15T13:17:21.914Z", "type":"SALE", "status":"CAPTURED", "channel":"CNP", "capture_mode":"AUTO", "amount":"1000", "currency":"CZK", "country":"CZ", "merchant_id": "MER_461194d8057xxxx08ca360ea8270", "merchant_name": "Sandbox_Merchant", "account_id": "TRA_08e5bac604xxxx96ad0d623fbba", "account_name": "Open_Banking_account", "reference":"59016331", "payment_method":{ "result":"00", "message":"SUCCEEDED", "entry_mode":"ECOM", "apm":{ "provider":"ob", "wait_notification":"", "fund_status":"NOT_EXPECTED", "payment_description":"3K1TRQQ", "confirmed_accountholder":"Former Glory", "account_number":"93722", "iban":"DE2570025xxxxxxxxxxxx", "bank_identifier_code":"xxxxxxxx", "bank_name":"xxxxxxxxx", "bank_address":"", "optional_redirect":"" } }, "batch_id":"", "action":{ "id":"ACT_mkP7xm9u47kLgTwTKhYfQXwjP", "type":"STATUS_NOTIFICATION", "time_created":"2020-04-20T14:36:58.193Z", "result_code":"SUCCESS", "app_id":"p2GgW0PntEU4qXhJHPoDqj", "app_name":"Test_App" } } ``` #### HPP ## Learn how to display Bank Payment on your Hosted Payment Page Alternative payment methods (APMs) available on your account can be displayed on the Hosted Payment Page (HPP). In this guide, we show you how they appear by default and how to display only those available in certain countries or ones that you consider most relevant to the customer. ### How they display By default, the HPP displays whatever APMs are available on your account. In addition, it displays only those payment methods that are available in the country submitted in the `order.transaction_configuration.country` field. ![Only methods available in the country submitted are displayed.](https://developer.globalpayments.com/gh-assets/bankpayment_cz1_bankovni.png) **Bank Payment “Bankovní Platba” on HPP** To present the most relevant payment methods to your customer, you can pre-select one or more in the request. To do this, include the optional `allowed_payment_methods` field. #### Sample request ```json curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2024-12-22' \ --header 'Authorization: Bearer bBj5Bv4RN1hxxxxxxxxxxx' \ --data-raw '{ "account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-5d9d-area-aeea-51b3fsas046a", "payer": { "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "48", "subsriber_number": "1801555888" }, "billing_address": { "line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Prague", "postal_code": "48", "country": "CZ" } }, "order": { "amount": "1000", "currency": "CZK", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "CZ", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD", "BANK_PAYMENT", ] }, "payment_method_configuration": { "authentications": { "preference": "CHALLENGE_PREFERRED" } } }, "notifications": { "return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url" } }' ``` #### Sample response ```json { "id": "LNK_ysoCziB7OG5rHMhhZ3eLUAIz3mQ7RG", "account_name": "transaction_processing", "url": "https://apis.sandbox.globalpay.com/ucp/hpp/redirect/518944c2-8e06-48e9-b153-cc31b65d25b9", "status": "ACTIVE", "type": "HOSTED_PAYMENT_PAGE", "usage_mode": "SINGLE", "usage_limit": "1", "name": "Mobile Bill Payment", "description": "February and March Invoice", "expiration_date": "2025-04-05T11:12:25.254Z", "order": { "amount": "1000", "currency": "CZK", "reference": "123456789", "transaction_configuration": { "country": "CZ", "channel": "CNP" } }, "action": { "id": "ACT_ysoCziB7OG5rHMhhZ3eLUAIz3mQ7RG", "type": "LINK_CREATE", "time_created": "2025-04-04T11:12:25.254Z", "result_code": "SUCCESS", "app_id": "p2GgW0PntEUiUh4qXhJHPoDqj3G5GFGI", "app_name": "UCP_Test_Automation_App" } } ``` ### Bank selection Bank Payment allows consumers to select their bank directly from our Hosted Payment Page to make an Open Banking payment. Adding bank selection to the HPP means consumers would be redirected to their selected bank. Selecting the tabs for different payment methods allows the user to view the list of banks presented as buttons. Once the bank is selected the consumer is then redirected to the bank environment to log in and push the payment. ![Only methods available in the country submitted are displayed.](https://developer.globalpayments.com/gh-assets/bankpayment_cz1_bankovni.png) **Bank Payment “Bankovní Platba” on HPP** Once the customer clicks on “Bankovní Platba” all the available banks are populated, once the bank is selected then the customer is redirected to the bank application. ![Bank payments displayed to the customer.](https://developer.globalpayments.com/gh-assets/bankpayment_cz2_allbanks.png) **Bank Payment “Bankovní Platba” on HPP** ### Status handling #### Endpoints Once you have a Global Payments Client ID, you can send transactions to the following URL endpoints: | **Environment** | **URL** | | ---- | ---- | | Sandbox | [https://apis.sandbox.globalpay.com/ucp/transactions](https://apis.sandbox.globalpay.com/ucp/transactions) | | Production | [https://apis.globalpay.com/ucp/transactions](https://apis.globalpay.com/ucp/transactions) | > For Production, we only accept transactions from IP addresses on your account's allow list. Your Global Payments account manager can assist you with setting this up. Even if your Client ID has been set to Live, you can still send transactions to the Sandbox environment — just target the Sandbox URL. #### Results codes | **Code** | **Description** | **Status** | | ---- |---- | ---- | | 200 | OK | This represents a successful API action. | | 400 | Bad Request | Error: The API request has an error in it. | | 401 | Not Authenticated | Error: Cannot authenticate with those credentials. Need to get a new access token. | | 403 | Forbidden | Error: No permission to execute that API action. | | 404 | Resource Not Found | Error: The resource referenced in the request cannot be found. | | 405 | Method Not Allowed | Error: The HTTP request method is not supported for the requested resource. | | 409 | Duplicate | Error: The API request was blocked because it was seen as a duplicate action that must not be processed. | | 500 | Internal Server Error | Error: Something unexpected happened. | | 502 | Bad Gateway | Error: Something unexpected happened when communicating with another system. | | 504 | Timeout | Error: The API did not get a response from another system in the expected timeframe. | #### Drop-In UI ## Learn how to integrate Bank Payment with our Drop-In UI In this guide, we'll show you how to integrate Bank Payment with our Drop-In User Interface (UI) – a ready-made payment form using our Hosted Fields solution. You’ll learn how to add Bank Payment to your payment form using our JavaScript Library. ### Prerequisites * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ### Step 1: Configure with Bank Payment Once you’ve created the access token, you can now configure the JavaScript Library to enable Bank Payment in your payment form. Add a `
` tag to render the Drop-In UI payment form to the customer. ```HTML
``` Next, configure your JavaScript Library with the transaction details required for Bank Payment. ```JavaScript GlobalPayments.configure({ accessToken: "WbTexlzWGcekOaTl3fkqkAW6Lfr4", env: "sandbox", apiVersion: "2023-03-22", language: "en", orderInformation: { merchantName: "Test Merchant Name", orderTotalAmount: "19.99", orderReference: "order-1234", currencyCode: "CZK", }, apms: { currencyCode: "CZK", countryCode: "CZ", acquirer: “erstecz”, nonCardPayments: { allowedPaymentMethods: [{ provider: GlobalPayments.enums.ApmProviders.OpenBanking, }] } } }); ``` ![Drop-In UI with Bank Payment button (Czech Republic).](https://developer.globalpayments.com/gh-assets/bankpayment_cz_drop-in-ui.png) **Drop-In UI with Bank Payment button (Czech Republic)** #### JavaScript configuration (Bank Payment-specific parameters) > “Type” indicates whether the element is Mandatory (M), Optional (O), or Conditional (C) – dependent on another field or regional requirement. | **Name** | **Format** | **Type** | **Description** | | -------- | ------- | -------- | ------- | | currencyCode | string | M | Currency of the amount in ISO-4217 (alpha-3). Czech Republic = CZK | | countryCode | string | M | The country in ISO-3166-1(alpha-2 code) format. Czech Republic = CZK | | provider | string | M | The string used to identify the payment method provider being used to execute this transaction. | | acquirer | string | M | The string used to identify the acquirer being used to execute this transaction: erstecz (CZ) | ### Step 2: Capture customer selection Now that we have configured Bank Payment and it's displayed on the Drop-In UI, when a customer selects Bank Payment as the payment method, the Drop-In UI returns this selection in an event. For example, the Drop-In UI returns: *Selected provider: OpenBanking*. Below is the code snippet of how the Drop-In UI returns this event. ```JavaScript cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const { provider, countryCode, currencyCode, bankName, acquirer } = paymentProviderData; console.log('Selected provider: ' + provider); ... //continued in Step 4 - Redirect customer to payment method ``` ### Step 3: Initiate the Bank Payment transaction Now that we know what payment method the customer has selected, we can initiate the transaction. We create a transaction request with the payment method provider and include the transaction information in the request. This returns the necessary details required to facilitate authentication. The response contains a specific URL that is passed to the Drop-In UI to redirect the customer. A successful transaction request returns a unique transaction identifier (`TRN_ID`) and a redirect URL, which you’ll use to facilitate the customer confirmation of the transaction ([Step 4](#step-4-redirect-customer-to-payment-method) ). #### Sample request ```json { "account_name": "Transaction_Processing", "channel": "CNP", "amount": "1999", "type": "SALE", "currency": "CZK", "reference": "APM-20200417", "country": "CZ", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "apm": { "provider": "ob" }, "Bank_transfer": { "bank": { "name": "unicredit" } } }, "notifications": { "return_url": "", "status_url": "" } }' ``` #### Sample response ```json { "id": "TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM", "time_created": "2024-01-15T13:17:21.914Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "CZK", "country": "CZ", "merchant_id": "MER_c4c0df11039xxxx9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854axxxx3347043ff8225f", "account_name": "Transaction_Processing", "reference": "APM-20200417", "payment_method": { "result": "00", "message": "SUCCEEDED", "entry_mode": "ECOM", "apm": { "provider": "ob", "wait_notification": "", "fund_status": "NOT_EXPECTED", "payment_description": "3K1TRAA", "confirmed_accountholder": "Former Glory", "account_number": "93722", "iban": "DE25700251750xxxx05970", "bank_identifier_code": "HYVxxxxM643", "bank_name": "xxxxxxxxxx", "bank_address": "", "optional_redirect": "" } }, "batch_id": "", "action": { "id": "ACT_mkP7xm9u47kLgTwTKhYfQXRvfynwjP", "type": "STATUS_NOTIFICATION", "time_created": "2020-04-20T14:36:58.193Z", "result_code": "SUCCESS", "app_id": "jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name": "sample_app" } } ``` ### Step 4: Redirect customer to payment method The next step is to redirect the customer to the payment method using the URL provided in the response field of the previous step (`payment_method.redirect_url`) to facilitate authentication with the payment method. To do this, we pass the `redirect_url` returned in the response to the Drop-In UI. #### Sample redirect ```JavaScript cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const { provider, countryCode, currencyCode, bankName } = paymentProviderData; console.log('Selected provider: ' + provider); if (provider === GlobalPayments.enums.ApmProviders.OpenBanking && !bankName) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "", countryCode, currencyCode, } }); window.dispatchEvent(merchantCustomEventProvideDetails); } else if (bankName) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "", bankName } }); window.dispatchEvent(merchantCustomEventProvideDetails); } }); ``` Once the customer completes the transaction with the payment method, the customer is redirected to the Return URL of the initial request. The current status of the transaction will also be returned. ### Step 5: Receive the final status The URL specified in the Status URL element in the initial request will receive the final status. Depending on the payment method used, this can happen at the same time as the customer is redirected to your Return URL or within moments. It's also possible that the final status update might come days later. When you receive the final status update, you may want to send the customer a status notification to indicate that the payment was finally accepted. At this point, you can begin the process of shipping the purchased items to the customer. #### Sample status update ```json { "id": "TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM", "time_created": "2024-01-15T13:17:21.914Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "CZK", "country": "CZ", "merchant_id": "MER_c4c0df11039c48xxxx3701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969xxxx48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "APM-20200417", "payment_method": { "result": "00", "message": "SUCCEEDED", "entry_mode": "ECOM", "apm": { "provider": "ob", "wait_notification": "", "fund_status": "NOT_EXPECTED", "payment_description": "3K1TRAA", "confirmed_accountholder": "Former Glory", "account_number": "93722", "iban": "DE257002517503xxxxxxxx", "bank_identifier_code": "HYVxxxxM643", "bank_name": "xxxxxxxxxxxx", "bank_address": "", "optional_redirect": "" } }, "batch_id": "", "action": { "id": "ACT_mkP7xm9u47kLgTwTKhYfQXRvfynwjP", "type": "STATUS_NOTIFICATION", "time_created": "2020-04-20T14:36:58.193Z", "result_code": "SUCCESS", "app_id": "jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name": "sample_app" } } ``` # Bank Payment – Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/sk-overview.md Section: Payments Description: Learn about our solution for letting customers in Slovakia pay using their bank of choice ## What is Bank Payment? Bank Payment, also known as *Banková Platba* in Slovakia, is one of the leading bank-to-bank payment methods in Slovakia, providing fast, secure, and convenient payment solutions for businesses and consumers. In Slovakia, Bank Payment is widely integrated with ecommerce platforms, offering features like recurring payments and multi-currency support. It also provides advanced fraud prevention measures, making it a trusted choice for both merchants and customers throughout the region. Bank Payment’s combination of flexibility, security, and ease of use makes it a popular choice for businesses and customers alike. ### Key benefits for businesses * **Global and local reach**: Offers multi-currency support and local payment methods, helping businesses expand both locally and internationally. * **Fast and reliable**: Facilitates quick payment processing, reducing friction during checkout and improving conversion rates. * **Advanced security**: Implements robust fraud prevention tools and compliance with global standards like PCI DSS, ensuring secure transactions. ### Key benefits for customers * **Convenience**: Offers user-friendly interfaces and quick checkout options. * **Security**: Ensures secure transactions with encryption and fraud protection measures. * **Customer support**: Provides reliable assistance for payment-related issues. Existing and new merchants can easily access bank payment. It will appear as another payment option alongside alternative payment methods like cards, PayPal or any other local payment methods. ![Option for choosing Bankova Platba.](https://developer.globalpayments.com/gh-assets/logo_sk_bankova.png) **Payment method option.** ## Next steps Click on the cards below to explore the different options for working with Bank Payment. ### [Use our API](https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/sk-guide.md#api) Learn how to integrate Bank Payment using our API. ### [Show APM on your Host Payment Page](https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/sk-guide.md#hpp) Learn how to display Bank Payment on your Hosted Payment Page. ### [Integrate with our Drop-in UI](https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/sk-guide.md#drop-in) Learn how to integrate Bank Payment with our Drop-in UI, a ready-made payment form. # Bank Payment – Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/bank-payment/sk-guide.md Section: Payments Description: Learn how to let customers in Slovakia pay using their bank of choice ## What is Bank Payment? Bank Payment, also known as *Banková Platba*, is one of the leading bank-to-bank payment methods in Slovakia, providing fast, secure, and convenient payment solutions for businesses and consumers. In this guide, we offer three easy ways to integrate with our Bank Payment solution. Once integrated, Banková Platba will appear as another payment option alongside alternative payment methods like cards, PayPal or any other local payment methods. You can learn more about how to use these options by clicking on the tabs below. ![Option for choosing Bankova Platba.](https://developer.globalpayments.com/gh-assets/logo_sk_bankova.png) **Payment method option.** #### API ## Learn how to integrate with Bank Payment using our API In this guide, we'll show you how to set up the request, receive the response, and handle the transaction status to give you access to Bank Payment. At a high level, the majority of APMs work like this: 1) The customer initiates the payment, triggering the API call to redirect the customer to a screen that shows all payment method options. 2) When the customer chooses a payment method, the merchant receives the initial response while the customer is redirected back to the merchant's application or website. 3) Then the merchant's application or website receives the final status update from the payment method the customer chose. The diagram below illustrates the interaction between the customer, our API, and the merchant to use an alternative payment method. ![Diagram flow showing interaction between the customer, our API, and the merchant to use an alternative payment method.](https://developer.globalpayments.com/gh-assets/apm_flow.png) **Typical API Integration for Bank Payment** ### Prerequisites * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ### Step 1. Get a bank list Prior to initiating the payment call, the merchant will need to get a list of banks that are available based on the country so that the country and currency details can be sent in the initiation request. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/banks?payment_method=bank_payment&country=SK¤cy=EUR&account_id=TRA_24bfc3d8513142c8be754003c7c17059' \ --header 'Accept: application/json' \ --header 'Accept-Encoding: gzip' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer 8V81ra1cZCUtALpjKnrHu7udsrhA' ``` #### Sample response ```json { "total_record_count": 7, "current_page_size": 7, "merchant_id": "MER_28c5fce9exxxx95bb1a5125be4fc8f7a", "merchant_name": "UCP_Test_Automation_Merchant", "account_id": "TRA_24bfc3d851314xxxx754003c7c17059", "account_name": "Transaction_Processing", "filter": { "payment_method": "BANK_PAYMENT", "account_id": "TRA_24bfc3d851xxxxc8be754003c7c17059", "country": "SK", "currency": "EUR" }, "paging": { "page_size": 7, "page": 1, "order": "ASC", "order_by": "BANK_NAME" }, "payment_method": { "bank_transfer": { "banks": [ { "code": "qrsk", "name": "QR Platba", "logo_url": "" }, { "code": "slovenskasporitelna", "name": "Slovenská sporiteľňa", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Ask%3Aslovenskasporitelna.svg" }, { "code": "tatrabanka", "name": "Tatra banka", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Ask%3Atatrabanka.svg" }, { "code": "vubbanka", "name": "VÚB banka", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Ask%3Avubbanka.svg" }, { "code": "csob", "name": "ČSOB", "logo_url": "https://developer.globalpay.com/gh-assets/apms%3Agpe-ob%3Ask%3Acsob.svg" }, { "code": "viamo", "name": "Viamo", "logo_url": "" }, { "code": "365bank", "name": "365.bank", "logo_url": "" } ] } }, "action": { "id": "ACT_F6GOvlMVaWpcboZXwebfzCrQPNyLx3", "type": "BANK_LIST", "time_created": "2025-05-27T14:51:09.623Z", "result_code": "SUCCESS", "app_id": "p2GgW0PntEUiUh4qXhJHPoDqj3G5GFGI", "app_name": "UCP_Test_Automation_App" } } ``` ### Step 2: Initiate the payment The first request is a Transaction Create. This is used to advise the payment method of the details of a new transaction and to retrieve the necessary information required to facilitate authentication. In this example, we set up a Bank Payment transaction. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Accept: application/json' \ --header 'Accept-Encoding: gzip' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxx' \ --data '{ "merchant_id": "", "account_id": "TRA_24bfc3d851xxxxc8be754003c7c17059", "channel": "CNP", "capture_mode": "AUTO", "type": "SALE", "amount": "1000", "currency": "EUR", "country": "SK", "reference": "59016331", "payment_method": { "name": "Jane", "entry_mode": "ECOM", "apm": { "provider": "bank_payment" }, "bank_transfer": { "bank": { "name": "mbank" } } }, "payer": { "country": "SK", "email": "" }, "notifications": { "return_url": "https://webhook.site/d76a62ef-4bd1-4a96-b8e2-ef0ea00fd2d4", "status_url": "https://webhook.site/d76a62ef-4bd1-4a96-b8e2-ef0ea00fd2d4", "cancel_url": "https://webhook.site/d76a62ef-4bd1-4a96-b8e2-ef0ea00fd2d4" } }' ``` #### Sample response ```json { "id": "TRN_DN2r7jVy0PGO0qsrcsc95EnLt3l3Dj_59016331", "time_created": "2025-04-22T15:42:23.145Z", "type": "SALE", "status": "INITIATED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1000", "currency": "EUR", "country": "SK", "merchant_id": "MER_28c5fce9ebexxxxb1a5125be4fc8f7a", "merchant_name": "UCP_Test_Automation_Merchant", "account_id": "TRA_24bfc3d85131xxxxbe754003c7c17059", "account_name": "GPECOM_PAYU_APM_Transaction_Processing", "reference": "59016331", "payment_method": { "result": "01", "message": "PENDING", "entry_mode": "ECOM", "provider_narrative": "", "apm": { "redirect_url": "https://merch-prod.snd.payu.com/info/?orderId=1ZPR16BCPG250422GUEST000P01&token=eyJhbGciOiJIUzI1NiJ9.eyJvcmRlcklkIjoiMVpQUjE2QkNQRzI1MDQyMkdVRVNUMDAwUDAxIiwicG9zSWQiOiI4NXdrMTZNSSIsImF1dGhvcml0aWVzIjpbIlJPTEVfQ0xJRU5UIl0sImV4cCI6MTc0NTQyMjk0MSwiaXNzIjoiUEFZVSIsImF1ZCI6ImFwaS1nYXRld2F5Iiwic3ViIjoiUGF5VSBzdWJqZWN0IiwianRpIjoiMTk3ZWEwNDItNzk2Mi00ZjUwLTg2MGYtZTZjMWMxYjU0MGUyIn0.1sPGsu9IrcQdLSzw-BWDhG3ekNREM9s8qFcUISyjxuw", "provider": "bank_payment", "provider_payer_name": "Jane", "wait_notification": "", "fund_status": "", "optional_redirect": "", "bank": { "account_number": "", "iban": "", "identifier_code": "", "name": "", "code": "" }, "mandate": { "reference": "" } } }, "platforms": [ { "type": "ECOM", "transaction_id": "", "order_id": "TRN_DN2r7jVy0PGO0qsrcsc95EnLt3l3Dj_59016331", "authcode": "", "pasref": "17453365403079031" } ], "payer": { "country": "SK", "email": "" }, "batch_id": "", "action": { "id": "ACT_DN2r7jVy0PGO0qsrcsc95EnLt3l3Dj", "type": "INITIATE", "time_created": "2025-04-22T15:42:23.145Z", "result_code": "SUCCESS", "app_id": "p2GgW0PntEUiUh4qXhJHPoDqj3G5GFGI", "app_name": "UCP_Test_Automation_App" } } ``` ### Step 3: Redirect to the payment method Following a successful initiation of the transaction, the next step is to redirect the customer to their bank to facilitate authentication and authorization. This can be achieved in a couple of ways. For example, you could use a simple JavaScript redirect as shown below, or an HTTP GET (302 redirect). #### Sample code ```HTML Sample APM Redirect ``` Once the customer completes their transaction with the payment method, they are redirected to the Return URL of the initial request. The current status of the transaction will also be returned. Your application might put the customer on hold for a few seconds while it checks to see if the Status URL was sent a final update. You can then redirect the customer to a final success or failure page. ### Step 4: Receive the final status The URL specified in the Status URL element in the initial request will receive the final status. Depending on the payment method used, this can happen at the same time as the customer is redirected to your Return URL or within moments. It's also possible that the final status update might come days later. When you receive the final status update, you may want to send the customer a status notification to indicate that the payment was finally accepted. At this point, you can begin the process of shipping the purchased items to the customer. #### Sample status update ```json { "id":"TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM", "time_created":"2024-01-15T13:17:21.914Z", "type":"SALE", "status":"CAPTURED", "channel":"CNP", "capture_mode":"AUTO", "amount":"1999", "currency":"EUR", "country":"SK", "merchant_id":"MER_c4c0df1103xxxxa9b63701adeaa296c3", "merchant_name":"Sandbox_merchant_2", "account_id":"TRA_671605896985xxxxb33347043ff8225f", "account_name":"Transaction_Processing", "reference":"APM-20200417", "payment_method":{ "result":"00", "message":"SUCCEEDED", "entry_mode":"ECOM", "apm":{ "provider":"ob", "wait_notification":"", "fund_status":"NOT_EXPECTED", "payment_description":"3K1TRAA", "confirmed_accountholder":"Former Glory", "account_number":"93722", "iban":"DE257002xxxxxxxxxxxx", "bank_identifier_code":"xxxxxxxx", "bank_name":"xxxxxxxx", "bank_address":"", "optional_redirect":"" } }, "batch_id":"", "action":{ "id":"ACT_mkP7xm9u47kLgTwTKhYfQXRvfynwjP", "type":"STATUS_NOTIFICATION", "time_created":"2020-04-20T14:36:58.193Z", "result_code":"SUCCESS", "app_id":"jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name":"sample_app" } } ``` #### HPP ## Learn how to display Bank Payment on your Hosted Payment Page Alternative payment methods (APMs) available on your account can be displayed on the Hosted Payment Page (HPP). In this guide, we show you how they appear by default and how to display only those available in certain countries or ones that you consider most relevant to the customer. ### How they display By default, the HPP displays whatever APMs are available on your account. In addition, it displays only those payment methods that are available in the country submitted in the `order.transaction_configuration.country` field. ![Only methods available in the country submitted are displayed.](https://developer.globalpayments.com/gh-assets/bankpayment_sk1_bankova.png) **Bank Payment “Banková Platba” on HPP** To present the most relevant payment methods to your customer, you can pre-select one or more in the request. To do this, include the optional `allowed_payment_methods` field. #### Sample request ```json curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2024-12-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7Vxxxxxxxxxxx' \ --data-raw '{ "account_name": "transaction_processing", "type": "HOSTED_PAYMENT_PAGE", "name": "Bill Payment", "description": "February and March Invoice", "reference": "82c2dbd5-549d-4967-aeea-51b3f320046a", "payer": { "name": "James Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "48", "subsriber_number": "1801555888" }, "billing_address": { "line_1": "Flat 456", "line_2": "House 456", "line_3": "Unit 4", "city": "Bratislava", "postal_code": "48", "country": "SK" } }, "order": { "amount": "1000", "currency": "EUR", "reference": "order-645", "transaction_configuration": { "channel": "CNP", "country": "SK", "capture_mode": "AUTO", "allowed_payment_methods": [ "CARD", "blik", "payu", ] }, "payment_method_configuration": { "authentications": { "preference": "CHALLENGE_PREFERRED" } } }, "notifications": { "return_url": "https://www.example.com/return_url", "status_url": "https://www.example.com/status_url" } }' ``` #### Sample response ```json { "id": "LNK_ysoCziB7OG5rHMhhZ3eLUAIz3mQ7RG", "account_name": "transaction_processing", "url": "https://apis-sit.globalpay.com/ucp/hpp/redirect/518944c2-8e06-48e9-b153-cc31b65d25b9", "status": "ACTIVE", "type": "HOSTED_PAYMENT_PAGE", "usage_mode": "SINGLE", "usage_limit": "1", "name": "Mobile Bill Payment", "description": "February and March Invoice", "expiration_date": "2025-04-05T11:12:25.254Z", "order": { "amount": "1000", "currency": "EUR", "reference": "123456789", "transaction_configuration": { "country": "SK", "channel": "CNP" } }, "action": { "id": "ACT_ysoCziB7OG5rHMhhZ3eLUAIz3mQ7RG", "type": "LINK_CREATE", "time_created": "2025-04-04T11:12:25.254Z", "result_code": "SUCCESS", "app_id": "p2GgW0PntEUiUh4qXhJHPoDqj3G5GFGI", "app_name": "UCP_Test_Automation_App" } } ``` ### Bank selection Bank Payment allows consumers to select their bank directly from our Hosted Payment Page to make an Open Banking payment. Adding bank selection to the HPP means consumers would be redirected to their selected bank. Selecting the tabs for different payment methods allows the user to view the list of banks presented as buttons. Once the bank is selected the consumer is then redirected to the bank environment to log in and push the payment. ![Only methods available in the country submitted are displayed.](https://developer.globalpayments.com/gh-assets/bankpayment_sk1_bankova.png) **Bank Payment “Banková Platba” on HPP** Once the customer clicks on “Bankovní Platba” all the available banks are populated, once the bank is selected then the customer is redirected to the bank application. ![Bank payments displayed to the customer.](https://developer.globalpayments.com/gh-assets/bankpayment_sk2_allbanks.png) **Bank Payment “Banková Platba” on HPP** ### Status handling #### Endpoints Once you have a Global Payments Client ID, you can send transactions to the following URL endpoints: | **Environment** | **URL** | | ---- | ---- | | Sandbox | [https://apis.sandbox.globalpay.com/ucp/transactions](https://apis.sandbox.globalpay.com/ucp/transactions) | | Production | [https://apis.globalpay.com/ucp/transactions](https://apis.globalpay.com/ucp/transactions) | > For Production, we only accept transactions from IP addresses on your account's allow list. Your Global Payments account manager can assist you with setting this up. Even if your Client ID has been set to Live, you can still send transactions to the Sandbox environment — just target the Sandbox URL. #### Results codes | **Code** | **Description** | **Status** | | ---- |---- | ---- | | 200 | OK | This represents a successful API action. | | 400 | Bad Request | Error: The API request has an error in it. | | 401 | Not Authenticated | Error: Cannot authenticate with those credentials. Need to get a new access token. | | 403 | Forbidden | Error: No permission to execute that API action. | | 404 | Resource Not Found | Error: The resource referenced in the request cannot be found. | | 405 | Method Not Allowed | Error: The HTTP request method is not supported for the requested resource. | | 409 | Duplicate | Error: The API request was blocked because it was seen as a duplicate action that must not be processed. | | 500 | Internal Server Error | Error: Something unexpected happened. | | 502 | Bad Gateway | Error: Something unexpected happened when communicating with another system. | | 504 | Timeout | Error: The API did not get a response from another system in the expected timeframe. | #### Drop-In UI ## Learn how to integrate Bank Payment with our Drop-In UI In this guide, we'll show you how to integrate Bank Payment with our Drop-In User Interface (UI) – a ready-made payment form using our Hosted Fields solution. You’ll learn how to add Bank Payment to your payment form using our JavaScript Library. ### Prerequisites * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ### Step 1: Configure with Bank Payment Once you’ve created the access token, you can now configure the JavaScript Library to enable Bank Payment in your payment form. Add a `
` tag to render the Drop-In UI payment form to the customer. ```HTML
``` Next, configure your JavaScript Library with the transaction details required for Bank Payment. ```JavaScript GlobalPayments.configure({ accessToken: "WbTexlzWGcekOaTl3fkqkAW6Lfr4", env: "sandbox", apiVersion: "2023-03-22", language: "en", orderInformation: { merchantName: "Test Merchant Name", orderTotalAmount: "19.99", orderReference: "order-1234", currencyCode: "EUR", }, apms: { currencyCode: "EUR", countryCode: "SK", acquirer: “erste”, nonCardPayments: { allowedPaymentMethods: [{ provider: GlobalPayments.enums.ApmProviders.OpenBanking, }] } } }); ``` ![Drop-In UI with Bank Payment button (Slovakia).](https://developer.globalpayments.com/gh-assets/bankpayment_sk_drop-in-ui.png) **Drop-In UI with Bank Payment button (Slovakia)** #### JavaScript configuration (Bank Paymentspecific parameters) > “Type” indicates whether the element is Mandatory (M), Optional (O), or Conditional (C) – dependent on another field or regional requirement. | **Name** | **Format** | **Type** | **Description** | | -------- | ------- | -------- | ------- | | currencyCode | string | M | Currency of the amount in ISO-4217 (alpha-3). Slovakia = EUR | | countryCode | string | M | The country in ISO-3166-1(alpha-2 code) format. Slovakia = SK | | provider | string | M | The string used to identify the payment method provider being used to execute this transaction | | acquirer | string | M | The string used to identify the acquirer being used to execute this transaction: erste (SK) | ### Step 2: Capture customer selection Now that we have configured Bank Payment and it's displayed on the Drop-In UI, when a customer selects Bank Payment as the payment method, the Drop-In UI returns this selection in an event. For example, the Drop-In UI returns: *Selected provider: OpenBanking*. Below is the code snippet of how the Drop-In UI returns this event. ```JavaScript cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const { provider, countryCode, currencyCode, bankName, acquirer } = paymentProviderData; console.log('Selected provider: ' + provider); ... //continued in Step 4 - Redirect customer to payment method ``` ### Step 3: Initiate the Bank Payment transaction Now that we know what payment method the customer has selected, we can initiate the transaction. We create a transaction request with the payment method provider and include the transaction information in the request. This returns the necessary details required to facilitate authentication. The response contains a specific URL that is passed to the Drop-In UI to redirect the customer. A successful transaction request returns a unique transaction identifier (`TRN_ID`) and a redirect URL, which you’ll use to facilitate the customer confirmation of the transaction ([Step 4](#step-4-redirect-customer-to-payment-method)). #### Sample request ```json { "account_name": "Transaction_Processing", "channel": "CNP", "amount": "1999", "type": "SALE", "currency": "EUR", "reference": "APM-20200417", "country": "SK", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "apm": { "provider": "ob" }, "Bank_transfer": { "bank": { "name": "unicredit" } } }, "notifications": { "return_url": "", "status_url": "" } }' ``` #### Sample response ```json { "id": "TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM", "time_created": "2024-01-15T13:17:21.914Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "SK", "merchant_id": "MER_c4c0df11039cxxxxb63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854xxxx33347043ff8225f", "account_name": "Transaction_Processing", "reference": "APM-20200417", "payment_method": { "result": "00", "message": "SUCCEEDED", "entry_mode": "ECOM", "apm": { "provider": "ob", "wait_notification": "", "fund_status": "NOT_EXPECTED", "payment_description": "3K1TRAA", "confirmed_accountholder": "Former Glory", "account_number": "93722", "iban": "DE257002517503xxxxxxxx", "bank_identifier_code": "HYxxxxMM643", "bank_name": "xxxxxxxxxxxx", "bank_address": "", "optional_redirect": "" } }, "batch_id": "", "action": { "id": "ACT_mkP7xm9u47kLgTwTKhYfQXRvfynwjP", "type": "STATUS_NOTIFICATION", "time_created": "2020-04-20T14:36:58.193Z", "result_code": "SUCCESS", "app_id": "jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name": "sample_app" } } ``` ### Step 4: Redirect customer to payment method The next step is to redirect the customer to the payment method using the URL provided in the response field of the previous step (`payment_method.redirect_url`) to facilitate authentication with the payment method. To do this, we pass the `redirect_url` returned in the response to the Drop-In UI. #### Sample redirect ```JavaScript cardForm.on(GlobalPayments.enums.ApmEvents.PaymentMethodSelection, paymentProviderData => { const { provider, countryCode, currencyCode, bankName } = paymentProviderData; console.log('Selected provider: ' + provider); if (provider === GlobalPayments.enums.ApmProviders.OpenBanking && !bankName) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "", countryCode, currencyCode, } }); window.dispatchEvent(merchantCustomEventProvideDetails); } else if (bankName) { const merchantCustomEventProvideDetails = new CustomEvent(GlobalPayments.enums.ApmEvents.PaymentMethodActionDetail, { detail: { provider, redirect_url: "", bankName } }); window.dispatchEvent(merchantCustomEventProvideDetails); } }); ``` Once the customer completes the transaction with the payment method, the customer is redirected to the Return URL of the initial request. The current status of the transaction will also be returned. ### Step 5: Receive the final status The URL specified in the Status URL element in the initial request will receive the final status. Depending on the payment method used, this can happen at the same time as the customer is redirected to your Return URL or within moments. It's also possible that the final status update might come days later. When you receive the final status update, you may want to send the customer a status notification to indicate that the payment was finally accepted. At this point, you can begin the process of shipping the purchased items to the customer. #### Sample status update ```json { "id": "TRN_JOGrqvzOvbLy4V2n7cHsusYy8aainM", "time_created": "2024-01-15T13:17:21.914Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "SK", "merchant_id": "MER_c4c0df110xxxx8a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_671605896xxxxa48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "APM-20200417", "payment_method": { "result": "00", "message": "SUCCEEDED", "entry_mode": "ECOM", "apm": { "provider": "ob", "wait_notification": "", "fund_status": "NOT_EXPECTED", "payment_description": "3K1TRAA", "confirmed_accountholder": "Former Glory", "account_number": "93722", "iban": "DE2570025xxxxx22205970", "bank_identifier_code": "HYVxxxxM643", "bank_name": "xxxxxxxxxxxx", "bank_address": "", "optional_redirect": "" } }, "batch_id": "", "action": { "id": "ACT_mkP7xm9u47kLgTwTKhYfQXRvfynwjP", "type": "STATUS_NOTIFICATION", "time_created": "2020-04-20T14:36:58.193Z", "result_code": "SUCCESS", "app_id": "jrYHwMdYRBDGmFwwAVmi5WufYzxuQIQj", "app_name": "sample_app" } } ``` # Thank You Points - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/loyalty/overview.md Section: Payments Description: Offer a loyalty scheme to your customers ## What is Thank you Points Loyalty? Thank you points is a popular in store Loyalty program offered in Mexico. With Thank You Points, eligible cardholders are able to acquire points and use them while making a purchase at a participating Merchants location. Our Thank You Points solution allows Merchants to participate in this loyalty program and offer this incentive to their customers. Benefits include increasing customer retention and enhanced brand awareness. With Thank You Points, cardholders can : - Use available Points to cover the full purchase amount - Use available Points to partially cover the full purchase amount - Use Discounts to lower Purchase amount ## Use cases In this section, we present some “real world” examples that can be enabled through the Thank You Points solution. Keep in mind that this section doesn’t cover all use cases. ### Use case \#1: Competing in a Crowded Market A clothing retail store competing with online fast-fashion brands wants to utilize a loyalty program to become more competitive. Using Thank You Points, the retailer can provide an incentive to customers to pay with their acquired points to provide a competitive edge in the market. ### Use case \#2: Offering Seasonal Rewards A Merchant wants to encourage customers to make purchases during off-peak seasons. With Thank You Points, they can offer discount rewards to customers during these seasons in order to increase sales. ### Use case \#3: Reaching New Customers A Merchant looking to expand their customer base can utilize Thank You Points as a way to reach a wide audience of eligible cardholders who can be converted to new customers. ## How does it work? The following illustrates how Thank You Points work at a high level : A customer provides a card to the Point of Sale (POS) system for a purchase. The POS then checks to see whether a card is eligible for Thank You Points, and then sends a request through the Global Payments API (GPAPI) to find and return any available rewards. The POS then prompts the customer to either pay with rewards or to proceed as a regular sale. If the customer chooses to pay using Thank You Points, the POS then sends a request to the GPAPI to redeem the points. A confirmation is then sent from the GPAPI to the POS. The GPAPI then processes an authorization for the remaining balance to the POS, and sends back a confirmation. The POS then completes the purchase and prints a receipt for the customer. ![Thank you flowchart](https://developer.globalpayments.com/gh-assets/loyalty.png) ## Eligibility Thank You Points is an Issuer based Loyalty Program and will only be eligible to cardholders within the following participating banks : - ScotiaBank Classic - ScotiaBank Classic Platinum - ScotiaBank Travel Black - ScotiaBank Travel Platinum - Banorte MC Clasica Internacional - Banorte MC ORO - Banorte MC Oro Banpais - Banorte MC Oro Mujer - Banorte POR Ti - Banorte TC AT&T Clásica - Banorte TC Clásica - Banorte TC Infinite - Banorte TC Oro - Banorte TC Platinum - Banorte Visa Clásica 2002 - Banorte VISA Clasica Banpais - Infinite Azteca - Beyond - Beyond (Socio Fundador) - Citi Premier - Citi Prestige - Citi Rewards - Aeromexico Blanca, Aeromexico Platino, Aeromexico Infnite - Flexcard, FR Clasica - FR Oro - FR Platino, Black Unlimited - Samsung / TDD digital - Santander AMEX - Santander Banca Privada - Santander Black - Santander Clásica Roja - Santander Credito - Santander Digitales - Santander Empresarial - Santander Free - Santander Junior - Santander Light - Santander Oro Tradicional - Santander Roja Tradicional - Santander Samsung - Santander TDC Tokenizado - Santander Universidades - Santander Zero - TDD Tokenizado - Tradicional Pon Tu Foto - World Elite / World Elite PB ## Next Steps Thank You Points is available to Merchants through our Standalone Terminals and Direct API Integration. For more information on how to get started with our [Standalone terminals](https://developer.globalpayments.com/docs/payments/in-store/standalone.md), please view our direct API integration, using the [guide](https://developer.globalpayments.com/docs/payments/payment-methods/loyalty/step-by-step.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from the My Account dashboard # Thank You Points - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/loyalty/step-by-step.md Section: Payments Description: Learn how to offer loyalty points to your customers In this guide you will learn how to integrate, redeem and use Points for a purchase. For more information on Thank You Points, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/loyalty/overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Check Points Balance This step takes in the customer's card and returns the available rewards they can use for a purchase. This will provide the number of points, the currency value of the points and any discounts if available. ### Sample request ```JSON { "account_id": "ESA_a1781985f3bb482ba18bcd1729ffea14", "transaction": { "amount": "2000" }, "payment_method": { "first_name": "Jane", "last_name": "Doe", "entry_mode": "ECOM", "card": { "number": "4391200100101497", "expiry_month": "12", "expiry_year": "25" } } } ``` ### Sample response ```JSON { "total_record_count": 1, "current_page_size": 1, "merchant_id": "MER_f910aa8af22a477d9208e17d4cbd2fbf", "merchant_name": "UCP_QA_Fidelity_Testing_Valid Merchant", "account_id": "ESA_a1781985f3bb482ba18bcd1729ffea14", "account_name": "Valid Testing account Fidelity", "filter": { "card.number_last4": "XXXXXXXXXXXX1497" }, "paging": { "page_size": 1, "page": 1, "order": "ASC", "order_by": "TIME_CREATED" }, "memberships": [ { "rewards": [ { "type": "POINTS", "count": "7271590.0", "currency_amount": "116345400" }, { "type": "DISCOUNT", "code": "10005", "description": "10% descuento en tus compras", "currency_amount": "200" } ] } ], "action": { "id": "ACT_9vggH7K48tMKtVqluVFyoM6FxkeOTe", "type": "MEMBERSHIP_LIST", "time_created": "2025-09-22T19:30:34.289Z", "result_code": "SUCCESS", "app_id": "dt8gykOQ8JiC06rDx1hcTTYYI9k1zAYg", "app_name": "Valid_app_for_Fidelity_testing" } } ``` ## Step 2: Redeem Points Once you have obtained the points balance, you can redeem the points for a specific transaction amount. This will deduct the customer's Points balance from their account. If Discounts are available, the discount will be applied first before the available points are used. This will return a unique Loyalty ID (LOR\_ID) ### Sample request ```JSON { "type": "REDEMPTION", "account_id": "ESA_a1781985f3bb482ba18bcd1729ffea14", "reference": "12345 ", "transaction": { "amount": "2000" }, "payment_method": { "first_name": "Jane", "last_name": "Doe", "entry_mode": "ECOM", "card": { "number": "4391200100101497", "expiry_month": "12", "expiry_year": "25" } } } ``` ### Sample response ```JSON { "id": "LOR_5625066", "type": "REDEMPTION", "status": "COMPLETE", "time_created": "2025-09-22T19:39:29.762Z", "time_last_updated": "2025-09-22T19:39:29.762Z", "currency_amount_redeemed": "2000", "points_redeemed": "113.0", "discount_amount_redeemed": "200", "transaction": { "amount": "2000" }, "rewards": [ { "count": "7271477.0", "currency_amount": "116343600", "type": "POINTS" } ], "action": { "id": "ACT_NEQlPtDKlyY2PgbEEm21sgKLwrz5kE", "type": "LOYALTY_ORDER_REDEEM", "time_created": "2025-09-22T19:39:29.762Z", "result_code": "SUCCESS", "app_id": "dt8gykOQ8JiC06rDx1hcTTYYI9k1zAYg", "app_name": "Valid_app_for_Fidelity_testing" } } ``` ## Step 3: Complete Transaction with Points Once the Points have been redeemed, you can now carry out the transaction with the points redemption details. If there is a remaining balance , this will be sent to the gateway to be authorized. It is important to note that the transaction amount has to be the full amount of the sale. ### Sample request ```JSON { "account_id": "TRA_de4056731241446fb82371a542439c74", "type": "SALE", "channel": "CP", "amount": "5000", "currency": "MXN", "country": "MX", "capture_mode": "AUTO", "reference": "TRANS-202300987623ee68", "description": "DESC-20098765927", "payment_method": { "first_name": "Jane", "last_name": "Doe", "entry_mode": "ECOM", "card": { "number": "4391200100101497", "expiry_month": "12", "expiry_year": "25" } }, "loyalty_order": { "redeem_id":"LOR_5625066" } } ``` ### Sample response ```JSON { "id": "TRN_6RYa1wY6lOdNzQfR0X2A1Uru1UF5Nj", "time_created": "2025-09-22T19:52:38.189Z", "type": "SALE", "status": "CAPTURED", "channel": "CP", "capture_mode": "AUTO", "amount": "3000", "currency": "MXN", "country": "MX", "merchant_id": "MER_f910aa8af22a477d9208e17d4cbd2fbf", "merchant_name": "UCP_QA_Fidelity_Testing_Valid Merchant", "account_id": "TRA_de4056731241446fb82371a542439c74", "account_name": "Portico Integration Fidelity Testing account", "reference": "TRANS-202300987623ee68", "payment_method": { "result": "00", "message": "APPROVAL", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX1497", "authcode": "VI5000", "brand_reference": "305265450007958", "provider": { "result": "00", "avs_result": "0" }, "commercial_level": "LEVEL_1" } }, "platforms": [ { "type": "PORTICO", "transaction_id": "643199666" } ], "batch_id": "BAT_1211205-44", "loyalty_order": { "redeem_id": "LOR_5625066", "redeem_status": "COMPLETE", "currency_amount_redeemed": "2000", "points_redeemed": "113.0", "discount_amount_redeemed": "200" }, "action": { "id": "ACT_6RYa1wY6lOdNzQfR0X2A1Uru1UF5Nj", "type": "AUTHORIZE", "time_created": "2025-09-22T19:52:38.189Z", "result_code": "SUCCESS", "app_id": "dt8gykOQ8JiC06rDx1hcTTYYI9k1zAYg", "app_name": "Valid_app_for_Fidelity_testing" } } ``` ## Step 4: Reverse Points Redemption Points Redemption can also be reversed resulting in the points balance being restored to the customer's account. If a Transaction with points is to be reversed, it is important to also reverse the points redemption. ### Sample request ```JSON { } ``` ### Sample response ```JSON { "id": "LOR_5625066", "type": "REDEMPTION", "status": "REVERSED", "action": { "id": "ACT_RVARByQtXgoactyFBcSRV8RLZBIcp8", "type": "LOYALTY_ORDER_REVERSE", "time_created": "2025-09-22T20:42:07.638Z", "result_code": "SUCCESS", "app_id": "dt8gykOQ8JiC06rDx1hcTTYYI9k1zAYg", "app_name": "Valid_app_for_Fidelity_testing" } } ``` ## Testing Thank You Points Our Thank You Points solution is available for testing in our Sandbox environment for registered users of this developer portal. Use our test cards to try different scenarios for your application to handle. For the full list of card numbers, see [Test Cards](https://developer.globalpayments.com/resources/test-cards.md). # Installments - Overview Source: https://developer.globalpayments.com/docs/payments/payment-methods/installments/overview.md Section: Payments Description: Offer Installment plans to customers ## What is the Installments feature? > This feature is currently only available in certain regions. For more information, check with your account manager. Our Installments solution allows Merchants to offer customers the option to pay for purchases over time in smaller, regular payments, rather than a single upfront payment. Eligible Customers can be offered installment plans that they can choose based on various conditions. Once a customer selects a plan and completes their purchase, the Merchant is paid in full and the customer is then charged for the subsequent amounts. Advantages of Installments include: * **Increased Sales & Conversion Rates** Customers are more likely to complete purchases, especially large ones, if they can spread the cost. * **Higher Average Order Value** By removing the barrier of a single large payment, customers can afford higher-priced items. * **Wider Customer Base** Attracts customers who may not have the funds for an immediate purchase or prefer the flexibility of installment payments. * **Improved Customer Experience** Offers a more convenient and flexible payment method that aligns with customer needs. ## Use cases Below are some “real world” examples that can be enabled through our Installments solution. Please note that these are examples and this does not cover all use cases. ### Use case \#1: * **Large Appliance Purchase:** A consumer buying a new refrigerator for $1,500 could choose a 6-month installment plan. This would break the cost into six equal payments, making the purchase more manageable for their budget. ### Use case \#2: * Seasonal Demand \- A merchant selling seasonal products can offer installment plans to help customers afford purchases during peak moments such as the holidays. This can drive urgency-based sales, improve customer satisfaction and increase revenue ### Use case \#3: * **Subscription Upgrades and Add Ons** \- A Merchant offering an online education platform can provide installment plans for premium add-ons. This allows customers to spread the cost over time which can increase the likelihood of upgrades and improve customer retention. ## How does it work? There are currently two Installment Services we offer today : 1. **Issuer \-Based Installments \-** These installment plans are agreed upon by the Merchant and issuers. If a cardholder meets the configured criteria, the eligible plans will be displayed for the customer to accept and complete their purchase. 2. **Visa Installments \-** Installments are offered by participating banks and are enabled by Visa. If a cardholder has an eligible Visa card and makes a qualifying purchase at a participating merchant, they will be presented with the option to choose an installment plan at checkout. The cardholder can then accept the terms and complete their purchase. Please be sure to check with your account manager for on which Installment service is available to you. > Note \- Merchants in Mexico can configure their installment plans on their [My Account Portal.](https://help.globalpayments.com/my-account/self-register) At a high level, all installments services will have the following flow: ![Installment flow](https://developer.globalpayments.com/gh-assets/installments/installment-flow.png) ## Next Steps To get started with Installments, see our [guide](https://developer.globalpayments.com/docs/payments/payment-methods/installments/step-by-step.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from the My Account dashboard. # Installments - Guide Source: https://developer.globalpayments.com/docs/payments/payment-methods/installments/step-by-step.md Section: Payments Description: Learn How to Offer Installments In this guide you will learn how to offer installment plans and make a charge using a selected plan For more information on Installments, see our [Overview](https://developer.globalpayments.com/docs/payments/payment-methods/installments/overview.md) #### API ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Installment Query First you will need to send a request to retrieve the eligible plans that are available to a customer. > **Note:** Availability of Installment plans is dependent on multiple factors such as the transaction amount, date, issuer etc. If Installment plans are not returned, then most likely the transaction did not meet the criteria for plans. * [Issuer-based Installments](https://developer.globalpayments.com/docs/payments/payment-methods/installments/step-by-step.md#issuer-based-installments) * [Visa Installments](https://developer.globalpayments.com/docs/payments/payment-methods/installments/step-by-step.md#visa-installments) ### Issuer-Based Installments ### Sample request ```json { "account_name": "transaction_processing", "channel": "CNP", "amount": "11099", "currency": "MXN", "country": "MX", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "payment_method": { "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "12", "expiry_year": "29" } } } ``` ### Sample response ```json { "id": "INS_6cFkx9FcSBwHDTzC6tN90KANILMzOj", "time_created": "2026-01-26T20:35:14.056Z", "type": "INSTALLMENT_QUERY", "status": "AVAILABLE", "channel": "CNP", "amount": "101", "currency": "MXN", "country": "MX", "merchant_id": "MER_20c2b3fcfedd484e9c3723347db56b71", "merchant_name": "UCP_Test_Automation_Merchant", "account_id": "TRA_89e47e02d3954f4c9999006e23b22375", "account_name": "IPP_Transaction_Processing_MP", "reference": "96be3927-c360-4c4d", "terms_and_conditions_url": "", "provider_image_url": "", "terms": [ { "reference": "33f7c8c8-61ec-4972-9395-6885f78d67a2", "name": "RD MWI Plan", "mode": "NO_INTEREST", "count": 3, "grace_period_count": 0 }, { "reference": "606d9d3c-49cc-44ae-8fed-a5f850dbfa05", "name": "ibukun_test", "mode": "NO_INTEREST", "count": 2, "grace_period_count": 0 }, { "reference": "6e5bb620-6263-4ab4-a00e-e01315905477", "name": "TEST Antoine", "mode": "BNPL", "count": 6, "grace_period_count": 2 }, { "reference": "85fa3383-ab2e-4b60-b30c-d3f4b3b57478", "name": "HSBC Diwali 02", "mode": "BNPL", "count": 5, "grace_period_count": 2 }, { "reference": "cf1610cf-2f2c-4f75-a7bb-8f45cd691fa5", "name": "New plan", "mode": "BNPL", "count": 9, "grace_period_count": 2 }, { "reference": "e061e99e-0283-4d2d-9125-8dd2de97b349", "name": "HSBC Diwali 03", "mode": "BNPL", "count": 5, "grace_period_count": 2 } ], "payment_method": { "entry_mode": "MOTO", "card": { "masked_number_last4": "XXXXXXXXXXXX5678", "expiry_month": "09", "expiry_year": "25", "funding": "DEBIT", "brand": "VISA", "issuer": "BBVA", "country": "MX", "currency": "MXN" } }, "action": { "id": "ACT_6cFkx9FcSBwHDTzC6tN90KANILMzOj", "type": "INSTALLMENT_QUERY", "time_created": "2026-01-26T20:35:14.056Z", "result_code": "SUCCESS", "app_id": "hkjrcsGDhWiDt8GEhoDMKy3pzFz5R0Bo", "app_name": "UCP_Test_Automation_App_1" } } ``` ### Visa Installments ### Sample Request ```json { "account_id": "TRA_ff583a33641544e4ae53a62315f9e843", "channel": "CNP", "amount": "50000", "currency": "GBP", "country": "GB", "reference": "96be3927-c360-4c4d-8ace-f53b20ec296f", "program": "VIS", "payment_method": { "usage_mode": "USE_CARD_NUMBER", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "brand": "VISA", "expiry_month": "09", "expiry_year": "25" } }, "funding_mode": "MERCHANT_FUNDED", "eligible_plans": "LIMITED", "terms": { "max_time_unit_number": 24, "max_amount": 100000 } } ``` ### Sample Response ```json { "id": "INS_XPhhl0RiQnbhfpZ0ieHKVsU7MTSRNg", "time_created": "2025-10-24T12:20:38.958Z", "type": "INSTALLMENT_QUERY", "status": "AVAILABLE", "channel": "CNP", "amount": "50000", "currency": "GBP", "country": "GB", "merchant_id": "MER_969b3cebc1664e7980f3a9a5226b3767", "merchant_name": "tokenizationmerchant777", "account_id": "TRA_ff583a33641544e4ae53a62315f9e843", "account_name": "VisaGunjanINS", "reference": "96be3927-c360-4c4d-8ace-f53b20ec296f", "program": "VIS", "terms": [ { "name": "plan12CnoAPR", "reference": "109bbbf5-c027-de5e-50c1-153dafa9ac06", "mode": "MARKET", "time_unit": "MONTH", "terms_and_conditions": [ { "url": "https://www.visa.co.uk/how-you-pay-matters/pay-instalments.html", "version": "5", "description": "You are selecting a 12-month installment plan. The total purchase amount will be deducted from your available credit limit. As set forth in your terms, your installment fee will be APR calculated for 12 months. If you miss an installment payment, the standard rate of purchases will apply to the remaining installment balance.", "language": "EN" }, { "url": "https://www.visa.co.uk/how-you-pay-matters/pay-instalments.html", "version": "5", "description": "Vous sélectionnez un plan de versement de 12 mois. Le montant total de l'achat sera déduit de votre limite de crédit disponible. Comme indiqué dans vos conditions, vos frais de versement seront APR calculés pour 12 mois. Si vous manquez un paiement échelonné, le taux standard des achats s'appliquera au solde restant du versement.", "language": "FR" } ], "count": 12, "cost_percentage": "0.00", "total_plan_cost": "54000", "plan_amount": "4163", "fees": { "fee_info": [ { "type": "MERCHANT_FUNDING", "interest_rate": "3.00", "flat_amount": "150" }, { "type": "MERCHANT_SERVICE", "interest_rate": "0.10", "flat_amount": "0" } ], "total_amount": "4000", "total_subsequent_amount": "4000", "subsequent_amount": "334", "total_upfront_amount": "0", "upfront_amount": "100000" }, "currency": "GBP" } ], "payment_method": { "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "expiry_month": "09", "expiry_year": "25" } }, "action": { "id": "ACT_XPhhl0RiQnbhfpZ0ieHKVsU7MTSRNg", "type": "INSTALLMENT_QUERY", "time_created": "2025-10-24T12:20:38.958Z", "result_code": "SUCCESS", "app_id": "WBLHjFlm87vIQ3F9CdwUA704KGcP3uE8", "app_name": "DEV_ECOMvisaInsstllamentapp" } } ``` ## Step 2: Sale using Installments Once you have displayed the Installment plans to the consumer, you can now process a charge which includes the installment fields to process the Installment transaction. * [Issuer-based Installments](https://developer.globalpayments.com/docs/payments/payment-methods/installments/step-by-step.md#issuer-based-installments-1) * [Visa Installments](https://developer.globalpayments.com/docs/payments/payment-methods/installments/step-by-step.md#visa-installments-1) ### Issuer-Based Installments ### Sample request ```json { "account_id": "TRA_37b072da4e5e436293dce254e95f69ee", "channel": "CNP", "capture_mode": "AUTO", "type": "SALE", "amount": "1000", "currency": "MXN", "country": "MX", "reference": "TRANS-202302271030111001", "payment_method": { "name": "Jane Doe", "entry_mode": "ECOM", "card": { "number": "4512971111111113", "expiry_month": "12", "expiry_year": "30", "cvv": "123" } }, "installment": { "id" : "INS_iiOG5yfxJQnGtopjFiOy5nVAc4vYS1", "reference" : "7533d4f7-6a10-5557-2e92-132d06157502" } ``` ### Sample response ```json { "id": "TRN_SK9cRUlnUYmyyxefWlmN39sRC5mNqj", "time_created": "2026-01-26T20:51:53.770Z", "time_last_updated": "2026-01-26T20:51:53.770Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "2000", "currency": "GBP", "country": "US", "merchant_id": "MER_1e4049f6f33145b2a5891332e9783bd9", "merchant_name": "UCP_Test_Automation_Merchant", "account_id": "TRA_1e0a2fdfd79d4013b87d47c4c43882f6", "account_name": "Portico_Transaction_Processing", "reference": "96be3927-c360-4c4d-8ace-f53b20ec296f", "payment_method": { "result": "00", "message": "APPROVAL", "entry_mode": "MOTO", "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX1112", "authcode": "VI2000", "brand_reference": "306026440007914", "brand_time_created": "", "issuer": "", "country": "", "currency": "", "provider": { "result": "00", "avs_result": "0" }, "commercial_level": "LEVEL_1" } }, "installment": { "id": "INS_QSTi1Rx1FVWN7WeI8PF4As9iUs7v0E", "program": "", "term": { "id": "", "time_unit": "", "time_unit_number": "", "interest_rate": "", "first_amount": "", "subsequent_amount": "", "last_amount": "", "total_amount": "" }, "mode": "MWI", "count": "1", "grace_period_count": "0" }, "batch_id": "BAT_1276709-38", "action": { "id": "ACT_SK9cRUlnUYmyyxefWlmN39sRC5mNqj", "type": "AUTHORIZE", "time_created": "2026-01-26T20:51:53.770Z", "result_code": "SUCCESS", "app_id": "hlZAokTftDazLlWDPe8E6VAz5g9rSDPg", "app_name": "UCP_Test_Automation_App" } } ``` ### Visa Installments ### Sample request ```json { "account_id": "TRA_37b072da4e5e436293dce254e95f69ee", "channel": "CNP", "capture_mode": "AUTO", "type": "SALE", "amount": "1000", "currency": "EUR", "country": "IE", "reference": "TRANS-202302271030111001", "payment_method": { "name": "Jane Doe", "entry_mode": "ECOM", "card": { "number": "4512971111111113", "expiry_month": "12", "expiry_year": "30", "cvv": "123" } }, "installment": { "id" : "INS_iiOG5yfxJQnGtopjFiOy5nVAc4vYS1", "reference" : "7533d4f7-6a10-5557-2e92-132d06157502", "terms" : } "language": "en" "version": "2" } } } ``` ### Sample Response ```json { "id": "TRN_AfauPfMZmR9NSpeSjkyEMqQ0pQcZt3_114123459878", "time_created": "2026-01-26T21:10:47.678Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100000", "currency": "GBP", "country": "GB", "merchant_id": "MER_20c2b3fcfedd484e9c3723347db56b71", "merchant_name": "UCP_Test_Automation_Merchant", "account_id": "TRA_1750765a32b34cdf9ecd5d0c643fc99a", "account_name": "GPECOM_Installments_Processing", "reference": "TRANS-20180114123459878", "payment_method": { "result": "00", "message": "[ test system ] Authorised", "entry_mode": "ECOM", "id": "PMT_9258ab95-cd99-4521-9840-584d2cc0f791", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX2828", "authcode": "123456", "brand_reference": "zvTXC2AYiHXmIZEC", "brand_time_created": "", "cvv_result": "NOT_CHECKED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "00", "cvv_result": "U", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "installment": { "id": "INS_0H2BJOVtcIOO2EelUokUWcdhoHcuZf", "program": "VIS", "count": "12" }, "platforms": [ { "type": "ECOM", "transaction_id": "", "order_id": "TRN_AfauPfMZmR9NSpeSjkyEMqQ0pQcZt3_114123459878", "authcode": "123456", "pasref": "1769461847235764" } ], "risk_assessment": [ { "mode": "ACTIVE", "result": "ACCEPTED", "rules": [ { "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd", "description": "Cardholder Name Rule", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3", "description": "CardNumber block", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e", "description": "Amount test", "mode": "ACTIVE", "result": "ACCEPTED" } ] } ], "batch_id": "BAT_1633946", "action": { "id": "ACT_AfauPfMZmR9NSpeSjkyEMqQ0pQcZt3", "type": "AUTHORIZE", "time_created": "2026-01-26T21:10:47.678Z", "result_code": "SUCCESS", "app_id": "hkjrcsGDhWiDt8GEhoDMKy3pzFz5R0Bo", "app_name": "UCP_Test_Automation_App_1" } } ``` #### HPP This guide focuses on adding the HPP to your application or website. After creating an access token, we set up the request to create a unique payment link. Using the HPP URL returned in the response, we then redirect the customer to facilitate authentication and authorization. After receiving the response and checking the transaction outcome, we then handle the redirect to your application’s appropriate successful or failed page. For an overview of the HPP, see our Overview page. To learn how to enable more value-added services to the HPP, see the Enhance your integration section. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Create the HPP URL First, we create a unique payment link using the Create Link request. This request also retrieves some necessary information to facilitate the redirect and authentication of the customer. Our sample request performs a standard card payment with 3D Secure and uses only mandatory and recommended fields (for the full list of HPP Link fields, see the table). It also includes information on API methods and request data. ### Sample request ```JSON curl 'https://apis.sandbox.globalpay.com/ucp/links' \ --header 'Connection: keep-alive' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'x-gp-version: 2021-03-22' \ --header 'Authorization: Bearer bBj5Bv4RoOz4xTJ7V5XtjLBHLN1h' \ --data-raw '{ { "account_name": "{{hpp}}", "type": "HOSTED_PAYMENT_PAGE", "name": "Mobile Bill Payment", "description": "Test Description", "reference": "{{reference}}", "payer": { "name": "James Mason", "first_name": "James", "last_name": "Mason", "language": "en", "email": "jamesmason@example.com", "mobile_phone": { "country_code": "44", "subscriber_number": "1801555888" }, "billing_address": { "line_1": "bill_street1", "line_2": "bill_street2", "line_3": "bill_street3", "city": "Bill_city", "postal_code": "44", "country": "IE" }, "address_match_indicator": "YES" }, "order": { "amount": "200000", "currency": "EUR", "reference": "{{reference}}", "transaction_configuration": { "channel": "CNP", "country": "GB", "capture_mode": "AUTO", "curreny_conversion_mode": "ON", "allowed_payment_methods": [ "CARD", "testpay" ] }, "payment_method_configuration": { "authentications": { "preference": "CHALLENGE_PREFERRED" } }, "shipping_address": { "line_1": "Flat 123", "line_2": "House 456", "line_3": "Btower", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "US" }, "shipping_phone": { "country_code": "99", "subscriber_number": "1801555999" } }, "installments": { "funding_mode": "CONSUMER_FUNDED", "terms": { "max_time_unit_number": "24", "max_amount": "100000" } }, "notifications": { "return_url": "https://example.com/Return", "status_url": "https://example.com/Status" } } ``` ### Request Syntax (Installments) | field | description | Enum / string | | :---- | :---- | :---- | | funding\_mode | Used to filter installment plans based on plan type. MERCHANT\_FUNDED (if sent, will return merchant funded plans only) CONSUMER\_FUNDED (if sent, will return consumer funded plans only) HYBRID\_FUNDED (if sent, will return both merchant and consumer funded plans) BILATERAL (if sent, will return BILATERAL plans only) ANY (if sent, will return all available plans) (default) Note: If not present, request will be sent with default value. | MERCHANT\_FUNDED CONSUMER\_FUNDED HYBRID\_FUNDED BILATERAL ANY | | terms.max\_time \_unit\_number terms.max\_amo unt | Used to retrieve installment plans with specific tenure. Applicable to merchant-funded plans only. Example: max\_term\_months\_merchant\_funded \= 12 — Means that only plans with tenure ≤ 12 months will be retrieved. Merchant-funded plans with tenure \> 12 months will not be returned. Default: 1000 Note: If not present, request will be sent with default value. Used to determine whether to return the longest or shortest tenure/duration plans depending on the amount sent. The amount should be sent in the smallest unit of the required currency. Example: 2000 \= €20.00 Ex value sent 50000 will mean that: For transactions with an amount less or equal than €500.00, the plans with the shortest tenure will be displayed first. For transactions with an amount greater than €500.00, the plans with the longest tenure will be displayed first. Note: If not present, request will be sent with default value: plans with the longest tenure. | String Min \- 1 Max \- 32 String Min \- 1 Max \- 11 | ### Sample response ```JSON { "id": "LNK_mdd0l2kNaKSoSXSEdLfPEoDnY9BykE", "account_name": "transaction_processing_hpp", "url": "https://apis.sandbox.globalpay.com/ucp/hpp/redirect/49f04248-1953-4028- b5c0-2a8cae690241", "status": "ACTIVE", "type": "HOSTED_PAYMENT_PAGE", "usage_mode": "SINGLE", "usage_limit": "1", "name": "Mobile Bill Payment", "description": "Test Description", "expiration_date": "2025-09-16T10:12:02.329Z", "order": { "amount": "200000", "currency": "EUR", "reference": "1234567ō", "transaction_configuration": { "country": "GB", "channel": "CNP" } }, "action": { "id": "ACT_mdd0l2kNaKSoSXSEdLfPEoDnY9BykE", "type": "LINK_CREATE", "time_created": "2025-09-15T10:12:02.329Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test" } } ``` ## Step 2: Redirect the customer Once the link is created, the customer must be redirected using the URL returned in the Create Pay by Link response to facilitate authentication and authorization. You can use a simple JavaScript redirect or HTTP GET (302 redirect). For information on API methods and request/response data, see Links in the API Explorer. In this example, you redirect the customer to the URL using JavaScript. ### Sample redirect ```html Sample Redirect ``` Once redirected to the URL, your customer will be presented with the HPP. ## Testing Installments Our Installments solution is available for testing in our Sandbox environment for registered users of this developer portal. Use our test cards to try different scenarios for your application to handle. For the full list of card numbers, see [Test Cards](https://developer.globalpayments.com/resources/test-cards.md). Valid amounts to get plans in the sandbox: 100000, 200000, 160000, 80000, 75000, 50000, 45000 # Manage Payments - Adjust Source: https://developer.globalpayments.com/docs/payments/manage-payments/adjust-guide.md Section: Payments Description: Learn how to adjust a bill to add a tip > This feature is only available for Customer Present transaction processing. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on sending an adjustment to add a tip to a card-present transaction. ## What is it? Tips, or gratuities, are common in North American restaurants and other service industries. They allow payers to add an additional amount to the transaction for excellent service provided by the merchant’s employees. ## How does it work? The main things to know about making an adjustment: * When processing adjustments, the status of the transaction, such as Pre-Authorized, does not change. * You can change the same transaction data (amount and EMV data) during a Capture request. However, that request will change the status of the transaction — for example, moving a transaction from Pre-Authorized to Captured. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Send an adjustment > Adjustments are available only for **card-present** transactions. To successfully send the command, you need the `trn_id` from the initial transaction. Adjustments can’t be made after the transaction is funded. #### Sample request ```json curl --compressed -X POST "https://apis.sandbox.globalpay.com/ucp/transactions/{id}/adjustment" \ -H "Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ" \ -H "X-GP-Version: 2021-03-22" \ -H "Content-type: application/json" \ -H "Accept: application/json" \ -d ‘{ "amount": "11099", "gratuity_amount": "11099", "payment_method": { "card": { "tag": "string" } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); try { Transaction transaction = Transaction.fromId("TRN_uhlhDZgs1P7jIXISu0AqEV0V1OoJHX"); String tagData = "9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001"; Transaction response = transaction.edit() .withTagData(tagData) .withAmount(new BigDecimal("11.09")) .withGratuity(new BigDecimal("11.09")) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Environment.TEST; config.RequestLogger = new RequestFileLogger(@"path\logname.txt"); ServicesContainer.ConfigureService(config); try { Transaction transaction = Transaction.FromId("TRN_uhlhDZgs1P7jIXISu0AqEV0V1OoJHX"); var tagData = "9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001"; var response = transaction.Edit() .WithAmount((decimal)10.01) .WithTagData(tagData) .WithGratuity((decimal)5.01) .Execute(); } catch (Exception e) { // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); try { $transaction = Transaction::fromId('TRN_uhlhDZgs1P7jIXISu0AqEV0V1OoJHX'); $tagData = '9F4005F000F0A0019F02060000000025009F03060000000000009F2608D90A06501B48564E82027C005F3401019F360200029F0702FF009F0802008C9F0902008C9F34030403029F2701809F0D05F0400088009F0E0508000000009F0F05F0400098005F280208409F390105FFC605DC4000A800FFC7050010000000FFC805DC4004F8009F3303E0B8C89F1A0208409F350122950500000080005F2A0208409A031409109B02E8009F21030811539C01009F37045EED3A8E4F07A00000000310109F0607A00000000310108407A00000000310109F100706010A03A400029F410400000001'; $response = $transaction->edit() ->withTagData($tagData) ->withAmount(11.09) ->withGratuity(11.09) ->execute(); } catch (GatewayException $ex){ // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response "id" $timeCreated = $response->timestamp; // API raw response "time_created" $status = $response->responseMessage; // API raw response "status" $amount = $response->balanceAmount; // API raw response "amount" $reference = $response->referenceNumber; // API raw response "reference" $batchId = $response->batchSummary->batchReference; // API raw response "batch_id" $authCode = $response->authorizationCode; // API raw response "payment_method.card.authcode" $brandReference = $response->cardBrandTransactionId; //API raw response "payment_method.card.brand_reference" $cardIssuerResponse = $response->cardIssuerResponse; //API raw response "payment_method.result" ``` #### Sample response ```json { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2026-05-03T21:23:39.718Z", "type": "SALE", "status": "CAPTURED", "amount": "11099", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "string", "message": "string", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "ADJUST", "time_created": "2026-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including adjustments. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Adjustments are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. # Batches - Guide Source: https://developer.globalpayments.com/docs/payments/manage-payments/batches-guide.md Section: Payments Description: Learn how to close batches and later review them > This feature is only available for Customer Present transaction processing. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on sending an API request to manually close a batch and researching a closed batch using the batch ID. ## What is it? Card-present transactions are managed in batches. Typically, a _batch_ of transactions is an entire business day for a merchant. A batch must be closed for transactions to be settled and funded. Depending on your region, our platform may automatically batch your daily transactions for you. However, in some regions, you may need to batch them yourself on your application. ## How does it work? The main things to know about batches: * Before implementing batches, check with your account manager for any specific market or platform requirements. * The `batch_id` is returned in all transaction responses and is required to submit a batch-close request. * The Batch ID is made up of three parts: * The resource identifier: BAT_ * Our batch ID – Not sequential, unique per terminal * Our batch sequence number – Sequential per terminal, starting at 001 and incrementing with each transaction * A financial transaction (for example, a sale or refund) will create a batch if one is not open. Non-financial commands, such as verify, will not open a batch. * Batch queries are limited to 90 days. * Batch size in all regions except Asia-Pacific is limited to 9,999. In Asia Pacific, the maximum batch size is 900 transactions. * The total combined amount of all transactions in a batch cannot exceed 9,999,999,999.99. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Send a batch-close request Body data is not necessary to close a batch, only the standard header data (including your valid access token). You can close the current batch by sending a POST command to the _/batches_ endpoint with the batch ID returned in every transaction. A successful batch close will return a status of `CLOSED`. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/batches/BAT_611718-215' \ --header 'Authorization: Bearer WVLzMsuEQzSEFfXX9D8tDl8t6YSG' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Content-Type: application/json' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardPresent); config.setEnvironment(Environment.TEST); String configName = "CONFIG_NAME"; ServicesContainer.configureService(config, configName); String batchReference = "BAT_1035455-218"; try { BatchSummary batchSummary = BatchService.closeBatch(batchReference, configName); // API raw response key "id" String batchId = batchSummary.getBatchReference(); // API raw response key "host_breakdown.getcount" Integer hostTotalCnt = batchSummary.getHostTotalCnt(); // API raw response key "host_breakdown.getamount" BigDecimal hostTotalAmt = batchSummary.getHostTotalAmt(); // API raw response key "device_reference" Integer processedDeviceId = batchSummary.getProcessedDeviceId(); // API raw response key "transaction_count" Integer transactionCount = batchSummary.getTransactionCount(); // API raw response key "amount" BigDecimal totalAmount = batchSummary.getTotalAmount(); // API raw response key "sales.getcount" Integer salesCount = batchSummary.getBatchTotals().getSalesCount(); // API raw response key "sales.getamount" BigDecimal salesAmount = batchSummary.getBatchTotals().getSaleAmount(); // API raw response key "refunds.getcount" Integer refundsCount = batchSummary.getBatchTotals().getRefundsCount(); // API raw response key "refunds.getamount" BigDecimal refundsAmount = batchSummary.getBatchTotals().getRefundsAmount(); // API raw response key "funding_debit.getcount" Integer fundingDebitCount = batchSummary.getBatchTotals().getFundingDebitCount(); // API raw response key "funding_credit.getcount" Integer fundingCreditCount = batchSummary.getBatchTotals().getFundingCreditCount(); // API raw response key "funding_debit.getamount" BigDecimal fundingDebitAmount = batchSummary.getBatchTotals().getFundingDebitAmount(); // API raw response key "funding_credit.getamount" BigDecimal fundingCreditAmount = batchSummary.getBatchTotals().getFundingCreditAmount(); // API raw response key "brand_breakdown" HashMap brandBreakdown = batchSummary.getBrandBreakdown(); return; } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "appID"; config.AppKey = "appKey"; config.Channel = Channel.CardPresent; ServicesContainer.ConfigureService(config); var batchSummary = BatchService.CloseBatch("BAT_933340-213"); var status = batchSummary.Status; //CLOSED ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $batchReference = 'BAT_1017430-723'; try { $batch = BatchService::closeBatch($batchReference); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } /** @var \GlobalPayments\Api\Entities\BatchSummary $batchSummary */ $batchSummary = $batch->batchSummary; $batchId = $batchSummary->id; // API raw response key "id" $hostTotalCnt = $batchSummary->hostTotalCnt; // API raw response key "host_breakdown->count" $hostTotalAmt = $batchSummary->hostTotalAmt; // API raw response key "host_breakdown->amount" $processedDeviceId = $batchSummary->processedDeviceId; // API raw response key "device_reference" $transactionCount = $batchSummary->transactionCount; // API raw response key "transaction_count" $totalAmount = $batchSummary->totalAmount; // API raw response key "amount" $salesCount = $batchSummary->batchTotals->salesCount; // API raw response key "sales->count" $salesAmount = $batchSummary->batchTotals->saleAmount; // API raw response key "sales->amount" $refundsCount = $batchSummary->batchTotals->refundsCount; // API raw response key "refunds->count" $refundsAmount = $batchSummary->batchTotals->refundsAmount; // API raw response key "refunds->amount" $fundingDebitCount = $batchSummary->batchTotals->fundingDebitCount; // API raw response key "funding_debit->count" $fundingCreditCount = $batchSummary->batchTotals->fundingCreditCount; // API raw response key "funding_credit->count" $fundingDebitAmount = $batchSummary->batchTotals->fundingDebitAmount; // API raw response key "funding_debit->amount" $fundingCreditAmount = $batchSummary->batchTotals->fundingCreditAmount; // API raw response key "funding_credit->amount" $brandBreakdown = $batchSummary->brandBreakdown; // API raw response key "brand_breakdown" ``` #### Sample response ```JSON { "id": "BAT_933340-213", "status": "CLOSED", "time_created": "2024-01-31T13:33:00Z", "time_last_updated": "2024-01-31T18:08:29.307Z", "time_closed": "2024-01-31T18:08:00Z", "open_action_id": "1945288291", "close_action_id": "ACT_nwmrHEmZ7iT94n1pwkPCCuS17gzhh9", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "site_reference": "140271", "device_reference": "514", "transaction_count": 48, "amount": "31396", "currency": "USD", "gratuity_amount": "100", "sales": { "count": 36, "amount": "45012" }, "refunds": { "count": 12, "amount": "-13616" }, "funding_debit": { "count": 0, "amount": "0" }, "funding_credit": { "count": 48, "amount": "31396" }, "brand_breakdown": [ { "brand": "MASTERCARD", "count": 1, "amount": "100", "gratuity_amount": "0", "sales": { "count": 1, "amount": "100" }, "refunds": { "count": 0, "amount": "0" }, "funding_debit": { "count": 0, "amount": "0" }, "funding_credit": { "count": 1, "amount": "100" } }, { "brand": "VISA", "count": 47, "amount": "31296", "gratuity_amount": "100", "sales": { "count": 35, "amount": "44912" }, "refunds": { "count": 12, "amount": "-13616" }, "funding_debit": { "count": 0, "amount": "0" }, "funding_credit": { "count": 47, "amount": "31296" } } ], "host_breakdown": { "merchant_name": "GP API CP", "reference": "2323", "count": 48, "amount": "31396", "funding_debit": { "sales": { "count": 0, "amount": "0" }, "refunds": { "count": 0, "amount": "0" } }, "funding_credit": { "sales": { "count": 36, "amount": "45012" }, "refunds": { "count": 12, "amount": "-13616" } } }, "action": { "id": "ACT_nwmrHEmZ7iT94n1pwkPCCuS17gzhh9", "type": "CLOSE", "time_created": "2024-01-31T18:08:29.307Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app" } } ``` ## Check batch by ID To query a batch to determine what it contained, send a GET command to the _/batches_ endpoint with the ID you want to investigate. This returns all the relevant data, including the totals for the batch you’re researching. Incidentally, what is returned is separate from our reporting endpoint. #### Sample request ```json curl --compressed -X GET "https://apis.sandbox.globalpay.com/ucp/batches/{id}" \ -H "Authorization: Bearer CdqyD9r7orAGau004u5NecG03JPy" \ -H "X-GP-Version: 2021-03-22" \ -H "Accept: application/json" \ ``` #### Sample response ```JSON { "id": "BAT_855049-899", "status": "OPEN", "time_created": "2021-05-03T21:23:39.718Z", "time_closed": "2021-05-03T21:23:39.718Z", "open_action_id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "close_action_id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "merchant_id": "MER_A6A1EC44522F96630ABEA17A", "merchant_name": "ABC INDUSTRIES", "account_id": "TRA_86920f927028745yt34d077d88beb29b", "account_name": "transaction_processing", "site_reference": "string", "device_reference": "string", "batch_transaction_count": 126, "amount": "12000", "currency": "USD", "gratuity_amount": "500", "sales": { "count": 123, "amount": "12300" }, "refunds": { "count": 3, "amount": "300" }, "funding_debit": { "count": 100, "amount": "10000" }, "funding_credit": { "count": 26, "amount": "2300" }, "brand_breakdown": [ { "brand": "VISA", "amount": "8300", "count": 83, "gratuity_amount": "500", "sales": { "count": 80, "amount": "8000" }, "refunds": { "count": 3, "amount": "300" }, "funding_debit": { "count": 80, "amount": "8000" }, "funding_credit": { "count": 3, "amount": "300" } } ], "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "BATCH_SINGLE", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and # integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/batches - API Explorer](https://developer.globalpayments.com/api/batches.md) Close and review batches by ID. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Batch commands are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # Manage Payments - Capture Source: https://developer.globalpayments.com/docs/payments/manage-payments/capture-guide.md Section: Payments Description: Learn how to perform a pre-authorization for a delayed capture > Availability of this feature in production depends on your allowed live configuration. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on performing a delayed-capture authorization and sending a Capture request to include the transaction for settlement file. ## What is it? Sometimes you may want to pre-authorize a transaction and have a pending charge on the customer’s card, such as bar tabs or lodging reservations. In these cases, you don’t want to finalize the transaction amount, as actions by the customer might change the final amount. ## How does it work? The main things to know about capture: * To capture a transaction, you must use the original ID returned in the authorization response. * You can capture a transaction for any amount up to 115% of the original value. However, to avail of the chargeback protection provided by 3D Secure, you must capture for the full amount. * If you don’t include an amount in your request, the full amount will be captured by default. * In some cases, multiple captures may be performed. This can facilitate use cases like split shipment. However, availability is determined by your setup. Consult your integration support for assistance. ![Diagram of the Capture Process Flow](https://developer.globalpayments.com/gh-assets/manage-payments-diagram.png) ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Perform a delayed-capture authorization > This step creates a transaction that will **not** be paid out, as it is set to be captured later. A pre-authorized transaction like this is necessary for the capture command to be used. First, we process a delayed-capture authorization. This will authorize the funds on the customer’s card, but the transaction won't be placed in the settlement file until we capture it. The amount of time the funds can remain ring-fenced on the customer's card may vary among different issuers and acquirers. Card brands such as Visa and Mastercard have their own rules around how long transactions can wait to be captured. #### Sample request ```json curl -L -X POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ -H 'X-Gp-Version: [custom:gp_api_version]' \ -H 'Accept: application/json' \ -H 'Accept-Encoding: gzip' \ -H 'Authorization: Bearer db670P7tddBGi72UdMRhnoiF8kh9' \ -H 'Content-Type: application/json' \ -d '{ "account_name": "Transaction_Processing", "type": "SALE", "channel": "CNP", "capture_mode": "LATER", "amount": "1999", "currency": "CHF", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "country": "BG", "payment_method": { "name": "James Mason", "entry_mode": "MOTO", "card": { "number": "4263970000005262", "expiry_month": "05", "expiry_year": "25", "cvv": "852", "cvv_indicator": "PRESENT", "avs_address": "Flat 123", "avs_postal_code": "50001" } } } ' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); config.setCountry("BG"); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(DateTime.now().getMonthOfYear()); card.setExpYear(DateTime.now().getYear() + 1); card.setCvn("852"); card.setCardHolderName("James Mason"); card.setEntryMethod(ManualEntryMethod.Moto); Address billingAddress = new Address(); billingAddress.setStreetAddress1("Flat 123"); billingAddress.setPostalCode("50001"); try { Transaction response = card.authorize(new BigDecimal("19.99")) .withCurrency("CHF") .withClientTransactionId("93459c78-f3f9-427c-84df-ca0584bb55bf") .withAddress(billingAddress) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getAuthorizedAmount(); // API raw response key "payment_method->card->avs_postal_code_result" String avsResponseCode = response.getAvsResponseCode(); // API raw response key "payment_method->card->avs_address_result" String avsAddressResponse = response.getAvsAddressResponse(); // API raw response key "payment_method->card->cvv_result" String cvnResponseMessage = response.getCvnResponseMessage(); // API raw response key "payment_method->card->brand_reference" String cardBrand = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // capture_mode == "MULTIPLE" boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->card->authcode" String $authCode = response.getAuthorizationCode(); // API raw response key "risk_assessment->mode" String fraudResponseMode = response.getFraudFilterResponse().getFraudResponseMode(); // API raw response key "risk_assessment->result" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // API raw response key "risk_assessment->rules" List fraudResponseRules = response.getFraudFilterResponse().getFraudResponseRules(); // API raw response key "payment_method->card->brand_reference" String brandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); // API raw response key "payment_method->card->provider->cvv_result" String cardIssuerCvv = response.getCardIssuerResponse().getCvvResult(); // API raw response key "payment_method->card->provider->avs_address_result" String cardIssuerAvsAddressResult = response.getCardIssuerResponse().getAvsAddressResult(); // API raw response key "payment_method->card->provider->avs_postal_code_result" String cardIssuerAvsPostalCodeResult = response.getCardIssuerResponse().getAvsPostalCodeResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "4gPqnGBkppGYvoE5UX9EWQlotTxGUDbs"; config.AppKey = "FQyJA5VuEQfcji2M"; config.Channel = Channel.CardNotPresent; config.RequestLogger = new RequestConsoleLogger(); config.Country = "BG"; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = ExpMonth; card.ExpYear = ExpYear; card.Cvn = "123"; card.CardPresent = true; card.EntryMethod = ManualEntryMethod.Moto; try { var transaction = card.Authorize(7.8m) .WithCurrency("CHF") .Execute(); var response = transaction.ResponseCode; //SUCCESS var status = transaction.ResponseMessage; //PREAUTHORIZED } catch (Exception) { //TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->country = 'BG'; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = "4263970000005262"; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = "852"; $card->cardHolderName = "James Mason"; $card->entryMethod = ManualEntryMethod::MOTO; $billingAddress = new Address(); $billingAddress->streetAddress1 = "Flat 123"; $billingAddress->postalCode = "50001"; try { $response = $card->authorize(19.99) ->withCurrency('CHF') ->withClientTransactionId('93459c78-f3f9-427c-84df-ca0584bb55bf') ->withAddress($billingAddress) ->execute(); } catch (GatewayException $ex) { // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" //API raw response key "payment_method->card->avs_postal_code_result" $avsResponseCode = $response->avsResponseCode; //API raw response key "payment_method->card->->avs_address_result" $avsAddressResponse = $response->avsAddressResponse; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "risk_assessment->mode" $fraudResponseMode = $response->fraudFilterResponse->fraudResponseMode; //API raw response key "risk_assessment->result" $fraudResponseResult = $response->fraudFilterResponse->fraudResponseResult; //API raw response key "risk_assessment->rules" $fraudResponseRules = $response->fraudFilterResponse->fraudResponseRules; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; //API raw response key "payment_method->card->provider->cvv_result" $cardIssuerCvv = $response->cardIssuerResponse->cvvResult; //API raw response key "payment_method->card->provider->avs_address_result" $cardIssuerAvsAddressResult = $response->cardIssuerResponse->avsAddressResult; //API raw response key "payment_method->card->provider->avs_postal_code_result" $cardIssuerAvsPostalCodeResult = $response->cardIssuerResponse->avsPostalCodeResult; ``` #### Sample response ```json { "id": "TRN_vMpI7vjdSs3c6ona5QncNLDIooCnTs_ca0584bb55bf", "time_created": "2024-08-12T13:17:53.539Z", "type": "SALE", "status": "PREAUTHORIZED", "channel": "CNP", "capture_mode": "LATER", "amount": "1999", "currency": "CHF", "country": "BG", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "93459c78-f3f9-427c-84df-ca0584bb55bf", "payment_method": { "result": "00", "message": "(00)[ test system ] AUTHORISED", "entry_mode": "MOTO", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "123456", "brand_reference": "pWx303GMt3Rtlxdf", "brand_time_created": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "risk_assessment": [ { "mode": "ACTIVE", "result": "ACCEPTED", "rules": [ { "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd", "description": "Cardholder Name Rule", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3", "description": "CardNumber block", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e", "description": "Amount test", "mode": "ACTIVE", "result": "ACCEPTED" } ] } ], "batch_id": "", "action": { "id": "ACT_vMpI7vjdSs3c6ona5QncNLDIooCnTs", "type": "PREAUTHORIZE", "time_created": "2024-08-12T13:17:53.539Z", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "dev_portal_demo" } } ``` ## Step 2: Capture a transaction If successfully authorized, the funds will be ring-fenced on the customer's account. When you want to include the transaction in the next settlement file (also known as a _batch_), you can simply send a Capture (Settle) request. When the transaction is captured with the acquirer, the funds are deducted from the customer’s account and settled into your account. #### Sample request ```json curl -L -X POST 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_6uKEyxaJMeIdyfniUVJs9nKMLpaniX/capture' \ -H 'AUTHORIZATION: Bearer WVLzMsuEQzSEFfXX9D8tDl8t6YSG' \ -H 'ACCEPT: application/json' \ -H 'ACCEPT-ENCODING: gzip' \ -H 'X-GP-VERSION: 2021-03-22' \ -H 'CONTENT-TYPE: application/json' \ -d '{ "amount": "11099", "gratuity_amount": "11099", "capture_sequence": "FIRST", "total_capture_count": "number", "lodging": { "booking_reference": "string", "duration_days": "number", "room_tax_amount": "string", "date_checked_in": "string", "date_checked_out": "string", "daily_rate_amount": "string", "charge_items": "array" }, "payment_method": { "card": { "tag": "string" } } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); LodgingData lodgingInfo = new LodgingData(); lodgingInfo.setBookingReference("s9RpaDwXq1sPRkbP"); lodgingInfo.setStayDuration(10); lodgingInfo.setCheckInDate(DateTime.now()); lodgingInfo.setCheckOutDate(DateTime.now().plusDays(7)); lodgingInfo.setRate(new BigDecimal("13.49")); String tag = "string"; Transaction transaction = Transaction.fromId("TRN_xk3noK4R3acBcujTLB5aoceH2THh6h_642f31d98ac7"); try { Transaction response = transaction.capture(new BigDecimal("11.99")) .withGratuity(new BigDecimal("11.99")) .withMultiCapture(1, 1) .withLodgingData(lodgingInfo) .withTagData(tag) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "payment_method->batch_id" String batchReference = response.getBatchSummary().getBatchReference(); // capture_mode == "MULTIPLE" boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->card->authcode" String $authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->brand_reference" String brandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "appId"; config.AppKey = "appKey"; config.Channel = Channel.CardNotPresent; config.RequestLogger = new RequestConsoleLogger(); config.Country = "BG"; ServicesContainer.ConfigureService(config); try { Transaction transaction = Transaction.FromId("TRN_r4qdItNRLydA8PVh0wx21WLoArNsAe_198be20b5355") var capture = transaction.Capture(8.8m) .WithGratuity(1m) .Execute(); var response = capture.ResponseCode; //SUCCESS var status = capture.ResponseMessage; //CAPTURED } catch (Exception) { //TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $lodgingInfo = new LodgingData(); $lodgingInfo->bookingReference = 's9RpaDwXq1sPRkbP'; $lodgingInfo->durationDays = 10; $lodgingInfo->checkedInDate = date('Y-m-d H:i:s'); $lodgingInfo->checkedOutDate = date('Y-m-d H:i:s', strtotime("+7 days")); $lodgingInfo->dailyRateAmount = '13.49'; $tag = 'string'; $trn = Transaction::fromId('TRN_xk3noK4R3acBcujTLB5aoceH2THh6h_642f31d98ac7'); try { $response = $trn->capture(11.99) ->withGratuity(11.99) ->withMultiCapture(StoredCredentialSequence::FIRST, 1) ->withLodgingData($lodgingInfo) ->withTagData($tag) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" // API raw response key "payment_method->batch_id" $batchReference = $response->batchSummary->batchReference; $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ```
#### Sample response ```json { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2026-05-03T21:23:39.718Z", "type": "SALE", "status": "CAPTURED", "amount": "11099", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "string", "message": "string", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "ADJUST", "time_created": "2026-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including captures. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Captures are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # Manage Payments - Increment Source: https://developer.globalpayments.com/docs/payments/manage-payments/increment-guide.md Section: Payments Description: Learn how to add supplemental charges to an existing transaction > Availability of this feature in production depends on your allowed live configuration. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on incrementing an existing authorized transaction. ## What is it? Increment is an action used to add a supplemental charge to the authorized amount for an existing transaction before it is batched. This is commonly done in a lodging scenario where upcharges for extra days might be necessary. The increment action does not change the status of a transaction. If successful, it increases the amount of the existing transaction. ## How does it work? The main things to know about increment: * Availability in production depends on your configuration * Only works on transactions that have not been captured (same day or in a delayed-capture status) ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Increment an Auth In this step, we increment an existing authorized transaction. #### Sample request ```json curl --compressed -X POST "https://apis.sandbox.globalpay.com/ucp/transactions/TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d/incremental" \ -H "Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ" \ -H "X-GP-Version: 2021-03-22" \ -H "Content-type: application/json" \ -H "Accept: application/json" \ -d { "amount": "11099", "lodging": { "booking_reference": "string", "duration_days": "number", "room_tax_amount": "string", "date_checked_in": "string", "date_checked_out": "string", "daily_rate_amount": "string", "charge_items": "array" } } ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); LodgingData lodgingInfo = new LodgingData(); lodgingInfo.setBookingReference("s9RpaDwXq1sPRkbP"); lodgingInfo.setStayDuration(10); lodgingInfo.setCheckInDate(DateTime.now()); lodgingInfo.setCheckOutDate(DateTime.now().plusDays(7)); lodgingInfo.setRate(new BigDecimal("13.49")); ArrayList items = new ArrayList<>(); items.add( new LodgingItems() .setTypes(LodgingItemType.NO_SHOW.toString()) .setReference("item1") .setTotalAmount("13.49") .setPaymentMethodProgramCodes(new String[]{PaymentMethodProgram.ASSURED_RESERVATION.toString()})); lodgingInfo.setItems(items); Transaction transaction = Transaction.fromId("TRN_jKNcGl8EyIBNkDiBIKs8EoAynLlbaw"); try { Transaction response = transaction.additionalAuth(new BigDecimal("110.99")) .withCurrency("USD") .withLodgingData(lodgingInfo) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getAuthorizedAmount(); // capture_mode == "MULTIPLE" boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->card->authcode" String $authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->brand_reference" String brandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); var lodgingInfo = new LodgingData { bookingReference = "s9RpaDwXq1sPRkbP", StayDuration = 10, CheckInDate = DateTime.Now, CheckOutDate = DateTime.Now.AddDays(7), Rate = (decimal)13.49 }; var item1 = new LodgingItems { Types = LodgingItemType.NO_SHOW.ToString(), Reference = "item1", paymentMethodProgramCodes = new [] { PaymentMethodProgram.ASSURED_RESERVATION.ToString() } }; lodgingInfo.Items = new List() { item1 }; Transaction transaction = Transaction.FromId("TRN_5rfiei5p4NLO2YeGFDS1tFp394bgt9"); try { Transaction response = transaction.AdditionalAuth(110.99m) .WithCurrency("USD") .WithLodgingData(lodgingInfo) .Execute(); // API raw response key "id" var id = response.TransactionId; // API raw response key "amount" var amount = response.AuthorizedAmount; // capture_mode === 'MULTIPLE' var multiCapture = response.MultiCapture; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "payment_method->card->brand_reference" var brandReference = response.CardBrandTransactionId; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $lodgingInfo = new LodgingData(); $lodgingInfo->bookingReference = 's9RpaDwXq1sPRkbP'; $lodgingInfo->durationDays = 10; $lodgingInfo->checkedInDate = date('Y-m-d H:i:s'); $lodgingInfo->checkedOutDate = date('Y-m-d H:i:s', strtotime("+7 days")); $lodgingInfo->dailyRateAmount = '13.49'; $item1 = new LodgingItems(); $item1->types = [LodgingItemType::NO_SHOW]; $item1->reference = 'item1'; $item1->totalAmount = '13.49'; $item1->paymentMethodProgramCodes = [PaymentMethodProgram::ASSURED_RESERVATION]; $lodgingInfo->items = [$item1]; $transaction = Transaction::fromId('TRN_q88KwtpIeYvbHMYvi3R9ZrqcxtFcS0'); try { $response = $transaction->additionalAuth(110.99) ->withCurrency('USD') ->withLodgingData($lodgingInfo) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->authorizedAmount; // API raw response key "amount" $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2026-05-03T21:23:39.718Z", "type": "SALE", "status": "CAPTURED", "amount": "11099", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "string", "message": "string", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "ADJUST", "time_created": "2026-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including incrementals. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Increments are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # Manage Payments - ReAuth Source: https://developer.globalpayments.com/docs/payments/manage-payments/reauth-guide.md Section: Payments Description: Learn how to get a new authcode for a stale transaction > Availability of this feature in production depends on your allowed live configuration. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on sending a Re-Authorization (ReAuth) request to receive a more recent authcode. ## What is it? This action is used to refresh the authorization associated with a transaction when too much time has passed since the transaction was authorized. The card issuer might return the withheld funds to the cardholder if the payment is not captured within a certain amount of time. Therefore, the transaction needs to get a more recent authcode. Additionally, you can use a Re-Authorization request in cases where the amount you want to deduct from the customer's card is less than the originally authorized amount or if you need to reauthorize a transaction that was reversed in error. ## How does it work? The main things to know about ReAuth: * The amount submitted in a Re-Authorization request must be less than 200% of the original pre-authorization amouount (ignoring any increments). * Availability in production depends on your live configuration. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## ReAuth a transaction In this step, we reauthorize a transaction to receive a more recent authcode. #### Sample request ```json ```json curl -L -X POST 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d/reauthorization' \ -H 'Authorization: Bearer WVLzMsuEQzSEFfXX9D8tDl8t6YSG' \ -H 'X-GP-Version: 2021-03-22' \ -H 'Accept: application/json' \ -H 'Content-type: application/json' \ -H 'Accept-Encoding: gzip' \ -d '{ "amount": "11099" }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Transaction transaction = Transaction.fromId("TRN_Txdt3Drc2N4HU8X8JWov4P3bNL1w3q"); try { Transaction response = transaction.reauthorize(new BigDecimal("11.99")) .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchReference = response.getBatchSummary().getBatchReference(); // API raw response key "payment_method->card->brand"; String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // capture_mode === 'MULTIPLE' boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->brand_reference" String brandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); Transaction transaction = Transaction.FromId("TRN_Txdt3Drc2N4HU8X8JWov4P3bNL1w3q"); try { Transaction response = transaction.Reauthorize(11.99m) .Execute(); // API raw response key "id" var id = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; // API raw response key "batch_id" var batchReference = response.BatchSummary.BatchReference; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; // capture_mode === 'MULTIPLE' var multiCapture = response.MultiCapture; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "payment_method->card->brand_reference" var brandReference = response.CardBrandTransactionId; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $transaction = Transaction::fromId('TRN_Txdt3Drc2N4HU8X8JWov4P3bNL1w3q'); try { $response = $transaction->reauthorized(11.99) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" $batchReference = $response->batchSummary->batchReference; // API raw response key "batch_id" // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $transactionStatus = $response->responseMessage;// API raw response key "status" $timeCreated = $response->timestamp; // API raw response key "time_created" // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2026-05-03T21:23:39.718Z", "type": "SALE", "status": "CAPTURED", "amount": "11099", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "string", "message": "string", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "ADJUST", "time_created": "2026-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including reauths. ### [SDKs - Libraries JAVA,.NET,PHP](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing ReAuths are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # Manage Payments - Refund Source: https://developer.globalpayments.com/docs/payments/manage-payments/refund-guide.md Section: Payments Description: Learn how to refund a transaction > Availability of this feature in production depends on your allowed live configuration. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on refunding a transaction to give money back to a cardholder. ## What is it? Once a transaction is captured and the funds are deducted from the customer’s account, you can refund the full or partial amount back to them without having to obtain their card details again. The payment method associated with the original sale is used to refund the payer. ## How does it work? The main things to know about refunds: * You can process a refund for any amount up to 115% of the original transaction value. * In this type of request, you must specify the amount and currency. * If the amount is not specified in the refund request, the full amount of the sale will be refunded. * Refunds can only be processed for a fixed amount of time after the original authorization. Limits differ among acquirers and can range from 6 to 13 months. For more information, contact your account manager. ![Diagram of the Refund Process Flow](https://developer.globalpayments.com/gh-assets/manage-payments-diagram.png) ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Refund a transaction In this step, we refund a transaction to give money back to a cardholder. #### Sample request ```json curl --compressed -X POST "https://apis.sandbox.globalpay.com/ucp/transactions/{id}/refund" \ -H "Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ" \ -H "X-GP-Version: 2021-03-22" \ -H "Content-type: application/json" \ -H "Accept: application/json" \ -d { "amount": "1199" } ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Transaction transaction = Transaction.fromId("TRN_TmpyYh2dXKJQMWT79F6KXfT685wotJ_23b4164fbddf"); try { Transaction response = transaction.refund(new BigDecimal("11.99")) .withCurrency("USD") .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchReference = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "payment_method->card->brand"; String cardType = response.getCardDetails().getBrand(); // API raw response key "payment_method->card->masked_number_last4" String maskedNumberLast4 = response.getCardDetails().getMaskedNumberLast4(); // capture_mode === 'MULTIPLE' boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->brand_reference" String brandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); Transaction transaction=Transaction.FromId("TRN_TmpyYh2dXKJQMWT79F6KXfT685wotJ_23b4164fbddf"); try { Transaction response = transaction.Refund(11.99m) .WithCurrency("USD") .Execute(); // API raw response key "id" var id = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; // API raw response key "batch_id" var batchReference = response.BatchSummary.BatchReference; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; // capture_mode === 'MULTIPLE' var multiCapture = response.MultiCapture; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "payment_method->card->brand_reference" var brandReference = response.CardBrandTransactionId; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $transaction = Transaction::fromId('TRN_TmpyYh2dXKJQMWT79F6KXfT685wotJ_23b4164fbddf'); try { $response = $transaction->refund(11.99) ->withCurrency('USD') ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response key "id" $transactionId = $response->transactionId; // API raw response key "amount" $amount = $response->balanceAmount; // API raw response key "batch_id" $batchReference = $response->batchSummary->batchReference; // API raw response key "type" $transactionType = $response->originalTransactionType; // API raw response key "status" $transactionStatus = $response->responseMessage; // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; // capture_mode === 'MULTIPLE' $multiCapture = $response->multiCapture; // API raw response key "reference" $referenceNumber = $response->referenceNumber; // API raw response key "action->result_code" $responseCode = $response->responseCode; // API raw response key "time_created" $timeCreated = $response->timestamp; // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2026-05-03T21:23:39.718Z", "type": "SALE", "status": "CAPTURED", "amount": "11099", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "string", "message": "string", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "ADJUST", "time_created": "2026-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including refunds. ### [SDKs - Libraries JAVA,.NET,PHP](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Refunds are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # Manage Payments - Reverse Source: https://developer.globalpayments.com/docs/payments/manage-payments/reverse-guide.md Section: Payments Description: Learn how to void a transaction > Availability of this feature in production depends on your allowed live configuration. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on reversing a transaction using the ID from the original transaction before settlement has occurred. ## What is it? Before capturing a transaction, you can void an authorization, capture, refund, or credit request. If the transaction was already placed in the next settlement file (or batch), this will remove it. Transactions can be reversed in full or partially reversed. For this type of request, you need the ID from the original transaction. ## How does it work? The main things to know about reverse: * The `TRN_id` is required for a reversal. * Transactions already settled can’t be reversed. * If a delayed-capture transaction is reversed, the initial authorization will be canceled. * If no amount is provided, the entire transaction will be reversed. * The `reference` field can be used in place of the `TRN_id` in the URL. ![Diagram of the Reversal Process Flow](https://developer.globalpayments.com/gh-assets/manage-payments-diagram.png) ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Reverse a transaction In this step, we reverse a transaction. #### Sample request ```json curl -L -X POST 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d/reversal' \ -H 'Authorization: Bearer WVLzMsuEQzSEFfXX9D8tDl8t6YSG' \ -H 'X-GP-Version: 2021-03-22' \ -H 'Accept: application/json' \ -H 'Content-type: application/json' \ -H 'Accept-Encoding: gzip' \ -d '{ "amount": "1999" }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Transaction transaction = Transaction.fromId("TRN_OlVvoSKMFXIVaxXIE7iTJvPMG5MHeH_5b23a3202d99"); try { Transaction response = transaction.reverse() .execute(); // API raw response key "id" String transactionId = response.getTransactionId(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); // API raw response key "batch_id" String batchReference = response.getBatchSummary().getBatchReference(); // API raw response key "type" TransactionType transactionType = response.getTransactionReference().getOriginalTransactionType(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // capture_mode === 'MULTIPLE' boolean multiCapture = response.isMultiCapture(); // API raw response key "reference" String referenceNumber = response.getReferenceNumber(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "time_created" String timeCreated = response.getTimestamp(); // API raw response key "payment_method->card->authcode" String authCode = response.getAuthorizationCode(); // API raw response key "payment_method->card->brand_reference" String brandReference = response.getCardBrandTransactionId(); // API raw response key "payment_method->card->provider->result" String cardIssuerResult = response.getCardIssuerResponse().getResult(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); Transaction transaction = Transaction.FromId("TRN_OlVvoSKMFXIVaxXIE7iTJvPMG5MHeH_5b23a3202d99"); try { Transaction response = transaction.Reverse() .Execute(); // API raw response key "id" var id = response.TransactionId; // API raw response key "amount" var amount = response.BalanceAmount; // API raw response key "batch_id" var batchReference = response.BatchSummary.BatchReference; // API raw response key "status" var transactionStatus = response.ResponseMessage; // capture_mode === 'MULTIPLE' var multiCapture = response.MultiCapture; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "payment_method->card->brand_reference" var brandReference = response.CardBrandTransactionId; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $transaction = Transaction::fromId('TRN_OlVvoSKMFXIVaxXIE7iTJvPMG5MHeH_5b23a3202d99'); try { $response = $transaction->reverse() ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $transactionId = $response->transactionId; // API raw response key "id" $amount = $response->balanceAmount; // API raw response key "amount" $batchReference = $response->batchSummary->batchReference; // API raw response key "batch_id" $transactionType = $response->originalTransactionType; // API raw response key "type" $transactionStatus = $response->responseMessage;// API raw response key "status" $multiCapture = $response->multiCapture; // capture_mode === 'MULTIPLE' $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $timeCreated = $response->timestamp; // API raw response key "time_created" // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "TRN_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2026-05-03T21:23:39.718Z", "type": "SALE", "status": "CAPTURED", "amount": "1999", "currency": "USD", "country": "US", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "batch_id": "BAT_234234234", "payment_method": { "result": "string", "message": "string", "card": { "authcode": "string", "brand_reference": "string" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "ADJUST", "time_created": "2026-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token ### [/transactions - API Explorer](https://developer.globalpayments.com/api/transactions.md) See the full transaction endpoint, including reversals. ### [SDKs - Libraries JAVA,.NET,PHP](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Reversals are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # Manage Payments - Verify Source: https://developer.globalpayments.com/docs/payments/manage-payments/verify-guide.md Section: Payments Description: Learn how to check the validity and balance of a card before a sale > Availability of this feature in production depends on your allowed live configuration. > Please contact Global Payments before coding this feature to confirm it will be available to you when you go live. This guide focuses on verifying a customer’s payment card and checking the balance of an EBT debit card (US only) before a sale. ## What is it? In some cases, you may want to confirm a payment method can be used in the creation of a transaction. The verify function allows you to query a card and determine if it's available for payment. ## How does it work? The main thing to know about verify: * The verify function does not authorize a transaction. A secondary request must be sent to complete an authorization. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Verify a card In this step, we verify a card to confirm that it can be used in a transaction. #### Sample request ```json curl --compressed -X POST "https://apis.sandbox.globalpay.com/ucp/verifications" \ -H "Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ" \ -H "X-GP-Version: 2021-03-22" \ -H "Content-type: application/json" \ -H "Accept: application/json" \ -d “{ "account_name": "Transaction_Processing", "channel": "CNP", "currency": "USD", "reference": "MY_TRANS_REF_12345", "country": "US", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "05", "expiry_year": "25" } } }” ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData { Number = "4263970000005262", ExpMonth = DateTime.Now.Month, ExpYear = DateTime.Now.Year + 1, Cvn = "852", CardHolderName = "James Mason" }; try { Transaction response = card.Verify() .WithCurrency("USD") .WithClientTransactionId("MY_TRANS_REF_12345") .Execute(); // API raw response key "id" var id = response.TransactionId; // API raw response key "payment_method->card->brand"; var cardType = response.CardDetails.Brand; // API raw response key "payment_method->card->masked_number_last4" var maskedNumberLast4 = response.CardDetails.MaskedNumberLast4; // API raw response key "payment_method->card->cvv_result" var cvnResponseMessage = response.CvnResponseMessage; // API raw response key "status" var transactionStatus = response.ResponseMessage; // API raw response key "reference" var referenceNumber = response.ReferenceNumber; // API raw response key "action->result_code" var responseCode = response.ResponseCode; // API raw response key "time_created" var timeCreated = response.Timestamp; // API raw response key "payment_method->card->authcode" var authCode = response.AuthorizationCode; //API raw response key "payment_method->card->brand_reference" var brandReference = response.CardBrandTransactionId; //API raw response key "payment_method->card->provider->result" var cardIssuerResult = response.CardIssuerResponse.Result; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = "4263970000005262"; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = "852"; $card->cardHolderName = "James Mason"; try { $response = $card->verify() ->withCurrency('USD') ->withClientTransactionId('MY_TRANS_REF_12345') ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $id = $response->transactionId; // API raw response key "id" // API raw response key "payment_method->card->brand"; $cardType = $response->cardDetails->brand; // API raw response key "payment_method->card->masked_number_last4" $maskedNumberLast4 = $response->cardDetails->maskedNumberLast4; // API raw response key "payment_method->card->cvv_result" $cvnResponseMessage = $response->cvnResponseMessage; $type = $response->originalTransactionType; // API raw response key "type" $transactionStatus = $response->responseMessage;// API raw response key "status" $referenceNumber = $response->referenceNumber; // API raw response key "reference" $responseCode = $response->responseCode; // API raw response key "action->result_code" $timeCreated = $response->timestamp; // API raw response key "time_created" // API raw response key "payment_method->card->authcode" $authCode = $response->authorizationCode; //API raw response key "payment_method->card->brand_reference" $brandReference = $response->cardBrandTransactionId; //API raw response key "payment_method->card->provider->result" $cardIssuerResult = $response->cardIssuerResponse->result; ``` #### Sample response ```json { "id": "VER_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2021-05-03T21:23:39.718Z", "status": "VERIFIED", "channel": "CP", "currency": "USD", "country": "US", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_86920f927028745yt34d077d88beb29b", "account_name": "transaction_processing", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "payment_method": { "id": "PMT_31087d9c-e68c-4389-9f13-39378e166ea5", "result": "string", "message": "string", "entry_mode": "MOTO", "fingerprint_presence_indicator": "EXISTS", "fingerprint": "string", "card": { "masked_number_last4": "XXXXXXXXXXXX7025", "brand": "VISA", "brand_reference": "string", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "PROMPT" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "VERIFY", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## EBT balance inquiry > Because the EBT card type is only available in the United States, this function is only possible in a US card-present, in-store environment. By adding the funding and `pin_block` parameters to the request, the verification will return the `available_balance` field in the response — underneath the card object. This allows you to query an EBT card for its current balance. #### Sample request ```json curl --compressed -X POST "https://apis.sandbox.globalpay.com/ucp/verifications" \ -H "Authorization: Bearer G3FA4TuYGCBiCWs4YpzrALGCYXZJ" \ -H "X-GP-Version: 2021-03-22" \ -H "Content-type: application/json" \ -H "Accept: application/json" \ -d “{ "account_name": "Transaction_Processing", "channel": "CNP", "currency": "USD", "reference": "MY_TRANS_REF_12345", "country": "US", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "05", "expiry_year": "25" "funding": "CASH_BENEFITS", "pin_block": "{{test card PIN block}}" } } }” ``` #### Sample response ```json { "id": "VER_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "time_created": "2021-05-03T21:23:39.718Z", "status": "VERIFIED", "channel": "CP", "currency": "USD", "country": "US", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_86920f927028745yt34d077d88beb29b", "account_name": "transaction_processing", "reference": "becf9f3e-4d33-459c-8ed2-0c4affc9555e", "payment_method": { "id": "PMT_31087d9c-e68c-4389-9f13-39378e166ea5", "result": "string", "message": "string", "entry_mode": "MOTO", "fingerprint_presence_indicator": "EXISTS", "fingerprint": "string", "card": { "masked_number_last4": "XXXXXXXXXXXX7025", "available_balance": "1600", "brand": "EBT", "brand_reference": "string", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "PROMPT" } }, "action": { "id": "ACT_uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "type": "VERIFY", "time_created": "2021-05-03T21:23:39.718Z", "result_code": "SUCCESS", "app_id": "uzFr7t4VOqxdLDI44hHmXIjHtOOE8d", "app_name": "my_lovely_app" } } ``` ## Integration references To get a deeper understanding of this function, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [/accesstoken - API Explorer](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [/verifications - API Explorer](https://developer.globalpayments.com/api/verifications.md) See the verifications endpoint used for all verify functions. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Testing Verifications are available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/docs/getting-started/postman-collection.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/responses) View successful responses, HTTP status codes, action response data, and errors. # 3D Secure & Strong Customer Authentication Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md Section: Risk Management Description: Mitigate risk via our 3D Secure and Fraud Management capabilities 3D Secure (3DS) is the authentication protocol used by card brands, such as Visa and Mastercard, to enable merchants to gain protection from fraud in a card-not-present (CNP) environment and to comply with European strong customer authentication (SCA) regulations set in PSD2. When 3DS2 is used with an authorization request requiring the customer to authenticate the card used in a transaction, the financial liability can shift from the merchant to the issuer in the event of a fraud-related chargeback. ## How does 3DS work? #### High-level steps An end-to-end 3DS authentication involves multiple steps with different components. The table below describes the high-level steps: | 3DS Step | Description | | -------- | ------- | | Check Enrollment | Confirm that the card is enrolled in 3DS and which versions it supports. Our platform currently supports 3DS Version 2.2. | | Device Profiling (Conditional) | Facilitate the issuer’s access control server (ACS) gathering data about the cardholder’s device (depends on whether the Issuer’s ACS supports this). | | Initiate Authentication | The transaction, cardholder, and browser information is sent as part of the authentication request to the issuer. The following outcomes can occur:
  • Frictionless Successful Authentication (Proceed to Authorization)
  • Frictionless Unsuccessful Authentication (Halt Transaction)
  • Challenge Required
| Present the Challenge (Conditional) | If the issuer determines that a challenge is required, the ACS must be displayed to the cardholder. The following outcomes can occur:
  • Challenge Completed Successfully (Proceed to Authorization)
  • Challenge Not Completed Successfully (Halt Transaction)
| Obtain Authentication Data (Conditional) | If the cardholder completes the challenge successfully, obtain the necessary data for authorization. | | Challenge required | Issuer requires more authentication and customer gets sent notification for more information. | | Authorization | Once the authentication is complete and a chargeback liability shift is available, proceed to authorization. | #### 3D Secure components Although there are multiple components that work together to perform a 3DS authentication, you'll primarily work with our server-side SDKs and client-side libraries and/or our REST API (depending on your integration type), as well as the issuer’s ACS. However, it’s worth familiarizing yourself with all of the components and who provides them (see table below). | Component Name | Provider | Description | | -------- | ------- | ------- | | Server-Side SDKs | Us | Collection of tools provided in a variety of languages to handle the communication between your application or website and our REST API. | | Client-Side Libraries | Us | Used with our REST API to provide an out-of-the-box payment form with secure data-capture fields. With 3DS, they also handle communication with the issuer's ACS. | | REST API | Us | A single integration point used to connect into numerous regions, channels, and payment methods worldwide. The REST API handles all communications with us, including with the 3DS server. | | 3DS Server | Us | Responsible for interfacing with the directory servers of the different card networks. | | Directory Server | Card Networks | The entry point into the 3DS ecosystem for card networks (Visa, Mastercard, etc.), including the issuer’s ACS. | | Access Control Server | (Card) Issuer | Responsible for the outcome of the authentication as well as providing the challenge to the cardholder if it’s a non-frictionless authentication. Note that the access control server is controlled by an entity external to Global Payments. | ## Liability shift Liability shift typically means that the responsibility for covering losses from fraudulent transactions transfers from the merchant to the issuing bank when the merchant authenticates the transaction using a 3DS protocol. If the merchant does not use a 3DS method to authenticate a credit card transaction, they remain liable for chargebacks and fraud-related losses. There are some differences in the liability shift offered by Mastercard, Visa, and American Express (AMEX). The following tables include the transaction status, electronic commerce indicator (ECI), authentication value, authentication flow, liability, and recommendation for each card brand. #### Mastercard | Transaction Status | ECI | Authentication Value | Authentication Flow | Liability | Recommendation | | -------- | ------- | ------- | -------- | ------- | ------- | | Authentication Successful | 2 | Present | Challenge/Frictionless | Issuer | Proceed to Authorization | | Authentication Sucessful | N2 | Present | Challenge Frictionless | Issuer | Proceed to Authorization | | Authentication Attempted | 1 | Present | Frictionless | Issuer | Proceed to Authorization | | Authentication Unavailable | 0 | Not Present | Challenge/Frictionless | Merchant | No liability shift; consider whether to proceed to Authorization | | Authentication Failed/Rejected | 0 | Not Present | Challenge/Frictionless | Merchant | No liability shift; do not proceed to Authorization | | Authentication Failed/Rejected | N0 | Not Present | Challenge Frictionless | Merchant | No liability shift; do not proceed to Authorization | #### Visa | Transaction Status | ECI | Authentication Value | Authentication Flow | Liability | Recommendation | | -------- | ------- | ------- | -------- | ------- | ------- | | Authentication Successful | 5 | Present | Challenge/Frictionless | Issuer | Proceed to Authorization | | Authentication Attempted | 6 | Present | Frictionless | Issuer | Proceed to Authorization | | Authentication Unavailable | 7 | Not Present | Challenge/Frictionless | Merchant | No liability shift; consider whether to proceed to Authorization | | Authentication Failed/Rejected | 7 | Not Present | Challenge/Frictionless | Merchant | No liability shift; do not proceed to Authorization | #### AMEX | Transaction Status | ECI | Authentication Value | Authentication Flow | Liability | Recommendation | | -------- | ------- | ------- | -------- | ------- | ------- | | Authentication Successful | 5 | Present | Challenge/Frictionless | Issuer | Proceed to Authorization | | Authentication Attempted | 6 | Present | Frictionless | Issuer | Proceed to Authorization | | Authentication Unavailable | 7 | Not Present | Challenge/Frictionless | Merchant | No liability shift; consider whether to proceed to Authorization | | Authentication Failed/Rejected | 7 | Not Present | Challenge/Frictionless | Merchant | No liability shift; do not proceed to Authorization | ## Get integrated We provide multiple ways of adding 3DS and SCA to your payment flow. The most popular integration is via our [browser authentication guide](https://developer.globalpayments.com/docs/risk-management/3D-secure/browser-authentication-guide.md), but we do provide in-app and many more [3DS options](https://developer.globalpayments.com/docs/risk-management/3D-secure/3DS-more-overview.md). # 3D Secure - Browser Authentication Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/browser-authentication-guide.md Section: Risk Management Description: Add 3D Secure authentication to reduce fraud risk 3D Secure (3DS) is the authentication protocol used by card brands, such as Visa and Mastercard, to enable merchants to gain protection from fraud in a card-not-present environment and to comply with European strong customer authentication (SCA) regulations set in PSD2. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Set up notification URLs](#set-up-notification-urls) ### Set up notification URLs Before testing or implementing 3D Secure 2, you first need to set up two endpoint URLs in your application or website so that data and event notifications can be received from the issuer’s ACS. Each endpoint must be configured to accept an HTTP POST with Base64 encoded values. The issuer’s ACS uses notifications at two important points during authentication: * Method URL notification – Informs your application or website that the issuer’s ACS completed device profiling of the browser (if supported by the issuer). * Challenge notification – Informs your application or website that the challenge presented to the customer on the issuer’s ACS is complete. The POST also contains key authentication data, including whether the customer completed the challenge successfully or not. > The following guides assume you will be using the 3DS library as part of your integration. > > The globalpayments-3ds.js library does not have a CDN. The merchant can install it via npm (npm i globalpayments-3ds), then they can find the final build in node_modules/globalpayments-3ds/dist/ - this needs to be added somewhere publicly available and referenced in the scripts below. #### Sample Method URL Notification endpoint We consume the POST sent by the issuer’s ACS, decode it, and prepare the string to be returned to the client side and return it to the client as HTML. ```java /* * this sample code is not specific to the Global Payments SDK and is intended as a simple example and * should not be treated as Production-ready code. You'll need to add your own message parsing and * security in line with your application or website */ @RequestMapping("/methodUrlResponse") public void consumeMethodUrlResponse(String threeDSMethodData) throws UnsupportedEncodingException { // sample ACS response for Method URL Response Notification // String threeDSMethodData = "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFmNjVjMzY5LTU5YjktNGY4ZC1iMmY2LTdkN2Q1ZjVjNjlkNSJ9"; try { byte[] decodedBytes = Base64.getDecoder().decode(threeDSMethodData); String methodUrlResponseString = new String(decodedBytes); Gson gson = new Gson(); // map to a custom class MethodUrlResponse MethodUrlResponse response = gson.fromJson(methodUrlResponseString, MethodUrlResponse.class); String threeDSServerTransID = response.getThreeDSServerTransID(); // // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 // TODO: notify client-side that the Method URL step is complete // optional to return decoded JSON string, see below } catch(Exception e) { // TODO: add your exception handling here } } ``` ```dotnet /* * this sample code is not specific to the Global Payments SDK and is intended as a simple example and * should not be treated as Production-ready code. You'll need to add your own message parsing and * security in line with your application or website */ var threDSMethodData = Request.Form["threeDSMethodData"]; // sample ACS response for Method URL Response Notification // threeDSMethodData = "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFmNjVjMzY5LTU5YjktNGY4ZC1iMmY2LTdkN2Q1ZjVjNjlkNSJ9"; try { byte[] data = Convert.FromBase64String(threeDSMethodData); string methodUrlResponseString = Encoding.UTF8.GetString(data); // map to a custom class MethodUrlResponse MethodUrlResponse methodUrlResponse = JsonConvert.DeserializeObject(methodUrlResponseString); string threeDSServerTransID = methodUrlResponse.ThreeDSServerTransID; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 // TODO: notify client-side that the Method URL step is complete (optional - return decoded JSON string), see below } catch (Exception exce) { // TODO: add your exception handling here } ``` ```php $convertedThreeDSMethodData->threeDSServerTransID, ]); /** If you have the backend and the frontend hosted on different domains, * or if they are served over different protocols, * you will need to specify the base url for the frontend domain as the second parameter * for the handleMethodNotification method (eg. http://localhost:3000). */ $response = << END; echo $response; exit; ``` #### Sample Challenge Notification endpoint We consume the POST sent by the issuer’s ACS, decode it, and prepare the string to be returned to the client side and return it to the client as HTML. ```java /* * this sample code is not specific to our SDK and is intended as a simple example and * should not be treated as Production-ready code. You'll need to add your own message parsing and * security in line with your application or website */ @RequestMapping("/challengeUrlResponse") public void consumeChallengeUrlResponse(@RequestParam("cres") String cres) throws UnsupportedEncodingException { // example CRes (Challenge Result) sent by the ACS /* String cres = "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFmNjVjMzY5LTU5YjktNGY4ZC1iMmY2LTdkN2Q1ZjVjNjlkNSIsImF" + "jc1RyYW5zSUQiOiIxM2M3MDFhMy01YTg4LTRjNDUtODllOS1lZjY1ZTUwYThiZjkiLCJjaGFsbGVuZ2VDb21wbGV0a" + "W9uSW5kIjoiWSIsIm1lc3NhZ2VUeXBlIjoiQ3JlcyIsIm1lc3NhZ2VWZXJzaW9uIjoiMi4xLjAiLCJ0cmFuc" + "1N0YXR1cyI6IlkifQ=="; */ try { byte[] decodedBytes = Base64.getDecoder().decode(cres); String challengeUrlResponseString = new String(decodedBytes); Gson gson = new Gson(); // map to a custom class ChallengeUrlResponse which has String variables for each response element ChallengeUrlResponse challengeUrlResponse = gson.fromJson(challengeUrlResponseString, ChallengeUrlResponse.class); String threeDSServerTransID = challengeUrlResponse.getThreeDSServerTransID(); // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 String acsTransId = challengeUrlResponse.getAcsTransID(); // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 String messageType = challengeUrlResponse.getMessageType(); // Cres String messageVersion = challengeUrlResponse.getMessageVersion(); // 2.1.0 String transStatus = challengeUrlResponse.getTransStatus(); // Y // TODO: simple example of how to prepare the JSON string for JavaScript Library (optional) Hashtable responseObject = new Hashtable(); responseObject.put("threeDSServerTransID", threeDSServerTransID); responseObject.put("transStatus", transStatus); String responseString = gson.toJson(responseObject); // TODO: notify client-side that the Challenge step is complete, see below } catch(Exception e) { // TODO: Add your exception handling here } } ``` ```dotnet /* * this sample code is not specific to our SDK and is intended as a simple example and * should not be treated as Production-ready code. You'll need to add your own message parsing and * security in line with your application or website */ var cres = Request.Form["cres"]; // Example CRes (Challenge Result) sent by the ACS // var cRes = "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFmNjVjMzY5LTU5YjktNGY4ZC1iMmY2LTdkN2Q1ZjVjNjlkNSIsImF" // + "jc1RyYW5zSUQiOiIxM2M3MDFhMy01YTg4LTRjNDUtODllOS1lZjY1ZTUwYThiZjkiLCJjaGFsbGVuZ2VDb21wbGV0a" // + "W9uSW5kIjoiWSIsIm1lc3NhZ2VUeXBlIjoiQ3JlcyIsIm1lc3NhZ2VWZXJzaW9uIjoiMi4xLjAiLCJ0cmFuc" // + "1N0YXR1cyI6IlkifQ=="; try { byte[] data = Convert.FromBase64String(cres); string challengeUrlResponseString = Encoding.UTF8.GetString(data); // map to a custom class ChallengeUrlResponse which has String variables for each response element ChallengeUrlResponse challengeUrlResponse = JsonConvert.DeserializeObject(challengeUrlResponseString); var threeDSServerTransID = challengeUrlResponse.ThreeDSServerTransID; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 var acsTransId = challengeUrlResponse.AcsTransID; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 var messageType = challengeUrlResponse.MessageType; // Cres var messageVersion = challengeUrlResponse.MessageVersion; // 2.1.0 var transStatus = challengeUrlResponse.TransStatus; // Y // TODO: prepare the JSON string for JavaScript Library (optional) challengeUrlResponseString = JsonConvert.SerializeObject(new { threeDSServerTransID = threeDSServerTransID, transStatus = transStatus }); // TODO: notify client-side that the Challenge URL step is complete, see below } catch (Exception exce) { // TODO: add your exception handling here } ``` ```php $convertedCRes->threeDSServerTransID, 'transStatus' => $convertedCRes->transStatus ?? '', ]); // $serverTransID = $convertedObject['threeDSServerTransID']; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5 // $acsTransID = $convertedObject['acsTransID']; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9 // $messageType = $convertedObject['messageType']; // Cres // $messageVersion = $convertedObject['messageVersion']; // 2.1.0 // $transStatus = $convertedObject['transStatus']; // Y /** If you have the backend and the frontend hosted on different domains, * or if they are served over different protocols, * you will need to specify the base url for the frontend domain as the second parameter * for the handleChallengeNotification method (eg. http://localhost:3000). */ $response = << END; echo $response; exit; ``` ## Step 1: Create single-use token In this step, we create a single-use token to use in place of the card details for the 3D Secure authentication steps and when creating the sale transaction. Single-use tokens can be created directly via our API. > This step assumes that you are using your own PCI-compliant card form. Alternatively, we can look after the PCI security compliance for you via our [Hosted Fields](https://developer.globalpayments.com/docs/payments/online/hosted-fields-guide.md) or [Drop-In UI](https://developer.globalpayments.com/docs/payments/online/drop-in-ui-overview.md) solution, which captures the customer card details on your behalf. The first API call in this step is to request a single-permission access token that allows you to request and create your single-use token. #### Sample request - Single permission token ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "secret": "b5bbcc9f923d0afd2d91a9539612974647aba8f630cacef8f8d0e6a580a6b09453442615cfafa32e0e5b446938fc80a9db6b5b3c36d27efd50da29d01a662db2", "grant_type": "client_credentials", "nonce": "2024-09-25T19:00:19.003Z", "interval_to_expire": "10_MINUTES", "permissions": [ "PMT_POST_Create_Single" ] }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setPermissions(new String[]{"PMT_POST_Create_Single"}); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setNumber("4222000006285344"); card.setExpMonth(DateTime.now().getMonthOfYear()); card.setExpYear(DateTime.now().getYear() + 1); card.setCvn("987"); try { Transaction response = card.tokenize(true, PaymentMethodUsageMode.SINGLE) .execute(); // API raw response key "id" String tokenId = response.getToken(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardNotPresent; $config->permissions = ['PMT_POST_Create_Single']; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = "4222000006285344"; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = "987"; try{ $response = $card->tokenize(true, PaymentMethodUsageMode::SINGLE) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: add your error handling here } // API raw response key "id" $tokenId = $response->token; //PMT_e7cc73be-c133-455e-8b10-0d2784f0101c ``` #### Sample response - Single permission token ```json { "token": "p3Pjk5Jyx6GDVjbIUDUAP9kM1dtu", "type": "Bearer", "scope": { "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "accounts": [ { "id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8", "name": "tokenization", "permissions": [ "PMT_POST_Create_Single" ] } ] }, "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "TEST_APP", "time_created": "2024-09-25T19:00:19.648Z", "seconds_to_expire": 599, "interval_to_expire": "10_MINUTES", "email": "your.name@email.com" } ``` #### Sample request - Tokenize card ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/payment-methods' \ --header 'accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Accept-Encoding: gzip' \ --header 'Authorization: Bearer p3Pjk5Jyx6GDVjbIUDUAP9kM1dtu' \ --header 'Content-Type: application/json' \ --data-raw '{ "usage_mode": "SINGLE", "reference": "2f2462be-74c4-4a63-ad5c-8da350f5f60c", "name": "James Mason", "card": { "number": "4222000006285344", "expiry_month": "12", "expiry_year": "25", "cvv": "987" } }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("APP_ID"); config.setAppKey("APP_KEY"); config.setChannel(Channel.CardNotPresent.getValue()); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(new DateTime().getMonthOfYear()); card.setExpYear(new DateTime().getYear() + 1); card.setCvn("131"); Transaction response = null; try { response = card .tokenize(true, PaymentMethodUsageMode.SINGLE) .execute(); } catch (ApiException $e) { // TODO: add your error handling here } String tokenId = response.getToken(); //PMT_1c22346c-aafe-47f3-a1c5-231bdb734521 ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "APP_ID"; config.AppKey = "APP_KEY"; config.Channel = Channel.CardPresent; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = DateTime.Now.Month; card.ExpYear = DateTime.Now.Year + 1; card.Cvn = "131"; try { var token = card.Tokenize("default", PaymentMethodUsageMode.Single); //PMT_1c22346c-aafe-47f3-a1c5-231bdb734521 } catch (ApiException e) { // TODO: add your error handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'APP_ID'; $config->appKey = 'APP_KEY'; $config->channel = Channel::CardPresent; ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = "4263970000005262"; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = "131"; try{ $response = $card->tokenize(true, PaymentMethodUsageMode::SINGLE) ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } $tokenId = $response->token; //PMT_1c22346c-aafe-47f3-a1c5-231bdb734521 ``` #### Sample response ```json { "id": "PMT_1c22346c-aafe-47f3-a1c5-231bdb734521", "time_created": "2022-10-06T11:36:44.316Z", "status": "ACTIVE", "usage_mode": "SINGLE", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TKA_b3a46f0f351f43cfad20acf5c32fea50", "account_name": "tokenization", "reference": "2f2462be-74c4-4a63-ad5c-8da350f5f60c", "card": { "masked_number_last4": "XXXXXXXXXXXX5344", "brand": "VISA", "expiry_month": "12", "expiry_year": "25" }, "action": { "id": "ACT_hboxaxUONzfojemgWfDoAE7O0JK7qO", "type": "PAYMENT_METHOD_CREATE", "time_created": "2022-10-06T11:36:44.316Z", "result_code": "SUCCESS", "app_id": "grf9Q3tGYqglXOmYXYGAeYfFvsmnXAGe", "app_name": "demo_app" } } ``` ## Step 2: Generate full access token Now that you have your single-use token stored, you need to use the _/accesstoken_ endpoint again to generate a full permission access token to proceed on your 3D Secure integration. Below are sample request and expected response to allow you move to Step 3. #### Sample request - Full access token ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/accesstoken' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "secret": "9e6ab70379a06aa41aebe3aac68100254fec77b338b579ae40ee8b45a9452d405e1b990ce942d63cd3c63ea2ff6c34bf563b57ff4e05cca32eeda2f670e5f966", "grant_type": "client_credentials", "nonce": "2024-09-25T19:25:35.813Z" }' ``` #### Sample response - Full access token ```json { "token": "yuolhwoZKLmPSFK04rEoZIEwfZyZ", "type": "Bearer", "scope": { "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "accounts": [ { "id": "TRA_27c901760029495f813afbb0dab197ef", "name": "transaction_processing", "permissions": [ "TRN_POST_Authorize", "TRN_POST_Force", "TRN_POST_Refund", "TRN_POST_Capture", "TRN_POST_Reverse", "TRN_POST_Adjust", "TRN_POST_Initiate", "BAT_POST_Close", "TRN_POST_Refund_Standalone", "VER_POST_Verify", "TRN_POST_Reauthorize", "INS_POST_Query", "TRN_GET_Single", "TRN_POST_Confirm", "DEV_POST_Sync", "ACT_GET_Single", "ACT_GET_List", "TRN_GET_List", "TRN_POST_Capture_Multiple", "ACT_POST_Multiple", "APP_GET_Single", "AUT_POST_Initiate", "CCS_POST_DCC", "ACC_GET_Single_Platform", "ACC_GET_Single", "APP_POST_Search_PFCValidate", "ACT_POST_Auto_Action", "PFC_GET_List", "PFC_GET_Single", "TRN_POST_Incremental", "AUT_POST_Results", "BAT_GET_Single", "ACC_GET_List", "GET_Single", "AUT_POST_Check_Availability", "APP_GET_List", "TRN_POST_Split", "AUT_GET_Single", "AUT_GET_List", "TRN_POST_Hold", "TRN_POST_Release" ] }, { "id": "TKA_c1de85a8a5844c56abd9ca07bbd792c8", "name": "tokenization", "permissions": [ "PMT_POST_Create", "PMT_PATCH_Edit", "PMT_Delete", "PMT_GET_List", "PMT_GET_Single", "PMT_POST_Search", "ACT_POST_Multiple", "PMT_POST_Create_Single", "ACC_GET_Single", "GET_Single", "ACT_POST_Auto_Action", "APP_POST_Search_PFCValidate", "ACC_GET_List", "ACT_GET_List", "ACT_GET_Single", "PYR_GET_Single", "PYR_POST_Edit", "PYR_GET_List", "PYR_POST_Create" ] } ] }, "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Test_APP", "time_created": "2024-09-25T19:25:43.008Z", "seconds_to_expire": 86399, "email": "your.name@email.com" } ``` ## Step 3: Check version and enrollment The authentication process begins with determining if the card is enrolled in 3D Secure 2. Authentication is not completed during this step. When [Step 5.1 frictionless](#step-51-frictionless-flow) or [Step 5.2 challenge](#step-52-challenge-flow) is completed, the relevant authentication fields are returned by the issuing bank. Please consult the [Check Availability](https://developer.globalpayments.com/api/authentications.md) method in our API Explorer for more details. If the card is enrolled, the exact version of 3D Secure 2 will be returned (2.x.x) along with the necessary Method URL to facilitate the gathering of device data by the issuer’s ACS (if supported by the issuer). #### Sample Check Version (client side) The Check Version method facilitates requests to your server-side code to check the enrolled version of 3D Secure for the customer’s card. This method also automatically handles the response from the version check. When a card is enrolled and a method URL is present, the method opens a hidden iFrame to the issuer’s ACS to facilitate device-profiling requirements. The method requires two parameters: the server-side endpoint responsible for checking the enrollment of the card and the card data. In our example, we pass the single-use token we created in Step 1. Optionally, we can also send any data from the client-side. For additional details on what can be sent from the client-side, see the [3D Secure Helper Library](https://developer.globalpayments.com/docs/sdk/3DS2#3DS-helper-library) in our SDK Reference. ```javascript ``` ## Step 7: Get authentication result At this point, we know the customer has successfully completed the challenge. However, unlike in a frictionless scenario, our application doesn’t have all the data we need to proceed to authorization. When the customer completes the challenge, the Issuer’s ACS also sends the outcome to our 3D Secure solution, with the full authentication data. The Get Result method in the API allows us to retrieve the necessary data for authorization, including: * ECI * Authentication value * DS Trans ID (Directory Server Transaction ID) * Message version If the customer canceled during the challenge or the authentication did not proceed for another reason, the summary endpoint will include this information. You can then update your application or website accordingly. If you decide not to use our 3D Secure Authentication resource and do not send the Authentication ID (AUT_ID) returned by Authentication resource in the Authorization request or you are using a third party 3D Secure provider, you will be required to include the following fields in the Authorization request. * message_version * eci * value * server_trans_ref * ds_trans_ref Please refer to the [Sample Request for Third-party 3DS Authentication](https://developer.globalpayments.com/docs/risk-management/3D-secure/browser-authentication-guide.md#sample-request-for-third-party-3ds-authentication) in Step 8 - Authorization with 3DS2 data. When a liability shift is obtained via the 3D Secure process then these values above or the `AUT_ID` must be passed in the Authorization request. If not submitted, then the liability shift will not be granted in the event of a chargeback. ### Sample Obtain Authentication data (server side) In our example, we only need to submit the REST API reference for the transaction, the `AUT_ID`. This returns all the information required to complete a 3D Secure authorization. #### Sample request ```json https://apis.sandbox.globalpay.com/ucp/authentications/AUT_5dad4214-78a9-4003-a5a0-737ffa38181c/result ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("app_id"); config.setAppKey("app_key"); config.setEnvironment(Environment.TEST); config.setCountry("IE"); config.setChannel(Channel.CardNotPresent.getValue()); ServicesContainer.configureService(config); // TODO: consume data sent from the payment form (requestData) CreditCardData paymentMethod = new CreditCardData(); paymentMethod.setToken(requestData.get("paymentToken").getAsString()); if (requestData.get("serverTransactionId") != null) { try { String serverTransactionId = requestData.get("serverTransactionId"); threeDSecureData = Secure3dService .getAuthenticationData() .withServerTransactionId(serverTransactionId) .execute(); } catch (ApiException $e) { // TODO: add your error handling here } } ``` ```dotnet // TODO: configure client & request settings GpApiConfig config = new GpApiConfig(); config.AppId = "app_id"; config.AppKey = "app_key"; config.Environment = Entities.Environment.TEST; config.Country = "IE"; config.Channel = Channel.CardNotPresent; ServicesContainer.ConfigureService(config); // TODO: consume card data sent from the JS Library (requestData) CreditCardData paymentMethod = new CreditCardData(); paymentMethod.Token = requestData.GetValue("paymentToken"); if (requestData.GetValue("serverTransactionId") != null) { try { string serverTransactionId = requestData.GetValue("serverTransactionId"); threeDSecureData = Secure3dService .GetAuthenticationData() .WithServerTransactionId(serverTransactionId) .Execute(); } catch (ApiException e) { // TODO: add your error handling here } } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->country = 'IE'; // TODO: consume data sent from the payment form ($requestData) $paymentMethod = new CreditCardData(); $paymentMethod->token = $requestData['paymentToken']; if (!empty($requestData['serverTransactionId'])) { try { $serverTransactionId = $requestData['serverTransactionId']; $threeDSecureData = Secure3dService::getAuthenticationData() ->withServerTransactionId($serverTransactionId) ->execute(); } catch (ApiException $e) { // TODO: add your error handling here } } ``` #### Sample response ```json { "id": "AUT_3df53b41-22eb-4db8-9861-56c28e0a37fb", "time_created": "2022-06-03T15:53:01.974", "status": "SUCCESS_AUTHENTICATED", "channel": "CNP", "amount": "1999", "currency": "EUR", "country": "IE", "source": "BROWSER", "three_ds": { "acs_trans_ref": "e0d13dd0-e354-41ec-8c03-435b033a82d6", "ds_trans_ref": "3d2f6746-6e41-4136-9650-4929c3932801", "server_trans_ref": "3df53b41-22eb-4db8-9861-56c28e0a37fb", "acs_reference_number": "", "liability_shift": "YES", "authentication_type": "OUT_OF_BAND_CHALLENGE", "authentication_value": "AAkBBVKDWAAAACcQl4FUdAoPFg0=", "eci": "05", "status": "AUTHENTICATION_SUCCESSFUL", "status_reason": "", "redirect_url": "https://apis.sandbox.globalpay.com/ucp/authentications/redirect/eyJpZCI6IkFVVF8zZGY1M2I0MS0yMmViLTRkYjgtOTg2MS01NmMyOGUwYTM3ZmIiLCJtZXJjaGFudF9tYW5hZ2VtZW50X2lkIjpudWxsLCJtZXJjaGFudF9pZCI6Ik1FUl83ZTNlMmM3ZGYzNGY0MjgxOWIzZWRlZTMxMDIyZWUzZiIsImFjY291bnRfaWQiOiJUUkFfYzk5NjdhZDdkOGVjNGI0NmI2ZGQ0NGE2MWNkZTlhOTEiLCJtZXJjaGFudF9uYW1lIjoiU2FuZGJveF9tZXJjaGFudF8zIiwiYWNjb3VudF9uYW1lIjoidHJhbnNhY3Rpb25fcHJvY2Vzc2luZyIsImFjc191cmwiOiJodHRwczovL2FjczJwLnRlc3QuZ3BlLmN6L3Rkcy9jaGFsbGVuZ2UvYnJ3L2UwZDEzZGQwLWUzNTQtNDFlYy04YzAzLTQzNWIwMzNhODJkNiIsIm1lc3NhZ2VfdmVyc2lvbiI6IjIuMS4wIiwiYXBwX2lkIjoiZ3JmOVEzdEdZcWdsWE9tWVhZR0FlWWZGdnNtblhBR2UiLCJhcHBfbmFtZSI6Imhvc3RlZF9maWVsZHMiLCJhcHBfZGV2ZWxvcGVyIjoiamFzb24uYmFqYXJpYXNAZ2xvYmFscGF5LmNvbSJ9", "acs_challenge_request_url": "https://acs2p.test.gpe.cz/tds/challenge/brw/e0d13dd0-e354-41ec-8c03-435b033a82d6", "authentication_source": "BROWSER", "challenge_value": "ewogICJtZXNzYWdlVHlwZSIgOiAiQ1JlcSIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjEuMCIsCiAgInRocmVlRFNTZXJ2ZXJUcmFuc0lEIiA6ICIzZGY1M2I0MS0yMmViLTRkYjgtOTg2MS01NmMyOGUwYTM3ZmIiLAogICJhY3NUcmFuc0lEIiA6ICJlMGQxM2RkMC1lMzU0LTQxZWMtOGMwMy00MzViMDMzYTgyZDYiLAogICJjaGFsbGVuZ2VXaW5kb3dTaXplIiA6ICIwNCIKfQ", "message_category": "PAYMENT_AUTHENTICATION", "message_version": "2.1.0", "challenge_status": "NOT_MANDATED", "authentication_request_type": "", "acs_decoupled_response_indicator": "", "whitelist_status": "", "message_extension": [] }, "action": { "id": "ACT_LmP0hFBVsqmimUGlBHwhAUaCYDQE3I", "type": "GET_CHALLENGE_RESULT", "time_created": "2022-06-03T15:53:01.974", "result_code": "SUCCESS", "app_id": "U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name": "demo_app" } } ``` ## Step 8: Authorization with 3DS2 data Now that the 3D Secure 2 process is complete, and depending on the ECI value returned, we can proceed to authorization while including the authentication data. Like we did in a frictionless scenario, here we check the ECI value to ensure it affords the merchant a liability shift. If it does, we proceed to authorization. At this point, the transaction is processed as normal and may be successful or declined based on standard criteria: sufficient funds, correct security code entered, and so forth. ### Authentication endpoint #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer yuolhwoZKLmPSFK04rEoZIEwfZyZ' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_name": "transaction_processing", "channel": "CNP", "type": "SALE", "amount": "1999", "currency": "EUR", "reference": "Test_1234sdfsd", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "id": "PMT_1c22346c-aafe-47f3-a1c5-231bdb734521", "authentication": { "id": "AUT_df8cf033-3c3f-4bc6-af75-73da2acb2f7c" } } }' ``` ```java if (!threeDSecure.getLiabilityShift().equals("YES") || (!threeDSecure.getStatus().equals("SUCCESS_AUTHENTICATED") && !threeDSecure.getStatus().equals("SUCCESS_ATTEMPT_MADE"))) { ) { // TODO: avoid authorization and ask the customer to try another card instead // e.g. available response data // String liabilityShift = threeDSecureData.getLiabilityShift(); // NO // String status = threeDSecureData.getStatus(); // NOT_AUTHENTICATED // String statusReason = threeDSecureData.getStatusReason(); // CARD_AUTHENTICATION_FAILED } paymentMethod.setThreeDSecure(threeDSecureData); try { // TODO: proceed to authorization with liability shift gatewayResponse = paymentMethod .authorize(requestData.get("amount").asBigDecimal()) .withCurrency(requestData.get("currency").getAsString()) .execute(); // TODO: handle gateway response // e.g. available response data // String responseCode = gatewayResponse.getResponseCode(); // SUCCESS // String responseMessage = gatewayResponse.getResponseMessage(); // PREAUTHORIZED // String authCode = gatewayResponse.getTransactionReference().getAuthCode(); // 00 // String transactionId = gatewayResponse.getTransactionReference().getTransactionId(); // TRN_87qJ8EIe4EyNGda9xAWPoa4awo6FbE_2189ef712481 } catch (Exception e) { // TODO: add your error handling here } ``` ```dotnet if (!threeDSecureData.LiabilityShift.Equals("YES") || !threeDSecureData.Status.Equals("SUCCESS_AUTHENTICATED") || !threeDSecureData.Status.Equals("SUCCESS_ATTEMPT_MADE") ) { // TODO: avoid authorization and ask the customer to try another card instead // e.g. available response data // String liabilityShift = threeDSecureData.getLiabilityShift(); // NO // String status = threeDSecureData.getStatus(); // NOT_AUTHENTICATED // String statusReason = threeDSecureData.getStatusReason(); // CARD_AUTHENTICATION_FAILED } paymentMethod.ThreeDSecure = threeDSecureData; try { // TODO: proceed to authorization with liability shift gatewayResponse = paymentMethod .Authorize(requestData.GetValue("amount").ToAmount()) .WithCurrency(requestData.GetValue("currency")) .Execute(); // TODO: handle gateway response // e.g. available response data // String responseCode = gatewayResponse.getResponseCode(); // SUCCESS // String responseMessage = gatewayResponse.getResponseMessage(); // PREAUTHORIZED // String authCode = gatewayResponse.getTransactionReference().getAuthCode(); // 00 // String transactionId = gatewayResponse.getTransactionReference().getTransactionId(); // TRN_87qJ8EIe4EyNGda9xAWPoa4awo6FbE_2189ef712481 } catch (Exception e) { // TODO: add your error handling here } ``` ```php liabilityShift !== 'YES' || ! in_array($threeDSecureData->status, [ Secure3dStatus::SUCCESS_AUTHENTICATED, Secure3dStatus::SUCCESS_ATTEMPT_MADE ])) { // TODO: avoid authorization and ask the customer to try another card instead // e.g. available response data // $liabilityShift = $threeDSecureData->liabilityShift; // NO // $status = $threeDSecureData->status; // NOT_AUTHENTICATED // $statusReason = $threeDSecureData->statusReason; // CARD_AUTHENTICATION_FAILED } $paymentMethod->threeDSecure = $threeDSecureData; } try { // TODO: proceed to authorization with liability shift $gatewayResponse = $paymentMethod->authorize($requestData['amount']) ->withCurrency($requestData['currency']) ->execute(); // TODO: handle gateway response // e.g. available response data // $responseCode = $gatewayResponse->responseCode; // SUCCESS // $responseMessage = $gatewayResponse->responseMessage; // PREAUTHORIZED // $authCode = $gatewayResponse->transactionReference->authCode; // 00 // $transactionId = $gatewayResponse->transactionReference->transactionId; // TRN_87qJ8EIe4EyNGda9xAWPoa4awo6FbE_2189ef712481 } catch (Exception $e) { // TODO: add your error handling here } ``` ### [Conditional] Third-party 3DS Authentication #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer yuolhwoZKLmPSFK04rEoZIEwfZyZ' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_name": "transaction_processing", "channel": "CNP", "type": "SALE", "amount": "1999", "currency": "EUR", "reference": "Test_1234sdfsd", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "id": "PMT_1c22346c-aafe-47f3-a1c5-231bdb734521", "authentication": { "three_ds": { "message_version": "2.2.0", "eci": "05", "value": "ODQzNjgwNjU0ZjM3N2JmYTg0NTM=", "server_trans_ref": "ad0fffeb-bfff-44d0-881f-b857fe77c5a2", "ds_trans_ref": "c272b04f-6e7b-43a2-bb78-90f4fb94aa25", } } } }' ``` #### Sample response ```json "id": "TRN_pVOW1K2sc8hRP4Nymi0qveBP7gcFGb_st_1234sdfsd", "time_created": "2022-06-01T09:42:42.252Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "IE", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "reference": "Test_1234sdfsd", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "funding": "CREDIT", "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "DxKmQE8NmDuXC1uV", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1099150", "action": { "id": "ACT_pVOW1K2sc8hRP4Nymi0qveBP7gcFGb", "type": "AUTHORIZE", "time_created": "2022-06-01T09:42:42.252Z", "result_code": "SUCCESS", "app_id": "grf9Q3tGYqglXOmYXYGAeYfFvsmnXAGe", "app_name": "demo_app" } } ``` ## Sample Hosted Fields and 3DS2 The following is a complete client-side example for Hosted Fields and 3D Secure 2. ```xml
// Configure account window.GlobalPayments.configure({ accessToken: gpApiAccessToken, env: 'sandbox', apiVersion: '2021-03-22', }); const paymentForm = document.getElementById("payment-form"); // Create Form const cardForm = GlobalPayments.creditCard.form("#credit-card", { style: "gp-default" }); cardForm.on("token-success", (response) => { // Add payment token to form as a hidden input const token = document.createElement("input"); token.type = "hidden"; token.id = "payment-token"; token.name = "paymentToken"; token.value = response.paymentReference; paymentForm.appendChild(token); const start3DSButton = document.getElementById("start"); start3DSButton.click(); }); cardForm.on("token-error", (response) => { // Show error to the consumer }); cardForm.on("error", (response) => { // Show error to the consumer }); const { checkVersion, initiateAuthentication, ChallengeWindowSize, } = GlobalPayments.ThreeDSecure; // Add submit click event handler document.addEventListener(“DOMContentLoaded”, () => { const checkVersionButton = document.getElementById(“start”); if (!checkVersionButton) { return; } checkVersionButton.addEventListener(“click”, start3DS); }); // Handle 3DS 2.0 workflow const start3DS = async (e) => { e.preventDefault(); try { const versionCheckData = await checkVersion(“/ThreeDSecure/CheckEnrollment / ”, { card: { reference: document.getElementById(“payment - token”).value, }, order: { amount: document.getElementById("amount").value, currency: document.getElementById("currency").value, } }); if (versionCheckData.status === "NOT_ENROLLED" && versionCheckData.liabilityShift !== "YES") { // TODO: avoid authorization and ask the customer to try another card instead return false; } if (versionCheckData.liabilityShift === "YES") { // TODO: proceed with authorization paymentForm.submit(); return true; } const authenticationData = await initiateAuthentication(“/ThreeDSecure/InitiateAuthentication / ”, { card: { reference: document.getElementById(“payment - token”).value, }, order: { amount: document.getElementById("amount").value, currency: document.getElementById("currency").value, // shipping address // billing address }, payer: { email: "john.smith@example.com", }, versionCheckData: versionCheckData, challengeWindow: { windowSize: ChallengeWindowSize.Windowed600x400, displayMode: “lightbox”, } }); // You have a liability shift and fraud protection if (authenticationData.liabilityShift === "YES" && (authenticationData.result === "SUCCESS_AUTHENTICATED" || authenticationData.result === "SUCCESS_ATTEMPT_MADE")) { // TODO: proceed with authorization paymentForm.submit(); return true; } // Add serverTransactionId to form as a hidden input const serverTransactionId = document.createElement("input"); serverTransactionId.type = "hidden"; serverTransactionId.name = "serverTransactionId"; serverTransactionId.value = authenticationData.serverTransactionId || authenticationData.challenge.response.data.threeDSServerTransID || versionCheckData.serverTransactionId; // Submit data to the integration's backend for processing paymentForm.appendChild(serverTransactionId); paymentForm.submit(); return true; } catch (error) { console.log(error); console.error(“An error occurred”, error.reasons); return false; } return false; }; ``` ## Integration references To get a deeper understanding of 3D Secure, we’ve provided some references for both API and SDK integrations. ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [API /authentications](https://developer.globalpayments.com/api/authentications.md) The full 3D secure resource for your reference. ### [SDK - 3DS guide](https://developer.globalpayments.com/docs/sdk/3DS2) 3DS integration is supported via our JavaScript 3DS library. ## Testing 3D Secure Our 3D Secure solution is available for testing in our free Sandbox environment registered users of this developer portal. Use our resources below to start testing different scenarios. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) Download for multiple use cases under the 3D Secure folder. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. # Exemptions - Overview Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/exemptions/overview.md Section: Risk Management Description: Use exemptions to help reduce payment friction In this article, we discuss how merchants can use our 3D Secure 2 Exemption Optimization and accompanying solutions to solve for both compliant transactions and a seamless customer experience. Exemptions are part of the European strong customer authentication (SCA) regulations set in PSD2. The idea is to allow for an easier payment experience with less friction for the customer under certain conditions. This includes transactions where the value of the payment is low or where robust risk analysis is performed. Exemptions might be applied by the issuer based on the transaction details or might be specifically requested by the merchant, with their acquirer’s permission. 3D Secure 2, the authentication protocol used by card brands such as Visa and Mastercard, provides a framework for merchants to benefit from SCA exemptions. ## When to request an exemption You can flag an exemption request during both the 3D Secure 2 authentication and the payment authorization. Or, you can choose to flag an exemption during the payment authorization step only. Submitting the request during both steps ensures the best chance that the exemption will be applied, as the issuer receives much more data about the transaction and the customer. For certain low-risk transactions, however, you may want to flag an exemption in just the authorization message to see if the issuer will approve the exemption without the use of 3D Secure 2. > When a merchant requests an exemption (whether via authentication or directly in authorization) and it's successfully applied, they'll no longer be able to avail of a liability shift if a fraud-related chargeback occurs. ## Available exemptions The following table provides the available exemptions and indicates whether they are applicable to be flagged during 3D Secure 2 authentication, authorization, or both. | Exemption | Description | Authentication | Authorization | | --- | --- | --- | --- | | Transaction Risk Analysis | Allows for transactions to be exempted from SCA if a robust risk analysis is performed. Whether it can be applied also depends on fraud thresholds pertaining to your acquirer. | Y | Y | | Low-Value Transactions | Transactions up to 30 EUR (or converted equivalent) can be exempted from SCA, dependent on the following criteria:
  • Up to a maximum of five (5) consecutive transactions
  • Or, up to a cumulative limit of 100 EUR (or converted equivalent)
| N | Y | | Trusted Beneficiary | Customers can add a merchant to a list of “trusted beneficiaries” held by the issuer. Subsequent payments to trusted merchants can then be exempted from SCA. | Y | Y | | Secure Corporate Payments | Transactions that meet the following criteria:
  • Initiated by a corporate customer using, for example, a virtual card
  • Originated in a secure corporate environment such as a company-wide travel and expenses system
| N | Y | ## Issuer response The following table provides the values in the response for exemptions that are available to request in the authentication message. The response indicates if the issuer accepted the exemption request or not. | Card Type | ECI | Authentication Value | Authentication Status | Authentication Status Reason | | --- | --- | --- | --- | --- | | Visa | 07 or Blank | Present | AUTHENTICATION_SUCCESSFUL | N/A | | Mastercard | 06 | Leading indicator is kN (optional) | 3D Secure 2.2: AUTHENTICATION_SUCCESSFUL 3D Secure 2.1: AUTHENTICATION_FAILED| 3D Secure 2.2: SCHEME_STATUS_REASON81 3D Secure 2.1: SCHEME_STATUS_REASON81 | If `ECI == 06`, and there is a present Authentication value, the transaction can be treated as successfully authenticated. The presence or absence of `kN` does not impact the success outcome. If the ECI is **not** present or is not the expected value, the transaction **cannot** be treated as successfully authenticated, regardless of Authentication Value. ### 3DS Version-Specific Behavior | 3DS Version | Authentication Status | Authentication Status Reason | | --- | --- | --- | | 3DS 2.2 | CHALLENGE_PREFERENCE_ACKNOWLEDGED_INFORMATIONAL_ONLY | N/A | ### Exemption Logic – Consistent Across Schemes Under the updated scheme logic for 3DS 2.2, if the expected values are present (e.g. **ECI + Authentication Value**), transactions may proceed with exemptions applied — **regardless of card scheme**. ## Next steps Check out the following guides to learn more about our exemption solutions. ### [Transaction Risk Analysis](https://developer.globalpayments.com/docs/TRA) Identify customer exemptions and avoid unnecessary authentications. ### [Low-Value Transactions](https://developer.globalpayments.com/docs/low-value-transactions) Avoid unnecessary authentications for transactions under a certain amount. ### [Trusted Beneficiary](https://developer.globalpayments.com/docs/trusted-beneficiary) Use a trusted merchant list to avoid unnecessary authentications. ### [Secure Corporate Payments](https://developer.globalpayments.com/docs/secure-corp-payments) Request an exemption for corporate customer transactions. # Transaction Risk Analysis Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/exemptions/transaction-risk-analysis.md Section: Risk Management Description: Receive real-time customer exemption eligibilty. Our Exemption Optimization Service (EOS) can perform real-time Transaction Risk Analysis (TRA) and respond with an outcome on exemption eligibility. Once eligibility is confirmed, the exemption can be requested from the Issuer as part of both the 3D Secure 2 authentication and payment authorization, or just in the payment authorization alone. Submitting the exemption request in both the 3D Secure 2 authentication and payment authorization ensures the best chance that the exemption will be applied. This use case is what we cover in this article, but we also show the payment authorization-only flow. ## Both authentication and authorization In this example, we process a 3D Secure 2 authentication using our 3DS Server. This triggers the following actions: * TRA is performed as part of the authentication process. EOS responds with one of the following outcomes: * Apply Exemption * Continue * Force Secure * Block * If Apply Exemption is returned, the 3DS Server will process the authentication with the Issuer and include the request for the TRA exemption. * Next, the Issuer analyzes the transaction and determines if the TRA exemption can be applied. The Issuer responds with one of the following outcomes: * Accepts the TRA exemption request; the authentication is frictionless * Declines the TRA exemption request but determines that another exemption can be applied; the authentication is frictionless * Declines the TRA exemption request and determines that no other exemption can be applied; the authentication requires a challenge ### Authentication message #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/authentications/AUT_79c5a132-e32b-466a-97f0-ceb9851e2374/initiate' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer 29rMFjGRYiyBsPffaerIg6fuT9Lk' \ --header 'Content-Type: application/json' \ --data '{ "three_ds": { "message_version":"2.2", "source": "BROWSER" }, "account_id": "TRA_27c901760029495f813afbb0dab197ef", "channel": "CNP", "country": "IE", "method_url_completion_status": "YES", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4012001038488884", "expiry_month": "09", "expiry_year": "22" } }, "order": { "time_created_reference": "2019-04-26T10:19:32.552327Z", "amount": "1001", "currency": "EUR", "reference": "3400dd37-101d-4940-be15-3c963b6109b3", "address_match_indicator": "false", "shipping_address": { "line1": "Apartment 852", "line2": "Complex 741", "line3": "House 963", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "840" } }, "payer": { "billing_address": { "line1": "Apartment 852", "line2": "Complex 741", "line3": "House 963", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "840" }, "mobile_phone": { "country_code": "44", "subscriber_number": "123456789" } }, "browser_data": { "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "color_depth": "TWENTY_FOUR_BITS", "ip": "123.123.123.123", "java_enabled": "true", "javascript_enabled": "true", "language": "en-US", "screen_height": "1080", "screen_width": "1920", "challenge_window_size": "FULL_SCREEN", "timezone": "0", "user_agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" }, "merchant_contact_url": "https://www.example.com/about" }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setCountry("IEGB"); config.setChallengeNotificationUrl("https://www.example.com/ChallengeNotificationUrl"); config.setMethodNotificationUrl("https://www.example.com/MethodUrl"); config.setMerchantContactUrl("https://www.example.com/AboutUrl"); config.setEnableLogging(true); ServicesContainer.configureService(config); // Create card data CreditCardData card = new CreditCardData(); card.setNumber("4012001038488884"; card.setExpMonth(DateTime.now().getMonthOfYear()); card.setExpYear(DateTime.now().getYear() + 1); card.setCardHolderName("John Smith"); // Shipping address Address shippingAddress = new Address(); shippingAddress.setStreetAddress1("Apartment 852"); shippingAddress.setStreetAddress2("Complex 741"); shippingAddress.setStreetAddress3("no"); shippingAddress.setCity("Chicago"); shippingAddress.setPostalCode("50001"); shippingAddress.setState("IL"); shippingAddress.setCountryCode("840"); // Billing address Address billingAddress = new Address(); billingAddress.setStreetAddress1("Apartment 852"); billingAddress.setStreetAddress2("Complex 741"); billingAddress.setStreetAddress3("no"); billingAddress.setCity("Chicago"); billingAddress.setPostalCode("50001"); billingAddress.setState("IL"); billingAddress.setCountryCode("840"); // Browser data BrowserData browserData = new BrowserData(); browserData.setAcceptHeader("text/html,application/xhtml+xml,application/xml;q=9,image/webp,img/apng,*/*;q=0.8"); browserData.setColorDepth(ColorDepth.TwentyFourBit); browserData.setIpAddress("123.123.123.123"); browserData.setJavaEnabled(true); browserData.setLanguage("en"); browserData.setScreenHeight(1080); browserData.setScreenWidth(1920); browserData.setChallengeWindowSize(ChallengeWindowSize.Windowed_600x400); browserData.setTimezone("0"); browserData.setUserAgent("Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"); try { String orderID = UUID.randomUUID().toString();; ThreeDSecure secureEcom = new ThreeDSecure(); secureEcom.setServerTransactionId("AUT_eb5dce75-99fa-4258-9ab0-69b6377ad935"); ThreeDSecure response = Secure3dService .initiateAuthentication(card, secureEcom) .withAmount(new BigDecimal(10.01)) .withCurrency("EUR") .withAuthenticationSource(AuthenticationSource.Browser) .withMethodUrlCompletion(MethodUrlCompletion.Yes) .withAddressMatchIndicator(false) .withReferenceNumber(orderID) .withOrderCreateDate(DateTime.now()) .withAddress(shippingAddress, AddressType.Shipping) .withAddress(billingAddress, AddressType.Billing) .withMobileNumber("44", "123456789") .withBrowserData(browserData) .execute(); } catch (GatewayException ex) { // TODO: Add your exception handling here } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Country = "IE"; config.ChallengeNotificationUrl = "https://www.example.com/ChallengeNotificationUrl"; config.MethodNotificationUrl = "https://www.example.com/MethodUrl"; config.MerchantContactUrl = "https://www.example.com/AboutUrl"; config.RequestLogger = new RequestConsoleLogger(); config.EnableLogging = true; ServicesContainer.ConfigureService(config); // Create card data CreditCardData card = new CreditCardData(); card.Number = "4012001038488884"; card.ExpMonth = DateTime.Now.Month; card.ExpYear = DateTime.Now.Year + 1; card.CardHolderName = "John Smith"; // Shipping address Address shippingAddress = new Address(); shippingAddress.StreetAddress1 = "Apartment 852"; shippingAddress.StreetAddress2 = "Complex 741"; shippingAddress.StreetAddress3 = "no"; shippingAddress.City = "Chicago"; shippingAddress.PostalCode = "50001"; shippingAddress.State = "IL"; shippingAddress.CountryCode = "840"; // Billing address Address billingAddress = new Address(); billingAddress.StreetAddress1 = "Apartment 852"; billingAddress.StreetAddress2 = "Complex 741"; billingAddress.StreetAddress3 = "no"; billingAddress.City = "Chicago"; billingAddress.PostalCode = "50001"; billingAddress.State = "IL"; billingAddress.CountryCode = "840"; // Browser data BrowserData browserData = new BrowserData(); browserData.AcceptHeader = "text/html,application/xhtml+xml,application/xml;q=9,image/webp,img/apng,*/*;q=0.8"; browserData.ColorDepth = ColorDepth.TWENTY_FOUR_BITS; browserData.IpAddress = "123.123.123.123"; browserData.JavaEnabled = true; browserData.Language = "en"; browserData.ScreenHeight = 1080; browserData.ScreenWidth = 1920; browserData.ChallengeWindowSize = ChallengeWindowSize.WINDOWED_600X400; browserData.Timezone = "0"; browserData.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"; try { var orderID = Guid.NewGuid().ToString(); ThreeDSecure secureEcom = new ThreeDSecure(); secureEcom.ServerTransactionId = "AUT_eb5dce75-99fa-4258-9ab0-69b6377ad935"; var response = Secure3dService.InitiateAuthentication(card, secureEcom) .WithAmount(10.01m) .WithCurrency("EUR") .WithAuthenticationSource(AuthenticationSource.BROWSER) .WithMethodUrlCompletion(MethodUrlCompletion.YES) .WithAddressMatchIndicator(false) .WithReferenceNumber(orderID) .WithOrderCreateDate(DateTime.Now) .WithAddress(shippingAddress, AddressType.Shipping) .WithAddress(billingAddress, AddressType.Billing) .WithMobileNumber("44", "123456789") .WithBrowserData(browserData) .Execute(); } catch (GatewayException ex) { // TODO: Add your exception handling here } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->country = 'IE'; $config->channel = Channel::CardNotPresent; $config->challengeNotificationUrl = 'https://ensi808o85za.x.pipedream.net/'; $config->methodNotificationUrl = 'https://ensi808o85za.x.pipedream.net/'; $config->merchantContactUrl = 'https://enp4qhvjseljg.x.pipedream.net/'; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $card = new CreditCardData(); $card->number = '4012001038488884'; $card->expMonth = '09'; $card->expYear = date('Y', strtotime('+1 year')); $card->cardHolderName = "James Mason"; $shippingAddress = new Address(); $shippingAddress->streetAddress1 = "Apartment 852"; $shippingAddress->streetAddress2 = "Complex 741"; $shippingAddress->streetAddress3 = "House 963"; $shippingAddress->city = "Chicago"; $shippingAddress->postalCode = "50001"; $shippingAddress->state = 'IL'; $shippingAddress->countryCode = "840"; $billingAddress = new Address(); $billingAddress->streetAddress1 = "Apartment 852"; $billingAddress->streetAddress2 = "Complex 741"; $billingAddress->streetAddress3 = "House 963"; $billingAddress->city = "Chicago"; $billingAddress->state = "IL"; $billingAddress->postalCode = "50001"; $billingAddress->countryCode = "840"; $browserData = new BrowserData(); $browserData->acceptHeader = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'; $browserData->colorDepth = ColorDepth::TWENTY_FOUR_BITS;; $browserData->ipAddress = '123.123.123.123'; $browserData->javaEnabled = true; $browserData->javaScriptEnabled = true; $browserData->language = "en-US"; $browserData->screenHeight = 1080; $browserData->screenWidth = 1920; $browserData->challengWindowSize = ChallengeWindowSize::FULL_SCREEN; $browserData->timeZone = "0"; $browserData->userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"; $orderId = GenerationUtils::generateOrderId(); $threeDS = new ThreeDSecure(); $threeDS->serverTransactionId = 'AUT_eb5dce75-99fa-4258-9ab0-69b6377ad935'; $response = Secure3dService::initiateAuthentication($card, $threeDS) ->withAmount('10.01') ->withCurrency('EUR') ->withAuthenticationSource(AuthenticationSource::BROWSER) ->withMethodUrlCompletion(MethodUrlCompletion::YES) ->withAddressMatchIndicator(false) ->withReferenceNumber($orderId) ->withOrderCreateDate(date('Y-m-d H:i:s')) ->withAddress($shippingAddress, AddressType::SHIPPING) ->withAddress($billingAddress, AddressType::BILLING) ->withMobileNumber('44', '123456789') ->withBrowserData($browserData) ->execute(); ``` #### Sample response ```json { "id": "AUT_79c5a132-e32b-466a-97f0-ceb9851e2374", "time_created": "2024-11-28T11:51:17.562Z", "time_last_updated": "2024-11-28T11:50:55.803Z", "transaction_type": "SALE", "status": "CHALLENGE_REQUIRED", "channel": "CNP", "amount": "1999", "currency": "GBP", "country": "IE", "source": "BROWSER", "three_ds": { "server_trans_ref": "79c5a132-e32b-466a-97f0-ceb9851e2374", "acs_trans_ref": "13a7a360-ad7f-41ef-8f90-24187489cd8a", "acs_reference_number": "3DS_LOA_ACS_INTE_020200_00293", "ds_trans_ref": "444a15b7-aa2a-4501-b157-33efad74df4e", "eci": "", "liability_shift": "", "status": "CHALLENGE_REQUIRED", "status_reason": "", "authentication_source": "BROWSER", "message_version":"2.2", "authentication_value": "", "cardholder_response_info": "", "message_category": "PAYMENT_AUTHENTICATION", "redirect_url": "https://acs2p.test.gpe.cz/tds/challenge/brw/13a7a360-ad7f-41ef-8f90-24187489cd8a", "acs_challenge_request_url": "https://acs2p.test.gpe.cz/tds/challenge/brw/13a7a360-ad7f-41ef-8f90-24187489cd8a", "challenge_status": "MANDATED", "challenge_model": "OUT_OF_BAND_CHALLENGE", "session_data_field_name": "threeDSSessionData", "message_type": "creq", "challenge_value": "ewogICJtZXNzYWdlVHlwZSIgOiAiQ1JlcSIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjIuMCIsCiAgInRocmVlRFNTZXJ2ZXJUcmFuc0lEIiA6ICI3OWM1YTEzMi1lMzJiLTQ2NmEtOTdmMC1jZWI5ODUxZTIzNzQiLAogICJhY3NUcmFuc0lEIiA6ICIxM2E3YTM2MC1hZDdmLTQxZWYtOGY5MC0yNDE4NzQ4OWNkOGEiLAogICJjaGFsbGVuZ2VXaW5kb3dTaXplIiA6ICIwNSIKfQ" }, "notifications": { "challenge_return_url": "https://www.example.com/ChallengeNotification" }, "action": { "id": "ACT_BjXCBMGXIg9hs9fm4KIeMj71TxnqHk", "type": "INITIATE", "time_created": "2024-11-28T11:51:17.562Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "my_sandbox_app" } } ``` ### TRA outcomes The following table describes the various outcomes and actions that can occur based on the EOS response. | Outcome | Description | 3DS Server Action | | -------- | ------- | ------- | | Apply Exemption | Transaction was approved for the TRA exemption. | Includes the appropriate exemption request flag in the authentication message to the Issuer. | | Continue | Transaction was not approved for an exemption but was deemed to be relatively low risk. | Proceeds with standard 3D Secure authentication. In this scenario, the Issuer can still choose to apply the exemption. | | Force Secure | Transaction was not approved for an exemption and was deemed to be high risk. In this scenario, the Issuer should always apply a Strong Customer Authentication (SCA) challenge to authenticate the cardholder. | Proceeds with 3D Secure authentication. Includes the Challenge Mandated flag in the message to the Issuer. | | Block | Transaction was identified as very high risk or known fraud. | Does not proceed with 3D Secure authentication. | ### Authorization message Once the exemption is accepted by the Issuer, you can proceed to authorization. In our example, we include the authentication data in the message, along with the relevant exemption. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer vJCIFsAMxW9PgVBKz91MoOSMvw9p' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "25576071", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" }, "authentication": { "id": "AUT_1ab42d76-5f0e-4d4b-b3bc-72de7071d61d", "three_ds": { "message_version":"2.2", "exempt_status": "TRANSACTION_RISK_ANALYSIS" } } } }' ``` #### Sample response ```json { "id": "TRN_p2fjfkU3mfWrRoQvSd6Omskep5SWxY_25576071", "time_created": "2022-05-06T17:08:33.816Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "25576071", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "ND6ZF7rk03RaqrIJ", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1086726", "action": { "id": "ACT_p2fjfkU3mfWrRoQvSd6Omskep5SWxY", "type": "AUTHORIZE", "time_created": "2022-05-06T17:08:33.816Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ## Sandbox testing In the Production environment, the TRA outcome is determined by the overall analysis of the provided transaction data. However, for Sandbox testing, you can trigger an outcome by setting the transaction amount value within a specific range, as indicated in the following table. ### TRA outcomes The following table describes the various outcomes and actions that can occur based on the EOS response. | Outcome | Amount Trigger EUR (or converted equivalent) | 3DS Server Action | | -------- | ------- | ------- | | Apply Exemption | amount \<= 250 | Populates the outbound authentication message with the appropriate exemption flag. | | Continue | 250 \< amount \<= 500 | Processes the 3D Secure authentication as normal. | | Force Secure | 500 \< amount \<= 750 | Populates the outbound authentication message indicating that a challenge is mandated. This will always force a challenge to be applied, regardless of the test card used. | | Block | 750 \< amount | Blocks the transaction and returns the appropriate response. | > In Sandbox, the Access Control Server simulator does not accept the exemption request and processes the authentication as standard. The Electronic Commerce Indicator and Transaction Status values will remain as described in our [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) article. ## Authorization only In this example, we call the EOS directly to perform TRA and request the associated exemption from the Issuer in the authorization message. This triggers the following actions: * The EOS responds with one of the following outcomes: * Apply Exemption * Continue * Force * Block * If Apply Exemption is returned, you can proceed directly to authorization and include the exemption request in the message. * The Issuer analyzes the transaction and determines if the TRA exemption can be applied. The Issuer responds with one of the following outcomes: * Accepts the TRA exemption request; the authorization continues as normal * Declines the TRA exemption request but determines that another exemption can be applied; the authorization continues as normal * Declines the TRA exemption request and determines that no other exemption can be applied; SCA is required, and a Soft Decline message is returned ### Exemption request message #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/risk-assessments' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TrAtA2UcxiCOj097b5d1P4rj1BKx' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "source": "BROWSER", "account_id": "RAA_577f0b7a91ba4dd8b8c0178eee5a973f", "country": "IE", "order": { "amount": 100, "currency": "EUR", "reference": "8525aa58-e47b-4d04-88a2-4d589b2c78c1" }, "payment_method": { "name": "James Mason", "card": { "brand": "VISA", "number": "4012001038488884", "expiry_month": "12", "expiry_year": "25" } }, "browser_data": { "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "language": "en-US", "ip": "123.123.123.123" } }' ``` #### Sample response ```json { "id":"RAS_Wrr413lAtzVWmuS5W3LcIX72cQDyVn", "time_created":"2022-04-11T09:22:40.850Z", "status":"ACCEPTED", "amount":"100", "currency":"EUR", "merchant_id":"MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name":"Sandbox_merchant_2", "account_id":"RAA_577f0b7a91ba4dd8b8c0178eee5a973f", "account_name":"exemptions", "reference":"8525aa58-e47b-4d04-88a2-4d589b2c78c1", "result":"Apply Exemption", "message":"Apply Exemption", "payment_method":{ "card":{ "masked_number_last4":"XXXXXXXXXXXX8884", "brand":"VISA", "bin":"", "bin_country":"", "account_type":"", "issuer":"" } }, "raw_response":{ "platform":"EOS", "data":{ "action_applied":"APPLY_EXEMPTION", "transaction_id":"3400dd37-101d-4940-be15-3c963b6109b3", "request_id":"dab03eb5-a34a-431f-89c3-a2c45fba530b", "matched_rule":{ "id":42831, "title":"Apply Exemption", "action_applied":"APPLY_EXEMPTION" } } }, "action":{ "id":"ACT_Wrr413lAtzVWmuS5W3LcIX72cQDyVn", "type":"ASSESS", "time_created":"2022-04-11T09:22:40.850Z", "result_code":"SUCCESS", "app_id":"U1lRHKomEn7DN907RCDPxVhyMfiMLcfy", "app_name":"dev_portal_demo" } } ``` ### TRA outcomes The following table describes the various outcomes and actions that can occur based on the EOS response. It also includes our recommended actions. | Outcome | Description | Recommended Action | | -------- | ------- | ------- | | Apply Exemption | Transaction was approved for the TRA exemption. | Include the appropriate exemption request flag in the authorization message. | | Continue | Transaction was not approved for an exemption but was deemed to be relatively low risk. | Proceed with a standard 3D Secure authentication with the 3DS Server. | | Force Secure | Transaction was not approved for an exemption and was deemed to be high risk. In this scenario, the Issuer should always apply a SCA challenge to authenticate the cardholder. | Proceeds with 3D Secure authentication. Include the Challenge Mandated flag in the message to the 3DS Server. For more information, see our [3D Secure](https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md) documentation. | | Block | The transaction was identified as very high risk or known fraud. | Halt the transaction and take appropriate action. | ### Authorization message In this example, EOS returned Apply Exemption, so we proceed directly to authorization and bypass 3D Secure authentication. As noted earlier, requesting the exemption in both the authentication and authorization messages is best practice; however, there may be specific use cases that call for authorization only. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer vJCIFsAMxW9PgVBKz91MoOSMvw9p' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "25576071", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" }, "authentication": { "three_ds": { "message_version":"2.2", "exempt_status": "TRANSACTION_RISK_ANALYSIS" } } } }' ``` #### Sample response ```json { "id": "TRN_p2fjfkU3mfWrRoQvSd6Omskep5SWxY_25576071", "time_created": "2022-05-06T17:08:33.816Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "25576071", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "ND6ZF7rk03RaqrIJ", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1086726", "action": { "id": "ACT_p2fjfkU3mfWrRoQvSd6Omskep5SWxY", "type": "AUTHORIZE", "time_created": "2022-05-06T17:08:33.816Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ## Soft decline ### What is a soft decline? A soft decline is a response we get when a customers issuing bank are not willing to provide an SCA exemption to the transaction you're processing. By requesting an exemption in the authorization only, the Issuer might reject the exemption request and respond with what’s known as a *soft decline*: result code **111**. If you receive a soft decline, you can then proceed with standard 3D Secure authentication and a second authorization. > The examples used in this guide involve one authentication message and two authorization messages. In using this logic, you might incur additional transaction fees. For more information, contact your account manager. #### Sample response ```json { "id": "TRN_aUZq8cKq57ur5RyiI9PQwQJheFxVXI_58657811", "time_created": "2022-05-09T12:58:04.224Z", "type": "SALE", "status": "DECLINED", "channel": "CNP", "capture_mode": "LATER", "amount": "", "currency": "", "country": "US", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "58657811", "payment_method": { "result": "111", "message": "[ test system ] Strong Customer Authentication Required", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX0091", "authcode": "", "brand_reference": "cl3De8e1TAQzttFT", "brand_time_created": "", "cvv_result": "NOT_MATCHED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "111", "cvv_result": "N", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "", "action": { "id": "ACT_aUZq8cKq57ur5RyiI9PQwQJheFxVXI", "type": "PREAUTHORIZE", "time_created": "2022-05-09T12:58:04.224Z", "result_code": "DECLINED", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` # Low-Value Transactions Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/exemptions/low-value-transactions.md Section: Risk Management Description: Avoid authentications for transactions under a certain amount. This guide focuses on how to request an exemption for a low-value transaction in the authorization. ## Exemption criteria Transactions up to 30 EUR (or converted equivalent) can be exempted from Strong Customer Authentication (SCA), dependent on the following criteria: * Up to a maximum of five (5) consecutive transactions * OR, up to a cumulative limit of 100 EUR (or converted equivalent) ## Authorization message The low-value transaction exemption can only be requested in the Payment Authorization message. If the Issuer accepts the exemption request, the transaction will proceed as normal and will be successful or declined based on standard criteria (sufficient funds, correct security code entered, and so on). If the exemption request is not accepted, the Issuer might respond with a soft decline (see [Soft decline](#soft-decline) section). #### Sample request ```JSON curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer vJCIFsAMxW9PgVBKz91MoOSMvw9p' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "25576071", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" }, "authentication": { "three_ds":{ "exempt_status": "LOW_VALUE" } } } }' ``` #### Sample response ```JSON { "id": "TRN_p2fjfkU3mfWrRoQvSd6Omskep5SWxY_25576071", "time_created": "2022-05-06T17:08:33.816Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "25576071", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "ND6ZF7rk03RaqrIJ", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1086726", "action": { "id": "ACT_p2fjfkU3mfWrRoQvSd6Omskep5SWxY", "type": "AUTHORIZE", "time_created": "2022-05-06T17:08:33.816Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ## Soft decline ### What is a soft decline? A soft decline is a response we get when a customers issuing bank are not willing to provide an SCA exemption to the transaction you're processing. By requesting a low-value exemption in the authorization message, the Issuer might reject the exemption request and respond with what’s known as a *soft decline*: result code **111**. If you receive a soft decline, you can then proceed with standard 3D Secure authentication and a second authorization. For more information on authentications, see our [3D Secure 2](https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md) documentation. # Trusted Beneficiary Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/exemptions/trusted-beneficiary.md Section: Risk Management Description: Use a trusted merchant list to avoid unnecessary authentications. Customers can add a merchant to a list of “trusted beneficiaries” held by the Issuer. Subsequent payments to trusted merchants can then be exempted from Strong Customer Authentication (SCA). In this article, we cover two high-level use cases: **Use Case 1: The merchant is not on the customer’s trusted list** * 3D Secure 2 authentication with the Prompt For Trusted List flag * Customer adds the merchant to their list * Authorization with Trusted Merchant exemption flag **Use Case 2: The merchant is already on the customer’s trusted list** * Request the exemption in the Authentication and Authorization messages * Request the exemption in the Authorization message only ## Add to trusted merchant list In this example, the customer has not previously added the merchant to their trusted list. In order to request them to do so, we process a 3D Secure 2 authentication with the Prompt For Trusted List flag enabled. ### Authentication message #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/authentications/AUT_bd7160df-58ee-4b39-9193-514ebfc9cdbb/initiate' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer TrAtA2UcxiCOj097b5d1P4rj1BKx' \ --header 'Content-Type: application/json' \ --data-raw '{ "three_ds": { "source": "BROWSER", "preference": "CHALLENGE_REQUESTED_PROMPT_FOR_WHITELIST" }, "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "country": "IE", "method_url_completion_status": "YES", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" } }, "order": { "time_created_reference": "2019-04-26T10:19:32.552327Z", "amount": "1001", "currency": "EUR", "reference": "3400dd37-101d-4940-be15-3c963b6109b3", "address_match_indicator": "false", "shipping_address": { "line1": "Apartment 852", "line2": "Complex 741", "line3": "House 963", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "840" } }, "payer": { "billing_address": { "line1": "Apartment 852", "line2": "Complex 741", "line3": "House 963", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "840" }, "mobile_phone": { "country_code": "44", "subscriber_number": "123456789" } }, "browser_data": { "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "color_depth": "TWENTY_FOUR_BITS", "ip": "123.123.123.123", "java_enabled": "true", "javascript_enabled": "true", "language": "en-US", "screen_height": "1080", "screen_width": "1920", "challenge_window_size": "FULL_SCREEN", "timezone": "0", "user_agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" }, "merchant_contact_url": "https://www.example.com/about" }' ``` #### Sample response ```json { "id": "AUT_d0614650-3453-491b-8f03-c0db6b2b1beb", "time_created": "2022-05-06T16:48:26.202Z", "time_last_updated": "2022-05-06T16:48:22.147Z", "transaction_type": "SALE", "status": "SUCCESS_AUTHENTICATED", "channel": "CNP", "amount": "100", "currency": "EUR", "country": "IE", "source": "BROWSER", "three_ds": { "server_trans_ref": "d0614650-3453-491b-8f03-c0db6b2b1beb", "acs_trans_ref": "59485280-cd5c-41ec-8be7-28ab04e64b15", "acs_reference_number": "3DS_LOA_ACS_INTE_020200_00293", "ds_trans_ref": "97aef3fd-2818-4f1d-964d-f3c558857972", "eci": "05", "liability_shift": "YES", "status": "AUTHENTICATION_SUCCESSFUL", "status_reason": "", "authentication_source": "BROWSER", "message_version": "2.1.0", "authentication_value": "AJkBAYKIUwAAAAPpl4EmdAAAAAA=", "cardholder_response_info": "", "message_category": "PAYMENT_AUTHENTICATION", "redirect_url": "", "acs_challenge_request_url": "", "challenge_status": "", "challenge_model": "", "session_data_field_name": "threeDSSessionData", "message_type": "creq", "challenge_value": "" }, "notifications": { "challenge_return_url": "https://www.example.com/challengeReturnUrl" }, "action": { "id": "ACT_r4P5qFmvJPdC8D70zbx3rzG2hjJjt1", "type": "INITIATE", "time_created": "2022-05-06T16:48:26.202Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ### Authorization message Now that the merchant is added to the customer’s trusted merchants list, we can proceed to authorization. We include the authentication data in the message, along with the relevant exemption. #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TrAtA2UcxiCOj097b5d1P4rj1BKx' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "8dc288e2-607b-41f4-99b7-a2f43fbba740", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" }, "authentication": { "id": "AUT_f3425c1a-4a92-46f3-80ca-ce30f3180e69", "three_ds": { "exempt_status": "TRUSTED_MERCHANT" } } } }' ``` #### Sample response ```json { "id": "TRN_wJDkGS1HydsCoGXq7Y1CqcRIAP5dKj_a2f43fbba740", "time_created": "2022-05-09T17:07:59.104Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "8dc288e2-607b-41f4-99b7-a2f43fbba740", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "Ms1FC3QU53XvoWF4", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1087449", "action": { "id": "ACT_wJDkGS1HydsCoGXq7Y1CqcRIAP5dKj", "type": "AUTHORIZE", "time_created": "2022-05-09T17:07:59.104Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ## Existing trusted merchant In this example, we assume that the merchant was already added to the customer’s trusted list. The next time the customer transacts, the merchant can request the Trusted Beneficiary exemption. As with the Transaction Risk Analysis (TRA) exemption, this can be requested either in the authentication and payment authorization message, or in the authorization message only. Similarly to TRA, requesting the exemption in the authorization message only could mean bypassing 3D Secure authentication altogether; however, the risk is that the Issuer declines the exemption request (that is, soft decline). This forces you to process a 3D Secure 2 authentication and another authorization. In this article, we cover both use cases. ### Authentication and Authorization messages In this example, we request the exemption in the 3D Secure 2 authentication message. If the Issuer declines the exemption, they may apply another exemption (for example, low value) or respond with a challenge for the customer to complete. ### Authentication message #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/authentications/AUT_65c32dda-80c6-4368-b1d2-cdd9fff6f230/initiate' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Authorization: Bearer TrAtA2UcxiCOj097b5d1P4rj1BKx' \ --header 'Content-Type: application/json' \ --data-raw '{ "three_ds": { "source": "BROWSER", "preference": "NO_CHALLENGE_REQUESTED_WHITELIST" }, "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "country": "IE", "method_url_completion_status": "YES", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" } }, "order": { "time_created_reference": "2019-04-26T10:19:32.552327Z", "amount": "1001", "currency": "EUR", "reference": "ce0a8cd8-d2ae-42cf-a5ba-c9703e19bab7", "address_match_indicator": "false", "shipping_address": { "line1": "Apartment 852", "line2": "Complex 741", "line3": "House 963", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "840" } }, "payer": { "billing_address": { "line1": "Apartment 852", "line2": "Complex 741", "line3": "House 963", "city": "Chicago", "postal_code": "50001", "state": "IL", "country": "840" }, "mobile_phone": { "country_code": "44", "subscriber_number": "123456789" } }, "browser_data": { "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "color_depth": "TWENTY_FOUR_BITS", "ip": "123.123.123.123", "java_enabled": "true", "javascript_enabled": "true", "language": "en-US", "screen_height": "1080", "screen_width": "1920", "challenge_window_size": "FULL_SCREEN", "timezone": "0", "user_agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" }, "merchant_contact_url": "https://www.example.com/about" }' ``` #### Sample response ```json { "id": "AUT_d0614650-3453-491b-8f03-c0db6b2b1beb", "time_created": "2022-05-06T16:48:26.202Z", "time_last_updated": "2022-05-06T16:48:22.147Z", "transaction_type": "SALE", "status": "SUCCESS_AUTHENTICATED", "channel": "CNP", "amount": "100", "currency": "EUR", "country": "IE", "source": "BROWSER", "three_ds": { "server_trans_ref": "d0614650-3453-491b-8f03-c0db6b2b1beb", "acs_trans_ref": "59485280-cd5c-41ec-8be7-28ab04e64b15", "acs_reference_number": "3DS_LOA_ACS_INTE_020200_00293", "ds_trans_ref": "97aef3fd-2818-4f1d-964d-f3c558857972", "eci": "07", "liability_shift": "NO", "status": "AUTHENTICATION_SUCCESSFUL", "status_reason": "", "authentication_source": "BROWSER", "message_version": "2.1.0", "authentication_value": "AJkBAYKIUwAAAAPpl4EmdAAAAAA=", "cardholder_response_info": "", "message_category": "PAYMENT_AUTHENTICATION", "redirect_url": "", "acs_challenge_request_url": "", "challenge_status": "", "challenge_model": "", "session_data_field_name": "threeDSSessionData", "message_type": "creq", "challenge_value": "" }, "notifications": { "challenge_return_url": "https://www.example.com/challengeReturnUrl" }, "action": { "id": "ACT_r4P5qFmvJPdC8D70zbx3rzG2hjJjt1", "type": "INITIATE", "time_created": "2022-05-06T16:48:26.202Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "sean_sandbox_app" } } ``` ### Authorization message #### Sample request ```json curl --location --request POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TrAtA2UcxiCOj097b5d1P4rj1BKx' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "8dc288e2-607b-41f4-99b7-a2f43fbba740", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" }, "authentication": { "id": "AUT_f3425c1a-4a92-46f3-80ca-ce30f3180e69", "three_ds": { "exempt_status": "TRUSTED_MERCHANT" } } } }' ``` #### Sample response ```json { "id": "TRN_wJDkGS1HydsCoGXq7Y1CqcRIAP5dKj_a2f43fbba740", "time_created": "2022-05-09T17:07:59.104Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "8dc288e2-607b-41f4-99b7-a2f43fbba740", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "Ms1FC3QU53XvoWF4", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1087449", "action": { "id": "ACT_wJDkGS1HydsCoGXq7Y1CqcRIAP5dKj", "type": "AUTHORIZE", "time_created": "2022-05-09T17:07:59.104Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ## Authorization only In this example, we proceed straight to authorization and request the exemption. We do not process a 3D Secure 2 authentication. > Note: Here, you will use the AUT_ID of the original authentication for the merchant added to your trusted merchant list. ### Authorization message #### Sample request ```json --header 'Content-Type: application/json' \ --header 'Authorization: Bearer TrAtA2UcxiCOj097b5d1P4rj1BKx' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data-raw '{ "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "channel": "CNP", "type": "SALE", "amount": "100", "currency": "EUR", "reference": "8dc288e2-607b-41f4-99b7-a2f43fbba740", "country": "IE", "payment_method": { "name": "James Mason", "entry_mode": "ECOM", "card": { "number": "4263970000005262", "expiry_month": "09", "expiry_year": "22" }, "authentication": { "id": "AUT_f3425c1a-4a92-46f3-80ca-ce30f3180e69", "three_ds": { "exempt_status": "TRUSTED_MERCHANT" } } } }' ``` #### Sample response ```json { "id": "TRN_wJDkGS1HydsCoGXq7Y1CqcRIAP5dKj_a2f43fbba740", "time_created": "2022-05-09T17:07:59.104Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "100", "currency": "EUR", "country": "IE", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "8dc288e2-607b-41f4-99b7-a2f43fbba740", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "authentication": { "cavv_result": "" }, "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "Ms1FC3QU53XvoWF4", "brand_time_created": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "batch_id": "BAT_1087449", "action": { "id": "ACT_wJDkGS1HydsCoGXq7Y1CqcRIAP5dKj", "type": "AUTHORIZE", "time_created": "2022-05-09T17:07:59.104Z", "result_code": "SUCCESS", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` ## Soft decline ### What is a soft decline? A soft decline is a response we get when a customers issuing bank are not willing to provide an SCA exemption to the transaction you're processing. By requesting the Trusted Beneficiary exemption directly in the authorization message, the Issuer could reject the exemption request and respond with what’s known as a *soft decline*: result code **111**. If you receive a soft decline, you can then proceed with standard 3D Secure authentication and a second authorization. For more information on authentications, see our [3D Secure](https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md) documentation. > The examples used in this guide involve one authentication message and two authorization messages. In using this logic, you might incur additional transaction fees. For more information, contact your account manager. #### Sample response ```json { "id": "TRN_aUZq8cKq57ur5RyiI9PQwQJheFxVXI_58657811", "time_created": "2022-05-09T12:58:04.224Z", "type": "SALE", "status": "DECLINED", "channel": "CNP", "capture_mode": "LATER", "amount": "", "currency": "", "country": "US", "merchant_id": "MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name": "Test Merchant", "account_id": "TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name": "internet", "reference": "58657811", "payment_method": { "result": "111", "message": "[ test system ] Strong Customer Authentication Required", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX0091", "authcode": "", "brand_reference": "cl3De8e1TAQzttFT", "brand_time_created": "", "cvv_result": "NOT_MATCHED", "avs_address_result": "NOT_CHECKED", "avs_postal_code_result": "NOT_CHECKED", "avs_action": "", "provider": { "result": "111", "cvv_result": "N", "avs_address_result": "U", "avs_postal_code_result": "U" } } }, "batch_id": "", "action": { "id": "ACT_aUZq8cKq57ur5RyiI9PQwQJheFxVXI", "type": "PREAUTHORIZE", "time_created": "2022-05-09T12:58:04.224Z", "result_code": "DECLINED", "app_id": "a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name": "my_sandbox_app" } } ``` # 3D Secure - Additional Guides Source: https://developer.globalpayments.com/docs/risk-management/3D-secure/3DS-more-overview.md Section: Risk Management Description: Mitigate risk via our 3D Secure and Fraud Management capabilities ### [In-App Authentication](https://developer.globalpayments.com/docs/3DS-mobile-sdk) Learn to use our 3DS Mobile SDK Solution with Netcetera to authenticate customers within an app. ### [Out of Scope Transactions](https://developer.globalpayments.com/docs/out-scope-overview) Learn how to properly flag transactions that don’t require 3DS authentication or the use of an exemption. ### [Merchant-Initiated Authentication](https://developer.globalpayments.com/docs/3DS2-3RI) Learn to generate authentication data without the customer’s involvement in the transaction. ### [Decoupled Authentication](https://developer.globalpayments.com/docs/decoupled-auth) Verify and authenticate the customer's identity outside of their interaction with your app or website. ### [Message Extension](https://developer.globalpayments.com/docs/message-extension) Learn how to use this field to send customized information to the card issuer. ### [3DS Validation Table](https://developer.globalpayments.com/docs/3DS-validation) Useful troubleshooting table, including card numbers to validate your integration for 3D Secure. # Fraud Management - Overview Source: https://developer.globalpayments.com/docs/risk-management/fraud-management/overview.md Section: Risk Management Description: Explore ways to better identify customers and reduce fraud Selling online enables merchants to grow and scale their business substantially. However, it can result in goods being shipped that you might not get paid for. In addition to using [3D Secure](https://developer.globalpayments.com/docs/risk-management/3D-secure/overview.md) for all online transactions, you can also mitigate this risk by using our Fraud Management solutions: * Fraud Filter — Automatically pass, hold, or block transactions based on the result of one or more rule results screened during a transaction. * Address Verification Service — Verify the customer’s address provided at the time of sale against the issuer’s records. * Decision Manager — Perform standalone or automatic risk assessment for transactions. Fraud Management offers: * Over 30 fraud rules, including powerful pattern and velocity rules with 12 data lists * A fraud filter Passive mode to hold risky transactions for manual review, preventing false positives * A simple user interface to set up and manage filter rules * The ability to easily incorporate fraud rules for every transaction you process > Fraud Management is currently only available for card-not-present transactions in the United Kingdom, United States, Canada, and the European Union. ## Use cases In this section, we present some “real world” examples that can be enabled through Fraud Management. Keep in mind that this section doesn’t cover all of the use cases. #### Use case #1: Limit the number of cards for top-up services A mobile operator discovers that fraudsters are using multiple stolen credit card numbers to top up “pay as you go” mobile accounts. However, by the time the mobile operator receives chargebacks from the cardholders, the credit has already been used. Using fraud filters, the mobile operator can now limit the number of different cards that can be used to top up any “pay as you go” mobile. After the limit is reached, any new cards that are attempted are blocked or held for further review by the merchant. Likewise, the mobile operator can limit the number of top-ups allowed per day, per week, and so on. #### Use case #2: Monitor high transaction amounts An online merchant observes an increased occurrence in chargebacks due to alleged fraud claimed by cardholders. The amounts for these transactions were substantially higher than what the merchant typically processes for their business. The merchant has since implemented 3D Secure to help protect against fraudulent online transactions. However, the merchant has opted to also implement two fraud filters as an additional layer of security: * Fraud rule #1: Hold a transaction (for further review) if the amount is higher than a predefined amount set by the merchant. This allows the merchant to review the transaction and validate with the cardholder before releasing it to be processed. * Fraud rule #2: Block a transaction if 3D Secure authentication was not successfully performed on the cardholder. #### Use case #3: Screen without losing sales to false positives A large multinational merchant wants to implement a set of various fraud rules but needs to ensure that the rules are properly configured and will not result in a substantial number of false positives leading to lost sales. In this scenario, the merchant can activate the rules and turn on Passive mode. When in Passive mode, all live transactions are screened by the established fraud rules. Fraud results will be generated but will not block or hold any of the transactions. This allows the merchant to first monitor the behavior and effectiveness of their fraud rules and to subsequently make any necessary adjustments before enabling them in Active mode to put them into action. ## Fraud Filter The Fraud Management Fraud Filter enables merchants to automatically hold, block, or pass transactions based on the result of one or more rule results screened during a transaction. You can configure and enable fraud rules on the Ecommerce Portal (RealControl) in the Fraud Management section. Fraud Filter must be set up first before being used via our REST API. For steps and code samples for how to use Fraud Filter, see our [Fraud Filter](https://developer.globalpayments.com/docs/risk-management/fraud-management/fraud-filter.md) guide. ### Create rules You can create new Fraud Filter rules from the Rules tab as shown below. From the Data Lists tab, you can manage your data lists, which are used by certain rules (for example, a high-risk card number list or medium-risk IP address list). ![Alt text: Fraud Filter - Rules Tab](https://developer.globalpayments.com/gh-assets/fraud_filter_rules.png) **Fraud Filter - Rules Tab** To make it easier to organize your rules, we provide preset categories, as described in the table below. | Rule Category | Description | | -------- | ------- | | Card Number and BIN (Bank Identification Number) | Rules relating to the usage frequency of a card number or BIN. You can also create a rule for all high-risk card numbers or BINs. | | Geographic | Rules relating to location or country. For example, cards from certain countries or if the shipping and billing countries are different. | | Customer | Rules relating to a customer number or cardholder name. For example, the number of times the customer number is seen with different card numbers. | | Product Details | Rules relating to product details. For example, for all high-risk product IDs or when the Variable Reference is used with different card numbers. | | Velocity | Rules based on the number of transactions processed or declined within a set time frame. | | High Risk Time | Rules based on the timestamp of the transaction, for example, a certain time of day. | | Amount | Rules based on if the amount is greater than a defined amount. | | Third Party | Rules based on the results of a third party such as Decision Manager. | ### Set mode You can set the Fraud Filter mode for individual fraud rules for a given transaction. There is also an option to turn off one or more rules while maintaining the other rules as Active, which can be done using the Passive or Off setting. * _Active_ means that the fraud rule will run, and the resulting action (for example, Hold or Block) will execute. This is recommended if you are sure of the behavior of the rule and the action you want to take. * _Passive_ means that although the fraud rules will run and will get the appropriate response values, the resulting action (for example, Hold or Block) will not execute. This is a good way to test new rules and see what their outcome will be before setting them live (Active). * _Off_ means that the fraud rule will not run at all. Setting an individual fraud rule to Off disables the rule for a particular transaction, while still running all other rules. ### Review held transactions Transactions that were held, blocked, or failed by Fraud Filter can be viewed on the Transactions screen in Ecommerce Portal (RealControl). If you want to review a certain held transaction, just search for transactions with a “Held” status. After finding the one you want, you can then view the details on the Fraud tab for the transaction. ## Next steps Check out the following guides to learn how to integrate Fraud Management into your application or website. ### [Fraud Filter](https://developer.globalpayments.com/docs/risk-management/fraud-management/fraud-filter.md) Set up rules and run filters to prescreen transactions. ### [Address Verification Service](https://developer.globalpayments.com/docs/risk-management/fraud-management/address-verification-service.md) Verify a cardholder's address by checking against the issuer's records. # Fraud Filter Source: https://developer.globalpayments.com/docs/risk-management/fraud-management/fraud-filter.md Section: Risk Management Description: Run filters from customized rules to screen transactions This guide focuses on how to use Fraud Filter for both direct API integrations and for integrations via Hosted Fields and the Drop-In User Interface (UI). First, we test some configured fraud rules and view the fraud-related fields in the response. We then send a Hold request to investigate a transaction and eventually release it to its original status after determining that it’s not actually fraudulent. For more information on Fraud Management, see our [Overview](https://developer.globalpayments.com/docs/risk-management/fraud-management/overview.md). ## Step 1: Set up the rules The Fraud Filter feature must be configured and enabled via the Ecommerce Portal (RealControl) under the Fraud Management section before being used via the API or Hosted Fields / Drop-In UI. For more information, see [Fraud Management FAQs](https://help.globalpay.com/products/ecommerce-help/fraud-management) for Ecommerce Help. > To access Ecommerce Portal (RealControl): > > Test account: https://realcontrol.sandbox.realexpayments.com > > Live account: https://realcontrol.realexpayments.com ## Step 2: Process a transaction and see the response Once you’ve set up a few Fraud Filter rules, you can then test them and note the different fraud-related fields returned in the response. ### Transaction request You can set a specific rule on a per-transaction basis by using the `risk_assessment` object in the request as shown in the example below. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions' \ --header 'Authorization: Bearer ZhMqj1a8V9VXg20P9Nj4RXJjGSZY' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "account_name": "transaction_processing", "type": "SALE", "channel": "CNP", "amount": "3000", "currency": "EUR", "country": "IE", "capture_mode": "LATER", "reference": "TRANS-20180114123459878", "site_reference": "", "initiator": "PAYER", "description": "description", "ip_address": "123.123.123.123", "stored_credential": { "model": "SUBSCRIPTION", "sequence": "FIRST", "reason": "NO_SHOW" }, "payment_method": { "name": "James Mason", "first_name": "James12", "last_name": "Mason", "entry_mode": "MOTO", "narrative": "Test Transaction", "card": { "number": "4012001037141112", "expiry_month": "04", "expiry_year": "25", "brand": "visa", "cvv": "451", "cvv_indicator": "PRESENT", "avs_address": "40 Hilltop", "avs_postal_code": "V94 DE7F", "tag": "123", "brand_reference": "" } }, "risk_assessment": [ { "mode": "ACTIVE", "rules": [ { "reference": "5c52428c-1f73-4fdf-ae53-ff62857f89d8", "mode": "ACTIVE" } ] } ] }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId(APP_ID); config.setAppKey(APP_KEY); config.setChannel(Channel.CardNotPresent); config.setRequestLogger(new RequestConsoleLogger()); config.setEnableLogging(true); ServicesContainer.configureService(config); CreditCardData card = new CreditCardData(); card.setNumber("4263970000005262"); card.setExpMonth(DateTime.now().getMonthOfYear()); card.setExpYear(DateTime.now().getYear() + 1); card.setReaderPresent(false); card.setEntryMethod(ManualEntryMethod.Moto); card.setCvn("131"); card.setCardHolderName("James Mason"); Address address = new Address(); address.setStreetAddress1("123 Main St."); address.setCity("Downtown"); address.setState("NJ"); address.setCountry("US"); address.setPostalCode("12345"); StoredCredential credentials = new StoredCredential(); credentials.setInitiator(StoredCredentialInitiator.CardHolder); credentials.setType(StoredCredentialType.Subscription); credentials.setSequence(StoredCredentialSequence.First); credentials.setReason(StoredCredentialReason.NoShow); FraudRuleCollection rules = new FraudRuleCollection(); rules.addRule("0c93a6c9-7649-4822-b5ea-1efa356337fd", FraudFilterMode.Active); try { Transaction response = card.charge(98.10) .withCurrency("USD") .withAddress(address) .withStoredCredential(credentials) .execute(); } catch (GatewayException ex) { // TO DO handle error } ``` ```dotnet GpApiConfig config = new GpApiConfig(); config.AppId = AppId; config.AppKey = AppKey; config.Channel = Channel.CardNotPresent; config.RequestLogger = new RequestConsoleLogger(); config.EnableLogging = true; ServicesContainer.ConfigureService(config); CreditCardData card = new CreditCardData(); card.Number = "4263970000005262"; card.ExpMonth = DateTime.Now.Month; card.ExpYear = DateTime.Now.Year + 1; card.ReaderPresent = false; card.EntryMethod = ManualEntryMethod.Moto; card.Cvn = "131"; card.CardHolderName = "James Mason"; Address address = new Address(); address.StreetAddress1 = "123 Main St."; address.City = "Downtown"; address.State = "NJ"; address.Country = "US"; address.PostalCode = "12345"; StoredCredential credentials = new StoredCredential(); credentials.Initiator = StoredCredentialInitiator.CardHolder; credentials.Type = StoredCredentialType.Subscription; credentials.Sequence = StoredCredentialSequence.First; credentials.Reason = StoredCredentialReason.NoShow; var rules = new FraudRuleCollection(); rules.AddRule("0c93a6c9-7649-4822-b5ea-1efa356337fd", FraudFilterMode.ACTIVE); try { var response = card.Charge(98.10m) .WithCurrency(CURRENCY) .WithAddress(address) .WithFraudFilter(FraudFilterMode.ACTIVE, rules) .WithStoredCredential(credentials) .Execute(); } catch (GatewayException ex) { // TO DO } ``` ```php $config = new GpApiConfig(); $config->appId = 'APP-ID'; $config->appKey = 'APP-KEY'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; ServicesContainer::configureService($config); $rule1 = '5c52428c-1f73-4fdf-ae53-ff62857f89d8'; $rules = new FraudRuleCollection(); $rules->addRule($rule1, FraudFilterMode::ACTIVE); $card = new CreditCardData(); $card->number = "4012001037141112"; $card->expMonth = date('m'); $card->expYear = date('Y', strtotime('+1 year')); $card->cvn = "451"; $card->cardHolderName = "James Mason"; $card->entryMethod = ManualEntryMethod::MOTO; $address = new Address(); $address->streetAddress1 = "40 Hilltop"; $address->postalCode = "V94 DE7F"; $storeCredentials = new StoredCredential(); $storeCredentials->initiator = StoredCredentialInitiator::PAYER; $storeCredentials->type = StoredCredentialType::SUBSCRIPTION; $storeCredentials->sequence = StoredCredentialSequence::FIRST; $storeCredentials->reason = StoredCredentialReason::NO_SHOW; try { /** @var \GlobalPayments\Api\Entities\Transaction $response */ $response = $card->authorize(30) ->withCurrency('EUR') ->withAddress($address) ->withFraudFilter(FraudFilterMode::ACTIVE, $rules) ->withStoredCredential($storeCredentials) ->withDescription('description') ->withCustomerIpAddress('123.123.123.123') ->withClientTransactionId('TRANS-20180114123459878') ->withDynamicDescriptor('Test Transaction') ->withTagData('123') ->execute(); } catch (GatewayException $e) { //@TODO handle error } if ($response instanceof Transaction) { $responseCode = $response->responseCode; // SUCCESS $trnStatus = $response->responseMessage; // CAPTURED $fraudFilterMode = $response->fraudFilterResponse->fraudResponseMode; // ACTIVE $fraudFilterResultFraudFilterResult = $response->fraudFilterResponse->fraudResponseResult; //PASS $fraudFilterRules = $response->fraudFilterResponse->fraudResponseRules; foreach ($fraudFilterRules as $fraudResponseRule) { $ruleReference = $fraudResponseRule->key; $ruleMode = $fraudResponseRule->mode; $ruleDescription = $fraudResponseRule->description; $ruleResult = $fraudResponseRule->result; } } ``` #### Request fields The following table describes the fraud-related fields used in the request. | Field | Description | Example(s) | | -------- | ------- | ------- | | risk_assessment.mode | Sets the overall transactional-level fraud mode. | PASSIVE/ACTIVE/OFF | | risk_assessment.rules.reference | Unique identifier for a rule. | 5c52428c-1f73-4fdf-ae53-ff62857f89d8 | | risk_assessment.rules.mode | Sets the mode at a per fraud rule level. | PASSIVE/ACTIVE/OFF | ### Transaction response The transaction response includes a `risk_assessment` object with details of the fraud rules that were carried out on the transaction. The overall transaction mode is returned as either `PASSIVE`, `ACTIVE`, or `OFF`. The overall result is returned as either `ACCEPTED`, `REJECTED`, `NOT_EXECUTED`, or `PENDING_REVIEW`. The outcome of passing the transaction through the Fraud Filter is included in the transaction response. You can check the overall Fraud Filter result and each individual rule outcome by using the rule's unique identifier. #### Sample response ```json { "id": "TRN_RO1H0eICPZFJt8xYffvio8miTg0tUy_114123459878", "time_created": "2023-03-23T11:03:43.555Z", "type": "SALE", "status": "PREAUTHORIZED", "channel": "CNP", "capture_mode": "LATER", "amount": "3000", "currency": "EUR", "country": "IE", "merchant_id": "MER_7e3e2c7df34f42819b3edee31022ee3f", "merchant_name": "Sandbox_merchant_3", "account_id": "TRA_c9967ad7d8ec4b46b6dd44a61cde9a91", "account_name": "transaction_processing", "reference": "TRANS-20180114123459878", "payment_method": { "result": "00", "message": "[ test system ] Authorised", "entry_mode": "MOTO", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX1112", "authcode": "12345", "brand_reference": "tmKvCwKEVQhX6PWw", "brand_time_created": "", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "", "provider": { "result": "00", "cvv_result": "M", "avs_address_result": "M", "avs_postal_code_result": "M" } } }, "risk_assessment": [ { "mode": "ACTIVE", "result": "PENDING_REVIEW", "rules": [ { "reference": "5c52428c-1f73-4fdf-ae53-ff62857f89d8", "description": "unknown rule", "mode": "ACTIVE", "result": "ERROR" }, { "reference": "0c93a6c9-7649-4822-b5ea-1efa356337fd", "description": "Cardholder Name Rule", "mode": "ACTIVE", "result": "ACCEPTED" }, { "reference": "a539d51a-abc1-4fff-a38e-b34e00ad0cc3", "description": "CardNumber block", "mode": "ACTIVE", "result": "PENDING_REVIEW" }, { "reference": "d023a19e-6985-4fda-bb9b-5d4e0dedbb1e", "description": "Amount test", "mode": "ACTIVE", "result": "ACCEPTED" } ] } ], "batch_id": "", "action": { "id": "ACT_RO1H0eICPZFJt8xYffvio8miTg0tUy", "type": "PREAUTHORIZE", "time_created": "2023-03-23T11:03:43.555Z", "result_code": "SUCCESS", "app_id": "07V8FC6G7kZvdUBpqGYWBBgnWdQ59HOv", "app_name": "Sandbox Merchant 3" } } ``` #### Response fields The following table describes the fraud-related fields returned in the response. | Field | Description | Example(s) | | -------- | ------- | ------- | | risk_assessment.mode | Returns the overall transactional-level fraud mode. | PASSIVE/ACTIVE/OFF | | risk_assessment.result | Returns the result of the overall fraud check. | ACCEPTED/REJECTED/NOT_EXECUTED/PENDING_REVIEW | | risk_assessment.rules.reference | Returns the rule's unique identifier. | 5c52428c-1f73-4fdf-ae53-ff62857f89d8 | | risk_assessment.rules.description | Returns a system-generated description of the rule. | Amount Check|CardNumber Check | | risk_assessment.rules.mode | Sets the mode at a per fraud rule level. | PASSIVE/ACTIVE/OFF | | risk_assessment.rules.result | Returns the result of the individual fraud check. | ACCEPTED/REJECTED/NOT_EXECUTED/PENDING_REVIEW | ## Step 3: Hold a transaction If you suspect a transaction is fraudulent and requires further investigation, you can send a Hold request. If the transaction was already placed in the queue to be included in the next settlement file or batch, this will remove it from the queue until the transaction is released (see [Step 4](#step-4-release-a-transaction)). The following field is returned in the response. | Field | Description | Example(s) | | -------- | ------- | ------- | | reason_code | The reason that the transaction is being held. | FRAUD/OUTOFSTOCK/OTHER/NOT_GIVEN | #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_P12kSMF8QxcdZM0iRieChToB4GxYfl_114123459878/hold' \ --header 'Authorization: Bearer 6lOMhiXA8nwfgIlw563Dnkki5Vsp' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "reason_code": "FRAUD" }' ``` ```java Transaction response = new Transaction(); response.setTransactionId("TRN_Tw34vgMCuBl9tUeLOV6VpnqjrSu9nj_c07882bf8f73"); try { response = response.hold() .withReasonCode(ReasonCode.Fraud) .execute(); } catch (Exception ex) { // TO DO handle error } String responseCode = response.getResponseCode(); // "SUCCESS" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // "HOLD_SUCCESSFULL" ``` ```dotnet var response = new Transaction(); response.TransactionId = "TRN_Tw34vgMCuBl9tUeLOV6VpnqjrSu9nj_c07882bf8f73"; response = response.Hold() .WithReasonCode(ReasonCode.FRAUD) .Execute(); ``` ```php $config = new GpApiConfig(); $config->appId = 'APP-ID'; $config->appKey = 'APP-KEY'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; ServicesContainer::configureService($config); $trn = Transaction::fromId("TRN_P12kSMF8QxcdZM0iRieChToB4GxYfl_114123459878"); try { /** @var \GlobalPayments\Api\Entities\Transaction $trn */ $trn = $trn->hold() ->withReasonCode(ReasonCode::FRAUD) ->execute(); } catch (GatewayException $e) { //@TODO handle error } if ($trn instanceof Transaction) { $responseCode = $trn->responseCode; // SUCCESS $trnStatus = $trn->responseMessage; // PREAUTHORIZED $fraudFilterResult = $trn->fraudFilterResponse->fraudResponseResult; //HOLD_SUCCESSFULL } ``` ## Step 4: Release a transaction If you decide that a transaction is not fraudulent or you have held one in error, you can send a Release request. This will return the transaction to its original status (awaiting settlement or in the queue for the next batch). Or, if you decide not to proceed with the transaction, you can reverse (void) it (see [Transactions](https://developer.globalpayments.com/api/transactions.md#/Capture%20a%20Sale/captureSaleTransaction) in the API Explorer). You don’t need to release the transaction before reversing it. The following field is returned in the response. | Field | Description | Example(s) | | -------- | ------- | ------- | | reason_code | The reason that the transaction is being released. | FALSE_POSITIVE/IN_STOCK/OTHER/NOT_GIVEN | #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_P12kSMF8QxcdZM0iRieChToB4GxYfl_114123459878/release' \ --header 'Authorization: Bearer 6lOMhiXA8nwfgIlw563Dnkki5Vsp' \ --header 'Content-Type: application/json' \ --header 'X-GP-Version: 2021-03-22' \ --data '{ "reason_code": "FALSEPOSITIVE" }' ``` ```java Transaction response = new Transaction(); response.setTransactionId("TRN_Tw34vgMCuBl9tUeLOV6VpnqjrSu9nj_c07882bf8f73"); try { response = response.release() .withReasonCode(ReasonCode.FalsePositive) .execute(); } catch (Exception ex) { // TO DO handle error } String responseCode = response.getResponseCode(); // "SUCCESS" String fraudResponseResult = response.getFraudFilterResponse().getFraudResponseResult(); // "RELEASE_SUCCESSFULL" ``` ```dotnet var response = new Transaction(); response.TransactionId = "TRN_Tw34vgMCuBl9tUeLOV6VpnqjrSu9nj_c07882bf8f73"; response = response.Release() .WithReasonCode(ReasonCode.FALSEPOSITIVE) .Execute(); ``` ```php $config = new GpApiConfig(); $config->appId = 'APP-ID'; $config->appKey = 'APP-KEY'; $config->channel = Channel::CardNotPresent; $config->country = 'IE'; ServicesContainer::configureService($config); $trn = Transaction::fromId("TRN_P12kSMF8QxcdZM0iRieChToB4GxYfl_114123459878"); try { /** @var \GlobalPayments\Api\Entities\Transaction $trn */ $trn = $trn->release() ->withReasonCode(ReasonCode::FALSE_POSITIVE) ->execute(); } catch (GatewayException $e) { //@TODO handle error } if ($trn instanceof Transaction) { $responseCode = $trn->responseCode; // SUCCESS $trnStatus = $trn->responseMessage; // PREAUTHORIZED $fraudFilterResult = $trn->fraudFilterResponse->fraudResponseResult; //RELEASE_SUCCESSFUL } ``` # Address Verification Service Source: https://developer.globalpayments.com/docs/risk-management/fraud-management/address-verification-service.md Section: Risk Management Description: Verify customer addresses to ensure a smooth transaction > This functionality is available only for cardholders in the United States, Canada, and Great Britain and is not supported by all acquirers or issuers. For more information, contact a member of our support team. The Address Verification Service (AVS) verifies the cardholder's address by checking the information provided at the time of sale against the issuer's records. If a transaction fails an AVS check, it will not automatically be declined. Instead, it acts as an advisory service and requires that the details of non-matched transactions be checked by your application. For more information on Fraud Management, see our [Overview](https://developer.globalpayments.com/docs/risk-management/fraud-management/overview.md). For direct API integration, AVS data is passed in the Card Object in the Payment Method Object. ## Sample request ```JSON curl -L -X POST 'https://apis.sandbox.globalpay.com/ucp/transactions' \ -H 'Authorization: Bearer g9msqo3kAb7oTpeSdwzv9CFK0281' \ -H 'X-GP-Version: 2020-01-20' \ -H 'Accept: application/json' \ -H 'Content-type: application/json' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/json' \ -d '{ "account_name": "Transaction_Processing", "account_id":"TRA_6716058969854a48b33347043ff8225f", "merchant_id":"MER_c4c0df11039c48a9b63701adeaa296c3", "channel": "CNP", "capture_mode": "AUTO", "type": "SALE", "amount": "1999", "currency": "EUR", "reference": "My-TRANS-29042020", "payment_method": { "first_name": "James", "last_name": "Mason", "entry_mode": "ECOM", "card":{ "number":"4263970000005262", "expiry_month":"11", "expiry_year":"24", "cvv": "123", "cvv_indicator": "PRESENT", "avs_address":"Flat 456 House 123 Halifax", "avs_postal_code":"WB3 A21" } } }' ``` ## AVS values | Element/Field | Format | Description | | -------- | -------- | -------- | | avs_address_result | String | The result of the AVS address check. MATCHED NOT_MATCHED NOT_CHECKED | | avs_postal_code_result | String | The AVS postal code result indicating the result of the postal code check. MATCHED NOT_MATCHED NOT_CHECKED | | avs_action | String | The recommended AVS action based on the AVS results. PROMPT DECLINE ACCEPT | ## Sample response ```JSON { "id": "TRN_kHlyWelGlIyv2CF0iY630A2Kh6KPEw", "time_created": "2020-04-29T14:33:26.637Z", "type": "SALE", "status": "CAPTURED", "channel": "CNP", "capture_mode": "AUTO", "amount": "1999", "currency": "EUR", "country": "US", "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "reference": "My-TRANS-29042020", "payment_method": { "result": "00", "message": "[ test system ] AUTHORISED", "entry_mode": "ECOM", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX5262", "authcode": "12345", "brand_reference": "Qsh3tzI25zqGkpX6", "brand_time_created": "", "cvv_result": "MATCHED", "avs_address_result": "MATCHED", "avs_postal_code_result": "MATCHED", "avs_action": "ACCEPT" } }, "batch_id": "BAT_782540", "action": { "id": "ACT_kHlyWelGlIyv2CF0iY630A2Kh6KPEw", "type": "AUTHORIZE", "time_created": "2020-04-29T14:33:26.637Z", "result_code": "SUCCESS", "app_id": "JMe7SYdTSV0mx5dAZI9PSJO5T9SMvL18", "app_name": "sandboxdefault_swaggerapp_v20200120" } } ``` # Disputes Management - Overview Source: https://developer.globalpayments.com/docs/operations/disputes-management-overview.md Section: Operations & Reporting Description: Automate the reporting and management of transaction disputes Using our Disputes API allows you to automate the reporting and management of transaction disputes. This includes the ability to accept or challenge disputes along with the reporting available across multiple channels and regions from a single source. With the help of our tools such as Fraud Management, Invoicing, and Dynamic Narrative, as well as our best practice guidelines, you can prevent disputes before they happen. > Disputes Management is only available to merchants who use us as an acquirer. ## What is a dispute? A _dispute_ occurs when a transaction’s validity is questioned and can be raised by the cardholder or the issuer. In either scenario, the issuer sends the dispute to the acquirer to resolve. We either resolve the dispute or forward it to the merchant to provide evidence that the transaction is legitimate. When a merchant receives the dispute, they can accept it or they can choose to challenge it by sending evidence to prove the transaction is legitimate. We review the evidence to ensure it meets the necessary requirements before sending it to the issuer. The issuer then reviews the evidence provided and makes a decision on the outcome of the dispute. The customer and the merchant are then notified of the case decision. ## Dispute types and stages Before we cover how to use the Disputes API, it’s useful to gain an understanding of the different types of disputes, the relevant terminology and their meanings. If you want to skip right to the code, see our [guide](https://developer.globalpayments.com/docs/operations/disputes-management-guide.md). | | | | --- | --- | | **Dispute Term** | **Description** | | Retrieval | A request for proof that a transaction was valid. To respond, you might provide a copy of the sales draft for the transaction. Funds are not exchanged during retrieval request cases, but if you do not respond successfully, you could be held responsible (liable) for any chargeback cases that result. Retrieval requests are sometimes simply referred to as retrievals. | | Chargeback | When the cardholder or issuer is formally disputing a transaction. As soon as a chargeback case is initiated, the disputed funds are usually transferred from the merchant’s account to the Issuer. With a chargeback you can choose to: –Acknowledge it and accept liability –Challenge it with supporting documentation | | Arbitration / PreArbitration | Can be created when a case is not resolved at the chargeback stage. For this case type, we work with the issuer to try to resolve the dispute and avoid arbitration.You would typically try to avoid arbitration because of the added fees, time lost and potential penalties if you lose the arbitration case. Arbitration, when necessary, is performed by the card brands like Visa and Mastercard. | | Compliance / PreCompliance | A type of case that is based on a violation of the rules that are defined by the relevant card brand. These violations include: –The customer agreed to be charged at least once, but the merchant billed for multiple key-entered transactions without the cardholder’s authority (card-present environment). –A merchant or acquirer ignored a retrieval request issued for legal proceedings or law enforcement investigations. | | Good Faith Collection | A request for you to accept liability for a case on a good faith basis, even though the final deadline for resolving the case has passed. Acceptance of an incoming good faith collection case is completely at your discretion. | | Exception Case | Includes both the incoming and outgoing versions of the following case types: PreArbitration, Arbitration, PreCompliance, Compliance, and Good Faith Collection. | | MasterCard Pre-Dispute | This is an initial stage for Mastercard holders where Disputes are attempted to be resolved initially between the acquirer and the Merchant before a chargeback occurs | ## Next steps To get familiar with how Disputes Management works, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/operations/disputes-management-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Disputes Management - Guide Source: https://developer.globalpayments.com/docs/operations/disputes-management-guide.md Section: Operations & Reporting Description: Learn how to automate the reporting and management of disputes In this guide, you'll learn how to obtain a list of disputes and get the details on a specific dispute case. We also cover how to resolve a dispute by either challenging or accepting it. In our example, we demonstrate a typical scenario that a merchant might go through when receiving a dispute. For more information on Disputes Management, see our [Overview](https://developer.globalpayments.com/docs/operations/disputes-management-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Get a list of disputes Our first step is to pull a list of disputes. You must submit the date range you want to query. You can include optional parameters such as the brand of the card involved, the dispute stage, the number of pages to return, the number of results per page, and so on. The returned list of disputes will include all of the disputes types that are available for your application, such as chargebacks, retrievals, and arbitrations. To understand more about the different types of disputes, see our [Overview](https://developer.globalpayments.com/docs/operations/disputes-management-overview.md). You can also filter the list based on the dispute status: Closed, New, or Under Review. In our example, we don't use any filters as we want to return all the disputes in the timeframe specified. #### Sample request ```JSON curl -L -X GET 'https://apis.sandbox.globalpay.com/unifiedcommerce/disputes?from_stage_time_created=2019-05-13' \ -H 'Authorization: Bearer 72hyeepo8DnW053OrqAEFwAzeDtC' \ -H 'X-Gp-Version: 2020-01-20' \ -H 'Accept: application/json' \ -H 'Accept-Encoding: gzip' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Date startDate = DateTime.now().minusDays(30).toDate(); try { DisputeSummaryPaged disputes = ReportingService.findDisputesPaged(1, 10) .where(DataServiceCriteria.StartStageDate, startDate) .execute(); // API raw response "total_record_count" int totalRecordCount = disputes.getTotalRecordCount(); // API raw response "disputes" List disputeList = disputes.getResults(); if (disputeList.isEmpty()) { // TODO: Add empty disputes list handling here } DisputeSummary dispute = disputeList.get(0); // API raw response "disputes[0]->id" String id = dispute.getCaseId(); // API raw response "disputes[0]->stage_time_created" DateTime timeCreated = dispute.getCaseIdTime(); // API raw response "disputes[0]->status" String status = dispute.getCaseStatus(); // API raw response "disputes[0]->stage" String stage = dispute.getCaseStage(); // API raw response "disputes[0]->amount" BigDecimal amount = dispute.getCaseAmount(); // API raw response "disputes[0]->currency" String currency = dispute.getCaseCurrency(); // API raw response "disputes[0]->system->mid" String mid = dispute.getCaseMerchantId(); // API raw response "disputes[0]->system->hierarchy" String hierarchy = dispute.getMerchantHierarchy(); // API raw response "disputes[0]->payment_method->card->number" String maskedCardNumber = dispute.getTransactionMaskedCardNumber(); // API raw response "disputes[0]->payment_method->card->arn" String arn = dispute.getTransactionARN(); // API raw response "disputes[0]->payment_method->card->brand" String cardType = dispute.getTransactionCardType(); // API raw response "disputes[0]->reason_code" String reasonCode = dispute.getReasonCode(); // API raw response "disputes[0]->reason_description" String reason = dispute.getReason(); // API raw response "disputes[0]->order->reference" String orderId = dispute.getTransactionOrderId(); // API raw response "disputes[0]->time_to_respond_by" DateTime respondByDate = dispute.getRespondByDate(); // API raw response "disputes[0]->result" String result = dispute.getResult(); // API raw response "disputes[0]->last_adjustment_amount" BigDecimal lastAdjustmentAmount = dispute.getLastAdjustmentAmount(); // API raw response "disputes[0]->last_adjustment_currency" String lastAdjustmentCurrency = dispute.getLastAdjustmentCurrency(); // API raw response "disputes[0]->last_adjustment_funding" String lastAdjustmentFunding = dispute.getLastAdjustmentFunding(); return; } catch (ApiException e) { // TODO: Add your exception handling here }catch (IOException e) { throw new RuntimeException(e.getMessage()); } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); DateTime StartDate = DateTime.UtcNow.AddDays(-30); try { PagedResult response = ReportingService.FindDisputesPaged(1,10) .Where(DataServiceCriteria.StartStageDate, StartDate) .Execute(); // API raw response "total_record_count" var totalRecordCount = response.TotalRecordCount; DisputeSummary dispute = response.Results.First(); // API raw response "disputes[0]->id" var id = dispute.CaseId; // API raw response "disputes[0]->stage_time_created" var timeCreated = dispute.CaseIdTime; // API raw response "disputes[0]->status" var status = dispute.CaseStatus; // API raw response "disputes[0]->stage" var stage = dispute.CaseStage; // API raw response "disputes[0]->amount" var amount = dispute.CaseAmount; // API raw response "disputes[0]->currency" var currency = dispute.CaseCurrency; // API raw response "disputes[0]->reason_code" var reasonCode = dispute.ReasonCode; // API raw response "disputes[0]->reason_description" var reason = dispute.Reason; // API raw response "disputes[0]->time_to_respond_by" var respondByDate = dispute.RespondByDate; // API raw response "disputes[0]->result" var result = dispute.Result; // API raw response "disputes[0]->last_adjustment_amount" var lastAdjustmentAmount = dispute.LastAdjustmentAmount; // API raw response "disputes[0]->last_adjustment_currency" var lastAdjustmentCurrency = dispute.LastAdjustmentCurrency; // API raw response "disputes[0]->last_adjustment_funding" var lastAdjustmentFunding = dispute.LastAdjustmentFunding; // API raw response "disputes[0]->system->mid" var mid = dispute.CaseMerchantId; // API raw response "disputes[0]->system->hierarchy" var systemHierarchy = dispute.MerchantHierarchy; // API raw response "disputes[0]->payment_method->card->number" var maskedCardNumber = dispute.TransactionMaskedCardNumber; // API raw response "disputes[0]->payment_method->card->arn" var arn = dispute.TransactionARN; // API raw response "disputes[0]->payment_method->card->brand" var cardType = dispute.TransactionCardType; // API raw response "disputes[0]->order->reference" var orderId = dispute.TransactionOrderId; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $startDate = (new DateTime())->modify("-30 days")->setTime(0, 0, 0); try { /** @var \GlobalPayments\Api\Entities\GpApi\PagedResult $disputes */ $disputes = ReportingService::findDisputesPaged(1, 10) ->where(DataServiceCriteria::START_STAGE_DATE, $startDate) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "total_record_count" $totalRecordCount = $disputes->totalRecordCount; //API raw response "disputes" $disputeList = $disputes->result; if (empty($disputeList)) { echo "No disputes found.\n"; } /** @var \GlobalPayments\Api\Entities\Reporting\DisputeSummary $dispute */ $dispute = reset($disputeList); // API raw response "disputes[0]->id" $id = $dispute->caseId; // API raw response "disputes[0]->stage_time_created" $timeCreated = $dispute->caseIdTime; // API raw response "disputes[0]->status" $status = $dispute->caseStatus; // API raw response "disputes[0]->stage" $stage = $dispute->caseStage; // API raw response "disputes[0]->amount" $amount = $dispute->caseAmount; // API raw response "disputes[0]->currency" $currency = $dispute->caseCurrency; // API raw response "disputes[0]->system->mid" $mid = $dispute->caseMerchantId; // API raw response "disputes[0]->system->hierarchy" $hierarchy = $dispute->merchantHierarchy; // API raw response "disputes[0]->payment_method->card->number" $maskedCardNumber = $dispute->transactionMaskedCardNumber; // API raw response "disputes[0]->payment_method->card->arn" $arn = $dispute->transactionARN; // API raw response "disputes[0]->payment_method->card->brand" $cardType = $dispute->transactionCardType; // API raw response "disputes[0]->reason_code" $reasonCode = $dispute->reasonCode; // API raw response "disputes[0]->reason_description" $reason = $dispute->reason; // API raw response "disputes[0]->order->reference" $orderId = $dispute->orderId; // API raw response "disputes[0]->time_to_respond_by" $respondByDate = $dispute->respondByDate; // API raw response "disputes[0]->result" $result = $dispute->result; // API raw response "disputes[0]->last_adjustment_amount" $lastAdjustmentAmount = $dispute->lastAdjustmentAmount; // API raw response "disputes[0]->last_adjustment_currency" $lastAdjustmentCurrency = $dispute->lastAdjustmentCurrency; // API raw response "disputes[0]->last_adjustment_funding" $lastAdjustmentFunding = $dispute->lastAdjustmentFunding; ``` ### Disputes list response The response contains all of the disputes that were created from the date specified. This list includes the ID, status, amount, reason, date, and time the dispute was created. Depending on the use case, the data returned in the disputes list response may be enough information for your application to proceed to the next action (Step 2). Alternatively, we show you in the next step how to pull the full detail of an individual dispute. #### Sample response ```JSON { "total_count": 20, "merchant_id": "MER_62251730c5574bbcb268191b5f315de8", "merchant_name": "TEST MERCHANT", "account_id": "DIA_882c832d13e04185bb6e213d6303ed98", "account_name": "testdispute", "disputes": [ { "id": "DIS_SAND_abcd1234", "time_created": "2020-02-23T13:34:38.276Z", "status": "WITH_MERCHANT", "stage": "RETRIEVAL", "amount": "1000", "currency": "USD", "system": { "mid": "627384967", "hierarchy": "111-23-099-001-001" }, "payment_method": { "card": { "number": "424242xxxxxx4242", "arn": "834523482349123", "brand": "VISA" } }, "reason_code": "104", "reason_description": "Other Fraud-Card Absent Environment", "time_to_respond_by": "2020-03-11T13:34:38.276Z", "result": "PENDING", "last_adjustment_amount": "", "last_adjustment_currency": "", "last_adjustment_funding": "" }, { "id": "DIS_SAND_abcd1235", "time_created": "2020-02-23T13:34:38.276Z", "status": "WITH_MERCHANT", "stage": "CHARGEBACK", "amount": "1500", "currency": "USD", "system": { "mid": "627384967", "hierarchy": "111-23-099-001-001" }, "payment_method": { "card": { "number": "424242xxxxxx4242", "arn": "123934529762282", "brand": "VISA" } }, "reason_code": "132", "reason_description": "Cancelled Recurring", "time_to_respond_by": "2020-03-11T13:34:38.276Z", "result": "PENDING", "last_adjustment_amount": "1500", "last_adjustment_currency": "USD", "last_adjustment_funding": "DEBIT" }, { "id": "DIS_SAND_abcd1236", "time_created": "2020-02-23T13:34:38.276Z", "status": "WITH_MERCHANT", "stage": "SECOND_CHARGEBACK", "amount": "2000", "currency": "USD", "system": { "mid": "627384967", "hierarchy": "111-23-099-001-001" }, "payment_method": { "card": { "number": "424242xxxxxx4242", "arn": "549365667487346", "brand": "VISA" } }, "reason_code": "137", "reason_description": "Cancelled Merchandise/Services", "time_to_respond_by": "2020-03-11T13:34:38.276Z", "result": "PENDING", "last_adjustment_amount": "2000", "last_adjustment_currency": "USD", "last_adjustment_funding": "DEBIT" }, { "id": "DIS_SAND_abcd1237", "time_created": "2020-02-23T13:34:38.276Z", "status": "WITH_MERCHANT", "stage": "PRE_ARBITRATION", "amount": "2500", "currency": "USD", "system": { "mid": "627384967", "hierarchy": "111-23-099-001-001" }, "payment_method": { "card": { "number": "424242xxxxxx4242", "arn": "217450078337808", "brand": "VISA" } }, "reason_code": "1261", "reason_description": "Duplicate Processing", "time_to_respond_by": "2020-03-11T13:34:38.276Z", "result": "PENDING", "last_adjustment_amount": "2500", "last_adjustment_currency": "USD", "last_adjustment_funding": "DEBIT" }, { "id": "DIS_SAND_abcd1238", "time_created": "2020-02-23T13:34:38.276Z", "status": "WITH_MERCHANT", "stage": "ARBITRATION", "amount": "3000", "currency": "USD", "system": { "mid": "627384967", "hierarchy": "111-23-099-001-001" }, "payment_method": { "card": { "number": "543267xxxxxx7207", "arn": "974871170906920", "brand": "MASTERCARD" } }, "reason_code": "4834", "reason_description": "Point of Interaction Error", "time_to_respond_by": "2020-03-11T13:34:38.276Z", "result": "PENDING", "last_adjustment_amount": "3000", "last_adjustment_currency": "USD", "last_adjustment_funding": "DEBIT" } ], "action": { "id": "ACT_5blBTHnIs4aOCIvGwG7KizYUpsGI0g", "type": "DISPUTE_LIST", "time_created": "2020-03-06T13:34:38.406Z", "result_code": "SUCCESS", "app_id": "7ABZlMiSukISskkxxtDTMzpTN5nG5Jjw", "app_name": "ucp-disputes-testharness" } } ``` ## [Optional] Get dispute information Using the unique ID returned in the list, you can obtain the full dispute record to understand more about the disputes that were raised. This will provide you with more detail regarding a single dispute such as a chargeback, retrieval or arbitration. #### Sample request ```JSON curl -L -X GET 'https://apis.sandbox.globalpay.com/unifiedcommerce/disputes/DIS_SAND_abcd1235' \ -H 'Authorization: Bearer 72hyeepo8DnW053OrqAEFwAzeDtC' \ -H 'X-GP-Version: 2020-01-20' \ -H 'Accept: application/json' \ -H 'Accept-Encoding: gzip' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); String disputeId = "DIS_SAND_abcd1235"; try { DisputeSummary dispute = ReportingService.disputeDetail(disputeId) .execute(); // API raw response "id" String id = dispute.getCaseId(); // API raw response "stage_time_created" DateTime timeCreated = dispute.getCaseIdTime(); // API raw response "status" String status = dispute.getCaseStatus(); // API raw response "stage" String stage = dispute.getCaseStage(); // API raw response "stage_time_created" DateTime stageTimeCreated = dispute.getCaseStageTime(); // API raw response "amount" BigDecimal amount = dispute.getCaseAmount(); // API raw response "currency" String currency = dispute.getCaseCurrency(); // API raw response "payer_amount" BigDecimal payerAmount = dispute.getDisputeCustomerAmount(); // API raw response "payer_currency" String payerCurrency = dispute.getDisputeCustomerCurrency(); // API raw response "reason_code" String reasonCode = dispute.getReasonCode(); // API raw response "reason_description" String reason = dispute.getReason(); // API raw response "order->reference" String orderId = dispute.getTransactionOrderId(); // API raw response "time_to_respond_by" DateTime respondByDate = dispute.getRespondByDate(); // API raw response "result" String result = dispute.getResult(); // API raw response "system->mid" String mid = dispute.getCaseMerchantId(); // API raw response "system->hierarchy" String hierarchy = dispute.getMerchantHierarchy(); // API raw response "system->name" String systemName = dispute.getMerchantName(); // API raw response "last_adjustment_amount" BigDecimal lastAdjustmentAmount = dispute.getLastAdjustmentAmount(); // API raw response "last_adjustment_currency" String lastAdjustmentCurrency = dispute.getLastAdjustmentCurrency(); // API raw response "last_adjustment_funding" String lastAdjustmentFunding = dispute.getLastAdjustmentFunding(); // API raw response "last_adjustment_time_created" String lastAdjustmentTimeCreated = dispute.getLastAdjustmentTimeCreated(); // API raw response "payment_method_provider->comment" ArrayList issuerComments = dispute.getIssuerComment(); // API raw response "payment_method_provider->reference" ArrayList issuerReferences = dispute.getIssuerCaseNumber(); // API raw response "transaction->time_created" DateTime trnTimeCreated = dispute.getTransactionTime(); // API raw response "transaction->type" String transactionType = dispute.getTransactionType(); // API raw response "transaction->amount" BigDecimal transactionAmount = dispute.getTransactionAmount(); // API raw response "transaction->currency" String transactionCurrency = dispute.getTransactionCurrency(); // API raw response "transaction->reference" String transactionReferenceNumber = dispute.getTransactionReferenceNumber(); // API raw response "payment_method->card->number" String transactionMaskedCardNumber = dispute.getTransactionMaskedCardNumber(); // API raw response "payment_method->card->arn" String transactionARN = dispute.getTransactionARN(); // API raw response "payment_method->card->brand" String transactionCardType = dispute.getTransactionCardType(); // API raw response "payment_method->card->authcode" String transactionAuthCode = dispute.getTransactionAuthCode(); // API raw response "payment_method->card->brand_reference" String transactionBrandReference = dispute.getTransactionBrandReference(); // API raw response "documents" ArrayList documents = dispute.getDocuments(); return; } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); string disputeId = "DIS_SAND_abcd1235"; try { DisputeSummary dispute = ReportingService.DisputeDetail(disputeId) .Execute(); // API raw response "id" var id = dispute.CaseId; // API raw response "stage_time_created" var timeCreated = dispute.CaseIdTime; // API raw response "status" var status = dispute.CaseStatus; // API raw response "stage_time_created" var stageTimeCreated = dispute.CaseStageTime; // API raw response "stage" var stage = dispute.CaseStage; // API raw response "amount" var amount = dispute.CaseAmount; // API raw response "currency" var currency = dispute.CaseCurrency; // API raw response "payer_amount" var payerAmount = dispute.DisputeCustomerAmount; // API raw response "payer_currency" var payerCurrency = dispute.DisputeCustomerCurrency; // API raw response "reason_code" var reasonCode = dispute.ReasonCode; // API raw response "reason_description" var reason = dispute.Reason; // API raw response "time_to_respond_by" var respondByDate = dispute.RespondByDate; // API raw response "result" var result = dispute.Result; // API raw response "last_adjustment_amount" var lastAdjustmentAmount = dispute.LastAdjustmentAmount; // API raw response "last_adjustment_currency" var lastAdjustmentCurrency = dispute.LastAdjustmentCurrency; // API raw response "last_adjustment_funding" var lastAdjustmentFunding = dispute.LastAdjustmentFunding; // API raw response "system->mid" var mid = dispute.CaseMerchantId; // API raw response "system->hierarchy" var systemHierarchy = dispute.MerchantHierarchy; // API raw response "payment_method->card->number" var maskedCardNumber = dispute.TransactionMaskedCardNumber; // API raw response "payment_method->card->arn" var arn = dispute.TransactionARN; // API raw response "payment_method->card->brand" var cardType = dispute.TransactionCardType; // API raw response "payment_method->card->authcode" var transactionAuthCode = dispute.TransactionAuthCode; // API raw response "payment_method->card->brand_reference" var transactionBrandReference = dispute.TransactionBrandReference; // API raw response "order->reference" var orderId = dispute.TransactionOrderId; // API raw response "documents" var documents = dispute.Documents; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $disputeId = "DIS_SAND_abcd1235"; try { /** @var \GlobalPayments\Api\Entities\Reporting\DisputeSummary $dispute */ $dispute = ReportingService::disputeDetail($disputeId) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "id" $id = $dispute->caseId; // API raw response "stage_time_created" $timeCreated = $dispute->caseIdTime; // API raw response "status" $status = $dispute->caseStatus; // API raw response "stage" $stage = $dispute->caseStage; // API raw response "stage_time_created" $stageTimeCreated = $dispute->disputeStageTime; // API raw response "amount" $amount = $dispute->caseAmount; // API raw response "currency" $currency = $dispute->caseCurrency; // API raw response "payer_amount" $payerAmount = $dispute->disputeCustomerAmount; // API raw response "payer_currency" $payerCurrency = $dispute->disputeCustomerCurrency; // API raw response "reason_code" $reasonCode = $dispute->reasonCode; // API raw response "reason_description" $reason = $dispute->reason; // API raw response "order->reference" $orderId = $dispute->orderId; // API raw response "time_to_respond_by" $respondByDate = $dispute->respondByDate; // API raw response "result" $result = $dispute->result; // API raw response "system->mid" $mid = $dispute->caseMerchantId; // API raw response "system->hierarchy" $hierarchy = $dispute->merchantHierarchy; // API raw response "system->name" $systemName = $dispute->merchantName; // API raw response "last_adjustment_amount" $lastAdjustmentAmount = $dispute->lastAdjustmentAmount; // API raw response "last_adjustment_currency" $lastAdjustmentCurrency = $dispute->lastAdjustmentCurrency; // API raw response "last_adjustment_funding" $lastAdjustmentFunding = $dispute->lastAdjustmentFunding; // API raw response "last_adjustment_time_created" $lastAdjustmentTimeCreated = $dispute->lastAdjustmentTimeCreated; // API raw response "payment_method_provider->comment" $issuerComments = $dispute->issuerComment; // API raw response "payment_method_provider->reference" $issuerReferences = $dispute->issuerCaseNumber; // API raw response "transaction->time_created" $trnTimeCreated = $dispute->transactionTime; // API raw response "transaction->type" $transactionType = $dispute->transactionType; // API raw response "transaction->amount" $transactionAmount = $dispute->transactionAmount; // API raw response "transaction->currency" $transactionCurrency = $dispute->transactionCurrency; // API raw response "transaction->reference" $transactionReferenceNumber = $dispute->transactionReferenceNumber; // API raw response "payment_method->card->number" $transactionMaskedCardNumber = $dispute->transactionMaskedCardNumber; // API raw response "payment_method->card->arn" $transactionARN = $dispute->transactionARN; // API raw response "payment_method->card->brand" $transactionCardType = $dispute->transactionCardType; // API raw response "payment_method->card->authcode" $transactionAuthCode = $dispute->transactionAuthCode; // API raw response "payment_method->card->brand_reference" $transactionBrandReference = $dispute->transactionBrandReference; // API raw response "documents" $documents = $dispute->documents; ``` ### Disputes information response The information returned in the response provides you with all the details regarding this dispute. This includes the current status of the dispute, the time and date when it was created, and any investigator comments. To see the full list of data that can be returned, see [Disputes](https://developer.globalpayments.com/api/disputes.md) in the API Explorer. #### Sample response ```JSON { "id": "DIS_SAND_abcd1235", "time_created": "2020-02-26T09:31:43.806Z", "merchant_id": "MER_62251730c5574bbcb268191b5f315de8", "merchant_name": "TEST MERCHANT", "account_id": "DIA_882c832d13e04185bb6e213d6303ed98", "account_name": "testdispute", "status": "WITH_MERCHANT", "status_time_created": "2020-02-28T09:31:43.806Z", "stage": "CHARGEBACK", "stage_time_created": "2020-03-02T09:31:43.806Z", "amount": "1500", "currency": "USD", "payer_amount": "1500", "payer_currency": "USD", "merchant_amount": "1500", "merchant_currency": "USD", "reason_code": "132", "reason_description": "Cancelled Recurring", "time_to_respond_by": "2020-03-14T09:31:43.806Z", "result": "PENDING", "investigator_comment": "WITH_MERCHANT CHARGEBACK PENDING 1500 USD 1500 USD", "system": { "mid": "627384967", "hierarchy": "111-23-099-001-001", "name": "ABC INC." }, "last_adjustment_amount": "1500", "last_adjustment_currency": "USD", "last_adjustment_funding": "DEBIT", "last_adjustment_time_created": "2020-03-05T09:31:43.806Z", "net_financial_amount": "1500", "net_financial_currency": "USD", "net_financial_funding": "DEBIT", "payment_method_provider": [ { "comment": "issuer comments 34524", "reference": "issuer-reference-0002", "documents": [] } ], "transaction": { "time_created": "2020-01-19T09:31:43.806Z", "type": "SALE", "amount": "1500", "currency": "USD", "reference": "my-trans-AAA2", "remarks": "my-trans-AAA2", "payment_method": { "card": { "number": "424242xxxxxx4242", "arn": "123934529762282", "brand": "VISA", "authcode": "AA2399", "brand_reference": "898375467348954" } } }, "documents": [ { "id": "DOC_MyEvidence_234234AVCDE-1", "type": "SALES_RECEIPT" } ], "action": { "id": "ACT_5blBTHnIs4aOCIvGwG7KizYUpsGI0g", "type": "DISPUTE_SINGLE", "time_created": "2020-03-09T09:31:43.877Z", "result_code": "SUCCESS", "app_id": "7ABZlMiSukISskkxxtDTMzpTN5nG5Jjw", "app_name": "ucp-disputes-testharness" } } ``` ## Step 2: Accept or challenge a dispute In the scenario of a chargeback or retrieval case, there are two actions you can take regarding the dispute: accept and take liability for the dispute or challenge it. ### Challenge a dispute A dispute challenge requires some evidence, depending on the case type. This evidence can be in the form of a sales receipt, proof of delivery, or a copy of the terms and conditions. Each evidence document must be submitted as a base64-encoded string. #### Sample request ```JSON curl -L -X POST 'https://apis.sandbox.globalpay.com/unifiedcommerce/disputes/DIS_SAND_abcd1235/challenge' \ -H 'Authorization: Bearer 72hyeepo8DnW053OrqAEFwAzeDtC' \ -H 'X-GP-Version: 2020-01-20' \ -H 'Accept: application/json' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/json' \ -D '{ "documents": [ { "type": "SALES_RECEIPT", "b64_content": "R0lGODlhigPCAXAAACwAAAAAigPCAYf///8AQnv" } ] }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); DisputeSummary dispute = new DisputeSummary().fromId("DIS_SAND_abcd1234"); DisputeDocument document = new DisputeDocument(); document.setType("SALES_RECEIPT"); document.setBase64Content("R0lGODlhigPCAXAAACwAAAAAigPCAYf///8AQnv"); ArrayList documents = new ArrayList<>(); documents.add(document); try { Transaction response = dispute.challenge(documents) .execute(); // API raw response "id" String id = response.getTransactionId(); // API raw response "status" String status = response.getResponseMessage(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); return; } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); var disputeDocuments = new List { new DisputeDocument { Type = "SALES_RECEIPT", Base64Content = "R0lGODlhigPCAXAAACwAAAAAigPCAYf///8AQnv", }, new DisputeDocument { Type = "TERMS_AND_CONDITIONS", Base64Content = "R0lGODlhigPCAXAAACwAAAAAigPCAYf///8AQnv", } }; DisputeSummary dispute = new DisputeSummary { CaseId = "DIS_SAND_abcd1241" }; try { Transaction response = dispute.Challenge(disputeDocuments) .Execute(); // API raw response "id" var id = response.TransactionId; // API raw response "status" var status = response.ResponseMessage; // API raw response "action->result_code" var responseCode = response.ResponseCode; // API raw response "amount" var amount = response.BalanceAmount; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $dispute = DisputeSummary::fromId("DIS_SAND_abcd1234"); $document = new DisputeDocument(); $document->type = 'SALES_RECEIPT'; $document->b64_content = 'R0lGODlhigPCAXAAACwAAAAAigPCAYf///8AQnv'; $documents[] = $document; try { /** @var DisputeSummary $dispute */ $response = $dispute->challenge($documents)->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "id" $id = $response->transactionId; // API raw response "status" $status = $response->responseMessage; // API raw response "action->result_code" $responseCode = $response->responseCode; // API raw response "amount" $amount = $response->balanceAmount; ``` ### Dispute challenge response The response of the challenge request contains information on the case, including the status, stage, and the result of the dispute. If successful, the evidence provided is sent to us to review and then sent to the issuer to support the chargeback case. If unsuccessful, detailed information is provided regarding the error. #### Sample response ```JSON { "id": "DIS_SAND_abcd1235", "status": "UNDER_REVIEW", "stage": "CHARGEBACK", "amount": "1500", "currency": "USD", "reason_code": "132", "reason_description": "Cancelled Recurring", "result": "PENDING", "documents": [ { "id": "DOC_MyEvidence_234234AVCDE-0" } ], "action": { "id": "ACT_5blBTHnIs4aOCIvGwG7KizYUpsGI0g", "type": "CHALLENGE", "time_created": "2020-03-09T14:45:05.575Z", "result_code": "SUCCESS", "app_id": "7ABZlMiSukISskkxxtDTMzpTN5nG5Jjw", "app_name": "ucp-disputes-testharness" } } ``` ### Accept a dispute There are a number of reasons to accept and take liability of a dispute. These reasons include: * If the dispute case is in fact valid. * The amount disputed is minimal and challenging the transaction does not justify the work involved. * To avoid proceeding to arbitration. To accept liability for a dispute, you just need to provide the unique ID of the case. #### Sample request ```JSON curl -L -X POST 'https://apis.sandbox.globalpay.com/unifiedcommerce/disputes/DIS_SAND_abcd1236/acceptance' \ -H 'Authorization: Bearer 72hyeepo8DnW053OrqAEFwAzeDtC' \ -H 'X-GP-Version: 2020-01-20' \ -H 'Accept: application/json' \ -H 'Accept-Encoding: gzip' \ -H 'Content-Type: application/json' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); DisputeSummary dispute = new DisputeSummary().fromId("DIS_SAND_abcd1234"); try { Transaction response = dispute.accept() .execute(); // API raw response "id" String id = response.getTransactionId(); // API raw response "status" String status = response.getResponseMessage(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); // API raw response key "amount" BigDecimal amount = response.getBalanceAmount(); return; } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); DisputeSummary dispute = new DisputeSummary { CaseId = "DIS_SAND_abcd1234" }; try { Transaction response = dispute.Accept() .Execute(); // API raw response "id" var id = response.TransactionId; // API raw response "status" var status = response.ResponseMessage; // API raw response "action->result_code" var responseCode = response.ResponseCode; // API raw response "amount" var amount = response.BalanceAmount; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $dispute = DisputeSummary::fromId("DIS_SAND_abcd1234"); try { $response = $dispute->accept()->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "id" $id = $response->transactionId; // API raw response "status" $status = $response->responseMessage; // API raw response "amount" $amount = $response->balanceAmount; ``` ### Accept response The response contains the status, stage, and the result of the dispute. It also contains information on the result of the action, whether it was successful or not. By accepting the dispute, you accept the liability of the dispute. The customer then retains the funds, and the case is closed. This also indicates that you do not want to take any further action in the case. #### Sample response ```JSON { "id": "DIS_SAND_abcd1236", "status": "CLOSED", "stage": "SECOND_CHARGEBACK", "amount": "2000", "currency": "USD", "reason_code": "137", "reason_description": "Cancelled Merchandise/Services", "result": "ACCEPTED", "action": { "id": "ACT_5blBTHnIs4aOCIvGwG7KizYUpsGI0g", "type": "ACCEPT", "time_created": "2020-03-10T10:30:43.322Z", "result_code": "SUCCESS", "app_id": "7ABZlMiSukISskkxxtDTMzpTN5nG5Jjw", "app_name": "ucp-disputes-testharness" } } ``` ## Dispute fields Below is a detailed explanation of some of the dispute fields returned in the API. ### `entry_mode_code` This is a two-digit code that identifies the method used to accept the cardholder’s payment details. | Code | Card Brand | Description | | -------- | ------- | ------- | | 00 | AX | Terminal not used | | 01 | AX | Manual key entry | | 02 | AX | Magnetic stripe read; CVV checking may not be possible; Exact Track 2 contents read but transaction is not eligible for CVV checking | | 03 | AX | Barcode | | 04 | AX | Optical Character Recognition (OCR) read | | 05 | AX | Integrated circuit card read; CVV or iCVV data is reliable | | 06 | AX | Track 1 read | | 07 | AX | Proximity payment using Visa Smart Debit/Credit (VSDC) chip data rules | | 10, 51, 52, 61, 62, 64, 67, 80, 81 | AX | Unknown | | 90 | AX | Magnetic stripe read and exact content of Track 1 or Track 2, CVV check is possible | | 91 | AX | Proximity payment (magnetic stripe on the card was read) | | 95 | AX | Integrated circuit card, CVV or iCVV checking may not be possible | | 00 | DI | Unknown (card not present) | | 01 | DI | Manual key entry | | 02 | DI | Magnetic stripe read | | 03 | DI | Barcode or payment code | | 04 | DI | Optical character reader (OCR) | | 05 | DI | Integrated circuit card reader | | 07 | DI | Electronic commerce (card not present) | | 08 | DI | Card present, magstripe is defective and cannot be read | | 10 | DI | Stored card account (card present) | | 79, 80 | DI | Unknown (card present) | | 81 | DI | Radio frequency identification (RFID) indicator \- Magnetic stripe | | 82 | DI | Mobile commerce (card not present) | | 83 | DI | Radio frequency identification (RFID) indicator \- Chip | | 85 | DI | Chip fallback (chip-enabled card, processed using the card's magnetic stripe) | | 90 | DI | Voice authorization (card not present) | | 94 | DI | Biometrics (card not present) | | 00 | MC | PAN entry mode unknown (card not present) | | 01 | MC | PAN manual entry (key entered) | | 02, 90 | MC | PAN auto-entry via magnetic stripe \- No track data required | | 03 | MC | PAN auto-entry via bar code reader | | 04 | MC | PAN auto-entry via optical character reader (OCR) | | 05 | MC | PAN auto-entry via chip | | 06 | MC | PAN auto-entry via chip with Paypass Mapping Service applied | | 07 | MC | PAN auto-entry via contactless M/Chip | | 08 | MC | Pan auto-entry via contactless M/Chip Paypass Mapping Service applied | | 10 | MC | Credential on file (card not present) | | 79 | MC | Chip fallback (chip-enabled card, processed using the card's magnetic stripe) via a hybrid terminal (Track 2\) | | 80 | MC | Chip fallback at a chip-capable terminal \- Full track data read | | 81 | MC | PAN entry via electronic commerce; can include a chip card (card not present) | | 82 | MC | PAN auto-entry via server; includes issuer, acquirer, or third party vendor systems (card not present) | | 91 | MC | PAN auto-entry via contactless magnetic stripe | | 92 | MC | Contactless input, Paypass Mapping Service applied | | 95 | MC | Chip card with unreliable CVV data (applies to Visa cards only) | | 00 | PR | PAN entry mode unknown, terminal was not used to capture card (card not present) | | 01 | PR | Manual entry via mail order, telephone order (MO/TO) or internet | | 02 | PR | Magnetic stripe read, checking may not be possible | | 03 | PR | Bar code reader | | 04 | PR | Optical character reader (OCR) | | 05 | PR | Chip-read (information was obtained from the chip on the card) | | 06 | PR | Chip-read (Track 1\) | | 07 | PR | Proximity payment (proximity chip on the card was read) | | 10 | PR | Credential on file (card not present) | | 84 | PR | MICR Reader (magnetic ink character recognition reader device was used in the POS check service) | | 90 | PR | Magnetic stripe read and exact content of Track 1 and Track 2 included (mag stripe or chip fallback) | | 91 | PR | Proximity payment (magnetic stripe on the card was read) | | 95 | PR | Integrated circuit card, chip data on the card may be unreliable | | 96 | PR | Stored value from pre-registered check-out service | | 00 | VI | PAN entry mode unknown, terminal was not used to capture card (card not present) | | 01 | VI | Manual entry via mail order, telephone order (MO/TO) or internet | | 02 | VI | Magnetic stripe read, checking may not be possible | | 03 | VI | Bar code reader | | 04 | VI | Optical character reader (OCR) | | 05 | VI | Chip-read (information was obtained from the chip on the card) | | 06 | VI | Chip-read (Track 1\) | | 07 | VI | Proximity payment (proximity chip on the card was read) | | 10 | VI | Credential on file (card not present) | | 79, 80 | VI | Unknown | | 84 | VI | MICR Reader (magnetic ink character recognition reader device was used in the POS check service) | | 90 | VI | Magnetic stripe read and exact content of Track 1 and Track 2 included (mag stripe or chip fallback) | | 91 | VI | Proximity payment (magnetic stripe on the card was read) | | 95 | VI | Integrated circuit card, chip data on the card may be unreliable | | 96 | VI | Stored value from pre-registered check-out service | ### `terminal_capacity_code` The `terminal_capacity_code` represents the terminal’s: * Capability: How the card information in the disputed transaction was captured * Operating environment: The location of the terminal used in the disputed transaction and whether it was attended or unattended by the card acceptor. The `terminal_capacity_code` values and their meaning vary by card brand and are explained in the table below. #### Visa | Code | Description | | -------- | ------- | | Blank | Unknown, default to `0` | | 0 | Unknown | | 1 | No terminal | | 2 | Magnetic stripe reader | | 3 | Optical code | | 4 | OCR reader | | 5 | Chip capable terminal | | 8 | Contactless-read capability | | 9 | Key entry only; no electronic reading capability | #### Mastercard | Code | Description | | -------- | ------- | | Blank | Unknown, default to `9` | | 0 | No terminal | | 1 | On card acceptor premises; attended | | 2 | On card acceptor premises; unattended | | 3 | Off card acceptor premises; attended | | 4 | Off card acceptor premises; unattended | | 5 | On cardholder premises; unattended | | 6 | Off cardholder premises; unattended | | 9 | Unknown; data not available | ### American Express | Code | Description | | -------- | ------- | | 0 | No terminal used or terminal is unknown | | 1 | On card acceptor premises; attended terminal | | 2 | On card acceptor premises; unattended terminal | | 3 | Off card acceptor premises; attended terminal | | 4 | Off card acceptor premises; unattended | | 5 | On cardholder premises; unattended | ## Testing disputes management Our Disputes Management solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Integration references To get a deeper understanding of Disputes Management, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [API /accesstoken](https://developer.globalpayments.com/api/access-token.md) Generate an access token. ### [API /disputes](https://developer.globalpayments.com/api/disputes.md) Create and retrieve payment links. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ## Enhance your integration Below are value-added services you can enable for Disputes Management. ### [Real-Time Data Reporting](https://developer.globalpayments.com/docs/reporting/real-time-reporting-guide.md) Tokenize card details to charge customers later. ### [Settlement Reporting](https://developer.globalpayments.com/docs/reporting/settlement-reporting-overview.md) Integrate with alternative and local payment methods. ### [File Processing](https://developer.globalpayments.com/docs/operations/file-processing-overview.md) Integrate with alternative and local payment methods. # File Processing - Overview Source: https://developer.globalpayments.com/docs/operations/file-processing-overview.md Section: Operations & Reporting Description: Process large volumes of transactions in one file Our File Processing solution allows merchants or partners to upload bulk files with high volumes of requests, such as transactions, in one file. You can generate this file automatically using your Customer Relationship Management (CRM) system or export it manually from a spreadsheet. All of our APIs are accessible using the dynamic file format. With File Processing, you can: * Process bulk files of large volumes of card payments. * Convert a large number of tokens at once. * Control what data is sent from your CRM rather than streaming all of it. * Manually upload any file as a one-time import. * Process bulk data from merchant onboarding (partners only). ## Use cases In this section, we present some “real world” examples that can be enabled through our File Processing solution. Keep in mind that this section doesn’t cover all use cases. ##### Use case #1: Recurring transactions A video streaming service wants to process a recurring transactions file on the first day of the month so that they can bill all of their customers with subscription memberships. After getting set up with our File Processing solution, they export a file from their system and upload it to ours. When the file is finished processing, they download the response file. Now they can view the results for each transaction and update their systems accordingly. ##### Use case #2: Token conversion and creation A merchant needs to tokenize a large volume of tokens. The merchant is new to us and therefore needs to convert their “legacy” tokens to ours. So, the merchant uses our File Processing solution to convert all of the tokens at once. The merchant could also use our solution to create network tokens in bulk. ##### Use case #3: Onboarding merchants (partners only) A partner wants to onboard a large number of new merchants at the same time. As part of the onboarding process, there are several tasks that need to be done for each merchant: * Create a merchant in the system. * Add the platforms the merchant will use. * Add the account capabilities the merchant will use. * Create app credentials for the merchant. * Securely share app credentials with the merchant. To make the whole process easier, the partner decides to access our onboarding APIs via the File Processing solution so that the above onboarding tasks can be automated. ## How does it work? Once you’re set up to use our File Processing solution, you can start the process to upload a file. First, you create your file in the comma-separated values (.csv) format. We can accept files up to 10 MB. You can use our provided templates to ensure that your request file is properly formatted. You’ll then need to send a create request to our API to get a signed URL so that you have a secure location to upload the file to. The URL is valid for 15 minutes. The response will also include a unique File Processing Resource ID (`FPR_ID`) to represent the file you plan to upload. Next, you’ll encrypt your file using part of a key pair that you’ve created using an open-source public key cryptosystem (OpenPGP). After you send the encrypted file to our API, we’ll decrypt it and process all of the records in the file. We’ll then send a webhook to notify you when the file is finished processing. This will include a signed URL from which you can download the response file. The response file contains the results for each transaction in the file. At a high level, File Processing works like this: ![Diagram flow showing interaction between the merchant, our API, and our File Processing solution to process a file.](https://developer.globalpayments.com/gh-assets/file-processing_flow.png) **File Processing Typical Flow** ## File statuses The status of your uploaded file changes as it is being processed by our API and our File Processing solution. The following table describes when the status occurs during the process. | File Status | Description | | -------- | ------- | | INITIATED | The initial status of all newly created file resources. Occurs after the API sends the signed URL to upload your file to. | | UPLOADED | Occurs after you upload the bulk file to the signed URL provided by the API. | | PENDING | Occurs after record validation if the combinations are deemed valid by our File Processing solution. | | SUBMITTED | Occurs once the file has been fully processed. | | FAILED | Occurs after record validation if the combinations are deemed invalid by our File Processing solution. | | COMPLETED | Occurs after the response file is generated and the API sends you the signed URL to download the encrypted response file via webhook notification. | ## Next steps To try our File Processing solution, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/operations/file-processing-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # File Processing - Guide Source: https://developer.globalpayments.com/docs/operations/file-processing-guide.md Section: Operations & Reporting Description: Learn how to process bulk transactions in one file In this guide, you’ll learn how to generate your public-private key pair, share the public key with us, and receive our public key — all so that you can encrypt the file you want to process. You’ll then learn how to send the file to us for processing, receive the response file, and get the file details. For more information on our File Processing solution, see our [Overview](https://developer.globalpayments.com/docs/operations/file-processing-overview.md). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## OpenPGP encryption For file encryption, we use [OpenPGP](https://openpgp.org), which is a widely used open-source cryptosystem for generating public-private key pairs. Encryption is needed for two files: * The request file you want to upload to our system * The response file we return that contains file details #### How it works First, contact [Integration Support](https://developer.globalpayments.com/support/integration-support) to let us know that you want to use File Processing (email is best). Once we reply, you can then create a public-private key pair as described below. Once we receive the email with your public key, we create our public-private key pair and share the public key with you via email. You then use the public part of this key pair to encrypt any request files you want to upload. The file must be created in the comma-separated values (.csv) format. We then decrypt your file using the private part of the key pair. Only we can decrypt your file. To create your public-private key pair, you can use the [OnlinePGP online tool](https://onlinepgp.com/). Make the following selections: * Algorithm: **RSA** * Key Size: **2048 bits** * Expiration: **Never Expires** You’ll then store the private key in your key truststore and share the public key with us via email (see details below). We then use the public part of this key pair to encrypt the response file we send to you. You then decrypt the response file using the private part of the key pair. Only you can decrypt this file. #### How to email us So that we can encrypt the response file, you need to email us the public key from the public-private key pair you created in the OpenPGP online tool. Here is what we require in the email: * Subject line: (Your MER ID) – Details for File Processing * Include in the email’s body: * Whether it's in Sandbox or Production * Merchant ID for Unified Payments API * File Processing Account ID * Attach to the email: Public key from OpenPGP You then need to send the email to [gpapi.prodsupport\@globalpay.com](mailto:gpapi.prodsupport@globalpay.com) with a carbon copy (CC) to [api.integrations\@globalpay.com](mailto:api.integrations@globalpay.com). ## Step 1: Create and encrypt the file First, you need to create the file that you plan to send to us for processing. The file must be created in the .csv format, and it cannot exceed **10 MB**. The three templates below can be used to get you started with creating your file. You'll need to modify each file to ensure that you're sending the appropriate fields required for your transactions. Sample files: * [Sale transaction file](https://developer.globalpayments.com/gh-assets/files/sample-sale-transaction-file.csv) * [Linked refund transactions file](https://developer.globalpayments.com/gh-assets/files/sample-linked-refund-transactions-file.csv) * [Reversal transaction file](https://developer.globalpayments.com/gh-assets/files/sample-reversal-transactions-file.csv) All fields that can typically be sent in JSON to the API become the column names in the file. If you need help with formatting, you can use our request template. After creating the .csv file, you then need to encrypt it in OpenPGP using the public key we gave you. For more information, see the [OpenPGP encryption](#openpgp-encryption) section. Only we can decrypt this file. ## Step 2: Create the URL Next, you need to send a request to create the URL that you’ll send the file to. We then provide a signed URL in the response that is valid for 15 minutes. You’ll also receive a unique File Processing Resource ID (`FPR_ID`), which can be used to check the details of the file. The initial status of all newly created file resources is INITIATED. For more information on file statuses, see the [Overview](https://developer.globalpayments.com/docs/operations/file-processing-overview.md). The `status_url` is the URL we will send a webhook to once the file has finished processing. #### Sample request ```json url --location 'https://apis.sandbox.globalpay.com/ucp/files' \ --header 'Authorization: Bearer PR3RmboHzLame3SmDcYMtaKSjFtC' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Accept: application/json' \ --header 'Content-type: application/json' \ --header 'Accept-Encoding: gzip' \ --data 'account_name": "file_processing", "notifications": { "status_url": "https://eo9faqlbl8wkwmx.m.pipedream.net/ }' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardPresent); config.setStatusUrl("https://samplestatusurl.com/webhookresponse/"); ServicesContainer.configureService(config); try { FileProcessor response = new FileProcessingService().initiate(); // API raw response key "id" String transactionId = response.getResourceId(); // API raw response key "url" String uploadUrl = response.getUploadUrl(); // API raw response key "expiration_date" String expirationDate = response.getExpirationDate(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "time_created" String createdDate = response.getCreatedDate(); // API raw response key "action->result_code" String responseCode = response.getResponseCode(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```net GpApiConfig config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Country = "US"; config.Channel = Channel.CardPresent; config.ChallengeNotificationUrl = "https://ensi808o85za.x.pipedream.net/"; config.MethodNotificationUrl = "https://ensi808o85za.x.pipedream.net/"; config.MerchantContactUrl = "https://enp4qhvjseljg.x.pipedream.net/"; config.AccessTokenInfo = new AccessTokenInfo { TransactionProcessingAccountName = "transaction_processing" }; config.StatusUrl = "https://eo9faqlbl8wkwmx.m.pipedream.net/"; ServicesContainer.ConfigureService(config); try { FileProcessor response = new FileProcessingService().Initiate(); //response.ResponseCode -> "SUCCESS" //response.ResponseMessage -> "INITIATED" } catch (Exception ex) { throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardPresent; $config->statusUrl = 'https://samplestatusurl.com/webhookresponse/'; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); try { /** @var FileProcessor $response */ $response = FileProcessingService::initiate(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw "id" $resourceId = $response->resourceId; // API raw "url" $uploadUrl = $response->uploadUrl; // API raw "expiration_date" $expirationDate = $response->expirationDate; // API raw "status" $status = $response->status; // API raw "time_created" $createdDate = $response->createdDate; // API raw "action->result_code" $responseCode = $response->responseCode; ``` #### Sample response ```json id": "FPR_303b370ad02f4853b5296391ca5c0f35", "time_created": "2024-11-28T13:34:39.513Z", "status": "INITIATED", "merchant_id": "MER_c5d37eaf0e3841e083c232b2318af55c", "merchant_name": "Sandbox_Merchant_4", "account_id": "FPA_d1b2792dab3e43718aaa3092b8589e27", "account_name": "file_processing", "url": "https://storage.googleapis.com/bkt-gouscnaic-file-processing-str01-unscanned/MER_c5d37eaf0e3841e083c232b2318af55c/Request/FPR_303b370ad02f4853b5296391ca5c0f35?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=file-processing-function%40pid-gousgnac-mega-gain-app.iam.gserviceaccount.com%2F20241128%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20241128T133436Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=5930f745b81d7fe32e502ab5036ace993c8f11326be5f32629f1e92c10ddff1c7962ea7eb5d773bde944170806af18be5c9568de1bdf756c14af25c4f6f1ffdc519e4db17c761688880c879be437712b34fcaf1243c2a572cab3f2dfcb53d011fef1b4224a697aedf09bc804bb858a686f0f2a9f9c8f1a3b14af60ddd9b1b402030c5d599b81c58034ea34987ed2903b0ef7726ca1c1e1d756a0132693b0b53fc7c9eac997f13fcaf1dbb2104589459d121935a51e3f993f03560e0309830ae156850fe937bd02ef10e2664d6862dab2fa9472fdb8e43aa6d67514d4c95381a5212e6275cc97581f0579e998fe003281e85a1f233d6f3aad0ebe73b9afa685d8", "expiration_date": "2024-11-28T13:49:36.560Z", "action": { "id": "ACT_H5LCD2KqYmtpAfPW7HclZM8FAK1yEI", "type": "FILE_CREATE", "time_created": "2024-11-28T13:34:39.513Z", "result_code": "SUCCESS", "app_id": "T6og1tbECpHFeO104qUM383oq5bOJ12r", "app_name": "Postman_Collection_Test } ``` ## Step 3: Send the file and check status Now it’s time to actually send the encrypted file to us. This is achieved via a PUT request to the URL returned in Step 2. **The maximum file size that can be uploaded is 10 MB**. We then decrypt and process the file and send you a webhook when the file is finished processing. You can check the status by using a GET request: `/ucp/files{id}`. For more information on file statuses, see the [Overview](https://developer.globalpayments.com/docs/operations/file-processing-overview.md). #### Sample request ```json curl --location --request PUT 'https://storage.googleapis.com/bkt-gouscnaic-file-processing-str01-unscanned/MER_c5d37eaf0e3841e083c232b2318af55c/Request/FPR_303b370ad02f4853b5296391ca5c0f35?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=file-processing-function%40pid-gousgnac-mega-gain-app.iam.gserviceaccount.com%2F20241128%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20241128T133436Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=5930f745b81d7fe32e502ab5036ace993c8f11326be5f32629f1e92c10ddff1c7962ea7eb5d773bde944170806af18be5c9568de1bdf756c14af25c4f6f1ffdc519e4db17c761688880c879be437712b34fcaf1243c2a572cab3f2dfcb53d011fef1b4224a697aedf09bc804bb858a686f0f2a9f9c8f1a3b14af60ddd9b1b402030c5d599b81c58034ea34987ed2903b0ef7726ca1c1e1d756a0132693b0b53fc7c9eac997f13fcaf1dbb2104589459d121935a51e3f993f03560e0309830ae156850fe937bd02ef10e2664d6862dab2fa9472fdb8e43aa6d67514d4c95381a5212e6275cc97581f0579e998fe003281e85a1f233d6f3aad0ebe73b9afa685d8' \ --header 'Content-Type: text/csv' \ --data '@/C:/Users/Downloads/Transactions.csv.encrypted.txt' ``` ```net GpApiConfig config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Country = "US"; config.Channel = Channel.CardPresent; config.ChallengeNotificationUrl = "https://ensi808o85za.x.pipedream.net/"; config.MethodNotificationUrl = "https://ensi808o85za.x.pipedream.net/"; config.MerchantContactUrl = "https://enp4qhvjseljg.x.pipedream.net/"; config.AccessTokenInfo = new AccessTokenInfo { TransactionProcessingAccountName = "transaction_processing" }; config.StatusUrl = "https://eo9faqlbl8wkwmx.m.pipedream.net/"; ServicesContainer.ConfigureService(config); try { FileProcessor response = new FileProcessingService().Initiate(); FileProcessingClient client = new FileProcessingClient(response.UploadUrl); var fileName = @"FileProcessing.encrypted.txt"; var fullPath = Path.GetFullPath(fileName); var result = client.UploadFile(fullPath); } catch (Exception ex) { throw; } ``` ## Step 4: Receive the webhook and response file Once the file is finished processing, a webhook POST notification is sent to the `status_url` you created in Step 2. You can then use the provided link to download the response file. You need to send a GET request to the URL provided to download the file or you can copy and paste the URL into your browser. This response file will be encrypted using your public key that you sent to us. You will need to use your private key and password to decrypt the file. Only you will be able to decrypt the response file. #### Sample webhook ```json method":"POST", "path":"/", "query":{ }, "client_ip":"123.123.123.123", "url":"https://sample.net/", "headers":{ "host":"qo9faqlbl8wkwmx.sample.net", "content-length":"1893", "access-control-allow-origin":"", "access-control-allow-headers":"origin, apikey, apienv, Authorization, x-requested-with, accept, content-type,X-GP-Version,X-GP-version,x-gp-version", "access-control-max-age":"3628800", "access-control-allow-methods":"POST", "access-control-allow-credentials":"true", "cache-control":"private,no-store", "strict-transport-security":"max-age=31536000; includeSubDomains;", "x-content-type-options":"nosniff", "x_global_transaction_id":"rrt-8f1f2d17-9d8d-40cf-8d85-5fd50dc606778tx78", "x_global_transaction_id_source":"gp-apigee", "apigee_x_global_transaction_id":"rrt-2614871067568800024-c-gea1-32143-51623357-1.1", "x-gp-file-id":"FPR_6bd1965c1cc6430ca19c964a5404dedd", "content-type":"application/json", "x-gp-signature":"d5cc6450645e3c1b2b86d097c4b5fb19dc48d9224d02bd300f6876f3cdf508b4e683761a3205aa5e1f94b2998982d10858776adb9fdfd5abc377ecdd0ca24f94, "body":id":"FPR_6bd1965c1cc6430ca19c964a5404dedd", "time_created":"2023-11-25T12:09:28.148Z", "status":"COMPLETED", "response_file_id":"FPR_6bd1965c1cc6430ca19c964a5404dedd_RESP", "total_record_count":"19", "response_files":[ { "response_file_id":"FPR_6bd1965c1cc6430ca19c964a5404dedd_RESP", "name":"RESPONSE_RECORDS", "time_created":"2023-11-25T12:11:19.322Z", "url":"https://storage.googleapis.com/bkt-gouscnaic-file-processing-str01-clean/MER_c3b3d1ba27684fccb2f391eb5f7a9104/Response/FPR_6bd1965c1cc6430ca19c964a5404dedd_RESP?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=file-processing-function%40pid-gousgnac-mega-gain-app.iam.gserviceaccount.com%2F20231125%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20231125T121119Z&X-Goog-Expires=7200&X-Goog-SignedHeaders=host&X-Goog-Signature=4e1c1448e9208f1561458baae6927ba4792b54f7752b05343d73bc331b835f47892f047818e83308075d8396a14087b2da94bd7417bbf7d3d0aa36263d63e9f6fc2829bd453774dfbe42b5c7c927513e675d966ab23941de4de5b132023071f33c2134f48af4b20d8383d5041dfed31c1a18c4ef4f777d97750e700e2cfed69c78d3aee1c4d09113541ab6de051a2733e2d3dfc36d0052091614be846eadcb83b10cd86b21690e36c9f7daca47a92e7877bcbcca05f4800669a278fdb5f7523e7f52f9afdec54b9aa551da6a5ead55c4de40fa121e409428f8528079ca48e745cb53b15b4978806c63d5751e71f7ed84515a9c0c7b87d3eb392145f02d87b7f8", "expiration_date":"2023-11-25T14:11:19.323Z ], "action":id":"ACT_euSwZVjl7TKB3w8n47Q6hJNzleUgPI", "type":"STATUS_NOTIFICATION", "time_created":"2023-11-25T12:11:20.671Z", "result_code":"SUCCESS", "app_id":"fWkEqBHQNyLrWCAtp1vCWDbo10kf5jr6", "app_name":"File-Processing-SystemApp-CERT } } ``` ## Step 5: Get file details You can check the status of a file and download the encrypted response file by sending a GET request to `/ucp/files/{FPR_ID}`. To decrypt the file, use the private key of the key pair you created in the [OpenPGP encryption](#openpgp-encryption) section. #### Sample request ```json curl --location 'https://apis.sandbox.globalpay.com/ucp/files/FPR_1fb42784270642b1b04fcb9d1e99cb11' \ --header 'Authorization: Bearer gy886f7FycZHyhuKeYr8VkU3CUYa' \ --header 'X-GP-Version: 2021-03-22' \ --header 'Accept: application/json' \ --header 'Content-type: application/json' \ --header 'Accept-Encoding: gzip' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardPresent); config.setStatusUrl("https://samplestatusurl.com/webhookresponse/"); ServicesContainer.configureService(config); String resourceId = "FPR_971edc6eb0944d8d890dcba7a2a41bea"; try { FileProcessor response = new FileProcessingService().getDetails(resourceId); // API raw response key "id" String transactionId = response.getResourceId(); // API raw response key "time_created" String createdDate = response.getCreatedDate(); // API raw response key "status" String transactionStatus = response.getResponseMessage(); // API raw response key "total_record_count" String totalRecordCount = response.getTotalRecordCount(); // API raw response key "response_files" List filesUploaded = response.getFilesUploaded(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```net GpApiConfig config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Country = "US"; config.Channel = Channel.CardPresent; config.ChallengeNotificationUrl = "https://ensi808o85za.x.pipedream.net/"; config.MethodNotificationUrl = "https://ensi808o85za.x.pipedream.net/"; config.MerchantContactUrl = "https://enp4qhvjseljg.x.pipedream.net/"; config.AccessTokenInfo = new AccessTokenInfo { TransactionProcessingAccountName = "transaction_processing" }; config.StatusUrl = "https://eo9faqlbl8wkwmx.m.pipedream.net/"; ServicesContainer.ConfigureService(config); string resourceId = "FPR_971edc6eb0944d8d890dcba7a2a41bea"; FileProcessor response = new FileProcessingService().GetDetails(resourceId); //response.ResponseCode -> "SUCCESS" //response.Status -> "COMPLETED" ``` ```php $config = new GpApiConfig(); $config->appId = 'AppId'; $config->appKey = 'AppKey'; $config->channel = Channel::CardPresent; $config->statusUrl = 'https://eo9faqlbl8wkwmx.m.pipedream.net/'; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $resourceId = "FPR_0b185b7a95b3455a96a23d2146102d0a"; try { /** @var FileProcessor $response */ $response = FileProcessingService::getDetails($resourceId); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw "id" $resourceId = $response->resourceId; // API raw "time_created" $createdDate = $response->createdDate; // API raw "status" $status = $response->status; // API raw "total_record_count" $total_record_count = $response->totalRecordCount; // API raw "response_files" $files = $response->files; ``` ## Testing Our File Processing solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Enhance your integration Explore more functionality to enrich your application or website. Below are value-added services you can enable for File Processing. ### [Real-Time Data Reporting](https://developer.globalpayments.com/docs/reporting/real-time-reporting-guide.md) Reconcile transactions and get an audit trail for all account activities. ### [Settlement Reporting](https://developer.globalpayments.com/docs/reporting/settlement-reporting-overview.md) Simplify reconciliation and get customized daily deposit data. ### [Disputes Management](https://developer.globalpayments.com/docs/operations/disputes-management-overview.md) Automate the reporting and management of transaction disputes. # Real-Time Reporting - Guide Source: https://developer.globalpayments.com/docs/reporting/real-time-reporting-guide.md Section: Operations & Reporting Description: Learn how to reconcile transactions and get an audit trail of your account Our reporting APIs can be used to reconcile transactions but can also provide a detailed audit trail for all activities that take place on your account. This guide focuses on transaction processing, specifically authorizations, to demonstrate how the outcome and data returned by the issuer are available in real time. Any subsequent actions performed on the transaction or authorization are also recorded and available in real time. When you perform any action on any resource via our API, all of your data is instantly available to report on via GET methods. For example, you can pull a list of authentications, payment methods, or links based on particular search criteria. You can also obtain the details of a specific resource by using its specific identifier (ID). ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Get a list of transactions In this step, we pull a list of transactions based on specific search criteria. There are a number of search options, including: * Card brand * Status * Last four digits of the card #### Sample request In this example, we use a date range to obtain a list of all the transactions processed on a specific day. For better readability, we limited our page size to 2. For available search parameters and details of all request and response variables, see [Transactions](https://developer.globalpayments.com/api/transactions.md) in the API Explorer. ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/transactions?order=DESC&page_size=2&from_time_created=2021-03-30&to_time_created=2021-03-30' \ --header 'Authorization: Bearer wuq80o5scA9ya5H2TBBpuNwgnOi3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Date startDate = DateTime.now().minusMonths(1).toDate(); Date enddate = DateTime.now().toDate(); try { TransactionSummaryPaged response = ReportingService.findTransactionsPaged(1, 10) .orderBy(TransactionSortProperty.TimeCreated, SortDirection.Descending) .where(SearchCriteria.StartDate, startDate) .and(SearchCriteria.EndDate, enddate) .execute(); // API raw response "total_record_count" int totalRecordCount = response.getTotalRecordCount(); // API raw response "transactions" List transactions = response.getResults(); TransactionSummary transaction = transactions.get(0); // API raw response "transactions[0]->id" String transactionId = transaction.getTransactionId(); // API raw response "transactions[0]->time_created" DateTime transactionDate = transaction.getTransactionDate(); // API raw response "transactions[0]->status" String status = transaction.getTransactionStatus(); // API raw response "transactions[0]->type" String type = transaction.getTransactionType(); // API raw response "transactions[0]->channel" String channel = transaction.getChannel(); // API raw response "transactions[0]->amount" BigDecimal amount = transaction.getAmount(); // API raw response "transactions[0]->gratuity_amount" BigDecimal gratuityAmount = transaction.getGratuityAmount(); // API raw response "transactions[0]->currency" String currency = transaction.getCurrency(); // API raw response "transactions[0]->reference" String reference = transaction.getReferenceNumber(); // API raw response "transactions[0]->description" String description = transaction.getDescription(); // API raw response "transactions[0]->order->reference" String orderId = transaction.getOrderId(); // API raw response "transactions[0]->time_created_reference" DateTime timeCreatedReference = transaction.getTransactionLocalDate(); // API raw response "transactions[0]->batch_id" String batchId = transaction.getBatchSequenceNumber(); // API raw response "transactions[0]->country" String country = transaction.getCountry(); // API raw response "transactions[0]->parent_resource_id" String parentResourceId = transaction.getOriginalTransactionId(); // API raw response "transactions[0]->payment_method->result" String gatewayResponseCode = transaction.getGatewayResponseCode(); // API raw response "transactions[0]->payment_method->message" String gatewayResponseMessage = transaction.getGatewayResponseMessage(); // API raw response "transactions[0]->payment_method->entry_mode" String entryMode = transaction.getEntryMode(); // API raw response "transactions[0]->payment_method->fingerprint" String fingerprint = transaction.getFingerprint(); // API raw response "transactions[0]->payment_method->fingerprint_presence_indicator" String fingerprintIndicator = transaction.getFingerprintIndicator(); // API raw response "transactions[0]->payment_method->name" String cardHolderName = transaction.getCardHolderName(); // API raw response "transactions[0]->payment_method->card->brand" String cardType = transaction.getCardType(); // API raw response "transactions[0]->payment_method->card->authcode" String authCode = transaction.getAuthCode(); // API raw response "transactions[0]->payment_method->card->brand_reference" String brandReference = transaction.getBrandReference(); // API raw response "transactions[0]->payment_method->card->masked_number_first6last4" String maskedCardNumber = transaction.getMaskedCardNumber(); // API raw response "transactions[0]->risk_assessment->mode" String fraudResponseMode = transaction.getFraudManagementResponse().getFraudResponseMode(); // API raw response "transactions[0]->risk_assessment->result" String fraudResponseResult = transaction.getFraudManagementResponse().getFraudResponseResult(); // API raw response "transactions[0]->risk_assessment->rules" Object fraudResponseRules = transaction.getFraudManagementResponse().getFraudResponseRules(); // API raw response "transactions[0]->system->mid" String mid = transaction.getMerchantId(); // API raw response "transactions[0]->system->hierarchy" String hierarchy = transaction.getMerchantHierarchy(); // API raw response "transactions[0]->system->name" String systemMerchantName = transaction.getMerchantName(); // API raw response "transactions[0]->system->dba" String dba = transaction.getMerchantDbaName(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```.net var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); DateTime StartDate = DateTime.UtcNow.AddMonths(-1); DateTime EndDate = DateTime.UtcNow; try { PagedResult response = ReportingService.FindTransactionsPaged(1,2) .OrderBy(TransactionSortProperty.TimeCreated, SortDirection.Descending) .Where(SearchCriteria.StartDate, StartDate) .And(SearchCriteria.EndDate, EndDate) .Execute(); // API raw response "total_record_count" var totalRecordCount = response.TotalRecordCount; // API raw response "transactions" var transactions = response.Results; TransactionSummary transaction = transactions.First(); // API raw response "transactions[0]->id" var transactionId = transaction.TransactionId; // API raw response "transactions[0]->time_created" var transactionDate = transaction.TransactionDate; // API raw response "transactions[0]->status" var status = transaction.TransactionStatus; // API raw response "transactions[0]->type" var type = transaction.TransactionType; // API raw response "transactions[0]->channel" var channel = transaction.Channel; // API raw response "transactions[0]->amount" var amount = transaction.Amount; // API raw response "transactions[0]->gratuity_amount" var gratuityAmount = transaction.GratuityAmount; // API raw response "transactions[0]->currency" var currency = transaction.Currency; // API raw response "transactions[0]->reference" var reference = transaction.ReferenceNumber; // API raw response "transactions[0]->description" var description = transaction.Description; // API raw response "transactions[0]->order->reference" var orderId = transaction.OrderId; // API raw response "transactions[0]->time_created_reference" var timeCreatedReference = transaction.TransactionLocalDate; // API raw response "transactions[0]->batch_id" var batchId = transaction.BatchSequenceNumber; // API raw response "transactions[0]->country" var country = transaction.Country; // API raw response "transactions[0]->parent_resource_id" var parentResourceId = transaction.OriginalTransactionId; // API raw response "transactions[0]->payment_method->result" var gatewayResponseCode = transaction.GatewayResponseCode; // API raw response "transactions[0]->payment_method->message" var gatewayResponseMessage = transaction.GatewayResponseMessage; // API raw response "transactions[0]->payment_method->entry_mode" var entryMode = transaction.EntryMode; // API raw response "transactions[0]->payment_method->fingerprint" var fingerprint = transaction.Fingerprint; // API raw response "transactions[0]->payment_method->fingerprint_presence_indicator" var fingerprintIndicator = transaction.FingerprintIndicator; // API raw response "transactions[0]->payment_method->name" var cardHolderName = transaction.CardHolderName; // API raw response "transactions[0]->payment_method->card->brand" var cardType = transaction.CardType; // API raw response "transactions[0]->payment_method->card->authcode" var authCode = transaction.AuthCode; // API raw response "transactions[0]->payment_method->card->brand_reference" var brandReference = transaction.BrandReference; // API raw response "transactions[0]->payment_method->card->masked_number_first6last4" var maskedCardNumber = transaction.MaskedCardNumber; // API raw response "transactions[0]->risk_assessment->mode" var fraudResponseMode = transaction.FraudManagementResponse.FraudResponseMode; // API raw response "transactions[0]->risk_assessment->result" var fraudResponseResult = transaction.FraudManagementResponse.FraudResponseResult; // API raw response "transactions[0]->risk_assessment->rules" var fraudResponseRules = transaction.FraudManagementResponse.FraudResponseRules; // API raw response "transactions[0]->system->mid" var mid = transaction.MerchantId; // API raw response "transactions[0]->system->hierarchy" var hierarchy = transaction.MerchantHierarchy; // API raw response "transactions[0]->system->name" var systemMerchantName = transaction.MerchantName; // API raw response "transactions[0]->system->dba" var dba = transaction.MerchantDbaName; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $startDate = (new DateTime())->modify("-30 days")->setTime(0, 0, 0); $endDate = (new DateTime())->modify("-30 days")->setTime(23, 59, 59); try { /** @var \GlobalPayments\Api\Entities\GpApi\PagedResult $response */ $response = ReportingService::findTransactionsPaged(1, 2) ->orderBy(TransactionSortProperty::TIME_CREATED, SortDirection::DESC) ->where(SearchCriteria::START_DATE, $startDate) ->andWith(SearchCriteria::END_DATE, $endDate) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "total_record_count" $totalRecordCount = $response->totalRecordCount; //API raw response "transactions" $transactionList = $response->result; if (empty($transactionList)) { echo "No transactions found.\n"; } /** @var \GlobalPayments\Api\Entities\Reporting\TransactionSummary $transaction */ $transaction = reset($transactionList); // API raw response "transactions[0]->id" $transactionId = $transaction->transactionId; // API raw response "transactions[0]->time_created" $transactionDate = $transaction->transactionDate; // API raw response "transactions[0]->status" $status = $transaction->transactionStatus; // API raw response "transactions[0]->type" $type = $transaction->transactionType; // API raw response "transactions[0]->channel" $channel = $transaction->channel; // API raw response "transactions[0]->amount" $amount = $transaction->amount; // API raw response "transactions[0]->merchant_amount" $merchantAmount = $transaction->merchantAmount; // API raw response "transactions[0]->gratuity_amount" $gratuityAmount = $transaction->gratuityAmount; // API raw response "transactions[0]->currency" $currency = $transaction->currency; // API raw response "transactions[0]->reference" $reference = $transaction->referenceNumber; // API raw response "transactions[0]->description" $description = $transaction->description; // API raw response "transactions[0]->order->reference" $orderId = $transaction->orderId; // API raw response "transactions[0]->time_created_reference" $timeCreatedReference = $transaction->transactionLocalDate; // API raw response "transactions[0]->batch_id" $batchId = $transaction->batchSequenceNumber; // API raw response "transactions[0]->country" $country = $transaction->country; // API raw response "transactions[0]->payment_method->result" $gatewayResponseCode = $transaction->gatewayResponseCode; // API raw response "transactions[0]->payment_method->message" $gatewayResponseMessage = $transaction->gatewayResponseMessage; // API raw response "transactions[0]->payment_method->entry_mode" $entryMode = $transaction->entryMode; // API raw response "transactions[0]->payment_method->fingerprint" $fingerprint = $transaction->fingerprint; // API raw response "transactions[0]->payment_method->fingerprint_presence_indicator" $fingerprintIndicator = $transaction->fingerprintIndicator; // API raw response "transactions[0]->payment_method->name" $cardHolderName = $transaction->cardHolderName; // API raw response "transactions[0]->payment_method->card->brand" $cardType = $transaction->cardDetails->brand; // API raw response "transactions[0]->payment_method->card->authcode" $authCode = $transaction->authCode; // API raw response "transactions[0]->payment_method->card->brand_reference" $brandReference = $transaction->cardDetails->brandReference; // API raw response "transactions[0]->payment_method->card->masked_number_first6last4" $maskedCardNumber = $transaction->cardDetails->maskedCardNumber; // API raw response "transactions[0]->currency_conversion->payer_amount" $dccPayerAmount = $transaction->dccRateData->cardHolderAmount ?? null; // API raw response "transactions[0]->currency_conversion->payer_currency" $dccPayerCurrency = $transaction->dccRateData->cardHolderCurrency ?? null; // API raw response "transactions[0]->currency_conversion->margin_rate_percentage" $dccMarginRatePercentage = $transaction->dccRateData->marginRatePercentage ?? null; // API raw response "transactions[0]->currency_conversion->exchange_rate" $dccExchangeRate = $transaction->dccRateData->cardHolderRate ?? null; // API raw response "transactions[0]->currency_conversion->commission_percentage" $dccCommissionPercentage = $transaction->dccRateData->commissionPercentage ?? null; // API raw response "transactions[0]->currency_conversion->exchange_rate_source" $dccExchangeRateSource = $transaction->dccRateData->exchangeRateSourceName ?? null; // API raw response "transactions[0]->currency_conversion->exchange_source_time" $dccExchangeRateSourceTime = $transaction->dccRateData->exchangeRateSourceTimestamp ?? null; // API raw response key "transactions[0]->risk_assessment->mode" $fraudResponseMode = $transaction->fraudManagementResponse->fraudResponseMode; // API raw response key "transactions[0]->risk_assessment->result" $fraudResponseResult = $transaction->fraudManagementResponse->fraudResponseResult; // API raw response key "transactions[0]->risk_assessment->rules" $fraudResponseRules = $transaction->fraudManagementResponse ->fraudResponseRules; // API raw response key "transactions[0]->system->mid" $mid = $transaction->merchantId; // API raw response key "transactions[0]->system->hierarchy" $systemHierarchy = $transaction->merchantHierarchy; // API raw response key "transactions[0]->system->name" $systemName = $transaction->merchantName; // API raw response key "transactions[0]->system->dba" $dba = $transaction->merchantDbaName; // API raw response key "transactions[0]->parent_resource_id" $parentResourceId = $transaction->originalTransactionId; ``` #### Sample response ```JSON { "total_record_count": 1155, "current_page_size": 2, "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "TRA_6716058969854a48b33347043ff8225f", "account_name": "Transaction_Processing", "filter": { "from_time_created": "2021-03-30T00:00:00.000Z", "to_time_created": "2021-03-30T23:59:59.999Z" }, "paging": { "page_size": 2, "page": 1, "order": "DESC", "order_by": "TIME_CREATED" }, "transactions": [ { "id": "TRN_l52ksA9raoU4gp2T07ZfCSBzqVMar0", "time_created": "2021-03-30T23:40:23.311Z", "status": "PREAUTHORIZED", "type": "SALE", "channel": "CNP", "amount": "4500", "partner_amount": "", "merchant_amount": "", "currency": "GBP", "reference": "togWvZyfoSCkclYtcdEQ", "time_created_reference": "", "batch_id": "", "country": "", "payment_method": { "message": "SUCCESS", "entry_mode": "ECOM", "fingerprint": "", "fingerprint_presence_indicator": "", "name": "James Mason", "card": { "brand": "VISA", "authcode": "12345", "brand_reference": "mjVPe4n3VwyLdpjU", "masked_number_first6last4": "426397XXXXXX5262" } }, "action_create_id": "ACT_l52ksA9raoU4gp2T07ZfCSBzqVMar0", "parent_resource_id": "TRN_l52ksA9raoU4gp2T07ZfCSBzqVMar0" }, { "id": "TRN_vmSQBXLBZbpHpo8nDnPf91NQec8nEm", "time_created": "2021-03-30T23:39:08.180Z", "status": "PREAUTHORIZED", "type": "SALE", "channel": "CNP", "amount": "4500", "partner_amount": "", "merchant_amount": "", "currency": "GBP", "reference": "nFAqUCuoeCyXWHopjzlq", "time_created_reference": "", "batch_id": "", "country": "", "payment_method": { "message": "SUCCESS", "entry_mode": "ECOM", "fingerprint": "", "fingerprint_presence_indicator": "", "name": "MR FOO BAR", "card": { "brand": "VISA", "authcode": "12345", "brand_reference": "7yzJ3NF4rKoCan3z", "masked_number_first6last4": "426397XXXXXX5262" } }, "action_create_id": "ACT_vmSQBXLBZbpHpo8nDnPf91NQec8nEm", "parent_resource_id": "TRN_vmSQBXLBZbpHpo8nDnPf91NQec8nEm" } ], "action": { "id": "ACT_zClF2MUwDM5ga7fvbZp2Owgv65ABfA", "type": "TRANSACTION_LIST", "time_created": "2022-03-31T10:59:01.516Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app" } } ``` ## Step 2: Get the details of a specific transaction When obtaining a list of transactions, a summary object is returned for each record. To pull the details of a specific transaction, we use its unique identifier. The response contains more data on the transaction, including specific variables and values passed as well as information on the payment method used. For more information on all request and response variables, see [Transactions](https://developer.globalpayments.com/api/transactions.md) in the API Explorer. #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/transactions/TRN_l52ksA9raoU4gp2T07ZfCSBzqVMar0' \ --header 'Authorization: Bearer wuq80o5scA9ya5H2TBBpuNwgnOi3' \ --header 'Accept: application/json' \ --header 'X-GP-Version: 2021-03-22' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); String transactionId = "TRN_bRpuhDJHK0czBI8dLxiCUn3Uk1yKKF_7e55cfad32ba"; try { TransactionSummary transaction = ReportingService.transactionDetail(transactionId) .execute(); // API raw response "id" String id = transaction.getTransactionId(); // API raw response "time_created" DateTime transactionDate = transaction.getTransactionDate(); // API raw response "status" String status = transaction.getTransactionStatus(); // API raw response "type" String type = transaction.getTransactionType(); // API raw response "channel" String channel = transaction.getChannel(); // API raw response "amount" BigDecimal amount = transaction.getAmount(); // API raw response "gratuity_amount" BigDecimal gratuityAmount = transaction.getGratuityAmount(); // API raw response "currency" String currency = transaction.getCurrency(); // API raw response "reference" String reference = transaction.getReferenceNumber(); // API raw response "description" String description = transaction.getDescription(); // API raw response "order->reference" String orderId = transaction.getOrderId(); // API raw response "time_created_reference" DateTime timeCreatedReference = transaction.getTransactionLocalDate(); // API raw response "batch_id" String batchId = transaction.getBatchSequenceNumber(); // API raw response "country" String country = transaction.getCountry(); // API raw response "parent_resource_id" String parentResourceId = transaction.getOriginalTransactionId(); // API raw response "payment_method->result" String gatewayResponseCode = transaction.getGatewayResponseCode(); // API raw response "payment_method->message" String gatewayResponseMessage = transaction.getGatewayResponseMessage(); // API raw response "payment_method->entry_mode" String entryMode = transaction.getEntryMode(); // API raw response "payment_method->fingerprint" String fingerprint = transaction.getFingerprint(); // API raw response "payment_method->fingerprint_presence_indicator" String fingerprintIndicator = transaction.getFingerprintIndicator(); // API raw response "payment_method->name" String cardHolderName = transaction.getCardHolderName(); // API raw response "payment_method->card->brand" String cardType = transaction.getCardType(); // API raw response "payment_method->card->authcode" String authCode = transaction.getAuthCode(); // API raw response "payment_method->card->brand_reference" String brandReference = transaction.getBrandReference(); // API raw response "payment_method->card->masked_number_first6last4" String maskedCardNumber = transaction.getMaskedCardNumber(); // API raw response "risk_assessment->mode" String fraudResponseMode = transaction.getFraudManagementResponse().getFraudResponseMode(); // API raw response "risk_assessment->result" String fraudResponseResult = transaction.getFraudManagementResponse().getFraudResponseResult(); // API raw response "risk_assessment->rules" List fraudResponseRules = transaction.getFraudManagementResponse().getFraudResponseRules(); // API raw response "system->mid" String mid = transaction.getMerchantId(); // API raw response "system->hierarchy" String hierarchy = transaction.getMerchantHierarchy(); // API raw response "system->name" String systemMerchantName = transaction.getMerchantName(); // API raw response "system->dba" String dba = transaction.getMerchantDbaName(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```net var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); var transactionId = "TRN_bRpuhDJHK0czBI8dLxiCUn3Uk1yKKF_7e55cfad32ba"; try { TransactionSummary transaction = ReportingService.TransactionDetail(transactionId) .Execute(); // API raw response "id" var id = transaction.TransactionId; // API raw response "time_created" var transactionDate = transaction.TransactionDate; // API raw response "status" var status = transaction.TransactionStatus; // API raw response "type" var type = transaction.TransactionType; // API raw response "channel" var channel = transaction.Channel; // API raw response "amount" var amount = transaction.Amount; // API raw response "gratuity_amount" var gratuityAmount = transaction.GratuityAmount; // API raw response "currency" var currency = transaction.Currency; // API raw response "reference" var reference = transaction.ReferenceNumber; // API raw response "description" var description = transaction.Description; // API raw response "order->reference" var orderId = transaction.OrderId; // API raw response "time_created_reference" var timeCreatedReference = transaction.TransactionLocalDate; // API raw response "batch_id" var batchId = transaction.BatchSequenceNumber; // API raw response "country" var country = transaction.Country; // API raw response "parent_resource_id" var parentResourceId = transaction.OriginalTransactionId; // API raw response "payment_method->result" var gatewayResponseCode = transaction.GatewayResponseCode; // API raw response "payment_method->message" var gatewayResponseMessage = transaction.GatewayResponseMessage; // API raw response "payment_method->entry_mode" var entryMode = transaction.EntryMode; // API raw response "payment_method->fingerprint" var fingerprint = transaction.Fingerprint; // API raw response "payment_method->fingerprint_presence_indicator" var fingerprintIndicator = transaction.FingerprintIndicator; // API raw response "payment_method->name" var cardHolderName = transaction.CardHolderName; // API raw response "payment_method->card->brand" var cardType = transaction.CardType; // API raw response "payment_method->card->authcode" var authCode = transaction.AuthCode; // API raw response "payment_method->card->brand_reference" var brandReference = transaction.BrandReference; // API raw response "payment_method->card->masked_number_first6last4" var maskedCardNumber = transaction.MaskedCardNumber; // API raw response "risk_assessment->mode" var fraudResponseMode = transaction.FraudManagementResponse.FraudResponseMode; // API raw response "risk_assessment->result" var fraudResponseResult = transaction.FraudManagementResponse.FraudResponseResult; // API raw response "risk_assessment->rules" var fraudResponseRules = transaction.FraudManagementResponse.FraudResponseRules; // API raw response "system->mid" var mid = transaction.MerchantId; // API raw response "system->hierarchy" var hierarchy = transaction.MerchantHierarchy; // API raw response "system->name" var systemMerchantName = transaction.MerchantName; // API raw response "system->dba" var dba = transaction.MerchantDbaName; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $transactionId = "TRN_bRpuhDJHK0czBI8dLxiCUn3Uk1yKKF_7e55cfad32ba"; try { /** @var \GlobalPayments\Api\Entities\Reporting\TransactionSummary $transaction */ $transaction = ReportingService::transactionDetail($transactionId)->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "id" $id = $transaction->transactionId; // API raw response "time_created" $transactionDate = $transaction->transactionDate; // API raw response "status" $status = $transaction->transactionStatus; // API raw response "type" $type = $transaction->transactionType; // API raw response "channel" $channel = $transaction->channel; // API raw response "amount" $amount = $transaction->amount; // API raw response "merchant_amount" $merchantAmount = $transaction->merchantAmount; // API raw response "gratuity_amount" $gratuityAmount = $transaction->gratuityAmount; // API raw response "currency" $currency = $transaction->currency; // API raw response "reference" $reference = $transaction->referenceNumber; // API raw response "description" $description = $transaction->description; // API raw response "order->reference" $orderId = $transaction->orderId; // API raw response "time_created_reference" $timeCreatedReference = $transaction->transactionLocalDate; // API raw response "batch_id" $batchId = $transaction->batchSequenceNumber; // API raw response "country" $country = $transaction->country; // API raw response "payment_method->result" $gatewayResponseCode = $transaction->gatewayResponseCode; // API raw response "payment_method->message" $gatewayResponseMessage = $transaction->gatewayResponseMessage; // API raw response "payment_method->entry_mode" $entryMode = $transaction->entryMode; // API raw response "payment_method->fingerprint" $fingerprint = $transaction->fingerprint; // API raw response "payment_method->fingerprint_presence_indicator" $fingerprintIndicator = $transaction->fingerprintIndicator; // API raw response "payment_method->name" $cardHolderName = $transaction->cardHolderName; // API raw response "payment_method->card->brand" $cardType = $transaction->cardDetails->brand ?? null; // API raw response "payment_method->card->authcode" $authCode = $transaction->authCode; // API raw response "payment_method->card->brand_reference" $brandReference = $transaction->cardDetails->brandReference ?? null; // API raw response "payment_method->card->masked_number_first6last4" $maskedCardNumber = $transaction->cardDetails->maskedCardNumber ?? null; // API raw response "payment_method->card->cvv_result" $cvnResponseMessage = $transaction->cardDetails->cvnResponseMessage ?? null; // API raw response "payment_method->card->avs_address_result" $avsAddressResponse = $transaction->cardDetails->avsAddressResponse ?? null; // API raw response "payment_method->card->avs_postal_code_result" $avsResponseCode = $transaction->cardDetails->avsResponseCode ?? null; // API raw response "currency_conversion->payer_amount" $dccPayerAmount = $transaction->dccRateData->cardHolderAmount ?? null; // API raw response "currency_conversion->payer_currency" $dccPayerCurrency = $transaction->dccRateData->cardHolderCurrency ?? null; // API raw response "currency_conversion->margin_rate_percentage" $dccMarginRatePercentage = $transaction->dccRateData->marginRatePercentage ?? null; // API raw response "currency_conversion->exchange_rate" $dccExchangeRate = $transaction->dccRateData->cardHolderRate ?? null; // API raw response "currency_conversion->commission_percentage" $dccCommissionPercentage = $transaction->dccRateData->commissionPercentage ?? null; // API raw response "currency_conversion->exchange_rate_source" $dccExchangeRateSource = $transaction->dccRateData->exchangeRateSourceName ?? null; // API raw response "currency_conversion->exchange_source_time" $dccExchangeRateSourceTime = $transaction->dccRateData->exchangeRateSourceTimestamp ?? null; //API raw response key "risk_assessment->mode" $fraudResponseMode = $transaction->fraudManagementResponse->fraudResponseMode ?? null; //API raw response key "risk_assessment->result" $fraudResponseResult = $transaction->fraudManagementResponse->fraudResponseResult ?? null; //API raw response key "risk_assessment->rules" $fraudResponseRules = $transaction->fraudManagementResponse ->fraudResponseRules ?? null; //API raw response key "system->mid" $mid = $transaction->merchantId; //API raw response key "system->hierarchy" $systemHierarchy = $transaction->merchantHierarchy; //API raw response key "system->name" $systemName = $transaction->merchantName; //API raw response key "system->dba" $dba = $transaction->merchantDbaName; //API raw response key "parent_resource_id" $parentResourceId = $transaction->originalTransactionId; ``` ## Step 3: Get a list of actions associated with a transaction Actions represent request and response messages sent by the merchant relating to a specific resource. In this step, we pull a list of actions related to one of the transactions returned previously. There are a number of search criteria we could use, but here we just use a single resource ID: a transaction. In the response, there are two actions: the card being pre-authorized and the transaction being captured. For more information on the available search parameters and the details of all request and response variables, see [Actions](https://developer.globalpayments.com/api/actions.md) in the API Explorer. #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/actions?order=DESC&page_size=5&resource_id=TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461' \ --header 'Authorization: Bearer wuq80o5scA9ya5H2TBBpuNwgnOi3' \ --header 'X-GP-Version: 2021-03-22' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); String transactionId = "TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461"; try { ActionSummaryPaged response = ReportingService.findActionsPaged(1, 5) .orderBy(ActionSortProperty.TimeCreated, SortDirection.Descending) .where(SearchCriteria.ResourceId, transactionId) .execute(); // API raw response "total_record_count" int totalRecordCount = response.getTotalRecordCount(); // API raw response "paging->order_by" String orderBy = response.getOrderBy(); // API raw response "paging->order" String order = response.getOrder(); if (!response.results.isEmpty()) { ActionSummary action = response.results.get(0); // API raw response actions[0]->id String id = action.getId(); // API raw response actions[0]->type String type = action.getType(); // API raw response actions[0]->time_created DateTime timeCreated = action.getTimeCreated(); // API raw response actions[0]->resource String resource = action.getResource(); // API raw response actions[0]->version String version = action.getVersion(); // API raw response actions[0]->resource_id String resourceId = action.getResourceId(); // API raw response actions[0]->resource_status String resourceStatus = action.getResourceStatus(); // API raw response actions[0]->http_response_code String httpResponseCode = action.getHttpResponseCode(); // API raw response actions[0]->response_code String responseCode = action.getResponseCode(); // API raw response actions[0]->app_id String appId = action.getAppId(); // API raw response actions[0]->app_name String appName = action.getAppName(); // API raw response actions[0]->account_id String accountId = action.getAccountId(); // API raw response actions[0]->account_name String accountName = action.getAccountName(); // API raw response actions[0]->merchant_name String merchantName = action.getMerchantName(); } } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```net var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); try { PagedResult response = ReportingService.FindActionsPaged(1,5) .OrderBy(ActionSortProperty.TimeCreated, SortDirection.Descending) .Where(SearchCriteria.ResourceId, "TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461") .Execute(); // API raw response "total_record_count" var totalRecordCount = response.TotalRecordCount; // API raw response "paging->order_by" var orderBy = response.OrderBy; // API raw response "paging->order" var order = response.Order; var action = response.Results.First(); // API raw response actions[0]->id var id = action.Id; // API raw response actions[0]->type var type = action.Type; // API raw response actions[0]->time_created var timeCreated = action.TimeCreated; // API raw response actions[0]->resource var resource = action.Resource; // API raw response actions[0]->version var version = action.Version; // API raw response actions[0]->resource_id var resourceId = action.ResourceId; // API raw response actions[0]->resource_status var resourceStatus = action.ResourceStatus; // API raw response actions[0]->http_response_code var httpResponseCode = action.HttpResponseCode; // API raw response actions[0]->response_code var responseCode = action.ResponseCode; // API raw response actions[0]->app_id var appId = action.AppId; // API raw response actions[0]->app_name var appName = action.AppName; // API raw response actions[0]->account_id var accountId = action.AccountId; // API raw response actions[0]->account_name var accountName = action.AccountName; // API raw response actions[0]->merchant_name var merchantName = action.MerchantName; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $resourceId = 'TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461'; try { /** @var \GlobalPayments\Api\Entities\GpApi\PagedResult $response */ $response = ReportingService::findActionsPaged(1, 5) ->orderBy(ActionSortProperty::TIME_CREATED, SortDirection::DESC) ->where(SearchCriteria::RESOURCE_ID, $resourceId) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } // API raw response "total_record_count" $totalRecordCount = $response->totalRecordCount; $orderBy = $response->orderBy; // API raw response "paging->order_by" $order = $response->order; // API raw response "paging->order" if (count($response->result) > 0) { /** @var \GlobalPayments\Api\Entities\Reporting\ActionSummary $action */ $action = reset($response->result); // API raw response $actions[0]->id $id = $action->id; // API raw response $actions[0]->type $type = $action->type; // API raw response $actions[0]->time_created $timeCreated = $action->timeCreated; // API raw response $actions[0]->resource $resource = $action->resource; // API raw response $actions[0]->version $version = $action->version; // API raw response $actions[0]->resource_id $resourceId = $action->resourceId; // API raw response $actions[0]->resource_status $resourceId = $action->resourceStatus; // API raw response $actions[0]->http_response_code $httpResponseCode = $action->httpResponseCode; // API raw response $actions[0]->response_code $responseCode = $action->responseCode; // API raw response $actions[0]->app_id $appId = $action->appId; // API raw response $actions[0]->app_name $appName = $action->appName; // API raw response $actions[0]->account_id $accountId = $action->accountId; // API raw response $actions[0]->account_name $accountName = $action->accountName; // API raw response $actions[0]->merchant_name $merchantName = $action->merchantName; } ``` ## Step 4: Get the details of a specific action For additional logging or auditing purposes, it’s also possible to obtain the details of a specific action. This includes the message that was sent by the merchant to the API, the response that was sent back with details about the merchant, and the app that was used. For more information on all request and response variables, see [Actions](https://developer.globalpayments.com/api/actions.md) in the API Explorer. #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/actions/ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE' \ --header 'Authorization: Bearer wuq80o5scA9ya5H2TBBpuNwgnOi3' \ --header 'X-GP-Version: 2021-03-22' ``` ```java // configure client & request settings GpApiConfig gpApiConfig = new GpApiConfig(); gpApiConfig.setAppId(APP_ID); gpApiConfig.setAppKey(APP_KEY); ServicesContainer.configureService(gpApiConfig); final String actionId = "ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE"; try { ActionSummary response = ReportingService.actionDetail(actionId) .execute(); String newActionId = response.getId(); //ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE DateTime actionDate = response.getTimeCreated(); String actionType = response.getType(); //CAPTURE String resource = response.getResource(); //TRANSACTIONS String resourceId = response.getResourceId(); //TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461 String resourceStatus = response.getResourceStatus(); //CAPTURED } catch (GatewayException ex) { // TODO: add your error handling here } ``` ```net // configure client & request settings ServicesContainer.ConfigureService(new GpApiConfig { AppId = APP_ID, AppKey = APP_KEY }); const string actionId = "ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE"; try { var response = ReportingService.ActionDetail(actionId) .Execute(); var newActionId = response.Id; //ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE var actionDate = response.TimeCreated.ToString(); var actionType = response.Type; //CAPTURE var resource = response.Resource; //TRANSACTIONS var resourceId = response.ResourceId; //TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461 var resourceStatus = response.ResourceStatus; //CAPTURED } catch (GatewayException ex) { // TODO: add your error handling here } ``` ```php use GlobalPayments\Api\Entities\Enums\SortDirection; use GlobalPayments\Api\Entities\Enums\ActionSortProperty; use GlobalPayments\Api\Entities\Reporting\SearchCriteria; use GlobalPayments\Api\Entities\Reporting\ActionSummary; use GlobalPayments\Api\ServiceConfigs\Gateways\GpApiConfig; use GlobalPayments\Api\Services\ReportingService; use GlobalPayments\Api\ServicesContainer; // configure client & request settings $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; ServicesContainer::configureService($config); $actionId = 'ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE'; $response = ReportingService::actionDetail($actionId) ->execute(); try{ $actionId = $response->id; //ACT_fOlT0ALO6A3f0Z7nwGAN95zSIetnJE $actionType = $response->type; // CAPTURE $actionDate = $response->timeCreated->format('Y-m-d H:i:s'); $resourceType = $response->resource; //TRANSACTIONS $resourceId = $response->resourceId; //TRN_ebTw41MlQhD3ERxFIxRfp9MkKCzcIf_37427461 $resourceStatus = $response->resourceStatus; //CAPTURED } catch (ApiException $e) { // TODO: add your error handling here } ``` ## Testing Our Real-Time Data Reporting solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Integration references To get a deeper understanding of Real-Time Data Reporting, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [API /transactions](https://developer.globalpayments.com/api/transactions.md) Create and retrieve payment links. ### [API /actions](https://developer.globalpayments.com/api/actions.md) Create and retrieve payment links. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ### [Quickstart Demo](https://demo.globalpay.com/merchants/insights-and-reporting/transaction-reports) Demo how easy it is to integrate our customizable solutions into your existing payment experience, and view transactions from multiple channels and regions in one place. ## Enhance your integration Below are value-added services you can enable for Real-Time Data Reporting. ### [Settlement Reporting](https://developer.globalpayments.com/docs/reporting/settlement-reporting-overview.md) Simplify reconciliation and get customized daily deposit data. ### [Disputes Management](https://developer.globalpayments.com/docs/operations/disputes-management-overview.md) Automate the reporting and management of transaction disputes ### [File Processing](https://developer.globalpayments.com/docs/operations/file-processing-overview.md) Process large volumes of transactions in one file. ``` # Settlement Reporting - Overview Source: https://developer.globalpayments.com/docs/reporting/settlement-reporting-overview.md Section: Operations & Reporting Description: Simplify reconciliation and get customized daily deposit data Settlement Reporting helps merchants simplify their daily fund transfer process by automating the reconciliation of funds transferred to their bank accounts with transactions from multiple payment channels. Our Deposits, Transactions, and Disputes capabilities offer maximum flexibility for pulling the deposit data, whether it's by timeframe, status, bank account number, and so on. With Settlement Reporting, you can: * Pull a list of deposits made to your bank account * Obtain each deposit’s granular details for transactions, fees, and disputes Settlement Reporting data is available the day after a transaction was processed. To see a transaction included in the report in real-time (that is, within 5 seconds of a transaction’s completion), you need to use our [Real-Time Data Reporting](https://developer.globalpayments.com/docs/reporting/real-time-reporting-guide.md) feature and be processing transactions through the API. > Settlement Reporting is available only to merchants who use us as their acquirer. ## How does it work? When you process a sale or refund transaction, we move the appropriate funds to or from the customer’s card and settles the transaction with the relevant card issuer. We handle your transactions from any payment channel, whether through an ecommerce website, point-of-sale (POS) platform, or call center. After aggregating all of your transactions over a determined period, we then transfer those funds to your specified bank account. This transfer of funds, or _deposit_, is made up of the sales and refunds you’ve processed within that period, including any deductions such as card processing fees and disputes (also known as _chargebacks_). Merchants who process a small number of transactions per day receive only one deposit per day, whereas larger volume merchants receive multiple ones. ## Sandbox testing When testing Settlement Reporting, our server returns a list of test transactions instead of real ones. This is because in our Sandbox environment, the settlement data is delivered via a standalone test harness, and reporting doesn’t generate from integration activity. In other words, the transactions you execute in Sandbox aren’t batched and flagged for settlement. However, the data does reflect Production. ## Next steps To try our Settlement Reporting solution, follow the steps and code samples in our [guide](https://developer.globalpayments.com/docs/reporting/settlement-reporting-guide.md). > Remember to first register for a developer account if you don't already have one. Once logged in, you can request Sandbox credentials from your account. # Settlement Reporting - Guide Source: https://developer.globalpayments.com/docs/reporting/settlement-reporting-guide.md Section: Operations & Reporting Description: Learn how to get a customized list of deposit data In this guide, you’ll learn how to use our Deposits, Transactions, and Disputes capabilities so you can understand how a daily transfer of funds to you works. Our examples provide a way to get more details for a particular deposit, but keep in mind that we offer maximum flexibility for how to pull deposit data, whether it’s by timeframe, status, bank account number, and so on. For information on managing transactions, see [Manage Payments](https://developer.globalpayments.com/docs/payments/manage-payments/overview). For more information on Settlement Reporting, see our [Overview](https://developer.globalpayments.com/docs/reporting/settlement-reporting-overview.md). > Settlement Reporting is available only to merchants who use us as their acquirer. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) * [Create an access token](https://developer.globalpayments.com/docs/getting-started/generate-token.md) ## Step 1: Get a list of deposits In this step, we pull a list of deposits. For this initial request, you must submit an Account Name or Account ID and the desired timeframe. You can filter the returned data by: * Amount * Bank account number (last 4 digits) * Status (for example, whether a deposit is funded or reserved) * ID - (to search for a particular deposit) You can sort the returned data by time created, status, or deposit in ascending or descending order. The page size can also be specified. In our example, we're not using any filters as we want to return all of the deposits in the timeframe specified. To make things simple, we're only going to return two deposits per page. #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/settlement/deposits?account_name=Settlement%20Reporting&from_time_created=2024-01-01&to_time_created=2024-01-01' \ --header 'Authorization: Bearer 8iZjQyEQeriGfqtA1V5wVDagEMAI' \ --header 'X-GP-Version: 2021-03-22' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Date startDate = DateTime.now().minusMonths(1).toDate(); Date enddate = DateTime.now().toDate(); try { DepositSummaryPaged response = ReportingService.findDepositsPaged(1, 10) .orderBy(DepositSortProperty.TimeCreated, SortDirection.Descending) .where(SearchCriteria.StartDate, startDate) .and(SearchCriteria.EndDate, enddate) .execute(); List depositList = response.getResults(); DepositSummary firstDeposit = depositList.get(0); // API raw response key "deposits[0]->id" String id = firstDeposit.getDepositId(); // API raw response key "deposits[0]->amount" BigDecimal amount = firstDeposit.getAmount(); // API raw response key "deposits[0]->time_created" Date timeCreated = firstDeposit.getDepositDate(); // API raw response key "deposits[0]->status" String status = firstDeposit.getStatus(); // API raw response key "deposits[0]->funding_type" String type = firstDeposit.getType(); // API raw response key "deposits[0]->currency" String currency = firstDeposit.getCurrency(); // API raw response key "deposits[0]->system->mid" String mid = firstDeposit.getMerchantNumber(); // API raw response key "deposits[0]->system->hierarchy" String hierarchy = firstDeposit.getMerchantHierarchy(); // API raw response key "deposits[0]->system->name" String mName = firstDeposit.getMerchantName(); // API raw response key "deposits[0]->system->dba" String dba = firstDeposit.getMerchantDbaName(); // API raw response key "deposits[0]->sales->count" int salesTotalCount = firstDeposit.getSalesTotalCount(); // API raw response key "deposits[0]->sales->amount" BigDecimal saleTotalAmount = firstDeposit.getSalesTotalAmount(); // API raw response key "deposits[0]->refunds->count" int refundsTotalCount = firstDeposit.getRefundsTotalCount(); // API raw response key "deposits[0]->refunds->amount" BigDecimal refundsTotalAmount = firstDeposit.getRefundsTotalAmount(); // API raw response key "deposits[0]->disputes->chargebacks->count" int chargebackTotalCount = firstDeposit.getChargebackTotalCount(); // API raw response key "deposits[0]->disputes->chargebacks->amount" BigDecimal chargebackTotalAmount = firstDeposit.getChargebackTotalAmount(); // API raw response key "deposits[0]->disputes->reversals->count" int adjustmentTotalCount = firstDeposit.getAdjustmentTotalCount(); // API raw response key "deposits[0]->disputes->reversals->amount" BigDecimal adjustmentTotalAmount = firstDeposit.getAdjustmentTotalAmount(); // API raw response key "deposits[0]->fees->amount" BigDecimal feesTotalAmount = firstDeposit.getFeesTotalAmount(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); DateTime StartDate = DateTime.UtcNow.AddYears(-1); DateTime EndDate = DateTime.UtcNow; try { PagedResult result = ReportingService.FindDepositsPaged(1, 10) .OrderBy(DepositSortProperty.TimeCreated, SortDirection.Descending) .Where(SearchCriteria.StartDate, StartDate) .And(SearchCriteria.EndDate, EndDate) .Execute(); var depositList = result.Results; DepositSummary firstDeposit = depositList.First(); // API raw response key "deposits[0]->id" var id = firstDeposit.DepositId; // API raw response key "deposits[0]->amount" var amount = firstDeposit.Amount; // API raw response key "deposits[0]->time_created" var timeCreated = firstDeposit.DepositDate; // API raw response key "deposits[0]->status" var status = firstDeposit.Status; // API raw response key "deposits[0]->funding_type" var type = firstDeposit.Type; // API raw response key "deposits[0]->currency" var currency = firstDeposit.Currency; // API raw response key "deposits[0]->system->mid" var mid = firstDeposit.MerchantNumber; // API raw response key "deposits[0]->system->hierarchy" var hierarchy = firstDeposit.MerchantHierarchy; // API raw response key "deposits[0]->system->name" var mName = firstDeposit.MerchantName; // API raw response key "deposits[0]->system->dba" var dba = firstDeposit.MerchantDbaName; // API raw response key "deposits[0]->sales->count" var salesTotalCount = firstDeposit.SalesTotalCount; // API raw response key "deposits[0]->sales->amount" var saleTotalAmount = firstDeposit.SalesTotalAmount; // API raw response key "deposits[0]->refunds->count" var refundsTotalCount = firstDeposit.RefundsTotalCount; // API raw response key "deposits[0]->refunds->amount" var refundsTotalAmount = firstDeposit.RefundsTotalAmount; // API raw response key "deposits[0]->disputes->chargebacks->count" var chargebackTotalCount = firstDeposit.ChargebackTotalCount; // API raw response key "deposits[0]->disputes->chargebacks->amount" var chargebackTotalAmount = firstDeposit.ChargebackTotalAmount; // API raw response key "deposits[0]->disputes->reversals->count" var adjustmentTotalCount = firstDeposit.AdjustmentTotalCount; // API raw response key "deposits[0]->disputes->reversals->amount" var adjustmentTotalAmount = firstDeposit.AdjustmentTotalAmount; // API raw response key "deposits[0]->fees->amount" var feesTotalAmount = firstDeposit.FeesTotalAmount; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); $startDate = (new DateTime('2024-01-01'))->setTime(0, 0, 0); $endDate = (new DateTime('2024-01-01'))->setTime(23, 59, 59); try { /** @var \GlobalPayments\Api\Entities\GpApi\PagedResult $response */ $response = ReportingService::findDepositsPaged(1, 10) ->orderBy(DepositSortProperty::TIME_CREATED, SortDirection::DESC) ->where(SearchCriteria::START_DATE, $startDate) ->andWith(SearchCriteria::END_DATE, $endDate) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $depositList = $response->result; /** @var \GlobalPayments\Api\Entities\Reporting\DepositSummary $firstDeposit */ $firstDeposit = reset($depositList); // API raw response key "deposits[0]->id" $id = $firstDeposit->depositId; // API raw response key "deposits[0]->amount" $amount = $firstDeposit->amount; // API raw response key "deposits[0]->time_created" $timeCreated = $firstDeposit->depositDate; // API raw response key "deposits[0]->status" $status = $firstDeposit->status; // API raw response key "deposits[0]->funding_type" $type = $firstDeposit->type; // API raw response key "deposits[0]->currency" $currency = $firstDeposit->currency; // API raw response key "deposits[0]->system->mid" $mid = $firstDeposit->merchantId; // API raw response key "deposits[0]->system->hierarchy" $mHierarchy = $firstDeposit->merchantHierarchy; // API raw response key "deposits[0]->system->name" $mName = $firstDeposit->merchantName; // API raw response key "deposits[0]->system->dba" $dba = $firstDeposit->merchantDbaName; // API raw response key "deposits[0]->sales->count" $salesTotalCount = $firstDeposit->salesTotalCount; // API raw response key "deposits[0]->sales->amount" $salesTotalAmount = $firstDeposit->salesTotalAmount; // API raw response key "deposits[0]->refunds->count" $refundsTotalCount = $firstDeposit->refundsTotalCount; // API raw response key "deposits[0]->refunds->amount" $refundsTotalAmount = $firstDeposit->refundsTotalAmount; // API raw response key "deposits[0]->tax->count" $taxTotalCount = $firstDeposit->taxTotalCount; // API raw response key "deposits[0]->tax->amount" $taxTotalAmount = $firstDeposit->taxTotalAmount; // API raw response key "deposits[0]->disputes->chargebacks->count" $chargebackTotalCount = $firstDeposit->chargebackTotalCount; // API raw response key "deposits[0]->disputes->chargebacks->amount" $chargebackTotalAmount = $firstDeposit->chargebackTotalAmount; // API raw response key "deposits[0]->disputes->reversals->count" $adjustmentTotalCount = $firstDeposit->adjustmentTotalCount; // API raw response key "deposits[0]->disputes->reversals->amount" $adjustmentTotalAmount = $firstDeposit->adjustmentTotalAmount; // API raw response key "deposits[0]->fees->amount" $feesTotalAmount = $firstDeposit->feesTotalAmount; ``` ### Deposit response The response data contains all of the deposits to your bank account within the specified timeframe. For each deposit, a summary object is returned outlining the number of sales, refunds, and disputes included in the deposit, along with any fees applied or discounts. The deposit’s unique ID is also returned, which we can use in Step 2 to get more details on this particular deposit. #### Sample response ```json total_record_count": 21, "current_page_size": 5, "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "DAA_5763583e72ca4181bee088a25482bf06", "account_name": "Settlement Reporting", "filter": { "from_time_created": "2024-01-01", "to_time_created": "2024-01-01, "paging": page_size": 5, "page": 1, "order": "ASC", "order_by": "TIME_CREATED, "deposits": [ id": "DEP_2342423423", "time_created": "2021-03-07", "status": "FUNDED", "funding_type": "CREDIT", "amount": "11400", "currency": "USD", "aggregation_model": "H-By Date", "bank_transfer": { "masked_account_number_last4": "XXXXXX9999", "bank": { "code": "XXXXX0001 }, "system": mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group, "sales": count": 4, "amount": "12400, "refunds": count": 1, "amount": "-1000, "discounts": count": 0, "amount": ", "tax": count": 0, "amount": ", "disputes": chargebacks": { "count": 0, "amount": ", "reversals": count": 0, "amount": " }, "fees": amount": " }, id": "DEP_2342423424", "time_created": "2021-03-07", "status": "FUNDED", "funding_type": "CREDIT", "amount": "11000", "currency": "USD", "aggregation_model": "5-Consolidate", "bank_transfer": { "masked_account_number_last4": "XXXXXX9999", "bank": { "code": "XXXXX0001 }, "system": mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group, "sales": count": 4, "amount": "12500, "refunds": count": 1, "amount": "-1500, "discounts": count": 0, "amount": ", "tax": count": 0, "amount": ", "disputes": chargebacks": { "count": 0, "amount": ", "reversals": count": 0, "amount": " }, "fees": amount": " }, id": "DEP_2342423425", "time_created": "2021-03-07", "status": "FUNDED", "funding_type": "CREDIT", "amount": "12600", "currency": "USD", "aggregation_model": "3-No Summary", "bank_transfer": { "masked_account_number_last4": "XXXXXX9999", "bank": { "code": "XXXXX0001 }, "system": mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group, "sales": count": 5, "amount": "12600, "refunds": count": 0, "amount": ", "discounts": count": 0, "amount": ", "tax": count": 0, "amount": ", "disputes": chargebacks": { "count": 0, "amount": ", "reversals": count": 0, "amount": " }, "fees": amount": " }, id": "DEP_2342423426", "time_created": "2021-03-07", "status": "DELAYED", "funding_type": "CREDIT", "amount": "12700", "currency": "", "aggregation_model": "4-No Summary", "bank_transfer": { "masked_account_number_last4": "XXXXXX9999", "bank": { "code": "XXXXX0001 }, "system": mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group, "sales": count": 5, "amount": "12700, "refunds": count": 0, "amount": ", "discounts": count": 0, "amount": ", "tax": count": 0, "amount": ", "disputes": chargebacks": { "count": 0, "amount": ", "reversals": count": 0, "amount": " }, "fees": amount": " }, id": "DEP_2342423427", "time_created": "2021-03-07", "status": "DELAYED", "funding_type": "CREDIT", "amount": "12800", "currency": "", "aggregation_model": "F-No Summary", "bank_transfer": { "masked_account_number_last4": "XXXXXX9999", "bank": { "code": "XXXXX0001 }, "system": mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group, "sales": count": 5, "amount": "12800, "refunds": count": 0, "amount": ", "discounts": count": 0, "amount": ", "tax": count": 0, "amount": ", "disputes": chargebacks": { "count": 0, "amount": ", "reversals": count": 0, "amount": " }, "fees": amount": " } ], "action": id": "ACT_xUhHvNxUHbT0b2ZdJnDVYThxDkbX1w", "type": "DEPOSIT_LIST", "time_created": "2021-03-10T15:21:42.749Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app } ``` ## Step 2: Get a list of deposit transactions Now that we have our deposit ID, we can call the transaction’s endpoint to pull the data of each individual sale or refund that makes up the deposit. It can also include disputes, which we cover in Step 3. The status of the transactions can be either funded or rejected. To search for a particular transaction in a deposit (or a particular timeframe), add the following data points to your request: * First six or last four digits of the card number used * Card brand (such as Visa or Mastercard) * Acquirer reference number (ARN) * Authorization code or unique merchant reference #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/settlement/transactions?account_name=Settlement%20Reporting&page_size=2&order_by=TIME_CREATED&order=DESC&deposit_id=DEP_2342423427' \ --header 'X-Gp-Version: 2021-03-22' \ --header 'Accept: application/json' \ --header 'Accept-Encoding: gzip' \ --header 'Authorization: Bearer 8iZjQyEQeriGfqtA1V5wVDagEMAI' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); try { PagedResult response = ReportingService.findSettlementTransactionsPaged(1, 15) .orderBy(DepositSortProperty.TimeCreated, SortDirection.Descending) .where(DataServiceCriteria.DepositReference, "DEP_2342423427") .execute(); // API raw response key "total_record_count" int totalRecordCount = response.getTotalRecordCount(); List trnList = response.getResults(); TransactionSummary transaction = trnList.get(0); // API raw response "transactions[0]->id" String id = transaction.getTransactionId(); // API raw response "transactions[0]->type" String type = transaction.getTransactionType(); // API raw response "transactions[0]->status" String status = transaction.getTransactionStatus(); // API raw response "transactions[0]->time_created" DateTime transactionDate = transaction.getTransactionDate(); // API raw response "transactions[0]->amount" BigDecimal amount = transaction.getAmount(); // API raw response "transactions[0]->currency" String currency = transaction.getCurrency(); // API raw response "transactions[0]->cashback_amount" BigDecimal cashBackAmount = transaction.getCashBackAmount(); // API raw response "transactions[0]->discount_amount" BigDecimal gratuityAmount = transaction.getGratuityAmount(); // API raw response "transactions[0]->tax_amount" BigDecimal taxAmount = transaction.getTaxAmount(); // API raw response "transactions[0]->reference" String reference = transaction.getReferenceNumber(); // API raw response "transactions[0]->time_created_reference" DateTime timeCreatedReference = transaction.getTransactionLocalDate(); // API raw response "transactions[0]->deposit_id" String depositId = transaction.getDepositReference(); // API raw response "transactions[0]->deposit_time_created" Date depositDate = transaction.getDepositDate(); // API raw response "transactions[0]->deposit_amount" BigDecimal depositAmount = transaction.getDepositAmount(); // API raw response "transactions[0]->batch_id" String batchId = transaction.getBatchId(); // API raw response "transactions[0]->batch_time_created" DateTime batchCloseDate = transaction.getBatchCloseDate(); // API raw response "transactions[0]->payment_method->card->brand" String cardType = transaction.getCardType(); // API raw response "transactions[0]->payment_method->card->brand_reference" String brandReference = transaction.getBrandReference(); // API raw response "transactions[0]->payment_method->card->authcode" String authCode = transaction.getAuthCode(); // API raw response "transactions[0]->payment_method->card->arn" String arn = transaction.getAcquirerReferenceNumber(); // API raw response "transactions[0]->order->reference" String orderId = transaction.getOrderId(); // API raw response "transactions[0]->system->mid" String mid = transaction.getMerchantId(); // API raw response "transactions[0]->system->hierarchy" String merchantHierarchy = transaction.getMerchantHierarchy(); // API raw response "transactions[0]->system->name" String systemName = transaction.getMerchantName(); // API raw response "transactions[0]->system->dba" String dba = transaction.getMerchantDbaName(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); try { PagedResult result = ReportingService.FindSettlementTransactionsPaged(1, 15) .OrderBy(TransactionSortProperty.TimeCreated, SortDirection.Descending) .Where(DataServiceCriteria.DepositReference, "DEP_2342423427") .Execute(); // API raw response key "total_record_count" var totalRecordCount = result.TotalRecordCount; var trnList = result.Results; TransactionSummary transaction = trnList.First(); //API raw response "transactions[0]->id" var id = transaction.TransactionId; //API raw response "transactions[0]->type" var type = transaction.TransactionType; //API raw response "transactions[0]->status" var status = transaction.TransactionStatus; //API raw response "transactions[0]->time_created" var transactionDate = transaction.TransactionDate; //API raw response "transactions[0]->amount" var amount = transaction.Amount; //API raw response "transactions[0]->currency" var currency = transaction.Currency; //API raw response "transactions[0]->cashback_amount" var cashBackAmount = transaction.CashBackAmount; //API raw response "transactions[0]->discount_amount" var gratuityAmount = transaction.GratuityAmount; //API raw response "transactions[0]->tax_amount" var taxAmount = transaction.TaxAmount; //API raw response "transactions[0]->reference" var reference = transaction.ReferenceNumber; //API raw response "transactions[0]->time_created_reference" var timeCreatedReference = transaction.TransactionLocalDate; //API raw response "transactions[0]->deposit_id" var depositId = transaction.DepositReference; //API raw response "transactions[0]->deposit_time_created" var depositDate = transaction.DepositDate; //API raw response "transactions[0]->deposit_amount" var depositAmount = transaction.DepositAmount; //API raw response "transactions[0]->batch_id" var batchId = transaction.BatchId; //API raw response "transactions[0]->batch_time_created" var batchCloseDate = transaction.BatchCloseDate; //API raw response "transactions[0]->payment_method->card->brand" var cardType = transaction.CardType; //API raw response "transactions[0]->payment_method->card->brand_reference" var brandReference = transaction.BrandReference; //API raw response "transactions[0]->payment_method->card->authcode" var authCode = transaction.AuthCode; //API raw response "transactions[0]->payment_method->card->arn" var arn = transaction.AquirerReferenceNumber; //API raw response "transactions[0]->order->reference" var orderId = transaction.OrderId; //API raw response "transactions[0]->system->mid" var mid = transaction.MerchantId; //API raw response "transactions[0]->system->hierarchy" var merchantHierarchy = transaction.MerchantHierarchy; //API raw response "transactions[0]->system->name" var systemName = transaction.MerchantName; //API raw response "transactions[0]->system->dba" var dba = transaction.MerchantDbaName; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); try { /** @var \GlobalPayments\Api\Entities\GpApi\PagedResult $response */ $response = ReportingService::findSettlementTransactionsPaged(1, 15) ->orderBy(TransactionSortProperty::TIME_CREATED, SortDirection::DESC) ->where(SearchCriteria::DEPOSIT_ID, 'DEP_2342423427') ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $trnList = $response->result; /** @var \GlobalPayments\Api\Entities\Reporting\TransactionSummary $transaction */ $transaction = reset($trnList); // "transactions[0]->id" $id = $transaction->transactionId; // "transactions[0]->type" $type = $transaction->transactionType; // "transactions[0]->status" $transactionStatus = $transaction->transactionStatus; // "transactions[0]->time_created" $transactionDate = $transaction->transactionDate; // "transactions[0]->amount" $amount = $transaction->amount; // "transactions[0]->currency" $currency = $transaction->currency; // "transactions[0]->cashback_amount" $cashBackAmount = $transaction->cashBackAmount; // "transactions[0]->merchant_amount" $merchantAmount = $transaction->merchantAmount; // "transactions[0]->merchant_currency" $merchantCurrency = $transaction->merchantCurrency; // "transactions[0]->discount_amount" $gratuityAmount = $transaction->gratuityAmount; // "transactions[0]->tax_amount" $taxAmount = $transaction->taxAmount; // "transactions[0]->reference" $referenceNumber = $transaction->referenceNumber; // "transactions[0]->time_created_reference" $timeCreatedReference = $transaction->transactionLocalDate; // "transactions[0]->deposit_id" $depositId = $transaction->depositReference; // "transactions[0]->deposit_time_created" $depositTimeCreated = $transaction->depositTimeCreated; // "transactions[0]->deposit_status" $depositStatus = $transaction->depositStatus; // "transactions[0]->deposit_amount" $depositAmount = $transaction->settlementAmount; // "transactions[0]->batch_id" $batchId = $transaction->batchSequenceNumber; // "transactions[0]->batch_time_created" $batchCloseDate = $transaction->batchCloseDate; // "transactions[0]->payment_method->entry_mode" $entryMode = $transaction->entryMode; // "transactions[0]->payment_method->card->brand" $cardType = $transaction->cardDetails->brand; // "transactions[0]->payment_method->card->brand_reference" $brandReference = $transaction->cardDetails->brandReference; // "transactions[0]->payment_method->card->authcode" $authcode = $transaction->authCode; // "transactions[0]->payment_method->card->arn" $arn = $transaction->aquirerReferenceNumber; // "transactions[0]->order->reference" $orderId = $transaction->orderId; // "transactions[0]->system->mid" $mid = $transaction->merchantId; // "transactions[0]->system->hierarchy" $systemHierarchy = $transaction->merchantHierarchy; // "transactions[0]->system->name" $systemName = $transaction->merchantName; // "transactions[0]->system->dba" $dba = $transaction->merchantDbaName; ``` ### Deposit transactions response For each of the deposit’s transactions, the response data contains funding status, time created, time batched, and the payment method the customer used. Also returned is the transaction’s unique merchant and acquirer references, which you can use to programatically reconcile the sales and refunds from your ecommerce or point-of-sale solutions with the transactions funded into your bank account. #### Sample response ```json total_record_count": 5, "current_page_size": 2, "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "DAA_5763583e72ca4181bee088a25482bf06", "account_name": "Settlement Reporting", "filter": { "from_deposit_time_created": "2024-01-08", "to_deposit_time_created": "2024-01-10", "deposit_id": "DEP_2342423427, "paging": page_size": 2, "page": 1, "order": "DESC", "order_by": "TIME_CREATED, "transactions": [ time_created": "2021-03-05T15:31:56", "status": "FUNDED", "type": "SALE", "amount": "2500", "currency": "USD", "cashback_amount": "", "merchant_amount": "2500", "merchant_currency": "USD", "discount_amount": "", "merchant_discount_amount": "", "tax_in_merchant_amount": true, "tax_amount": "", "merchant_tax_amount": "", "reference": "28012076eb6M", "time_created_reference": "2021-03-05T17:31:56", "deposit_id": "DEP_2342423427", "deposit_time_created": "2021-03-07", "deposit_status": "DELAYED", "batch_id": "", "batch_time_created": "2021-03-06T15:31:56.508Z", "payment_method": { "entry_mode": "MOTO", "card": { "brand": "AMEX", "authcode": "129623", "brand_reference": "MWE1P0JG80110", "masked_number_first6last4": "379132XXXXX1007", "arn": "71400011203688701393903 }, "system": mid": "101023947262", "tid": "", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group }, time_created": "2021-03-05T15:31:56", "status": "FUNDED", "type": "SALE", "amount": "2620", "currency": "USD", "cashback_amount": "", "merchant_amount": "2620", "merchant_currency": "USD", "discount_amount": "", "merchant_discount_amount": "", "tax_in_merchant_amount": true, "tax_amount": "", "merchant_tax_amount": "", "reference": "280120767b6M", "time_created_reference": "2021-03-05T17:31:56", "deposit_id": "DEP_2342423427", "deposit_time_created": "2021-03-07", "deposit_status": "DELAYED", "batch_id": "", "batch_time_created": "2021-03-06T15:31:56.576Z", "payment_method": { "entry_mode": "CP", "card": { "brand": "VISA", "authcode": "10557", "brand_reference": "MDJ1Q6CG80110", "masked_number_first6last4": "419132XXXXXX1007", "arn": "71406011129179730359011 }, "system": mid": "101023947262", "tid": "", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD.", "dba": "XYZ Group } ], "action": id": "ACT_LIFYysI3OtcaS0CrbJeUOHdkrxI5cN", "type": "TRANSACTION_LIST", "time_created": "2021-03-10T15:31:56.642Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app } ``` ## Step 3: Get a list of deposit disputes Our final step is to pull the list of disputes that make up the deposit. To do this, we call the Disputes endpoint using the deposit ID. #### Sample request ```json curl --location --request GET 'https://apis.sandbox.globalpay.com/ucp/settlement/disputes?from_deposit_time_created=2024-01-01&account_name=Settlement%20Reporting' \ --header 'Authorization: Bearer 8iZjQyEQeriGfqtA1V5wVDagEMAI' \ --header 'X-GP-Version: 2023-01-22' ``` ```java GpApiConfig config = new GpApiConfig(); config.setAppId("AppId"); config.setAppKey("AppKey"); config.setChannel(Channel.CardNotPresent); config.setEnvironment(Environment.TEST); ServicesContainer.configureService(config); Date startDate = DateTime.now().minusYears(1).toDate(); try { DisputeSummaryPaged response = ReportingService.findSettlementDisputesPaged(1, 10) .where(DataServiceCriteria.StartDepositDate, startDate) .execute(); List disputeList = response.getResults(); val dispute = disputeList.get(0); // API raw response disputes[0]->id String disputeId = dispute.getCaseId(); // API raw response disputes[0]->status String status = dispute.getCaseStatus(); // API raw response disputes[0]->stage_time_created DateTime stageTime = dispute.getCaseStageTime(); // API raw response disputes[0]->stage String stage = dispute.getCaseStage(); // API raw response disputes[0]->amount BigDecimal amount = dispute.getCaseAmount(); // API raw response disputes[0]->currency String currency = dispute.getCaseCurrency(); // API raw response disputes[0]->reason_code String reasonCode = dispute.getReasonCode(); // API raw response disputes[0]->reason_description String reason = dispute.getReason(); // API raw response disputes[0]->time_to_respond_by DateTime respondByDate = dispute.getRespondByDate(); // API raw response disputes[0]->result String result = dispute.getResult(); // API raw response disputes[0]->deposit_time_created Date depositDate = dispute.getDepositDate(); // API raw response disputes[0]->deposit_id String depositId = dispute.getDepositReference(); // API raw response disputes[0]->last_adjustment_amount BigDecimal lastAdjustmentAmount = dispute.getLastAdjustmentAmount(); // API raw response disputes[0]->last_adjustment_currency String lastAdjustmentCurrency = dispute.getLastAdjustmentCurrency(); // API raw response disputes[0]->last_adjustment_funding String lastAdjustmentFunding = dispute.getLastAdjustmentFunding(); // API raw response disputes[0]->system->mid String mid = dispute.getCaseMerchantId(); // API raw response disputes[0]->system->hierarchy String merchantHierarchy = dispute.getMerchantHierarchy(); // API raw response disputes[0]->system->name String systemName = dispute.getMerchantName(); // API raw response disputes[0]->transaction->time_created DateTime transactionTime = dispute.getTransactionTime(); // API raw response disputes[0]->transaction->type String transactionType = dispute.getTransactionType(); // API raw response disputes[0]->transaction->amount BigDecimal transactionAmount = dispute.getTransactionAmount(); // API raw response disputes[0]->transaction->currency String transactionCurrency = dispute.getTransactionCurrency(); // API raw response disputes[0]->transaction->reference String transactionReference = dispute.getTransactionReferenceNumber(); // API raw response disputes[0]->transaction->payment_method->card->masked_number_first6last4 String transactionMaskedCardNumber = dispute.getTransactionMaskedCardNumber(); // API raw response disputes[0]->transaction->payment_method->card->arn String transactionArn = dispute.getTransactionARN(); // API raw response disputes[0]->transaction->payment_method->card->brand_reference String transactionBrandReference = dispute.getTransactionBrandReference(); // API raw response disputes[0]->transaction->payment_method->card->authcode String transactionAuthCode = dispute.getTransactionAuthCode(); // API raw response disputes[0]->transaction->payment_method->card->brand String transactionCardType = dispute.getTransactionCardType(); } catch (ApiException e) { // TODO: Add your exception handling here } ``` ```dotnet var config = new GpApiConfig(); config.AppId = "AppId"; config.AppKey = "AppKey"; config.Channel = Channel.CardNotPresent; config.Environment = Entities.Environment.TEST; ServicesContainer.ConfigureService(config); DateTime StartDate = DateTime.UtcNow.AddYears(-1); try { PagedResult response = ReportingService.FindSettlementDisputesPaged(1, 10) .Where(DataServiceCriteria.StartDepositDate, StartDate) .Execute(); var disputeList = response.Results; DisputeSummary dispute = disputeList.First(); // API raw response disputes[0]->id var disputeId = dispute.CaseId; // API raw response disputes[0]->status var status = dispute.CaseStatus; // API raw response disputes[0]->stage_time_created var stageTime = dispute.CaseStageTime; // API raw response disputes[0]->stage var stage = dispute.CaseStage; // API raw response disputes[0]->amount var amount = dispute.CaseAmount; // API raw response disputes[0]->currency var currency = dispute.CaseCurrency; // API raw response disputes[0]->reason_code var reasonCode = dispute.ReasonCode; // API raw response disputes[0]->reason_description var reason = dispute.Reason; // API raw response disputes[0]->time_to_respond_by var respondByDate = dispute.RespondByDate; // API raw response disputes[0]->result var result = dispute.Result; // API raw response disputes[0]->deposit_time_created var depositDate = dispute.DepositDate; // API raw response disputes[0]->deposit_id var depositId = dispute.DepositReference; // API raw response disputes[0]->last_adjustment_amount var lastAdjustmentAmount = dispute.LastAdjustmentAmount; // API raw response disputes[0]->last_adjustment_currency var lastAdjustmentCurrency = dispute.LastAdjustmentCurrency; // API raw response disputes[0]->last_adjustment_funding var lastAdjustmentFunding = dispute.LastAdjustmentFunding; // API raw response disputes[0]->system->mid var mid = dispute.CaseMerchantId; // API raw response disputes[0]->system->hierarchy var merchantHierarchy = dispute.MerchantHierarchy; // API raw response disputes[0]->system->name var systemName = dispute.MerchantName; // API raw response disputes[0]->transaction->time_created var transactionTime = dispute.TransactionTime; // API raw response disputes[0]->transaction->type var transactionType = dispute.TransactionType; // API raw response disputes[0]->transaction->amount var transactionAmount = dispute.TransactionAmount; // API raw response disputes[0]->transaction->currency var transactionCurrency = dispute.TransactionCurrency; // API raw response disputes[0]->transaction->reference var transactionReference = dispute.TransactionReferenceNumber; // API raw response disputes[0]->transaction->payment_method->card->masked_number_first6last4 var transactionMaskedCardNumber = dispute.TransactionMaskedCardNumber; // API raw response disputes[0]->transaction->payment_method->card->arn var transactionArn = dispute.TransactionARN; // API raw response disputes[0]->transaction->payment_method->card->brand_reference var transactionBrandReference = dispute.TransactionBrandReference; // API raw response disputes[0]->transaction->payment_method->card->authcode var transactionAuthCode = dispute.TransactionAuthCode; // API raw response disputes[0]->transaction->payment_method->card->brand var transactionCardType = dispute.TransactionCardType; } catch (GatewayException e) { Console.WriteLine(e); throw; } ``` ```php /* Config set at the start of your integration. Not required each time a method is called from the SDK */ $config = new GpApiConfig(); $config->appId = 'appId'; $config->appKey = 'appKey'; $config->channel = Channel::CardNotPresent; $config->environment = Environment::TEST; $config->requestLogger = new SampleRequestLogger(new Logger("logs")); ServicesContainer::configureService($config); // End of config $startDate = (new DateTime('2024-01-01'))->setTime(0, 0, 0); try { /** @var \GlobalPayments\Api\Entities\GpApi\PagedResult $response */ $response = ReportingService::findSettlementDisputesPaged(1, 10) ->where(DataServiceCriteria::START_DEPOSIT_DATE, $startDate) ->execute(); } catch (GatewayException $ex) { echo $ex->getMessage(); exit(); // TODO: Add your exception handling here } $disputeList = $response->result; /** @var \GlobalPayments\Api\Entities\Reporting\DisputeSummary $dispute */ $dispute = reset($disputeList); $disputeId = $dispute->caseId; // API raw response disputes[0]->id $status = $dispute->caseStatus; // API raw response disputes[0]->status $stageTime = $dispute->disputeStageTime; // API raw response "disputes[0]->stage_time_created" $stage = $dispute->caseStage; // API raw response "disputes[0]->stage" $amount = $dispute->caseAmount; // API raw response "disputes[0]->amount" $currency = $dispute->caseCurrency; //API raw response "disputes[0]->currency" $reasonCode = $dispute->reasonCode; // API raw response "disputes[0]->reason_code" $reason = $dispute->reason; // API raw response "disputes[0]->reason_description" $respondByDate = $dispute->respondByDate; // API raw response "disputes[0]->time_to_respond_by" $result = $dispute->result;// API raw response "disputes[0]->result" $fundingType = $dispute->fundingType; // API raw response "disputes[0]->funding_type" $depositDate = $dispute->depositDate; // API raw response "disputes[0]->deposit_time_created" $depositId = $dispute->depositReference;// API raw response "disputes[0]->deposit_id" // API raw response "disputes[0]->last_adjustment_amount" $lastAdjustmentAmount = $dispute->lastAdjustmentAmount; // API raw response "disputes[0]->last_adjustment_currency" $lastAdjustmentCurrency = $dispute->lastAdjustmentCurrency; // API raw response "disputes[0]->last_adjustment_funding" $lastAdjustmentFunding = $dispute->lastAdjustmentFunding; // API raw response "disputes[0]->last_adjustment_time_created" $lastAdjustmentTimeCreated = $dispute->lastAdjustmentTimeCreated; $mid = $dispute->caseMerchantId; // API raw response "disputes[0]->system->mid" $merchantName = $dispute->merchantName; // API raw response "disputes[0]->system->name" $hierarchy = $dispute->merchantHierarchy; // API raw response "disputes[0]->system->hierarchy" // API raw response "disputes[0]->transaction->time_created" $transactionTime = $dispute->transactionTime; // API raw response "disputes[0]->transaction->type" $transactionType = $dispute->transactionType; // API raw response "disputes[0]->transaction->amount" $transactionAmount = $dispute->transactionAmount; // API raw response "disputes[0]->transaction->currency" $transactionCurrency = $dispute->transactionCurrency; // API raw response "disputes[0]->transaction->reference" $transactionReferenceNumber = $dispute->transactionReferenceNumber; // API raw response "disputes[0]->transaction->payment_method->card->masked_number_first6last4" $transactionMaskedCardNumber = $dispute->transactionMaskedCardNumber; // API raw response "disputes[0]->transaction->payment_method->card->arn" $transactionARN = $dispute->transactionARN; // API raw response "disputes[0]->transaction->payment_method->card->brand_reference" $transactionBrandReference = $dispute->transactionBrandReference; // API raw response "disputes[0]->transaction->payment_method->card->authcode" $transactionAuthCode = $dispute->transactionAuthCode; // API raw response "disputes[0]->transaction->payment_method->card->brand" $transactionCardType = $dispute->transactionCardType; ``` ### Deposit disputes response For each of the deposit’s disputes, the response data contains the reason, date created, and the last adjustment, which indicates whether the funds were debited or credited to your account. You also receive data on the dispute’s status and what stage of the process it’s in. For more information on disputes, see [Disputes Management](https://developer.globalpayments.com/docs/operations/disputes-management-overview.md). ```json current_page_size": 5, "merchant_id": "MER_c4c0df11039c48a9b63701adeaa296c3", "merchant_name": "Sandbox_merchant_2", "account_id": "DAA_5763583e72ca4181bee088a25482bf06", "account_name": "Settlement Reporting", "filter": { "status": "FUNDED", "from_deposit_time_created": "2024-01-01", "to_deposit_time_created": "2024-03-10, "paging": page_size": 5, "page": 1, "order": "ASC", "order_by": "FROM_STAGE_TIME_CREATED, "disputes": [ id": "DIS_792", "status": "FUNDED", "stage": "CHARGEBACK", "stage_time_created": "2021-03-03T15:41:33", "amount": "200", "currency": "PHP", "reason_code": "53", "reason_description": "Not As Described/Defective Merchandise", "time_to_respond_by": "2021-03-20T15:41:33", "result": "LOST", "funding_type": "DEBIT", "deposit_time_created": "2021-03-07", "deposit_id": "DEP_2342423443", "last_adjustment_amount": "", "last_adjustment_currency": "", "last_adjustment_funding": "", "last_adjustment_time_created": "", "system": { "mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD., "transaction": time_created": "2021-02-08T15:41:33", "merchant_time_created": "2021-02-08T17:41:33", "type": "SALE", "amount": "200", "currency": "PHP", "reference": "28012075cffM", "payment_method": { "card": { "masked_number_first6last4": "516075XXXXXX4234", "arn": "74500010037624410827759", "brand": "MASTERCARD", "authcode": "28010", "brand_reference": "130 } } }, id": "DIS_793", "status": "FUNDED", "stage": "REVERSAL", "stage_time_created": "2021-03-03T15:41:33", "amount": "200", "currency": "PHP", "reason_code": "77", "reason_description": "Non-Matching Account Number", "time_to_respond_by": "2021-03-20T15:41:33", "result": "WON", "funding_type": "CREDIT", "deposit_time_created": "2021-03-07", "deposit_id": "DEP_2342423443", "last_adjustment_amount": "", "last_adjustment_currency": "", "last_adjustment_funding": "", "last_adjustment_time_created": "", "system": { "mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD., "transaction": time_created": "2021-02-08T15:41:33", "merchant_time_created": "2021-02-08T17:41:33", "type": "SALE", "amount": "200", "currency": "PHP", "reference": "28012076405M", "payment_method": { "card": { "masked_number_first6last4": "543458XXXXXX7652", "arn": "55504430037039389318875", "brand": "MASTERCARD", "authcode": "28656", "brand_reference": "MCF1CZ5ME5405 } } }, id": "DIS_794", "status": "FUNDED", "stage": "REVERSAL", "stage_time_created": "2021-03-03T15:41:33", "amount": "200", "currency": "PHP", "reason_code": "81", "reason_description": "Fraudulent Transaction-Card-Present Environment", "time_to_respond_by": "2021-03-20T15:41:33", "result": "WON", "funding_type": "CREIT", "deposit_time_created": "2021-03-07", "deposit_id": "DEP_2342423443", "last_adjustment_amount": "", "last_adjustment_currency": "", "last_adjustment_funding": "", "last_adjustment_time_created": "", "system": { "mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD., "transaction": time_created": "2021-02-08T15:41:33", "merchant_time_created": "2021-02-08T17:41:33", "type": "SALE", "amount": "200", "currency": "PHP", "reference": "28012076eb6M", "payment_method": { "card": { "masked_number_first6last4": "414720XXXXXX9274", "arn": "55181360037672410181238", "brand": "VISA", "authcode": "8481", "brand_reference": "MCS18V1EG3201 } } }, id": "DIS_795", "status": "FUNDED", "stage": "CHARGEBACK", "stage_time_created": "2021-03-03T15:41:33", "amount": "200", "currency": "PHP", "reason_code": "62", "reason_description": "Counterfeit Transaction", "time_to_respond_by": "2021-03-20T15:41:33", "result": "LOST", "funding_type": "DEBIT", "deposit_time_created": "2021-03-07", "deposit_id": "DEP_2342423443", "last_adjustment_amount": "", "last_adjustment_currency": "", "last_adjustment_funding": "", "last_adjustment_time_created": "", "system": { "mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD., "transaction": time_created": "2021-02-08T15:41:33", "merchant_time_created": "2021-02-08T17:41:33", "type": "SALE", "amount": "200", "currency": "PHP", "reference": "280120767b6M", "payment_method": { "card": { "masked_number_first6last4": "414720XXXXXX3564", "arn": "24137550037630153798573", "brand": "VISA", "authcode": "05075A", "brand_reference": "MCW1A7LHA1320 } } }, id": "DIS_796", "status": "FUNDED", "stage": "REVERSAL", "stage_time_created": "2021-03-03T15:41:33", "amount": "200", "currency": "PHP", "reason_code": "A02", "reason_description": "No Valid Authorization", "time_to_respond_by": "2021-03-20T15:41:33", "result": "WON", "funding_type": "CREDIT", "deposit_time_created": "2021-03-07", "deposit_id": "DEP_2342423443", "last_adjustment_amount": "", "last_adjustment_currency": "", "last_adjustment_funding": "", "last_adjustment_time_created": "", "system": { "mid": "101023947262", "hierarchy": "055-70-024-011-019", "name": "XYZ LTD., "transaction": time_created": "2021-02-08T15:41:33", "merchant_time_created": "2021-02-08T17:41:33", "type": "SALE", "amount": "200", "currency": "PHP", "reference": "2801207a017M", "payment_method": { "card": { "masked_number_first6last4": "452088XXXXXX7639", "arn": "24388940037630154188364", "brand": "VISA", "authcode": "00375J", "brand_reference": "MCSUYX1FY1977 } } } ], "action": id": "ACT_Xo6RjwmmPwO12wA1cRUr5hqV1SnA2k", "type": "DISPUTE_LIST", "time_created": "2021-03-10T15:41:33.961Z", "result_code": "SUCCESS", "app_id": "i9R0byBBor6RqTQNj3g4MuVBwH5rd7yR", "app_name": "demo_app } ``` ## Testing Our Settlement Reporting solution is available for testing in our free Sandbox environment for registered users of this developer portal. Use our resources below to start testing. ### [Test Cards](https://developer.globalpayments.com/resources/test-cards.md) Test different transaction outcomes with simulated cards or banks. ### [Postman Collection](https://developer.globalpayments.com/api/postman-collection/overview.md) View, import, or fork our API collection in Postman. ### [Responses](https://developer.globalpayments.com/resources/responses.md) View successful responses, HTTP status codes, action response data, and errors. ## Integration references To get a deeper understanding of Settlement Reporting, we recommend that you use our provided integration references for both API and SDK integrations. For the full detailed API specification, see the [API Explorer](https://developer.globalpayments.com/api/overview.md). ### [API Settlement Reporting](https://developer.globalpayments.com/api/825) API Guide to using the Settlement Reporting Functionality. ### [Manage Payments](https://developer.globalpayments.com/docs/payments/manage-payments/overview) Explore all of the payment actions that are available for our API. ### [SDKs & Libraries](https://developer.globalpayments.com/docs/integration-options/sdk/overview) Add server-side or client-side code to your integration. ### [Quickstart Demo](https://demo.globalpay.com/merchants/insights-and-reporting/settlement-reports) Demo how easy it is to integrate our customizable solutions into your existing payment experience, and view transactions from multiple channels and regions in one place. ## Enhance your integration Below are value-added services you can enable for Real-Time Data Reporting. ### [Real-Time Data Reporting](https://developer.globalpayments.com/docs/reporting/real-time-reporting-guide.md) Simplify reconciliation and get customized daily deposit data. ### [Disputes Management](https://developer.globalpayments.com/docs/operations/disputes-management-overview.md) Automate the reporting and management of transaction disputes. ### [File Processing](https://developer.globalpayments.com/docs/operations/file-processing-overview.md) Process large volumes of transactions in one file. ``` # Access Tokens Source: https://developer.globalpayments.com/api/definitions/access-tokens.md Section: API References Description: Learn how to generate a single-use key to start making API requests An access token is a unique, single-use key used to access API actions for a limited time. Allowable actions are based on what capabilities were assigned to you during onboarding. An access token must be used in every request to create, edit, or read resources. So, before you can send a transaction, for example, you first need to create one to access our API. This guide focuses on how to create an access token, including obtaining your app credentials, creating a random nonce value, calculating a secret key, calling the endpoint, and then receiving a response. You’ll also find information on how an access token differs from other [token types](#token-types). ## Token types An access token is used only for authentication. It is sometimes mistaken for a payment token, which is another type of token used to substitute sensitive card data in a transaction. A card token can be either _single-use_ or _multi-use_, but there is only one type of access token. However, there are some functional differences for an access token: * Duration – Limits how long it is valid for (timeout value) * Permissions – Restricts the functionality (required for hosted integrations) For more information, see [Access Token](https://www.postman.com/globalproduct-api/workspace/gp-api-public-workspace/request/12989945-85e01624-21db-4ad2-bdcf-fc32363b991a?action=share&creator=29539958&ctx=documentation) in our Postman public workspace. ## Prerequisites Before starting the steps in this guide, you must do the following: * [Get registered](https://developer.globalpayments.com/docs/getting-started/register.md) * [Create an app (generate keys)](https://developer.globalpayments.com/docs/getting-started/register.md#create-an-app-generate-keys) ## Step 1: Obtain your app credentials Your app credentials are the `app_id` and `app_key`. Your app credentials for testing in Sandbox are located on your account (to learn how to create them, see our [Register / Create an App](https://developer.globalpayments.com/docs/getting-started/register.md)). For Production credentials, check with your account manager. For example: ```JSON app_id = "MN500Q8lk5jp0rEmB5LGvTo27gdQgZln" app_key = "QtOSeNmh3DY6AuMO" ``` > App credentials (App ID and App Key) are specific to merchants and should never be shared with any unauthorized person. ## Step 2: Create a random nonce value A random nonce is a unique string used to calculate the secret key (see the next step). The value must be unique. Typically, a timestamp is used because the time changes every time an access token is run, making it a unique value. For example: ```JSON nonce="2029-03-14T13:24:10.832Z" ``` ## Step 3: Calculate the secret key For security reasons, you should never send your `app_key` in a request. That’s why we use encryption to make it secret. The secret key consists of a SHA512 hash of the nonce concatenated with the `app_key`. For example: ```JSON // secret = SHA512(nonce + app_key) secret = SHA512(2029-03-14T13:24:10.832ZQtOSeNmh3DY6AuMO) ``` ## Step 4: Call the endpoint Now it’s time to send the values from the previous steps to the Access Token endpoint. > Never send the app key in a request. Always store it securely. #### Sample request ```JSON curl -v -X POST https://apis.globalpay.com/ucp/accesstoken -H "Content-type: application/json" -H "X-GP-Version: 2021-03-22" -d ' { app_id="" nonce="", secret="", grant_type="client_credentials" } ' ``` ## Step 5: Receive a response After receiving the token response and its permission, you can now use it in the Authorization header field in subsequent API requests. #### Sample response ```JSON { "token": "qdYUdzfZfigqTppQOHVwrbJwLlNd", “Type”: “Bearer”, "scope": { "merchant_id": "MER_8cc2638c8a14453fa98e08ad51511a1a", "merchant_name": "GPQA_IPP_CERT", "accounts": [ { "id": "TRA_34b9806b35bd4012bd23206a00abc1a1", "name": "GP API", "permissions": [ "BAT_PUT_Close", "TRN_POST_Adjustment", "TRN_POST_Authorize", "TRN_POST_Capture", "TRN_POST_Force", "TRN_POST_Initiate", "TRN_POST_Reauthorize", "TRN_POST_Refund", "TRN_POST_Refund_Standalone", "TRN_POST_Reverse", "TRN_POST_Verify" ] } ] }, "app_id": "MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "My app name", "date_created": "2019-03-20T10:42:23.527Z", "seconds_to_expire": "86399", "email": "dev.mcdev@example.com" } ``` ## Troubleshooting After receiving an access token, you may encounter some errors when trying to pass it in a request. The two most common error messages are: * Invalid Access Token – This most often occurs when a token request is rejected, but your website or application attempts a transaction anyway. * Access Token Expired – This occurs if a token is used after its timeout value has passed (`interval_to_expire` or `seconds_to_expire fields`). If you’re having issues passing a token, verify the following: 1) Are the `app_id` and `app_key` you’re using correct? 2) Was the secret key calculated correctly and properly entered in the field? 3) Are other mandatory fields you included in the request correct (for example, `grant_type`)? 4) Do you have the right account permissions for your request? If you’re not sure, check with your account manager. # Account Capabilities Source: https://developer.globalpayments.com/api/definitions/account-capabilities.md Section: API References Description: Learn what capabilities you can add to your account with us > The availability of capabilities depends on your region. The following table describes the capabilities we offer merchants and partners when they sign up with us. | Account Capability | ID Prefix | Description | | --- | --- | --- | | Data Services | DAA | Ability to retrieve all deposits, transactions, disputes, and fees that affect a merchant's bank account(s). Account(s): **data\_services** **settlement\_reporting** See: [Settlement Reporting](/docs/reporting/settlement-reporting-overview "Settlement Reporting") | | Dispute Management | DIA | Ability to retrieve dispute information across the full lifecycle, including chargebacks, reversals, and retrieval requests that were processed by us. Account(s): **dispute\_management** See: [Disputes Management](/docs/operations/disputes-management-overview "Disputes Management") | | File Processing | FPA | Ability for merchants or partners to bulk-upload files with large volumes of transactions. Account(s): **file\_processing** See: [File Processing](/docs/operations/file-processing-overview "File Processing Overview") | | Fund Management | FMA | (Partner Solution) Ability to move funds from a merchant’s Funds Management Account (FMA) within our system to their business bank account or debit card. Account(s): **fund\_management** See: [Funds Management](/docs/partners-funds-mgt "Funds Management") | | Merchant Management | MMA | (Partner Solution) Ability to create and manage merchants, from handling the initial validation process to maintaining a merchant’s account data after onboarding. Account(s): **my\_merchants** See: [Merchant Creation and Management](/docs/partners/merchant-mgt "Merchant Creation and Management") | | Risk Assessment | RAA | Ability to assess the degree of risk in proceeding with a course of action with regard to a transaction in progress. Account(s): **risk\_assessment** **EOS\_RiskAssessment** See: [Fraud Filter](/docs/fraud-filter "Fraud Filter"), [Decision Manager](/docs/decision-manager#api "Decision Manager"), [Exemption Optimization Service](/ecommerce/exemptions/eos#api "Exemption Optimization Service") | | Transaction Processing | TRA | Ability to create and manage transactions. This includes authorizing, capturing, reversing, and adjusting card and non-card transactions. It also includes related activities such as Dynamic Currency Conversion (DCC), 3D Secure (3DS), and batch closing. Account(s): **transaction\_processing** **dcc** **dcc\_rate** **PayByLink** See: [Dynamic Currency Conversion](/docs/payments/payment-methods/dynamic-currency-conversion-guide "Dynamic Currency Conversion"), [Pay by Link](/docs/payments/online/pay-by-link-overview "Pay By Link"), [Transaction Management](/docs/transaction-management "Transaction Management") | | Tokenization | TKA | Ability to securely store and manage payment methods in any region and across any channel. Includes both card-not-present and card-present transactions. A token is produced that can be stored and used on the customer’s system in place of sensitive card information to process transactions. Account(s): **tokenization** See: [Card Storage](/docs/payments/tokenization/card-storage-guide "Card Storage") | # Data Formats Source: https://developer.globalpayments.com/api/definitions/data-formats.md Section: API References Description: See what standards and formats our API uses to represent common values ## Encoding The API assumes UTF-8 encoding in API requests and always returns UTF-8 encoding in all responses. ## Date and time The API accepts and generates dates and times in the [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601#General_principles) format and set to UTC. Date and times created and submitted by users must be in ISO-8601 but can be in the user's own timezone. ```json 200 OK { "id": "TRN_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "time_created": "2021-03-20T13:44:14.327Z", "type": "SALE", "status": "CAPTURED", "channel": "CP", ... ``` ## Amounts Amounts are always represented in the smallest common currency unit. There are no decimal points in amount values. Here are some examples of currencies with different exponents and how the amount is represented in the API. | Currency / Exponent | Example | | --- | --- | | US Dollar - 2 exponent currency | $100.99 --> 10099 | | Euro - 2 exponent currency | €34.59 --> 3459 | | Japanese Yen - 0 exponent currency | ¥145 --> 145 | | Tunisian Dinar - 3 exponent currency | DT 53.454 --> 53454| ## Currencies Currencies are always represented by the [ISO 4217 alpha code](https://en.wikipedia.org/wiki/ISO_4217#Active_codes). For example: | Currency | ISO 4217 Code | | --- | --- | | US Dollar | USD | | Pound Sterling | GBP | | Canadian Dollar | CAD | | Singapore Dollar | SGD | | Euro | EUR | | Japanese Yen | JPY | | Tunisian Dinar | TND | ## Countries Countries are represented by the [ISO-3166-1(alpha-2 code)](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Decoding_table). For example: | Country | ISO 3166-1 (Alpha-2 code) | | --- | --- | | United States of America | US | | Singapore | SG | | Canada | CA | | Great Britain | GB | | Australia | AU | | Japan | JP | | Hong Kong | HK | ## Languages Languages are represented by the format [ISO-639-1(alpha-2)](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) alone or a combined [ISO-639-1(alpha-2)](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and [ISO-3166-1(alpha-2 code)](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Decoding_table) by a hyphen delimiter. For example: | Language | ISO-639-1_ISO 3166-1 | | --- | --- | | English | en | | French | fr | | French Canadian | fr_CA | | Spanish | es | | Mexican Spanish | es_MX | # Lists Source: https://developer.globalpayments.com/api/definitions/lists.md Section: API References Description: Learn how to use parameters and values to control multiple query results This guide outlines the different query string parameters and values that can be passed in the request to retrieve a list of resources. These concepts apply to all lists of resources, regardless of whether it is a list of transactions, disputes, or deposits. You can append query string parameters and values to the end of a resource endpoint to represent [search criteria](#search-criteria), fields to return, and [pagination](#pagination) information when retrieving lists of resources. ## Search criteria Search criteria are query string parameters and values that indicate the resources to return in a list response. The following search criteria is used to return a list of disputes that are waiting on a response from the merchant (`status=WITH_MERCHANT`). #### Sample request ```json curl -v -X GET https://apis.globalpay.com/ucp/disputes?status=WITH_MERCHANT -H "Content-type: application/json" -H "X-GP-Version: 2021-03-22" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" ``` ## Pagination Data can be returned more efficiently by using the pagination query parameters to retrieve pages of records for a large data set. | Property | Description | | --- | --- | | order_by | Indicates the resource field to order the list by. The default is DATE_CREATED. | | order | Sets the ordering direction and can be ASC or DESC. The default is DESC. | | page_size | The number of records in the list to return in a single list response. The default is 5 and the max is 1000. | | page | Indicates what portion (page) of the full result list to return with this particular request. For example, a page of 1 and page_size of 10 will return records 1 to 10 of the entire result set, and a page of 2 and page_size of 10 will return records 11 to 20 of the entire result set, and so on. | The below example modifies the previous one so that only records 10-14 are returned and that the data set is ordered by the date the merchant needs to respond by, with the most recent first. #### Sample request ```json curl -v -X GET https://apis.globalpay.com/ucp/disputes?status=WITH_MERCHANT &order_by=time_to_respond_by&order=DESC&page_size=5&page=3 -H "Content-type: application/json" -H "X-GP-Version: 2022-12-31" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" ``` ## List response The response to a list of resources can contain: * The count of the total number of resources across the entire list, not just that page * The count of resources returned in the current page * The list of resources for the current page The `total_count` value is returned on the first page and only if the search date range is within one month. To determine the total number of pages to retrieve to get the entire result list, you can use the `total_count` on page 1 response if it's returned. Alternatively, you can use the `current_page_size` from the response. When the `current_page_size` is less than the `page_size` then that is the last page to be retrieved. #### Sample request ```json curl -v -X GET https://apis.globalpay.com/ucp/disputes?status=WITH_MERCHANT &order_by=time_to_respond_by&order=DESC&page_size=5&page=3 -H "Content-type: application/json" -H "X-GP-Version: 2022-12-31" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" ``` #### Sample response ```json { "total_count": 8, "current_page_size": 8, "merchant_id": "MER_62251730c5574bbcb268191b5f315de8", "merchant_name": "TEST MERCHANT", "account_id": "DIA_882c832d13e04185bb6e213d6303ed98", "account_name": "testdispute", "disputes": [ { "id": "DIS_lskdnfosdfjsdfsdf23dasd1", "status": "WITH_MERCHANT", "time_to_respond_by": "2019-02-22T10:24:43.761Z" }, { "id": "DIS_lskdnfosdfjsdfsdf23dasd2", "status": "WITH_MERCHANT", "time_to_respond_by": "2019-02-22T10:24:43.761Z", ... }, { "id": "DIS_lskdnfosdfjsdfsdf23dasd3", "status": "WITH_MERCHANT", "time_to_respond_by": "2019-02-22T10:24:43.761Z", ... }, { "id": "DIS_lskdnfosdfjsdfsdf23dasd4", "status": "WITH_MERCHANT", "time_to_respond_by": "2019-02-22T10:24:43.761Z", ... }, { "id": "DIS_lskdnfosdfjsdfsdf23dasd5", "status": "WITH_MERCHANT", "time_to_respond_by": "2019-02-22T10:24:43.761Z", ... }, {..} ] } ``` # Performance Source: https://developer.globalpayments.com/api/definitions/performance.md Section: API References Description: Learn how to optimize the API experience This guide focuses on ways to enhance the operation of our API. The tips provided here help reduce network bandwidth and ensure the predictability of API messages over a distributed network. ## Message encoding Accept-encoding allows you to specify the content encoding methods your software can handle. We currently support `gzip` and `identity`. | Header Name | Header Value | | --- | --- | | Accept-Encoding | gzip / identity | Bandwidth usage is reduced across networks as response messages are compressed. *Content-Encoding: gzip* is used for all API responses. | Header Name | Header Value | | --- | --- | | Content-Encoding | gzip | ## Pagination Retrieve data efficiently by using the pagination query parameters to retrieve pages of records for a large data set (for more information, see [Lists](https://developer.globalpayments.com/api/definitions/lists.md). | Query Parameter | Description | | --- | --- | | page_size | The total number of objects to return in a single page for that list. | | page | Indicates the page sequence to return in the response. The number of records presented on each page is determined by `page_size` field. | ### Sample request ```json curl -v -X POST https://apis.globalpay.com/ucp/disputes?status=WITH_MERCHANT &order_by=time_to_respond_by&order-DESC&page_size=5&page=3 -H "Content-type: application/json" -H "X-GP-Version: 2021-03-22" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" ``` ## Idempotency Use `X-GP-Idempotency` in the message header to ensure an action is not executed more than once. This is a user-generated value that can be up to 50 characters in length. If the same value is used again within 24 hours (for the same merchant), a response is returned indicating that the action was previously executed. The scope of the key is applied at a Merchant ID level, regardless of the account or app being used to execute the action. In addition, it applies only to POST, PATCH, and DELETE operations; it does not apply to GET. ```json curl -v -X POST https://apis.globalpay.com/ucp/deposits -H "X-GP-Idempotency: 234quigdua7stduabkjwe" -H "X-GP-Version: 2021-03-22" -H "Accept: application/json" -H "Content-type: application/json" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" ``` # Requests Source: https://developer.globalpayments.com/api/definitions/requests.md Section: API References Description: Get to know the basics of sending requests to our API This guide focuses on the key principles of executing API requests. ## Environments The environment you target, whether it's Sandbox or Production, is determined by the URL the request is sent to. #### Sandbox This is a test environment used to assess and test an integration to the API. Funds are never moved in this environment. ```JSON https://apis.sandbox.globalpay.com/ucp ``` #### Production This environment is used to move actual funds between payers and merchants. ```JSON https://apis.globalpay.com/ucp ``` ## Resource location The location to send requests to create, edit, or read resources is the base URL of the environment appended with the plural of the resource name. For example: The **Transactions** URL is used to authorize, reverse, refund, capture, and report on transactions. ```JSON https://apis.sandbox.globalpay.com/ucp/transactions ``` The **Disputes** URL is used to report on, challenge, and accept disputes. ```JSON https://apis.sandbox.globalpay.com/ucp/disputes ``` The **Deposits** URL is used to report on and reconcile deposits. ```JSON https://apis.sandbox.globalpay.com/ucp/deposits ``` ## HTTP verbs When initiating an action through the API, an HTTP verb needs to be used. The usage of this aspect of the HTTP protocol ensures a lightweight and intuitive experience. The verbs indicate the behavior of the action being executed. * **GET** – Requests data about a single resource or a list of resources and is idempotent. * **POST** – Creates or updates a resource and is not idempotent. * **PATCH** – Partially updates an existing resource and is not idempotent. ## Headers The following table outlines the properties that can be sent in the header of a request. | Header | Description | | --- | --- | | Accept | Indicates the format of the response requested. Set to _application/json_. | | Authorization | Contains the access token to use in a request. | | Content-type | Indicates the format of the data in the request. Set to _application/json_. | | Accept-encoding | Confirms that compressed response messages can be received, reducing network bandwidth. Supports `gzip` and `identity`. | | X-GP-Version | Mandatory field that contains the version of the API to execute the request. | | Idempotency-key | Contains a unique user-generated value that if repeated in a subsequent request, within a 24-hour window, the subsequent request will fail. | ## Sample request ```json curl -v -X POST https://apis.globalpay.com/ucp/settlement/deposits -H "X-GP-Version: 2021-03-22" -H "X-GP-Idempotency: 234quigdua7stduabkjwe" -H "Content-type: application/json" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" ``` # API responses Source: https://developer.globalpayments.com/api/definitions/responses.md Section: API References Description: A guide to all of our API response messages ## HTTP status codes The HTTP status codes indicates at a high level whether the API call was successful or not. For example, the _200 OK_ code indicates the successful execution of the API call and that there were no errors. Any non-200 http status code indicates an error. | HTTP Status Code | Message | Description | | -------- | -------- | -------- | | 200 | OK | This represents a successful API action. | | 400 | Bad Request | Error: The API request has an error in it. | | 401 | Not Authenticated | Error: Can’t authenticate with those credentials. Need to get a new access token. | | 403 | Forbidden | Error: Don’t have permission to execute that API action. | | 404 | Resource Not Found| Error: the resource referenced in the request cannot be found. | | 405 | Method Not Allowed | Error: The HTTP request method is not supported for the requested resource. | | 409 | Duplicate | Error: The API request was blocked as it is seen as a duplicate action that must not processed. | | 500 | Internal Server Error | Error: Something unexpected happened. | | 502 | Bad Gateway | Error: Something unexpected happened when communicating with another system. | | 504 | Timeout | Error: API did not get a response from another system in the expected timeframe. | ## Action response With every successful action, the following data is returned as part of the response. | Property | Description | | ------- | -------- | | id | Unique ID for that action. For example: ACT_udnMIdFzIcLC0kt6GatzZLsmyhvBXj | | type | The type of action execute. For example: AUTHORIZE, REFUND, REVERESE | | time_created | The time the action executed in ISO8601. For example: 2025-03-20T13:44:14.327Z | | result_code | The result of the action from us. For example: SUCCESS or DECLINED | | app_id | The unique ID of the app used to create the token associated with the executed action. For example: F45as8i3eaLHNfgsa12a4dEA2sddaA | ### Sample response ```JSON ..... "action": { "id": "ACT_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "type": "AUTHORIZE", "time_created": "2024-01-20T13:44:14.327Z", "result_code": "SUCCESS", "app_id": "MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "my_sandbox_app" } } ``` ### Action result_code The result of a successful API action is recorded in the `action.result_code` field as it always contains the API's result for the action. | action.result_code | Description | Examples | | ------- | ------- | ------- | | SUCCESS | indicates the action executed successfully.| When authorizing a card this means the card issuer authorized the transaction. | | DECLINED | indicates the action DECLINED. This means to consider that payment is not allowed and goods or services should not be provided. | When authorizing a card this means the card issuer declined the transaction. | | PENDING | indicates the result is not known but a final result will be subsequently provided. When the result is known result_code changes from PENDING to a SUCCESS, DECLINED or ERROR result_code.| This is result_code is currently only applicable for certain Asia Pacific payments methods when trying to void or reverse them. | | ERROR | indicates the action was PENDING but when the final result was known, it had erred. | This is result_code is currently only applicable for certain Asia Pacific payments methods when trying to void or reverse them.| ### Payment method result & message When processing transactions using a payment method (for example, a card), there are other fields in the response from the card provider that an integrator can examine to get more information about the response. | Area | Description | Examples | | ------- | ------- | ------- | | Payment Method Result & Message | Indicates the payment method provider's result and associated message. | If a card authorization declines, the payment_method result and message include more detail from the Issuer on why it was declined. For example, 51 - INSUFFICIENT FUNDS. This is generated by the issuing bank, who will provide decline codes in the response back to the authorization platform. | ### Sample response ```JSON 200 OK # <--- HTTP Status Code { "id": "TRN_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "time_created": "2024-01-20T13:44:14.327Z", "type": "SALE", "status": "CAPTURED", # <--- Status "channel": "CP", "capture_mode": "AUTO", "amount": "20045", "currency": "CAD", "merchant_id": "MER_8096479c606f4deb93dfab49e7bfea28", "merchant_name": "SANDBOX_MERCHANT", "account_id": "TRA_0b1fcc7cceea48dea38d044bae4295c2", "account_name": "Termiinal_55", "reference": "03559571", "payment_method": { "result": "00", # <--- Payment Method Result "message": "APPROVAL", # <--- Payment Method Message "entry_mode": "MANUAL", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX4242", "authcode": "351404", "brand_reference": "772201652998701", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "0", "avs_postal_code_result": "0", "avs_action": "" } }, "batch_id": "BAT_353445", "action": { "id": "ACT_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "type": "AUTHORIZE", "time_created": "2024-01-20T13:44:14.327Z", "result_code": "SUCCESS", # <--- Action Result Code "app_id": "APP_MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "my_sandbox_app" } } ``` ## Successful responses - 200 OK These are API actions that executed successfully and did not error. They will return an action object in the response message. > A DECLINED card transaction still returns a 200 OK as the action did execute successfully end to end, but the cardholder’s issuing bank declined the transaction. > The _action.result_code_ must also be examined. For more information, see the [Action result_code](#action-result_code) section. ## Error responses If the HTTP Status Code is 4xx or 5xx, then an error has occurred. Error responses contain the following fields. | Property | Description | | -------- | -------- | | error_code | Categorizes the error into a specific group. | | detailed_error_code | Specific code used to uniquely identify the error. | | detailed_error_description | Detailed verbiage of the specific error. | #### Sample error response ```JSON 401 Not Authenticated # <--- HTTP Status Code & Error Object { "error_code": "NOT_AUTHENTICATED", "detailed_error_code": "40001", "detailed_error_description": "Invalid Access Token" } ``` > Do not code to the _detailed_error_description_ field value as that verbiage may change. The following tables outline the implemented HTTP Status Codes, `error_code`, `detailed_error_code`, and `detailed_error_description` that the API can return when an error is encountered. ## 400 - Bad Request | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40224 | Can't CAPTURE a Transaction that is already CAPTURED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40226 | Can't reverse this transaction. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40225 | Currency Mis-match | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40223 | Request expects the batch_id. | | 400 | Bad Request | INVALID_PAYMENT_METHOD_ACTION | 40227 | Retrieve information about this payment method is not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40141 | Invalid value provided in the input field - system.name. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | `field_name` contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | `field_name` contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | `field_name` contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40118 | `RESOURCE` `RESOURCE_ID` not found at this location. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40005 | $[1].dependency' cannot be empty. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40192 | 100003 ACCT# INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40153 | 100003 AMOUNT NOT ALLOWED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40152 | 100003 AUTH CODE NOT ALLOWED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40183 | 100003 CARD TYPE DISABLED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40190 | 100003 CVV NOT ALLOWED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40182 | 100003 DATA INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40185 | 100003 ENCRYPTION ERROR | | 400 | Bad Request | INVALID_REQUEST_DATA | 40155 | 100003 MERCHANT FEE ONLY FOR CB | | 400 | Bad Request | INVALID_REQUEST_DATA | 40184 | 100003 PLZ VOID ADDTIP | | 400 | Bad Request | INVALID_REQUEST_DATA | 40186 | 100003 SAF MODE VALUE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40181 | 100003 ZIP CODE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40191 | 100003 ZIPCODE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40193 | 100015 CVV ERROR | | 400 | Bad Request | INVALID_REQUEST_DATA | 40194 | 100016 AVS ERROR | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40188 | 100020 CANNOT ADJUST | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40189 | 100021 ALREADY VOIDED/ ALREADY COMPL | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40018 | 11, Original transaction not CPC. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40054 | 111, Invalid value provided in the input field page. Must be greater than 0. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40019 | 12, Invalid CPC data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40020 | 13, Invalid edit data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40021 | 14, Invalid card number. | | 400 | Bad Request | INVALID_BATCH_ACTION | 40022 | 15, Batch close in progress. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40023 | 16, Invalid Ship Date. Transaction rejected because the ship date and month are invalid. Try again in a few seconds and resubmit. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40024 | 17, Invalid encryption version. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40025 | 18, E3 MSR failure. The message returned with this code is the parsed error message from the MSR data stream. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40026 | 9, Invalid Reversal Amount. Occurs if a reversal request includes a new settlement amount that is not less than the current total authorization amount. the total authorization amount is the original authorization plus any incremental authorization minus any previous reversal amounts. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40012 | 3, Invalid original transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40027 | 32, Missing KTB error. Occurs when a POS is attempting to send encrypted data, but the expected KTB value was corrupted or not received. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40028 | 33, Missing KSN error. Occurs when a POS is attempting to send encrypted data, but the expected KSN value was corrupted or not received. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40029 | 34, Invalid data received. Returned from a CreditAuth or CreditSale if both GatewayTxnId and a CardData subfield are received. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40044 | 6, Invalid original transaction for reauthorization. Returned from a CreditAuth or CreditSale if the original transaction referenced by GatewayTxnId cannot be found. this is typically because the original does not meet the criteria for the sale or authorization by GatewayTxnID. Can also be returned if the original transaction is found but the card number was written over with nulls after 30 days. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40030 | 37, Missing element. Returned if a required (or conditional) element is missing from the transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40031 | 38, Invalid auth amount. Returned from a CreditAuth or CreditSale by GatewayTxnId when the requested amount is over the threshold set for the transaction type, which is some percentage of the original amount (default = 100%). | | 400 | Bad Request | INVALID_REQUEST_DATA | 40032 | 39, Transaction rejected because EMV TLV data was invalid. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40013 | 4, Transaction already associated with batch. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40033 | 40, Transaction rejected because the referenced transaction has invalid EMV TLV data. | | 400 | Bad Request | INVALID_BATCH_ACTION | 40014 | 5, No current batch. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40015 | 6, Invalid return amount. Occurs if a credit return request is against a specific original transaction and the return amount is greater than the original transaction’s settle amount—or the return amount is zero. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40016 | 8, Bad track data. | | 400 | Bad Request | INVALID_BATCH_ACTION | 40017 | 9, No transaction associated with batch. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40108 | Action cannot be completed. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | Amount contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40162 | avs_address contains unexpected data. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40037 | Can't ADJUST a transaction without a status of CAPTURED or PREAUTHORIZED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40035 | Can't CAPTURE a transaction without a status of PREAUTHORIZED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40038 | Can't REFUND a transaction without a status of CAPTURED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40009 | Can't REVERSE a transaction without a status of CAPTURED or PREAUTHORIZED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40010 | Can't REVERSE a transaction that is already REVERSED. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40218 | Cannot include both payment_method.id and card.number in this request. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | cashback_amount contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40006 Dependency cannot be executed. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60012 | Device error: CAPK Expired. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60001 | Device error: Card Expired. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60006 | Device error: Chip Blocked. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60008 | Device error: Chip Blocked. | | 400 | Bad Request | DEVICE_INPUT_INVALID 60007 | Device error: Chip Error. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60016 | Device error: Chip Error. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60004 | Device error: Chip Malfunction. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60009 | Device error: Chip Not Accepted. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60005 | Device error: Chip Read Error. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60011 | Device error: Chip Reject. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60010 | Device error: Chip Reject Approval. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60019 | Device error: Contactless failed. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60015 | Device error: Device memory is overflow. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60013 | Device error: No PIN Pad. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60014 | Device error: PIN Pad can’t be used. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60003 | Device error: PIN Pad Failure. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60002 | Device error: PIN Pad Timeout. | | 400 | Bad Request | USER_ABORTED | 40146 | Device error: 100002 ABORTED. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40147 | Device error: 100028 TAX EXCEED AMT. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40148 | Device error: 100003 CARDTYPE ONLY FOR CREDIT. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40149 | Device error: 100003 UNSUPPORT CARDTYPE. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40195 | Device error: 100017 HALO EXCEED. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40203 | Device error: 100027 UNSUPPORT COMMAND. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60017 | Device error: Tap Not Accepted. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60021 | Device error: Tap Not Accepted - Try another card. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60018 | Device error: Tap Terminated. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60020 | Device error: Transaction should be declined by device. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40066 | Documents provided in the request are too large. Please correct and retry. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40177 | entry_mode contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40179 | entry_mode contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40161 | first_name, last_name contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40114 | from_deposit_time_created cannot be greater than the to_deposit_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40093 | from_adjustment_time_created cannot be greater than the to_adjustment_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40047 | from_adjustment_time_created cannot be greater than the to_adjustment_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40132 | from_batch_time_created cannot be greater than the to_batch_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40046 | from_stage_time_created cannot be greater than the to_stage_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40122 | from_time_created cannot be greater than the to_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40113 | from_time_created cannot be greater than to_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40127 | from_time_last_updated cannot be greater than the to_time_last_updated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | Funding contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | Funding contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | gratuity_amount contains unexpected data. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40045 | Input does not have any search criteria; please provide valid search criteria. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40219 | interval_to_expire contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40115 | Invalid from_time_created; date provided shouldn't be more than 2 years. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40095 | Invalid Date: Request rejected because the date and month are invalid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40049 | Invalid Date: Request rejected because the date and month are invalid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40059 | Invalid request. No value provided in field from_adjustment_time_created, but value provided in to_adjustment_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40058 | Invalid request. No value provided in field from_stage_time_created, but value provided in to_stage_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40053 | Invalid value provided in the input field - adjustment_funding. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40097 | Invalid value provided in the input field - brand. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40051 | Invalid value provided in the input field - brand. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40206 | Invalid value provided in the input field - developer_id. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40208 | Invalid value provided in the input field - email. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40104 | Invalid value provided in the input field - masked_account_number_last4. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40209 | Invalid value provided in the input field - mobile_phone. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40054 | Invalid value provided in the input field - offset. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40103 | Invalid value provided in the input field - order. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Invalid value provided in the input field - order_by. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40056 | Invalid value provided in the input field - order_by. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40057 | Invalid value provided in the input field - order. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40100 | Invalid value provided in the input field - page. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40101 | Invalid value provided in the input field - page_size. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40055 | Invalid value provided in the input field - page_size. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40207 | Invalid value provided in the input field - site_id. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40096 | Invalid value provided in the input field - stage. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40050 | Invalid value provided in the input field - stage. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40098 | Invalid value provided in the input field - status. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40052 | Invalid value provided in the input field - status. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40105 | Invalid value provided in the input field - system.hierarchy. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40106 | Invalid value provided in the input field - system.mid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40099 | Invalid value provided in the input field - amount. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40123 | Invalid value provided in the input field - expiry_month. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40124 | Invalid value provided in the input field - expiry_year. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40131 | Invalid value provided in the input field - from_batch_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40111 | Invalid value provided in the input field - from_deposit_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40091 | Invalid value provided in the input field - from_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40120 | Invalid value provided in the input field - from_time_created_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40128 | Invalid value provided in the input field - from_time_last_updated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40090 | Invalid value provided in the input field - Id. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40125 | Invalid value provided in the input field - number. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40129 | Invalid value provided in the input field - numberfirst6. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40130 | Invalid value provided in the input field - numberlast4. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40117 | Invalid value provided in the input field - permissions. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40119 | Invalid value provided in the input field - tid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40133 | Invalid value provided in the input field - to_batch_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40112 | Invalid value provided in the input field - to_deposit_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40092 | Invalid value provided in the input field - to_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40121 | Invalid value provided in the input field - to_time_created_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40126 | Invalid value provided in the input field - to_time_last_updated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40176 | keyedCardData is not allowed with entry_mode value SWIPE. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40229 | Merchant Configuration does not exist for `merId`,`mmaId`. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40217 | Merchant configuration does not exist for this account: `account_id`. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40041 | Merchant configuration does not exist for: `TRA_ID`, `TRA_NAME`, `COUNTRY`,`CHANNEL`, `CURRENCY``PAYMENT_METHOD` `MMA_ID` `MER_ID` | | 400 | Bad Request | INVALID_REQUEST_DATA | 40216 | Merchant configuration invalid for this account. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40107 | Multiple accounts found; a specific account must be used in the request. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40145 | Partial authorization is not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40214 | Partial reversal not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40165 | payer.date_of_birth contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40166 | payer.email contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40168 | payer.email contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40163 | payer.mobile_phone or payer.landline_phone or shipping_address.mobile_phone contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40157 | Missing/Invalid Amount | | 400 | Bad Request | INVALID_REQUEST_DATA | 40158 | Missing/Invalid Input | | 400 | Bad Request | INVALID_REQUEST_DATA | 40159 | Invalid Amount | | 400 | Bad Request | INVALID_REQUEST_DATA | 40160 | Missing Payee Name | | 400 | Bad Request | INVALID_REQUEST_DATA | 40164 | Invalid SSN | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40169 | Resubmit not allowed for approved ACH transaction. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40170 | Resubmit not allowed for non ACH/Resubmit transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40171 | Format Error field details | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40180 | Invalid request for returning ACH transaction. Use AchReturn. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40016 | Device error: 100019 TRACK INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40086 | Device error: 100003 AMOUNT TOO LARGE | | 400 | Bad Request | INVALID_REQUEST_DATA | 40199 | Device error: 999985 Too many original transactions were found; please add other conditions. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40200 | Device error: 999983 Invalid URL | | 400 | Bad Request | INVALID_REQUEST_DATA | 40201 | Device error: 999979. This merchant sends BatchAll commands frequently; please try after a while. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40205 | Device error: 100003 EXP DATE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40220 | Device error: 999998 Parameter Error | | 400 | Bad Request | INVALID_REQUEST_DATA | 40221 | Device error: 999997 Invalid POS information | | 400 | Bad Request | INVALID_REQUEST_DATA | 40178 | Sum of elements of group additional charges should not be greater than transaction amount. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - guest_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - order_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - payer_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - table_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - tax_exempt_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - ticket_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40006 | Request contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40043 | Request contains unexpected fields: payment_method. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40136 | Request expects account_name or account_id along with `request parameters` | | 400 | Bad Request | INVALID_REQUEST_DATA | 40007 | Request expects the following conditionally mandatory fields `field_list`. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40005 | Request expects the following field `field_list`. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40211 | Request expects the following field `field_list` from the Merchant. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40211 | Request expects the following field `field_list` from the Merchant. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40005 | Request expects the following field dependency. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40075 | Retrieving a list expects a date range to be populated. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40074 | Retrieving a List of Disputes expects the from_stage_time_created populated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40085 | Multiple Scenarios Error Code: 509   NonNumeric in Credit card number. Invalid credit card length. Card number fails Luhn Check. Invalid expiry date. Invalid expiry date. Card Expiry date in past. Expiry month invalid. That Card Number does not correspond to the card type you selected. Length of CVV data is incorrect. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40086 | Error Code: 510 That amount is greater than the max allowed. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40087 | Multiple Scenarios Error Code: 512   This transaction was already rebated and cannot be rebated again. You can't refund a delayed transaction that was not sent for settlement. You are refunding money to a customer that was not and never will be charged. Original transaction currency was not currency. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40088 | Error code : 513 Can't void a settled transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 50020 | error code - 508 | | 400 | Bad Request | MANDATORY_DATA_MISSING | 50021 | 502 | | 400 | Bad Request | INVALID_REQUEST_DATA | 50025 | 550 | | 400 | Bad Request | INVALID_REQUEST_DATA | 50027 | 520 | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40036 | Transaction already captured. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | seconds_to_expire contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | tax_amount contains unexpected data. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40072 | The dispute stage, Retrieval, can be challenged with a single document only. Please correct the request and resubmit. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40174 | track data is not allowed with entry_mode value EMAIL. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40175 | track data is not allowed with entry_mode value INTERNET. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40172 | track data is not allowed with entry_mode value MANUAL. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40173 | track data is not allowed with entry_mode value PHONE. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40215 | Reversal with greater amount than original amount not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40212 | Transaction declined; cannot find DCC information for the card. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40212 | Transaction declined; cannot find DCC information for the card. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40069 | Unable to accept as existing record is financially closed. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40068 | Unable to accept as existing record is Under Review. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40067 | Unable to accept for that id. Please check the Case id again. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40070 | Unable to accept; please try again after some time. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40062 | Unable to challenge as existing record is financially closed. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40061 | Unable to challenge as existing record is Under Review. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40064 | Unable to challenge as Invalid document provided in the request. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40065 | Unable to challenge as No document provided with the request. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40060 | Unable to challenge for that id. Please check the Case id again. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40063 | Unable to challenge, please try again after some time. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | user_reference contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40167 | user_reference contains unexpected data. | ## 401 - Not Authorized | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 401 | Not Authenticated | NOT_AUTHENTICATED | 40001 | Invalid access token. | | 401 | Not Authenticated | NOT_AUTHENTICATED | 40002 | Access token expired. | | 401 | Not Authenticated | NOT_AUTHENTICATED | 40142 | Merchant info is not active. | ## 403 - Forbidden | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40004 | App credentials not recognized. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40212 | Permission not enabled to execute action. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40228 | Merchant Configuration does not exist for an active `merId`,`mmaId` along with required permission to execute action. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40202 | Device error: 999962. This Host was inactivated. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 50022 | 503 | ## 404/405 - Not Found | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 404 | Not Found | RESOURCE_NOT_FOUND | 40116 | `RESOURCE` `RESOURCE_ID` not found at this location. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40118 | `RESOURCE` `RESOURCE_ID` not found at this location. | | 404 | Not Found | n/a | n/a | API not found for requested URI. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40071 | No document found; please recheck the values provided. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40196 | Device error: 999988. This transaction does not exist. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40198 | Device error: 999986. This batch does not exist. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40008 | Transaction to action cannot be found. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40094 | Unable to locate dispute record for arn. Please recheck the value provided for arn. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40048 | Unable to locate dispute record for arn. Please recheck the value provided for arn. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40073 | Unable to locate dispute record for that ID. Please recheck the ID provided. | | 405 | Not Found | INVALID_TRANSACTION_ACTION | 40222 | Device error: 999996 Invalid Terminal information | | 405 | Not Found | INVALID_TRANSACTION_ACTION | 40042 | Retrieve information about this transaction is not supported. | ## 409 - Conflict | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 409 | Conflict | DUPLICATE_TRANSACTION | 40011 | 2, Duplicate transactions | | 409 | Conflict | DUPLICATE_ACTION | 40039 | Idempotency Key seen before : id:`resource-id` status: `resource_status` | | 409 | Conflict | DUPLICATE_TRANSACTION | 40011 | Device error: 100011 DUP TRANSACTION | | 409 | Conflict | DUPLICATE_TRANSACTION | 50015 | 501, This transaction was already processed. | ## 500 - Internal Server Error | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 500 | Internal Server | SYSTEM_ERROR_DOWNSTREAM | 50053 | 129, Unable to locate User with the Credentials provided; please contact Support Team. | ## 501 - Not Implemented | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 501 | Not Implemented | UNKNOWN_RESPONSE | 50012 | `ECHO BACK MESSAGE FROM SYSTEM` | | 501 | Not Implemented | UNKNOWN_RESPONSE | 50012 | Device error: 100023 UNKNOWN ERROR/NOT FOUND/USERABORTED | | 501 | Not Implemented | SYSTEM_ERROR_DOWNSTREAM | 50045 | Unable to process your request due to an Internal System Error; please reach out to your administrator if the issue persists. | ## 502 - Bad Gateway | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50004 | 1, Gateway system error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50003 | 1, Portico error. Developers notified. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 40187 | 100006 BATCH FAILED | | 502 | Bad Gateway | UNAUTHORIZED_DOWNSTREAM | 50002 | 2, Authentication error. Verify and correct credentials. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50005 | 20, Database operation time out. May occur when Portico is trying to communicate to the database for large amounts of data. If this is due to a search, it can be corrected by adding more specific criteria. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50006 | 21, Archive database is currently unavailable. Try the transaction again later. | | 502 | Bad Gateway | UNAUTHORIZED_DOWNSTREAM | 50001 | 21, Unauthorized | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50007 | 22, Archive database is currently unavailable but an attempt was made to retrieve the data from the real-time database. If there was data available from the real-time database that met the request criteria, then it was returned. However, it is not guaranteed to be complete. The request may need to be tried again later. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50013 | 2xx, eCom error. Developers notified. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50014 | 3xx, Error with GP Systems | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50010 | 50, Processor System error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50011 | 51, Processor Configuration error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 40204 | Device error: 199999 TERMINAL ERROR | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50052 | Inactive Device (Terminal) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50053 | Device (Terminal) Configuration missing | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50054 | Insufficient privileges | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50055 | Incremental Auth Not Allowed | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50056 | Unable to process your request. Settlement In Progress. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50057 | Functionality currently not available. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50058 | Inactive Merchant (Account) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50059 | Merchant (Account) configuration missing | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50060 | Processor configuration missing | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50061 | Unique ID Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50062 | Service Not Allowed | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50063 | Authentication error. Verify and correct credentials. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50064 | System Error (PhCountry) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50065 | System Error (Bin Lookup) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50066 | System Error (Merchant Bin Lookup) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50067 | System Error (Search Merchant) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50068 | System Error (Modify Schedule) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50069 | System Error (Modify Payment) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50070 | System Error (CCust) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50071 | System Error (CCustID) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50073 | System Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50074 | Error on Host | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50075 | System Error (DB Insert) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50076 | Card verification failed for card number. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50077 | Supported SecCodes not found for ACH. | | 502 | Bad Gateway | DUPLICATE_TRANSACTION | 50078 | Duplicate transaction (Same amount/ Account). | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50079 | General Money Transfer Decline | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50080 | Service is temporarily unavailable. Please try later. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50081 | Payment count cannot be greater than processed count. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50082 | One or more transactionID(s) in transactionPaymentTypeDetails is/are invalid. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50083 | Record Not Found | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50084 | Invalid Transaction Key | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50085 | The provided authentication credentials are not correct. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50086 | Invalid merchant details | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50087 | Host Operator not allowed | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50088 | Token services cannot be enabled until the merchant account is set up with a token zone. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50089 | Tokenization service not enabled | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50092 | Tokenization Unsuccessful | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50093 | Credit Limit Reached | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50094 | Invalid Message | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50095 | System Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50097 | Service disabled | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50098 | General Notify Decline | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50099 | Invalid Cashback amount | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50100 | Cashback Amount is not allowed for this type of transaction. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50101 | Mandatory Tags are missing. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50102 | Card Type not supported for requested service. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50103 | terminalData terminalCapability, terminalOperating Environment, cardholderAuthenticationMethod, terminalAuthenticationCapability, terminalOutputCapability, maxPinLength group is required. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50104 | cardholderAuthenticationMethod must be PIN. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50126 | Device error: 999995 Invalid POS/Terminal Pair info | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50127 | Device error: 999994 Internal Create Queue Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50128 | Device error: 999993 Terminal response does not match POS request | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50129 | Device error: 999992 Process Terminal response Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50130 | Device error: 999999 System Internal Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50130 | Device error: 999991 Internal Send Queue Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50131 | Device error: 999990 Receive Terminal response Timeout Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50132 | Device error: 999989 Terminal response type does not match POS request | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50133 | Device error: 999984 This Merchant is not paired with a Host | | 502 | Bad Gateway | UNAUTHORIZED_DOWNSTREAM | 50017 | error code - 505 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50018 | error code - 506 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50023 | 504 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50024 | 507 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50018 | This resource has reached the maximum number of records that can be returned. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50026 | Transaction `TRN_id` completed successfully but there was an issue in communicating the result to the merchant. Please check the status of the transaction. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50046 | Unable to process your request due to an error with a system down stream. | ## 504 - Timeout | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 504 | Timeout | TIMEOUT_DOWNSTREAM | 50008 | | 0, Occurs if we do not receive a response from the backend system and we're not sure if the transaction was successful or not. In this case, the POS is responsible for deciding whether to issue a reversal for this transaction. Used in cases where the transaction is an authorizing transaction, e.g., CreditAuth, CreditSale. If the transaction is non-authorizing (e.g., CreditAccountVerify, CreditReversal) and we receive no response, then we sends back a System Error (+1) to the POS. | | 504 | Timeout | TIMEOUT_DOWNSTREAM | 50009 | 31, Occurs when we attempt a reversal for the POS, but the reversal fails. In this case, the POS is responsible for issuing the reversal. | | 504 | Timeout | TIMEOUT_DOWNSTREAM | 50072 | Time out | # Resources & Actions Source: https://developer.globalpayments.com/api/definitions/resources-actions.md Section: API References Description: Understand our API resources and their associated actions The API is structured around resources and their associated actions. Resources are created, edited, and reported on by executing actions using the API. For example, a _/transactions_ resource is created by authorizing a card for a specific amount. It is edited by subsequently reversing it. This table outlines some example resources and their associated actions. | Example Resource | Definition | Associated Action(s) | | --- | --- | --- | | [/transactions](https://developer.globalpayments.com/api/transactions.md) | The transfer or attempt to transfer funds between a merchant and a payer using a payment method. | Authorize, Capture, Adjust, Reverse, Refund, Report | | [/disputes](https://developer.globalpayments.com/api/disputes.md) | Questions or objections from a payer relating to a previous transaction.| Challenge, Accept, Reporting | | [/deposits](https://developer.globalpayments.com/api/deposits) | The debiting or crediting of funds to a merchant's bank account. | Reporting | ### Resource IDs For every instance of a resource, we create an ID that uniquely identifies that instance. These IDs are important as they are used to reference an instance of a resource when actioning in. IDs are structured using the first three characters to represent the type of resource the instance refers to, followed by an underscore and then a unique string. For example, _TRN_C0kt6GatzZLsC0kt6GatzZLsmyhvBX_ is an unique ID for a transaction. IDs are created when the instance of the resource is created. #### Sample request ```json curl -v -X POST https://apis.globalpay.com/ucp/transactions -H "Content-type: application/json" -H "X-GP-Version: 2021-03-22" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" -d ' { "account_name": "transaction_processing", "channel": "CP", "type": "SALE", "amount": "20045", "currency": "CAD", "reference": "my-trans-ref", "payment_method": { "name": "Jane Doe", "entry_mode": "MANUAL", "card": { "number": "4242424242424242", "expiry_month": "12", "expiry_year": "20" } } }' ``` #### Sample response ```json { "id": "TRN_udnMIdFzIcLC0kt6GatzZLsmyhvBXj", "time_created": "2021-03-20T23:31:33.878Z", "type": "SALE", "status": "CAPTURED", .... } ``` The following table describes the API resources and gives an example ID for each. | Resource | Description | Example ID | | --- | --- | --- | | Merchant | Represents a configured business entity that has an account configured to access a payment-processing capability. | MER_8096479c606f4deb93dfab49e7bfea28 | | Account | Umbrella term for all configured accounts of all account types. Each account has a type and represents a payment-processing capability. | ACC_345lmaslhvj7sdfnlsdfh8asdfnsldknfas2 | | Transaction Account | Represents a configured capability to create, edit, and report on transactions. Transactions represent the attempt or the actual movement of funds between a payer and a merchant. | TRA_0b1fcc7cceea48dea38d044bae4295c2 | | Data Services Account | Represents a configured capability to access Settlement Reporting to retrieve settlement info related to deposits, transactions, and disputes. | DAA_dea38d044bae4295c20b1fcc7cceea48 | | Tokenization Account | Represents a configured capability to store, edit, and report on payment methods stored on our system. | TKA_nsldknfas2345lmaslhvj7sdfnlsdf | | Action | Represents information about the requests and corresponding responses sent to the API. | ACT_udnMIdFzIcLC0kt6GatzZLsmyhvBXj | | Transaction | Represents the transfer or the attempt to transfer funds between a payer and a merchant using a specific payment method. A Sale transaction represents movement of funds from payer to merchant and a refund from merchant to payer. | TRN_C0kt6GatzZLsC0kt6GatzZLsmyhvBX | | Dispute |An act, initiated by a payer or payer’s bank, to query or challenge the previous transfer of funds between that payer and the merchant. | DIS_2SDFC0kt6GatzZLsC0kt6GatzZLscc | | Deposit | Represents the initiation of a debit or a credit to a merchant's bank account that relates to processed transactions and disputes or fees charged to the merchant. | DEP_2VCssdf2SDFC0kt6GatzZLsC0kt6Ga | | Verification | Represents the validation of a payment method to ensure it can be used in the creation of a transaction. | VER_k35345dfgdwRWCVfZFSDFsdfsdfsd | | Payment Methods | Stored by us and represented by an identifier, commonly referred to as a _token_. Can be used to create sale and refund transactions, in place of real card details. | PMT_ZFSDFsdfsdfsdudnMIdFzIcLC0kt6G | | Authentications | Represents an authentication process to prove the payer executing a sale transaction is the owner of the payment method being used. This includes the SCA/3DS process. | AUT_FsdfsdfsdudnMIdFzIcLC0dea38d044 | | Batch | Represents a group of sale and refund transactions that start the funding process in the same collection. | BAT_35wdfsdfsdfsdf32VCssdf2SDF2SDFv | | Currency Conversion Services | Represents an instance of payment currency service provided by us, such as DCC rate lookup, Multi-currency Pricing, or FX rate file retrieval. | CCS_dfsdfsdf32VCssdf2SDatzZLsC0kt6Gat | | Device | Represents the requests to manage and configure devices. | DEV_6GatzZLsC0kt6GatzZdfsdfsdf32VCs3c | # Versioning Source: https://developer.globalpayments.com/api/definitions/versioning.md Section: API References Description: Be sure to include the correct version in every API request The API is version controlled. Some past versions are available to merchants in Production. The API requires that the header **X-GP-Version** be submitted with every request to indicate the version of the API to execute. The response will contain the same header to indicate the version that was executed. > The latest version of the API is: 2021-03-22 #### Sample request ```json curl -v -X POST https://apis.globalpay.com/ucp/transactions -H "Content-type: application/json" -H "X-GP-Version: 2021-03-22" -H "Authorization: Bearer KnxbvhyY4GgBYq6mV64uEGLzotrw" -d ' { "account_name": "Transaction_Processsing", "channel": "CP", ... }' ``` # Validating Webhook Notifications Source: https://developer.globalpayments.com/api/definitions/webhooks.md Section: API References Description: Learn how to validate a webhook notification message and its sender. A webhook is a message from us that notifies a merchant’s system that a particular event has occurred. There are two types of webhooks that can be sent from our system: a **POST webhook** that contains data in the payload body of a message and a **GET webhook** that contains data in the query string of the URL being notified. This guide focuses on how to validate both of these types of webhooks to ensure the message came from our API. ## POST Webhook The below webhook is a HTTP POST request and the message content is in the body of the webhook. The signature is in the header field `X-GP-Signature`. ### Sample Webhook ```JSON ["Host","example.com", "Content-Length","652", "Content-Type","application/json", "Accept","application/json", "Content-Encoding","gzip", "Cache-Control","private,no-store", "Strict-Transport-Security","max-age=31536000; includeSubDomains;", "X-Content-Type-Options","nosniff", "x_global_transaction_id","rrt-6432659491113021748-b-geu1-27725-72152606-1", "x_global_transaction_id_source","globalpay.ApigeeEdge", "X-GP-Signature","ee16e2d14fb2969565499c172522e69955945a544751a5fa9e5fc775b3141785612c223ed77c2ff4cc367ead60f816c4fec6e16dc35564882d9aa695a3d0a907"] ``` ```JSON { "id":"TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181", "time_created":"2024-07-03T15:23:51.342Z", "type":"SALE", "status":"CAPTURED", "channel":"CNP", "capture_mode":"AUTO", "amount":"1005", "currency":"EUR", "country":"DE", "merchant_id":"MER_f414851d386a4e1f9fa4beb56c5e38b9", "merchant_name":"Global Payments Test Merchant Mason", "account_id":"TRA_4d49f5d4e1b84ea4a28c8902a8538375", "account_name":"79810948", "reference":"44819181", "payment_method":{ "result":"00", "message":"SUCCEEDED", "entry_mode":"ECOM", "apm":{ "provider":"testpay", "wait_notification":"", "fund_status":"NOT_EXPECTED", "payment_description":"546CCB7", "confirmed_accountholder":"", "account_number":"", "iban":"", "bank_identifier_code":"", "bank_name":"", "bank_address":"", "optional_redirect":"" } }, "batch_id":"", "action":{ "id":"ACT_Jm6BviEawzx7XgbQZUh0dbfBettgQ5", "type":"STATUS_NOTIFICATION", "time_created":"2024-07-03T15:24:52.217Z", "result_code":"SUCCESS", "app_id":"a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ", "app_name":"sean_sandbox_app" } } ``` ### How to check the X-GP-Signature 1) Take the signature value from the header field `X-GP-Signature`. 2) Take the full JSON body of the message. The message must be minified to ensure all unnecessary whitespace and control characters are removed. 3) Take the `app_key` (Click [here](https://developer.globalpayments.com/api/definitions/access-tokens.md#step-1-obtain-your-app-credentials) to learn about `app_key`). 4) Concatenate the JSON body of the message with the `app_key`. 5) SHA512 the string from Step 4. 6) Check if the string from Step 5 is the same as the `X-GP-Signature` value from the header. If it’s the same, the message came from us. If they do not match, the message did not come our system. ```Pseudocode X-GP-Signature = "ee16e2d14fb2969565499c172522e69955945a544751a5fa9e5fc775b3141785612c223ed77c2ff4cc367ead60f816c4fec6e16dc35564882d9aa695a3d0a907"; body = '{"id":"TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181","time_created":"2024-07-03T15:23:51.342Z","type":"SALE","status":"CAPTURED","channel":"CNP","capture_mode":"AUTO","amount":"1005","currency":"EUR","country":"DE","merchant_id":"MER_f414851d386a4e1f9fa4beb56c5e38b9","merchant_name":"Global Payments Test Merchant Mason","account_id":"TRA_4d49f5d4e1b84ea4a28c8902a8538375","account_name":"79810948","reference":"44819181","payment_method":{"result":"00","message":"SUCCEEDED","entry_mode":"ECOM","apm":{"provider":"testpay","wait_notification":"","fund_status":"NOT_EXPECTED","payment_description":"546CCB7","confirmed_accountholder":"","account_number":"","iban":"","bank_identifier_code":"","bank_name":"","bank_address":"","optional_redirect":""}},"batch_id":"","action":{"id":"ACT_Jm6BviEawzx7XgbQZUh0dbfBettgQ5","type":"STATUS_NOTIFICATION","time_created":"2024-07-03T15:24:52.217Z","result_code":"SUCCESS","app_id":"a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ","app_name":"sean_sandbox_app"}}'; app_key = "WinZP9PgPfVZuTi4"; stringToHash = body + app_key; stringToHash = '{"id":"TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181","time_created":"2024-07-03T15:23:51.342Z","type":"SALE","status":"CAPTURED","channel":"CNP","capture_mode":"AUTO","amount":"1005","currency":"EUR","country":"DE","merchant_id":"MER_f414851d386a4e1f9fa4beb56c5e38b9","merchant_name":"Global Payments Test Merchant Mason","account_id":"TRA_4d49f5d4e1b84ea4a28c8902a8538375","account_name":"79810948","reference":"44819181","payment_method":{"result":"00","message":"SUCCEEDED","entry_mode":"ECOM","apm":{"provider":"testpay","wait_notification":"","fund_status":"NOT_EXPECTED","payment_description":"546CCB7","confirmed_accountholder":"","account_number":"","iban":"","bank_identifier_code":"","bank_name":"","bank_address":"","optional_redirect":""}},"batch_id":"","action":{"id":"ACT_Jm6BviEawzx7XgbQZUh0dbfBettgQ5","type":"STATUS_NOTIFICATION","time_created":"2024-07-03T15:24:52.217Z","result_code":"SUCCESS","app_id":"a5f0OOTJdAChObGXIqi8I5eGq6i6sLlJ","app_name":"sean_sandbox_app"}}WinZP9PgPfVZuTi4'; hashedString = SHA512(stringToHash); hashedString = 'ee16e2d14fb2969565499c172522e69955945a544751a5fa9e5fc775b3141785612c223ed77c2ff4cc367ead60f816c4fec6e16dc35564882d9aa695a3d0a907' IF X-GP-Signature == hashedString { All Good } IF X-GP-Signature != hashedString { Issue } ``` ## HTTP GET Webhook The below webhook is a HTTP GET request and the message content is in the URL’s query string. The signature is in the first query string field, `X-GP-Signature`. ### Sample Webhook ```Pseudocode https://www.example.com/?X-GP-Signature=8174e708320993a2083d82c097cbb148f1dcf381fb33ca85495fdc672c219e52d0ba19dab2f15460b00f80727fc952ad23cf9390b1af49227d8f6acd81205c14&id=TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181&status=PENDING&reference=44819181&payment_method.result=01&payment_method.message=PENDING&provider=testpay&apm.wait_notification=&apm.optional_redirect=&apm.fund_status=NOT_EXPECTED&apm.payment_description=546CCB7&apm.confirmed_accountholder=&apm.account_number=&country=DE&apm.bank.iban=&apm.bank.identifier_code=&apm.bank.name=&apm.bank.code=&action.id=ACT_UWGHF3hQxRmfe9im2W7AmSLUdXB1Rb&action.type=RETURN_NOTIFICATION&action.time_created=2024-07-03T15%3A24%3A23.402Z ``` ### How to check the X-GP-Signature 1) Take the signature value from the `X-GP-Signature` query string field. It will be the first parameter in the query string. 2) Take the remaining query string value: everything after the ampersand (&) directly after the `X-GP-Signature` value. 3) Take the `app_key` (Click [here](https://developer.globalpayments.com/api/definitions/access-tokens.md#step-1-obtain-your-app-credentials) to learn about `app_key`). 4) Concatenate the remaining query string value with the `app_key`. 5) SHA512 the string from Step 4 6) Check if the string from Step 5 is the same as the `X-GP-Signature` value from the query string field. If it’s the same, the message came from us. If they do not match, the message did not come from our system. ```Pseudocode fullURL = ‘https://www.example.com/?X-GP-Signature=8174e708320993a2083d82c097cbb148f1dcf381fb33ca85495fdc672c219e52d0ba19dab2f15460b00f80727fc952ad23cf9390b1af49227d8f6acd81205c14&id=TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181&status=PENDING&reference=44819181&payment_method.result=01&payment_method.message=PENDING&provider=testpay&apm.wait_notification=&apm.optional_redirect=&apm.fund_status=NOT_EXPECTED&apm.payment_description=546CCB7&apm.confirmed_accountholder=&apm.account_number=&country=DE&apm.bank.iban=&apm.bank.identifier_code=&apm.bank.name=&apm.bank.code=&action.id=ACT_UWGHF3hQxRmfe9im2W7AmSLUdXB1Rb&action.type=RETURN_NOTIFICATION&action.time_created=2024-07-03T15%3A24%3A23.402Z”; X-GP-Signature = "8174e708320993a2083d82c097cbb148f1dcf381fb33ca85495fdc672c219e52d0ba19dab2f15460b00f80727fc952ad23cf9390b1af49227d8f6acd81205c14"; remainingQueryStringToHash = “id=TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181&status=PENDING&reference=44819181&payment_method.result=01&payment_method.message=PENDING&provider=testpay&apm.wait_notification=&apm.optional_redirect=&apm.fund_status=NOT_EXPECTED&apm.payment_description=546CCB7&apm.confirmed_accountholder=&apm.account_number=&country=DE&apm.bank.iban=&apm.bank.identifier_code=&apm.bank.name=&apm.bank.code=&action.id=ACT_UWGHF3hQxRmfe9im2W7AmSLUdXB1Rb&action.type=RETURN_NOTIFICATION&action.time_created=2024-07-03T15%3A24%3A23.402Z”; appKey = "WinZP9PgPfVZuTi4"; stringToHash = body + app_key; stringToHash = 'id=TRN_wRWA1rOQeVRDUOafRmirrpYPURPODJ_44819181&status=PENDING&reference=44819181&payment_method.result=01&payment_method.message=PENDING&provider=testpay&apm.wait_notification=&apm.optional_redirect=&apm.fund_status=NOT_EXPECTED&apm.payment_description=546CCB7&apm.confirmed_accountholder=&apm.account_number=&country=DE&apm.bank.iban=&apm.bank.identifier_code=&apm.bank.name=&apm.bank.code=&action.id=ACT_UWGHF3hQxRmfe9im2W7AmSLUdXB1Rb&action.type=RETURN_NOTIFICATION&action.time_created=2024-07-03T15%3A24%3A23.402ZWinZP9PgPfVZuTi4'; hashedString = SHA512(stringToHash); hashedString = '8174e708320993a2083d82c097cbb148f1dcf381fb33ca85495fdc672c219e52d0ba19dab2f15460b00f80727fc952ad23cf9390b1af49227d8f6acd81205c14' IF X-GP-Signature == hashedString { All Good } IF X-GP-Signature != hashedString { Issue } ``` # Postman Collection Source: https://developer.globalpayments.com/api/postman-collection/overview.md Section: API References Description: Import our Postman collection for easier integration with our API Our API Postman collection is available for importing. The collection includes the REST API for Transaction Processing, Fraud Management, Settlement Reporting, Dispute Management, and more. The collection will be updated periodically, so keep checking back. Keep in mind that you'll need to import the collection again when a new version of the REST API is released in order to get any new updates. To view, import, or fork our API collection in Postman, click the button below: > The below link is for merchant processing. If you are looking for partner functionality, please reach out to your integration support contact. To download the environment for your Postman collection, click the Download button below: [Download Environment](/gh-assets/resources /REST API Environment (Merchant).postman_environment.json) Not currently using Postman? [Create a free account](https://identity.getpostman.com/login) and give it a try. It's a simple collaborative platform with an extensive range of features to help you interact more seamlessly with our API. Postman can be run in a web browser (Chrome, Firefox, and Edge), Microsoft Windows (v4.4.3 or higher), or in the [Postman app](https://www.postman.com/downloads/). # API Explorer Source: https://developer.globalpayments.com/api/overview.md Section: API References Description: Test code interactively and explore the details of our API resources Our REST API is a single point of integration that provides access to a vast worldwide payments ecosystem. It easily enables the processing of payments in person, on a website, or within an application (in-app). You can use it to manage transactions, disputes, and deposits across a multitude of currencies, payment methods, and regions. This overview shows you how to use our interactive API Explorer, provides a link to Postman to view our API collection, and identifies some key API resources to get you started (for more information about our resources and their related actions, see [Resources & Actions](https://developer.globalpayments.com/api/definitions/resources-actions.md) in API Definitions). ## How it works ### Resources & actions In the API Explorer, each resource has a separate page for its associated API actions of GET, POST, or PATCH. For example, for the Transactions resource, you can directly go to an API action such as `[POST] Create` by clicking it on the left menu. Each API action page contains the complete list of parameters in the left column, grouped by Header, Request, Response, and so on. In the right column is the related endpoint at the top and an interactive code playground (black window) to call our API using JSON or cURL. The response window is right below it where you can see both success and failure model responses. ![API Explorer Action Page.](https://developer.globalpayments.com/gh-assets/api-explorer_action-page.png) **API Explorer Action Page - [POST Create]** ### Code playground In our code playground, we provide a model request sample to get you started, with separate tabs for the URL & Query (endpoint), Headers, and Body. You can use the Switch Example arrow to see other examples. Add your own values and run a test directly on the page. You can reset the code back to the model at any time. To better see the relevant parameters in the left column for the selected example, switch on the Highlight Properties feature. After running a test, the Response appears in the window directly below, so you can instantly see how it worked. For better viewing of the request or response, use the expand icon to open it in a separate window (as shown below). When finished, click the collapse icon. ![Response Model in a Separate Window.](https://developer.globalpayments.com/gh-assets/api-explorer_popup.png) **Response Model in a Separate Window** ## View in Postman If you prefer to view our collection of API resources and methods in Postman, click the button below. You can also import or fork the collection.   ## Basic API Actions ### [Access Token](https://developer.globalpayments.com/api/access-token.md) Create an access token to execute an API action. ### [Transactions](https://developer.globalpayments.com/api/transactions.md) Transfer funds between payer and merchant, and get transaction records. ## Manage risk ### [Authentications](https://developer.globalpayments.com/api/authentications.md) Request payer validation from the card issuer to support 3D Secure requirements. ### [Risk Assessments](https://developer.globalpayments.com/api/risk-assessments) Determine fraud risk for a transaction, payer, or payment method. ### [Stored Payment Methods](https://developer.globalpayments.com/api/payment-methods-tokenization.md) Use a token to securely store sensitive information for future sales and refunds. ### [Payers](https://developer.globalpayments.com/api/payers.md) Store customer details such as name, addresses, and payment methods to use for future transactions. ### [Verifications](https://developer.globalpayments.com/api/verifications.md) Verify a payment method to create a transaction at a later time. ## Manage transaction data ### [Actions](https://developer.globalpayments.com/api/actions.md) Report on all aspects of your app's usage of our API. ### [Batches](https://developer.globalpayments.com/api/batches.md) Close card-present batches and review them. ### [Deposits](https://developer.globalpayments.com/api/deposits) Obtain details of each deposit to your bank account. ### [Disputes](https://developer.globalpayments.com/api/disputes.md) Manage dispute queries and chargebacks. ### [Reports](https://developer.globalpayments.com/api/reports.md) Get available reports for a merchant. ## Expand your integration ### [Currency Conversion](https://developer.globalpayments.com/api/currency-conversion.md) Dynamically convert the transaction amount to the payer's currency. ### [Links](https://developer.globalpayments.com/api/links.md) Provide a unique payment link to your customer. ### [Installments](https://developer.globalpayments.com/api/installments.md) Allow Visa customers to pay for their purchases over time. # Access Token Source: https://developer.globalpayments.com/api/access-token.md Section: API References # Accounts Source: https://developer.globalpayments.com/api/accounts.md Section: API References # Actions Source: https://developer.globalpayments.com/api/actions.md Section: API References # Authentications Source: https://developer.globalpayments.com/api/authentications.md Section: API References # Batches Source: https://developer.globalpayments.com/api/batches.md Section: API References # Consents Source: https://developer.globalpayments.com/api/consents.md Section: API References # Currency Conversion Source: https://developer.globalpayments.com/api/currency-conversion.md Section: API References # Disputes Source: https://developer.globalpayments.com/api/disputes.md Section: API References # Funds Source: https://developer.globalpayments.com/api/funds.md Section: API References # Installments Source: https://developer.globalpayments.com/api/installments.md Section: API References # Links Source: https://developer.globalpayments.com/api/links.md Section: API References # Merchants Source: https://developer.globalpayments.com/api/merchants.md Section: API References # Payers Source: https://developer.globalpayments.com/api/payers.md Section: API References # Reports Source: https://developer.globalpayments.com/api/reports.md Section: API References # Orders Source: https://developer.globalpayments.com/api/orders.md Section: API References # Payment Methods Source: https://developer.globalpayments.com/api/payment-methods-tokenization.md Section: API References # Settlement Reporting Source: https://developer.globalpayments.com/api/settlement-reporting.md Section: API References # Transactions Source: https://developer.globalpayments.com/api/transactions.md Section: API References # Transfers Source: https://developer.globalpayments.com/api/transfers.md Section: API References # Verifications Source: https://developer.globalpayments.com/api/verifications.md Section: API References # Test Cards Source: https://developer.globalpayments.com/resources/test-cards.md Section: Resources Description: Use our simulated credit cards or banks to try different scenarios When testing your integration, you should never use real card details or banking information. That’s why we provide simulated payment methods such as test card numbers, test banks (for Open Banking), and even test installment plans (for Visa Installment Service). Use these resources to test different scenarios for your application or website. > When using the cards, either through the API or Hosted Payment Page, you can enter any cardholder name, security code, and future-dated expiry. ## Successful | Card Number | Card Type | Result | Code | Description | | -------- | -------- | -------- | -------- | -------- | | 4263970000005262 | Visa | Successful | 00 | Successful transaction | | 5425230000004415 | Mastercard | Successful | 00 | Successful transaction | | 374101000000608 | American Express | Successful | 00 | Successful transaction | | 36256000000725 | Diners Club | Successful | 00 | Successful transaction | | 6011000000000087 | Discover | Successful | 00 | Successful transaction | | 3566000000000000 | JCB | Successful | 00 | Successful transaction | | 135400000007187 | UATP | Successful | 00 | Successful transaction | ## Declined | Card Number | Card Type | Result | Code | Description | | -------- | -------- | -------- | -------- | -------- | 4000120000001154 | Visa | Declined | 101 | Declined by the bank | 4000130000001724 | Visa | Declined | 102 | Referral B | 4000160000004147 | Visa | Declined | 103 | Referral A - Card reported lost/stolen | 4009830000001985 | Visa | Declined | 200 | Communication Error | 4242420000000091 | Visa | Declined | 111 | Strong Customer Authentication Required | 5114610000004778 | Mastercard | Declined | 101 | Declined by the bank | 5114630000009791 | Mastercard | Declined | 102 | Referral B | 5121220000006921 | Mastercard | Declined | 103 | Referral A - Card reported lost/stolen | 5135020000005871 | Mastercard | Declined | 200 | Communication Error | 5100000000000131 | Mastercard | Declined | 111 | Strong Customer Authentication Required | 376525000000010 | American Express | Declined | 101 | Declined by the bank | 375425000000907 | American Express | Declined | 102 | Referral B | 343452000000306 | American Express | Declined | 103 | Referral A - Card reported lost/stolen | 372349000000852 | American Express | Declined | 200 | Communication Error | 374205502001004 | American Express | Declined | 111 | Strong Customer Authentication Required | 36256000000998 | Diners Club | Declined | 101 | Declined by the bank | 36256000000634 | Diners Club | Declined | 102 | Referral B | 38865000000705 | Diners Club | Declined | 103 | Referral A - Card reported lost/stolen | 30450000000985 | Diners Club | Declined | 200 | Communication Error | 6011000000001010 | Discover | Declined | 101 | Declined by the bank | 6011000000001028 | Discover | Declined | 102 | Referral B | 6011000000001036 | Discover | Declined | 103 | Referral A - Card reported lost/stolen | 6011000000002000 | Discover | Declined | 200 | Communication Error | 3566000000001016 | JCB | Declined | 101 | Declined by the bank | 3566000000001024 | JCB | Declined | 102 | Referral B | 3566000000001032 | JCB | Declined | 103 | Referral A - Card reported lost/stolen | 3566000000002006 | JCB | Declined | 200 | Communication Error | 135400000009712 | UATP | Declined | 101 | Declined by the bank | 135400000007633 | UATP | Declined | 102 | Referral B | 135400000000281 | UATP | Declined | 103 | Referral A - Card reported lost/stolen | 135400000005637 | UATP | Declined | 205 | Communication Error | ## DCC ### Without 3D Secure authentication Use the following cards to test Dynamic Currency Conversion (DCC) **without** 3D Secure authentication. | Card Number | Card Type | Result | Code | Description | Currency | | -------- | -------- | -------- | -------- | -------- | -------- | | 4006097467207025 | DCC | Successful | 00 | Successful transaction | AUD | | 4002933640008365 | DCC | Successful | 00 | Successful transaction | EUR | ### With 3D Secure authentication Use the following cards to test DCC **with** 3D Secure authentication. | Card Number | Card Type | Result | Code | Description | Currency | | -------- | -------- | -------- | -------- | -------- | -------- | | 4222000001227408 | DCC | Challenge_Required | N/A | Challenged Trx | USD | | 4263970000005262 | DCC | Authentication_Successful | 00 | Successful Trx | EUR | ## 3D Secure 2 We provide a Simulator issuer access control server (ACS) that allows you to test different 3D Secure scenarios for Visa or Mastercard. ### Visa #### Visa Message Version 2.2†† | Card Number | Flow Type | Transaction Result | ECI† | | -------- | -------- | -------- | -------- | | 4222000006285344 | Frictionless | AUTHENTICATION_SUCCESSFUL | 05 | | 4222000009719489 | Frictionless | AUTHENTICATION_SUCCESSFUL - No Method URL | 05 | | 4222000005218627 | Frictionless | AUTHENTICATION_ATTEMPTED_BUT_NOT_SUCCESSFUL | 06††† | | 4222000002144131 | Frictionless | AUTHENTICATION_FAILED | 07 | | 4222000007275799 | Frictionless | AUTHENTICATION_ISSUER_REJECTED | 07 | | 4222000008880910 | Frictionless | AUTHENTICATION_COULD_NOT_BE_PERFORMED | 07 | | 4222000001227408 | Challenge | CHALLENGE_REQUIRED | N/A | † The expected ECI value associated with the corresponding transaction status. ++Note++: Values may vary depending on the card issuer; however, the ECI will always indicate if there is a liability shift in favor of the merchant or not and can be used as a guide on whether to proceed to authorization. †† X-GP-VERSION: 2.2.0 is required to allow the use of the new message version 2.2 fields and values. ††† Transaction was attempted but not successful; however, the bank is still willing to offer chargeback protection, so the transaction proceeds. Success is expected in this scenario. ### Mastercard #### Mastercard Message Version 2.2†† | Card Number | Flow Type | Transaction Result | ECI† | | -------- | -------- | -------- | -------- | | 5354560000000004 | Frictionless | AUTHENTICATION_SUCCESSFUL | 02 | | 5571596304025153 | Frictionless | AUTHENTICATION_SUCCESSFUL - No Method URL | 02 | | 5580364874958322 | Frictionless | AUTHENTICATION_ATTEMPTED_BUT_NOT_SUCCESSFUL | 01 | | 5540010585397800 | Frictionless | AUTHENTICATION_FAILED | 00 | | 5588312194362669 | Frictionless | AUTHENTICATION_ISSUER_REJECTED | 00 | | 5520680211891022 | Frictionless | AUTHENTICATION_COULD_NOT_BE_PERFORMED | 00 | | 5506874496684651 | Challenge | CHALLENGE_REQUIRED | N/A | † The expected ECI value associated with the corresponding transaction status. ++Note++: Values may vary depending on the card issuer; however, the ECI will always indicate if there is a liability shift in favor of the merchant or not and can be used as a guide on whether to proceed to authorization. †† X-GP-VERSION: 2.2.0 is required to allow the use of the new message version 2.2 fields and values. ## Apple Pay Based on the amount specified in the token, the Sandbox environment maps the tokenized data in the transaction to one of our test cards. Any card details can be used in the token — they won't be logged, stored, or used for transaction processing. The table below lists the amount to specify in your Apple Pay token to test Visa and Mastercard (MC) and result scenarios. > Important : Apple requires an [Apple sandbox account](https://developer.apple.com/apple-pay/sandbox-testing/) and the use of the test cards listed there only. ### Standard testing | Amount in Token | Card Type | Result Code | Message | AVS Postcode Result | AVS Address Result | | -------- | -------- | -------- | -------- | -------- | -------- | | 10.00 | VISA | 00 | Successful | | | | 11.01 | VISA | 101 | Declined | | | | 11.02 | VISA | 102 | Referral B | | | | 11.03 | VISA | 103 | Referral A | | | | 12.05 | VISA | 200 | Comms Error | | | | 20.00 | MC | 00 | Successful | | | | 21.01 | MC | 101 | Declined | | | | 21.02 | MC | 102 | Referral B | | | | 21.03 | MC | 103 | Referral A | | | | 22.05 | MC | 200 | Comms Error | | | ### AVS/CVN-specific testing | Amount in Token | Card Type | Result Code | Message | AVS Postcode Result | AVS Address Result | | -------- | -------- | -------- | -------- | -------- | -------- | | 43.00 | VISA | 101 | Declined | U | U | | 43.01 | VISA | 101 | Declined | I | I | | 43.02 | VISA | 101 | Declined | P | P | | 43.03 | VISA | 101 | Declined | M | M | | 43.04 | VISA | 101 | Declined | M | N | | 43.05 | VISA | 101 | Declined | N | M | | 43.06 | VISA | 101 | Declined | N | N | | 53.00 | MC | 00 | Successful | U | U | | 53.01 | MC | 00 | Successful | I | I | | 53.02 | MC | 00 | Successful | P | P | | 53.03 | MC | 00 | Successful | M | M | | 53.04 | MC | 00 | Successful | M | N | | 53.05 | MC | 00 | Successful | N | M | | 53.06 | MC | 00 | Successful | N | N | ### Error | Amount in Token | Card Type | Result Code | | -------- | -------- | -------- | | Any other amount | 108 | Using test system. Please use predefined Apple Pay test amounts only. See documentation. | ## Google Pay Based on the amount specified in the token, the Sandbox environment maps the tokenized data in the transaction to one of our test cards. Any card details can be used in the token — they won't be logged, stored, or used for transaction processing. The table below lists the amount to specify in the request to test Visa and Mastercard (MC) and result scenarios. > Important \- Google requires the use of live cards for sandbox testing \- the cards will not be charged ( this is flagged in the google modal) ### Standard testing | Amount in Token | Card Type | Result Code | Message | AVS Postcode Result | AVS Address Result | | -------- | -------- | -------- | -------- | -------- | -------- | | 10.00 | VISA | 00 | Successful | | | | 11.01 | VISA | 101 | Declined | | | | 11.02 | VISA | 102 | Referral B | | | | 11.03 | VISA | 103 | Referral A | | | | 12.05 | VISA | 200 | Comms Error | | | | 20.00 | MC | 00 | Successful | | | | 21.01 | MC | 101 | Declined | | | | 21.02 | MC | 102 | Referral B | | | | 21.03 | MC | 103 | Referral A | | | | 22.05 | MC | 200 | Comms Error | | | ### AVS/CVN-specific testing | Amount in Token | Card Type | Result Code | Message | AVS Postcode Result | AVS Address Result | | -------- | -------- | -------- | -------- | -------- | -------- | | 43.00 | VISA | 101 | Declined | U | U | | 43.01 | VISA | 101 | Declined | I | I | | 43.02 | VISA | 101 | Declined | P | P | | 43.03 | VISA | 101 | Declined | M | M | | 43.04 | VISA | 101 | Declined | M | N | | 43.05 | VISA | 101 | Declined | N | M | | 43.06 | VISA | 101 | Declined | N | N | | 53.00 | MC | 00 | Successful | U | U | | 53.01 | MC | 00 | Successful | I | I | | 53.02 | MC | 00 | Successful | P | P | | 53.03 | MC | 00 | Successful | M | M | | 53.04 | MC | 00 | Successful | M | N | | 53.05 | MC | 00 | Successful | N | M | | 53.06 | MC | 00 | Successful | N | N | ### Error | Amount in Token | Card Type | Result Code | | -------- | -------- | -------- | | Any other amount | 108 | Using test system. Please use predefined Google Pay test amounts only. See documentation. | ## Open Banking Each test bank provides a different result, as shown in the table below. | Test Bank | Currency | Result | Webhook | Notes | | -------- | -------- | -------- | -------- | -------- | | Natwest | £ | Pending or Decline | Yes | Declines if the transaction amount is above the balance. | | Lloyds | £ | Pending Only | No | | | Ozone Modelo | £ | Success and Pending | No | Each “debtor account” provides a different outcome. | | Commerzbank | € | Success Only | No | Select “Germany” first to see this bank option. | | Deutsche Bank | € | Payment Not Complete | No | Select “Germany” first to see this bank option. | The following table provides the login information for each test bank. | Test Bank | Username | Password | IBAN | | -------- | -------- | -------- | -------- | | Natwest | 123456789012 | 5-7-2-4-3-6 | N/A | | Lloyds | llr001 | Password123 | N/A | | Ozone Modelo | mits | mits | N/A | | Commerzbank | N/A | N/A | FR5191497531710377217771433 | | | Branch | Account | | | Deutsche Bank | 648 | 1094846 | FR5191497531710377217771433 | ## Card Blocking Use these test cards for the Enhanced Card ID service. | Card Number | Brand | Type | Response Code | Response Text | CVV Response | AVS Postcode | AVS Address | | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | | 4400000000000008 | VISA | Standard Debit | 00 | Authorized | M | M | M | | 4095790000000004 | VISA | Standard Credit | 00 | Authorized | M | M | M | | 5200000000000007 | MC | Standard Debit | 00 | Authorized | M | M | M | | 5275000000000007 | MC | Commercial Credit | 00 | Authorized | M | M | M | | 5348500000000009 | MC | Commercial Credit | 00 | Authorized | M | M | M | ## Network tokens - CSS The following cards can be used for testing network tokens as part of our Card Storage Service (CSS). | Card Number | Expiry (mmyy) | Result | | --- | --- | --- | | 4622943123052970 | 1225 | Network token returned in response. | | 5186151950000055 | 1225 | Network token returned in response. | | 370295069663597 | 1225 | Network token returned in response. | ## Click to Pay ### VISA: | Flow | PAN | Expiry | CVV | Description | | :---- | :---- | :---- | :---- | :---- | | Approved Flow | 4395840190010011 | 12/27 | 840 | Frictionless Flow. | | Challenged Approved | 4395840118000110 | 12/27 | 240 | Triggers OTP challenge Flow. | | Challenged Failed | 4395840118000110 | 12/25 | 448 | Triggers OTP challenge Flow. After 3 unsuccessful tries returns an N (Authentication Failed) | ### Mastercard | Flow | PAN | Expiry | CVV | Description | | :---- | :---- | :---- | :---- | :---- | | Approved Flow | 5120350100064537 | Any Future Date | Any 3 digits | Frictionless Flow. | | Approved Flow | 5120350100064545 | Any Future Date | Any 3 digits | Approval | ## Thank You Points | Card type | Card Number | Result | | :--- | :--- | :--- | | Visa | 4391200100101497 | Successful | | MasterCard | 5288519105988050 | Successful | ## Installments The valid amounts to get plans in the sandbox: 100000, 200000, 160000, 80000, 75000, 50000, 45000 | Card type | Card Number | Result | | :--- | :--- | :--- | | Visa | 4263970000005262 | Successful | | Visa | 4000120000001154 | Declined | | MasterCard | 5425230000004415 | Successful | | MasterCard | 5114610000004778 | Declined | # API responses Source: https://developer.globalpayments.com/resources/responses.md Section: Resources Description: A guide to all of our API response messages > Do not code to the detailed_error_description field value as that verbiage may change. ## HTTP status codes The HTTP status codes indicates at a high level whether the API call was successful or not. For example, the _200 OK_ code indicates the successful execution of the API call and that there were no errors. Any non-200 http status code indicates an error. | HTTP Status Code | Message | Description | | -------- | -------- | -------- | | 200 | OK | This represents a successful API action. | | 400 | Bad Request | Error: The API request has an error in it. | | 401 | Not Authenticated | Error: Can’t authenticate with those credentials. Need to get a new access token. | | 403 | Forbidden | Error: Don’t have permission to execute that API action. | | 404 | Resource Not Found| Error: the resource referenced in the request cannot be found. | | 405 | Method Not Allowed | Error: The HTTP request method is not supported for the requested resource. | | 409 | Duplicate | Error: The API request was blocked as it is seen as a duplicate action that must not processed. | | 500 | Internal Server Error | Error: Something unexpected happened. | | 502 | Bad Gateway | Error: Something unexpected happened when communicating with another system. | | 504 | Timeout | Error: API did not get a response from another system in the expected timeframe. | ## Action response With every successful action, the following data is returned as part of the response. | Property | Description | | ------- | -------- | | id | Unique ID for that action. For example: ACT_udnMIdFzIcLC0kt6GatzZLsmyhvBXj | | type | The type of action execute. For example: AUTHORIZE, REFUND, REVERESE | | time_created | The time the action executed in ISO8601. For example: 2025-03-20T13:44:14.327Z | | result_code | The result of the action from us. For example: SUCCESS or DECLINED | | app_id | The unique ID of the app used to create the token associated with the executed action. For example: F45as8i3eaLHNfgsa12a4dEA2sddaA | ### Sample response ```JSON ..... "action": { "id": "ACT_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "type": "AUTHORIZE", "time_created": "2024-01-20T13:44:14.327Z", "result_code": "SUCCESS", "app_id": "MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "my_sandbox_app" } } ``` ### Action result_code The result of a successful API action is recorded in the `action.result_code` field as it always contains the API's result for the action. | action.result_code | Description | Examples | | ------- | ------- | ------- | | SUCCESS | indicates the action executed successfully.| When authorizing a card this means the card issuer authorized the transaction. | | DECLINED | indicates the action DECLINED. This means to consider that payment is not allowed and goods or services should not be provided. | When authorizing a card this means the card issuer declined the transaction. | | PENDING | indicates the result is not known but a final result will be subsequently provided. When the result is known result_code changes from PENDING to a SUCCESS, DECLINED or ERROR result_code.| This is result_code is currently only applicable for certain Asia Pacific payments methods when trying to void or reverse them. | | ERROR | indicates the action was PENDING but when the final result was known, it had erred. | This is result_code is currently only applicable for certain Asia Pacific payments methods when trying to void or reverse them.| ### Payment method result & message When processing transactions using a payment method (for example, a card), there are other fields in the response from the card provider that an integrator can examine to get more information about the response. | Area | Description | Examples | | ------- | ------- | ------- | | Payment Method Result & Message | Indicates the payment method provider's result and associated message. | If a card authorization declines, the payment_method result and message include more detail from the Issuer on why it was declined. For example, 51 - INSUFFICIENT FUNDS. This is generated by the issuing bank, who will provide decline codes in the response back to the authorization platform. | ### Sample response ```JSON 200 OK # <--- HTTP Status Code { "id": "TRN_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "time_created": "2024-01-20T13:44:14.327Z", "type": "SALE", "status": "CAPTURED", # <--- Status "channel": "CP", "capture_mode": "AUTO", "amount": "20045", "currency": "CAD", "merchant_id": "MER_8096479c606f4deb93dfab49e7bfea28", "merchant_name": "SANDBOX_MERCHANT", "account_id": "TRA_0b1fcc7cceea48dea38d044bae4295c2", "account_name": "Termiinal_55", "reference": "03559571", "payment_method": { "result": "00", # <--- Payment Method Result "message": "APPROVAL", # <--- Payment Method Message "entry_mode": "MANUAL", "card": { "brand": "VISA", "masked_number_last4": "XXXXXXXXXXXX4242", "authcode": "351404", "brand_reference": "772201652998701", "tag_response": "", "cvv_result": "MATCHED", "avs_address_result": "0", "avs_postal_code_result": "0", "avs_action": "" } }, "batch_id": "BAT_353445", "action": { "id": "ACT_noXZxzpagCCMyJT08Sz2tGkPji8WXN", "type": "AUTHORIZE", "time_created": "2024-01-20T13:44:14.327Z", "result_code": "SUCCESS", # <--- Action Result Code "app_id": "APP_MN500Q8lk5jp0rEmB5LGvTo27gdQgZln", "app_name": "my_sandbox_app" } } ``` ## Successful responses - 200 OK These are API actions that executed successfully and did not error. They will return an action object in the response message. > A DECLINED card transaction still returns a 200 OK as the action did execute successfully end to end, but the cardholder’s issuing bank declined the transaction. > The _action.result_code_ must also be examined. For more information, see the [Action result_code](#action-result_code) section. ## Error responses If the HTTP Status Code is 4xx or 5xx, then an error has occurred. Error responses contain the following fields. | Property | Description | | -------- | -------- | | error_code | Categorizes the error into a specific group. | | detailed_error_code | Specific code used to uniquely identify the error. | | detailed_error_description | Detailed verbiage of the specific error. | #### Sample error response ```JSON 401 Not Authenticated # <--- HTTP Status Code & Error Object { "error_code": "NOT_AUTHENTICATED", "detailed_error_code": "40001", "detailed_error_description": "Invalid Access Token" } ``` > Do not code to the _detailed_error_description_ field value as that verbiage may change. The following tables outline the implemented HTTP Status Codes, `error_code`, `detailed_error_code`, and `detailed_error_description` that the API can return when an error is encountered. ## 400 - Bad Request | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40224 | Can't CAPTURE a Transaction that is already CAPTURED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40226 | Can't reverse this transaction. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40225 | Currency Mis-match | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40223 | Request expects the batch_id. | | 400 | Bad Request | INVALID_PAYMENT_METHOD_ACTION | 40227 | Retrieve information about this payment method is not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40141 | Invalid value provided in the input field - system.name. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | `field_name` contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | `field_name` contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | `field_name` contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40118 | `RESOURCE` `RESOURCE_ID` not found at this location. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40005 | $[1].dependency' cannot be empty. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40192 | 100003 ACCT# INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40153 | 100003 AMOUNT NOT ALLOWED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40152 | 100003 AUTH CODE NOT ALLOWED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40183 | 100003 CARD TYPE DISABLED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40190 | 100003 CVV NOT ALLOWED | | 400 | Bad Request | INVALID_REQUEST_DATA | 40182 | 100003 DATA INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40185 | 100003 ENCRYPTION ERROR | | 400 | Bad Request | INVALID_REQUEST_DATA | 40155 | 100003 MERCHANT FEE ONLY FOR CB | | 400 | Bad Request | INVALID_REQUEST_DATA | 40184 | 100003 PLZ VOID ADDTIP | | 400 | Bad Request | INVALID_REQUEST_DATA | 40186 | 100003 SAF MODE VALUE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40181 | 100003 ZIP CODE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40191 | 100003 ZIPCODE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40193 | 100015 CVV ERROR | | 400 | Bad Request | INVALID_REQUEST_DATA | 40194 | 100016 AVS ERROR | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40188 | 100020 CANNOT ADJUST | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40189 | 100021 ALREADY VOIDED/ ALREADY COMPL | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40018 | 11, Original transaction not CPC. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40054 | 111, Invalid value provided in the input field page. Must be greater than 0. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40019 | 12, Invalid CPC data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40020 | 13, Invalid edit data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40021 | 14, Invalid card number. | | 400 | Bad Request | INVALID_BATCH_ACTION | 40022 | 15, Batch close in progress. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40023 | 16, Invalid Ship Date. Transaction rejected because the ship date and month are invalid. Try again in a few seconds and resubmit. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40024 | 17, Invalid encryption version. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40025 | 18, E3 MSR failure. The message returned with this code is the parsed error message from the MSR data stream. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40026 | 9, Invalid Reversal Amount. Occurs if a reversal request includes a new settlement amount that is not less than the current total authorization amount. the total authorization amount is the original authorization plus any incremental authorization minus any previous reversal amounts. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40012 | 3, Invalid original transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40027 | 32, Missing KTB error. Occurs when a POS is attempting to send encrypted data, but the expected KTB value was corrupted or not received. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40028 | 33, Missing KSN error. Occurs when a POS is attempting to send encrypted data, but the expected KSN value was corrupted or not received. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40029 | 34, Invalid data received. Returned from a CreditAuth or CreditSale if both GatewayTxnId and a CardData subfield are received. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40044 | 6, Invalid original transaction for reauthorization. Returned from a CreditAuth or CreditSale if the original transaction referenced by GatewayTxnId cannot be found. this is typically because the original does not meet the criteria for the sale or authorization by GatewayTxnID. Can also be returned if the original transaction is found but the card number was written over with nulls after 30 days. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40030 | 37, Missing element. Returned if a required (or conditional) element is missing from the transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40031 | 38, Invalid auth amount. Returned from a CreditAuth or CreditSale by GatewayTxnId when the requested amount is over the threshold set for the transaction type, which is some percentage of the original amount (default = 100%). | | 400 | Bad Request | INVALID_REQUEST_DATA | 40032 | 39, Transaction rejected because EMV TLV data was invalid. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40013 | 4, Transaction already associated with batch. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40033 | 40, Transaction rejected because the referenced transaction has invalid EMV TLV data. | | 400 | Bad Request | INVALID_BATCH_ACTION | 40014 | 5, No current batch. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40015 | 6, Invalid return amount. Occurs if a credit return request is against a specific original transaction and the return amount is greater than the original transaction’s settle amount—or the return amount is zero. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40016 | 8, Bad track data. | | 400 | Bad Request | INVALID_BATCH_ACTION | 40017 | 9, No transaction associated with batch. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40108 | Action cannot be completed. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | Amount contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40162 | avs_address contains unexpected data. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40037 | Can't ADJUST a transaction without a status of CAPTURED or PREAUTHORIZED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40035 | Can't CAPTURE a transaction without a status of PREAUTHORIZED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40038 | Can't REFUND a transaction without a status of CAPTURED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40009 | Can't REVERSE a transaction without a status of CAPTURED or PREAUTHORIZED. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40010 | Can't REVERSE a transaction that is already REVERSED. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40218 | Cannot include both payment_method.id and card.number in this request. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | cashback_amount contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40006 Dependency cannot be executed. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60012 | Device error: CAPK Expired. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60001 | Device error: Card Expired. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60006 | Device error: Chip Blocked. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60008 | Device error: Chip Blocked. | | 400 | Bad Request | DEVICE_INPUT_INVALID 60007 | Device error: Chip Error. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60016 | Device error: Chip Error. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60004 | Device error: Chip Malfunction. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60009 | Device error: Chip Not Accepted. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60005 | Device error: Chip Read Error. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60011 | Device error: Chip Reject. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60010 | Device error: Chip Reject Approval. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60019 | Device error: Contactless failed. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60015 | Device error: Device memory is overflow. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60013 | Device error: No PIN Pad. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60014 | Device error: PIN Pad can’t be used. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60003 | Device error: PIN Pad Failure. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60002 | Device error: PIN Pad Timeout. | | 400 | Bad Request | USER_ABORTED | 40146 | Device error: 100002 ABORTED. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40147 | Device error: 100028 TAX EXCEED AMT. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40148 | Device error: 100003 CARDTYPE ONLY FOR CREDIT. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40149 | Device error: 100003 UNSUPPORT CARDTYPE. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40195 | Device error: 100017 HALO EXCEED. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40203 | Device error: 100027 UNSUPPORT COMMAND. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60017 | Device error: Tap Not Accepted. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60021 | Device error: Tap Not Accepted - Try another card. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60018 | Device error: Tap Terminated. | | 400 | Bad Request | DEVICE_INPUT_INVALID | 60020 | Device error: Transaction should be declined by device. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40066 | Documents provided in the request are too large. Please correct and retry. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40177 | entry_mode contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40179 | entry_mode contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40161 | first_name, last_name contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40114 | from_deposit_time_created cannot be greater than the to_deposit_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40093 | from_adjustment_time_created cannot be greater than the to_adjustment_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40047 | from_adjustment_time_created cannot be greater than the to_adjustment_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40132 | from_batch_time_created cannot be greater than the to_batch_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40046 | from_stage_time_created cannot be greater than the to_stage_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40122 | from_time_created cannot be greater than the to_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40113 | from_time_created cannot be greater than to_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40127 | from_time_last_updated cannot be greater than the to_time_last_updated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | Funding contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | Funding contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | gratuity_amount contains unexpected data. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40045 | Input does not have any search criteria; please provide valid search criteria. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40219 | interval_to_expire contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40115 | Invalid from_time_created; date provided shouldn't be more than 2 years. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40095 | Invalid Date: Request rejected because the date and month are invalid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40049 | Invalid Date: Request rejected because the date and month are invalid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40059 | Invalid request. No value provided in field from_adjustment_time_created, but value provided in to_adjustment_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40058 | Invalid request. No value provided in field from_stage_time_created, but value provided in to_stage_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40053 | Invalid value provided in the input field - adjustment_funding. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40097 | Invalid value provided in the input field - brand. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40051 | Invalid value provided in the input field - brand. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40206 | Invalid value provided in the input field - developer_id. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40208 | Invalid value provided in the input field - email. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40104 | Invalid value provided in the input field - masked_account_number_last4. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40209 | Invalid value provided in the input field - mobile_phone. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40054 | Invalid value provided in the input field - offset. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40103 | Invalid value provided in the input field - order. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Invalid value provided in the input field - order_by. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40056 | Invalid value provided in the input field - order_by. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40057 | Invalid value provided in the input field - order. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40100 | Invalid value provided in the input field - page. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40101 | Invalid value provided in the input field - page_size. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40055 | Invalid value provided in the input field - page_size. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40207 | Invalid value provided in the input field - site_id. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40096 | Invalid value provided in the input field - stage. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40050 | Invalid value provided in the input field - stage. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40098 | Invalid value provided in the input field - status. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40052 | Invalid value provided in the input field - status. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40105 | Invalid value provided in the input field - system.hierarchy. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40106 | Invalid value provided in the input field - system.mid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40099 | Invalid value provided in the input field - amount. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40123 | Invalid value provided in the input field - expiry_month. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40124 | Invalid value provided in the input field - expiry_year. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40131 | Invalid value provided in the input field - from_batch_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40111 | Invalid value provided in the input field - from_deposit_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40091 | Invalid value provided in the input field - from_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40120 | Invalid value provided in the input field - from_time_created_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40128 | Invalid value provided in the input field - from_time_last_updated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40090 | Invalid value provided in the input field - Id. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40125 | Invalid value provided in the input field - number. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40129 | Invalid value provided in the input field - numberfirst6. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40130 | Invalid value provided in the input field - numberlast4. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40117 | Invalid value provided in the input field - permissions. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40119 | Invalid value provided in the input field - tid. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40133 | Invalid value provided in the input field - to_batch_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40112 | Invalid value provided in the input field - to_deposit_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40092 | Invalid value provided in the input field - to_time_created. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40121 | Invalid value provided in the input field - to_time_created_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40126 | Invalid value provided in the input field - to_time_last_updated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40176 | keyedCardData is not allowed with entry_mode value SWIPE. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40229 | Merchant Configuration does not exist for `merId`,`mmaId`. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40217 | Merchant configuration does not exist for this account: `account_id`. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40041 | Merchant configuration does not exist for: `TRA_ID`, `TRA_NAME`, `COUNTRY`,`CHANNEL`, `CURRENCY``PAYMENT_METHOD` `MMA_ID` `MER_ID` | | 400 | Bad Request | INVALID_REQUEST_DATA | 40216 | Merchant configuration invalid for this account. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40107 | Multiple accounts found; a specific account must be used in the request. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40145 | Partial authorization is not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40214 | Partial reversal not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40165 | payer.date_of_birth contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40166 | payer.email contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40168 | payer.email contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40163 | payer.mobile_phone or payer.landline_phone or shipping_address.mobile_phone contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40157 | Missing/Invalid Amount | | 400 | Bad Request | INVALID_REQUEST_DATA | 40158 | Missing/Invalid Input | | 400 | Bad Request | INVALID_REQUEST_DATA | 40159 | Invalid Amount | | 400 | Bad Request | INVALID_REQUEST_DATA | 40160 | Missing Payee Name | | 400 | Bad Request | INVALID_REQUEST_DATA | 40164 | Invalid SSN | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40169 | Resubmit not allowed for approved ACH transaction. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40170 | Resubmit not allowed for non ACH/Resubmit transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40171 | Format Error field details | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40180 | Invalid request for returning ACH transaction. Use AchReturn. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40016 | Device error: 100019 TRACK INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40086 | Device error: 100003 AMOUNT TOO LARGE | | 400 | Bad Request | INVALID_REQUEST_DATA | 40199 | Device error: 999985 Too many original transactions were found; please add other conditions. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40200 | Device error: 999983 Invalid URL | | 400 | Bad Request | INVALID_REQUEST_DATA | 40201 | Device error: 999979. This merchant sends BatchAll commands frequently; please try after a while. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40205 | Device error: 100003 EXP DATE INVALID | | 400 | Bad Request | INVALID_REQUEST_DATA | 40220 | Device error: 999998 Parameter Error | | 400 | Bad Request | INVALID_REQUEST_DATA | 40221 | Device error: 999997 Invalid POS information | | 400 | Bad Request | INVALID_REQUEST_DATA | 40178 | Sum of elements of group additional charges should not be greater than transaction amount. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - guest_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - order_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - payer_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - table_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - tax_exempt_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40102 | Request contains the following invalid fields - ticket_reference. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40006 | Request contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40043 | Request contains unexpected fields: payment_method. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40136 | Request expects account_name or account_id along with `request parameters` | | 400 | Bad Request | INVALID_REQUEST_DATA | 40007 | Request expects the following conditionally mandatory fields `field_list`. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40005 | Request expects the following field `field_list`. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40211 | Request expects the following field `field_list` from the Merchant. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40211 | Request expects the following field `field_list` from the Merchant. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40005 | Request expects the following field dependency. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40075 | Retrieving a list expects a date range to be populated. | | 400 | Bad Request | MANDATORY_DATA_MISSING | 40074 | Retrieving a List of Disputes expects the from_stage_time_created populated. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40085 | Multiple Scenarios Error Code: 509   NonNumeric in Credit card number. Invalid credit card length. Card number fails Luhn Check. Invalid expiry date. Invalid expiry date. Card Expiry date in past. Expiry month invalid. That Card Number does not correspond to the card type you selected. Length of CVV data is incorrect. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40086 | Error Code: 510 That amount is greater than the max allowed. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40087 | Multiple Scenarios Error Code: 512   This transaction was already rebated and cannot be rebated again. You can't refund a delayed transaction that was not sent for settlement. You are refunding money to a customer that was not and never will be charged. Original transaction currency was not currency. | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40088 | Error code : 513 Can't void a settled transaction. | | 400 | Bad Request | INVALID_REQUEST_DATA | 50020 | error code - 508 | | 400 | Bad Request | MANDATORY_DATA_MISSING | 50021 | 502 | | 400 | Bad Request | INVALID_REQUEST_DATA | 50025 | 550 | | 400 | Bad Request | INVALID_REQUEST_DATA | 50027 | 520 | | 400 | Bad Request | INVALID_TRANSACTION_ACTION | 40036 | Transaction already captured. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | seconds_to_expire contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | tax_amount contains unexpected data. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40072 | The dispute stage, Retrieval, can be challenged with a single document only. Please correct the request and resubmit. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40174 | track data is not allowed with entry_mode value EMAIL. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40175 | track data is not allowed with entry_mode value INTERNET. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40172 | track data is not allowed with entry_mode value MANUAL. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40173 | track data is not allowed with entry_mode value PHONE. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40215 | Reversal with greater amount than original amount not supported. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40212 | Transaction declined; cannot find DCC information for the card. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40212 | Transaction declined; cannot find DCC information for the card. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40069 | Unable to accept as existing record is financially closed. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40068 | Unable to accept as existing record is Under Review. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40067 | Unable to accept for that id. Please check the Case id again. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40070 | Unable to accept; please try again after some time. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40062 | Unable to challenge as existing record is financially closed. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40061 | Unable to challenge as existing record is Under Review. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40064 | Unable to challenge as Invalid document provided in the request. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40065 | Unable to challenge as No document provided with the request. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40060 | Unable to challenge for that id. Please check the Case id again. | | 400 | Bad Request | INVALID_DISPUTE_ACTION | 40063 | Unable to challenge, please try again after some time. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40213 | user_reference contains unexpected data. | | 400 | Bad Request | INVALID_REQUEST_DATA | 40167 | user_reference contains unexpected data. | ## 401 - Not Authorized | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 401 | Not Authenticated | NOT_AUTHENTICATED | 40001 | Invalid access token. | | 401 | Not Authenticated | NOT_AUTHENTICATED | 40002 | Access token expired. | | 401 | Not Authenticated | NOT_AUTHENTICATED | 40142 | Merchant info is not active. | ## 403 - Forbidden | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40003 | Access token and merchant info do not match. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40004 | App credentials not recognized. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40212 | Permission not enabled to execute action. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40228 | Merchant Configuration does not exist for an active `merId`,`mmaId` along with required permission to execute action. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 40202 | Device error: 999962. This Host was inactivated. | | 403 | Forbidden | ACTION_NOT_AUTHORIZED | 50022 | 503 | ## 404/405 - Not Found | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 404 | Not Found | RESOURCE_NOT_FOUND | 40116 | `RESOURCE` `RESOURCE_ID` not found at this location. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40118 | `RESOURCE` `RESOURCE_ID` not found at this location. | | 404 | Not Found | n/a | n/a | API not found for requested URI. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40071 | No document found; please recheck the values provided. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40196 | Device error: 999988. This transaction does not exist. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40198 | Device error: 999986. This batch does not exist. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40008 | Transaction to action cannot be found. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40094 | Unable to locate dispute record for arn. Please recheck the value provided for arn. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40048 | Unable to locate dispute record for arn. Please recheck the value provided for arn. | | 404 | Not Found | RESOURCE_NOT_FOUND | 40073 | Unable to locate dispute record for that ID. Please recheck the ID provided. | | 405 | Not Found | INVALID_TRANSACTION_ACTION | 40222 | Device error: 999996 Invalid Terminal information | | 405 | Not Found | INVALID_TRANSACTION_ACTION | 40042 | Retrieve information about this transaction is not supported. | ## 409 - Conflict | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 409 | Conflict | DUPLICATE_TRANSACTION | 40011 | 2, Duplicate transactions | | 409 | Conflict | DUPLICATE_ACTION | 40039 | Idempotency Key seen before : id:`resource-id` status: `resource_status` | | 409 | Conflict | DUPLICATE_TRANSACTION | 40011 | Device error: 100011 DUP TRANSACTION | | 409 | Conflict | DUPLICATE_TRANSACTION | 50015 | 501, This transaction was already processed. | ## 500 - Internal Server Error | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 500 | Internal Server | SYSTEM_ERROR_DOWNSTREAM | 50053 | 129, Unable to locate User with the Credentials provided; please contact Support Team. | ## 501 - Not Implemented | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 501 | Not Implemented | UNKNOWN_RESPONSE | 50012 | `ECHO BACK MESSAGE FROM SYSTEM` | | 501 | Not Implemented | UNKNOWN_RESPONSE | 50012 | Device error: 100023 UNKNOWN ERROR/NOT FOUND/USERABORTED | | 501 | Not Implemented | SYSTEM_ERROR_DOWNSTREAM | 50045 | Unable to process your request due to an Internal System Error; please reach out to your administrator if the issue persists. | ## 502 - Bad Gateway | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50004 | 1, Gateway system error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50003 | 1, Portico error. Developers notified. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 40187 | 100006 BATCH FAILED | | 502 | Bad Gateway | UNAUTHORIZED_DOWNSTREAM | 50002 | 2, Authentication error. Verify and correct credentials. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50005 | 20, Database operation time out. May occur when Portico is trying to communicate to the database for large amounts of data. If this is due to a search, it can be corrected by adding more specific criteria. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50006 | 21, Archive database is currently unavailable. Try the transaction again later. | | 502 | Bad Gateway | UNAUTHORIZED_DOWNSTREAM | 50001 | 21, Unauthorized | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50007 | 22, Archive database is currently unavailable but an attempt was made to retrieve the data from the real-time database. If there was data available from the real-time database that met the request criteria, then it was returned. However, it is not guaranteed to be complete. The request may need to be tried again later. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50013 | 2xx, eCom error. Developers notified. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50014 | 3xx, Error with GP Systems | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50010 | 50, Processor System error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50011 | 51, Processor Configuration error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 40204 | Device error: 199999 TERMINAL ERROR | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50052 | Inactive Device (Terminal) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50053 | Device (Terminal) Configuration missing | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50054 | Insufficient privileges | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50055 | Incremental Auth Not Allowed | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50056 | Unable to process your request. Settlement In Progress. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50057 | Functionality currently not available. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50058 | Inactive Merchant (Account) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50059 | Merchant (Account) configuration missing | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50060 | Processor configuration missing | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50061 | Unique ID Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50062 | Service Not Allowed | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50063 | Authentication error. Verify and correct credentials. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50064 | System Error (PhCountry) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50065 | System Error (Bin Lookup) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50066 | System Error (Merchant Bin Lookup) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50067 | System Error (Search Merchant) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50068 | System Error (Modify Schedule) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50069 | System Error (Modify Payment) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50070 | System Error (CCust) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50071 | System Error (CCustID) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50073 | System Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50074 | Error on Host | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50075 | System Error (DB Insert) | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50076 | Card verification failed for card number. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50077 | Supported SecCodes not found for ACH. | | 502 | Bad Gateway | DUPLICATE_TRANSACTION | 50078 | Duplicate transaction (Same amount/ Account). | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50079 | General Money Transfer Decline | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50080 | Service is temporarily unavailable. Please try later. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50081 | Payment count cannot be greater than processed count. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50082 | One or more transactionID(s) in transactionPaymentTypeDetails is/are invalid. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50083 | Record Not Found | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50084 | Invalid Transaction Key | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50085 | The provided authentication credentials are not correct. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50086 | Invalid merchant details | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50087 | Host Operator not allowed | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50088 | Token services cannot be enabled until the merchant account is set up with a token zone. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50089 | Tokenization service not enabled | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50092 | Tokenization Unsuccessful | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50093 | Credit Limit Reached | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50094 | Invalid Message | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50095 | System Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50097 | Service disabled | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50098 | General Notify Decline | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50099 | Invalid Cashback amount | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50100 | Cashback Amount is not allowed for this type of transaction. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50101 | Mandatory Tags are missing. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50102 | Card Type not supported for requested service. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50103 | terminalData terminalCapability, terminalOperating Environment, cardholderAuthenticationMethod, terminalAuthenticationCapability, terminalOutputCapability, maxPinLength group is required. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50104 | cardholderAuthenticationMethod must be PIN. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50126 | Device error: 999995 Invalid POS/Terminal Pair info | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50127 | Device error: 999994 Internal Create Queue Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50128 | Device error: 999993 Terminal response does not match POS request | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50129 | Device error: 999992 Process Terminal response Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50130 | Device error: 999999 System Internal Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50130 | Device error: 999991 Internal Send Queue Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50131 | Device error: 999990 Receive Terminal response Timeout Error | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50132 | Device error: 999989 Terminal response type does not match POS request | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50133 | Device error: 999984 This Merchant is not paired with a Host | | 502 | Bad Gateway | UNAUTHORIZED_DOWNSTREAM | 50017 | error code - 505 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50018 | error code - 506 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50023 | 504 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50024 | 507 | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50018 | This resource has reached the maximum number of records that can be returned. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50026 | Transaction `TRN_id` completed successfully but there was an issue in communicating the result to the merchant. Please check the status of the transaction. | | 502 | Bad Gateway | SYSTEM_ERROR_DOWNSTREAM | 50046 | Unable to process your request due to an error with a system down stream. | ## 504 - Timeout | HTTP | HTTP Message | error_code | detailed_error_code | detailed_error_description | | -------- | -------- | -------- | -------- | -------- | | 504 | Timeout | TIMEOUT | 50008 | | No response received while executing this action. | | 504 | Timeout | TIMEOUT | 50009 | No response received from a platform while executing this action. An attempted automatic reversal failed. Please try to reverse this transaction.. | | 504 | Timeout | TIMEOUT | 50013 | No response received from a platform while executing this action. An automatic reversal was successful. Please try again. | | 504 | Timeout | TIMEOUT | 50015 | Transaction timed out. Please retry the transaction with the same X-GP-Idempotency value. | # Country Codes Source: https://developer.globalpayments.com/resources/codes/country-codes.md Section: Resources Description: Use ISO country codes in your integration ## ISO 3166-1 alpha-2 countries The following country codes are in accordance with the International Organization for Standardization (ISO) 3166-1 alpha-2. ```JSON { "Afghanistan": "AF", "Åland Islands": "AX", "Albania": "AL", "Algeria": "DZ", "American Samoa": "AS", "Andorra": "AD", "Angola": "AO", "Anguilla": "AI", "Antarctica": "AQ", "Antigua and Barbuda": "AG", "Argentina": "AR", "Armenia": "AM", "Aruba": "AW", "Australia": "AU", "Austria": "AT", "Azerbaijan": "AZ", "Bahamas": "BS", "Bahrain": "BH", "Bangladesh": "BD", "Barbados": "BB", "Belarus": "BY", "Belgium": "BE", "Belize": "BZ", "Benin": "BJ", "Bermuda": "BM", "Bhutan": "BT", "Bolivia: Plurinational State of": "BO", "Bonaire: Sint Eustatius and Saba": "BQ", "Bosnia and Herzegovina": "BA", "Botswana": "BW", "Bouvet Island": "BV", "Brazil": "BR", "British Indian Ocean Territory": "IO", "Brunei Darussalam": "BN", "Bulgaria": "BG", "Burkina Faso": "BF", "Burundi": "BI", "Cambodia": "KH", "Cameroon": "CM", "Canada": "CA", "Cape Verde": "CV", "Cayman Islands": "KY", "Central African Republic": "CF", "Chad": "TD", "Chile": "CL", "China": "CN", "Christmas Island": "CX", "Cocos (Keeling) Islands": "CC", "Colombia": "CO", "Comoros": "KM", "Congo": "CG", "Congo: the Democratic Republic of the": "CD", "Cook Islands": "CK", "Costa Rica": "CR", "Côte d'Ivoire": "CI", "Croatia": "HR", "Cuba": "CU", "Curaçao": "CW", "Cyprus": "CY", "Czech Republic": "CZ", "Denmark": "DK", "Djibouti": "DJ", "Dominica": "DM", "Dominican Republic": "DO", "Ecuador": "EC", "Egypt": "EG", "El Salvador": "SV", "Equatorial Guinea": "GQ", "Eritrea": "ER", "Estonia": "EE", "Eswatini": "SZ", "Ethiopia": "ET", "Falkland Islands (Malvinas)": "FK", "Faroe Islands": "FO", "Fiji": "FJ", "Finland": "FI", "France": "FR", "French Guiana": "GF", "French Polynesia": "PF", "French Southern Territories": "TF", "Gabon": "GA", "Gambia": "GM", "Georgia": "GE", "Germany": "DE", "Ghana": "GH", "Gibraltar": "GI", "Greece": "GR", "Greenland": "GL", "Grenada": "GD", "Guadeloupe": "GP", "Guam": "GU", "Guatemala": "GT", "Guernsey": "GG", "Guinea": "GN", "Guinea-Bissau": "GW", "Guyana": "GY", "Haiti": "HT", "Heard Island and McDonald Islands": "HM", "Holy See (Vatican City State)": "VA", "Honduras": "HN", "Hong Kong": "HK", "Hungary": "HU", "Iceland": "IS", "India": "IN", "Indonesia": "ID", "Iran: Islamic Republic of": "IR", "Iraq": "IQ", "Ireland": "IE", "Isle of Man": "IM", "Israel": "IL", "Italy": "IT", "Jamaica": "JM", "Japan": "JP", "Jersey": "JE", "Jordan": "JO", "Kazakhstan": "KZ", "Kenya": "KE", "Kiribati": "KI", "Korea: Democratic People's Republic of": "KP", "Korea: Republic of": "KR", "Kuwait": "KW", "Kyrgyzstan": "KG", "Lao People's Democratic Republic": "LA", "Latvia": "LV", "Lebanon": "LB", "Lesotho": "LS", "Liberia": "LR", "Libya": "LY", "Liechtenstein": "LI", "Lithuania": "LT", "Luxembourg": "LU", "Macao": "MO", "Macedonia: the Former Yugoslav Republic of": "MK", "Madagascar": "MG", "Malawi": "MW", "Malaysia": "MY", "Maldives": "MV", "Mali": "ML", "Malta": "MT", "Marshall Islands": "MH", "Martinique": "MQ", "Mauritania": "MR", "Mauritius": "MU", "Mayotte": "YT", "Mexico": "MX", "Micronesia: Federated States of": "FM", "Moldova: Republic of": "MD", "Monaco": "MC", "Mongolia": "MN", "Montenegro": "ME", "Montserrat": "MS", "Morocco": "MA", "Mozambique": "MZ", "Myanmar": "MM", "Namibia": "NA", "Nauru": "NR", "Nepal": "NP", "Netherlands": "NL", "New Caledonia": "NC", "New Zealand": "NZ", "Nicaragua": "NI", "Niger": "NE", "Nigeria": "NG", "Niue": "NU", "Norfolk Island": "NF", "Northern Mariana Islands": "MP", "Norway": "NO", "Oman": "OM", "Pakistan": "PK", "Palau": "PW", "Palestine: State of": "PS", "Panama": "PA", "Papua New Guinea": "PG", "Paraguay": "PY", "Peru": "PE", "Philippines": "PH", "Pitcairn": "PN", "Poland": "PL", "Portugal": "PT", "Puerto Rico": "PR", "Qatar": "QA", "Réunion": "RE", "Romania": "RO", "Russian Federation": "RU", "Rwanda": "RW", "Saint Barthélemy": "BL", "Saint Helena: Ascension and Tristan da Cunha": "SH", "Saint Kitts and Nevis": "KN", "Saint Lucia": "LC", "Saint Martin (French part)": "MF", "Saint Pierre and Miquelon": "PM", "Saint Vincent and the Grenadines": "VC", "Samoa": "WS", "San Marino": "SM", "Sao Tome and Principe": "ST", "Saudi Arabia": "SA", "Senegal": "SN", "Serbia": "RS", "Seychelles": "SC", "Sierra Leone": "SL", "Singapore": "SG", "Sint Maarten (Dutch part)": "SX", "Slovakia": "SK", "Slovenia": "SI", "Solomon Islands": "SB", "Somalia": "SO", "South Africa": "ZA", "South Georgia and the South Sandwich Islands": "GS", "South Sudan": "SS", "Spain": "ES", "Sri Lanka": "LK", "Sudan": "SD", "Suriname": "SR", "Svalbard and Jan Mayen": "SJ", "Sweden": "SE", "Switzerland": "CH", "Syrian Arab Republic": "SY", "Taiwan: Province of China": "TW", "Tajikistan": "TJ", "Tanzania: United Republic of": "TZ", "Thailand": "TH", "Timor-Leste": "TL", "Togo": "TG", "Tokelau": "TK", "Tonga": "TO", "Trinidad and Tobago": "TT", "Tunisia": "TN", "Turkey": "TR", "Turkmenistan": "TM", "Turks and Caicos Islands": "TC", "Tuvalu": "TV", "Uganda": "UG", "Ukraine": "UA", "United Arab Emirates": "AE", "United Kingdom": "GB", "United States": "US", "United States Minor Outlying Islands": "UM", "Uruguay": "UY", "Uzbekistan": "UZ", "Vanuatu": "VU", "Venezuela: Bolivarian Republic of": "VE", "Viet Nam": "VN", "Virgin Islands: British": "VG", "Virgin Islands: U.S.": "VI", "Wallis and Futuna": "WF", "Western Sahara": "EH", "Yemen": "YE", "Zambia": "ZM", "Zimbabwe": "ZW" } ``` ## ISO 3166-1 countries - numeric The following country codes are in accordance with ISO 3166-1 numeric code. ```JSON { "Afghanistan": "004", "Åland Islands": "248", "Albania": "008", "Algeria": "012", "American Samoa": "016", "Andorra": "020", "Angola": "024", "Anguilla": "660", "Antarctica": "010", "Antigua and Barbuda": "028", "Argentina": "032", "Armenia": "051", "Aruba": "533", "Australia": "036", "Austria": "040", "Azerbaijan": "031", "Bahamas": "044", "Bahrain": "048", "Bangladesh": "050", "Barbados": "052", "Belarus": "112", "Belgium": "056", "Belize": "084", "Benin": "204", "Bermuda": "060", "Bhutan": "064", "Bolivia: Plurinational State of": "068", "Bonaire: Sint Eustatius and Saba": "535", "Bosnia and Herzegovina": "070", "Botswana": "072", "Bouvet Island": "074", "Brazil": "076", "British Indian Ocean Territory": "086", "Brunei Darussalam": "096", "Bulgaria": "100", "Burkina Faso": "854", "Burundi": "108", "Cambodia": "116", "Cameroon": "120", "Canada": "124", "Cape Verde": "132", "Cayman Islands": "136", "Central African Republic": "140", "Chad": "148", "Chile": "152", "China": "156", "Christmas Island": "162", "Cocos (Keeling) Islands": "166", "Colombia": "170", "Comoros": "174", "Congo": "178", "Congo: the Democratic Republic of the": "180", "Cook Islands": "184", "Costa Rica": "188", "Côte d'Ivoire": "384", "Croatia": "191", "Cuba": "192", "Curaçao": "531", "Cyprus": "196", "Czech Republic": "203", "Denmark": "208", "Djibouti": "262", "Dominica": "212", "Dominican Republic": "214", "Ecuador": "218", "Egypt": "818", "El Salvador": "222", "Equatorial Guinea": "226", "Eritrea": "232", "Estonia": "233", "Eswatini": "748", "Ethiopia": "231", "Falkland Islands (Malvinas)": "238", "Faroe Islands": "234", "Fiji": "242", "Finland": "246", "France": "250", "French Guiana": "254", "French Polynesia": "258", "French Southern Territories": "260", "Gabon": "266", "Gambia": "270", "Georgia": "268", "Germany": "276", "Ghana": "288", "Gibraltar": "292", "Greece": "300", "Greenland": "304", "Grenada": "308", "Guadeloupe": "312", "Guam": "316", "Guatemala": "320", "Guernsey": "831", "Guinea": "324", "Guinea-Bissau": "624", "Guyana": "328", "Haiti": "332", "Heard Island and McDonald Islands": "334", "Holy See (Vatican City State)": "336", "Honduras": "340", "Hong Kong": "344", "Hungary": "348", "Iceland": "352", "India": "356", "Indonesia": "360", "Iran: Islamic Republic of": "364", "Iraq": "368", "Ireland": "372", "Isle of Man": "833", "Israel": "376", "Italy": "380", "Jamaica": "388", "Japan": "392", "Jersey": "832", "Jordan": "400", "Kazakhstan": "398", "Kenya": "404", "Kiribati": "296", "Korea: Democratic People's Republic of": "408", "Korea: Republic of": "410", "Kuwait": "414", "Kyrgyzstan": "417", "Lao People's Democratic Republic": "418", "Latvia": "428", "Lebanon": "422", "Lesotho": "426", "Liberia": "430", "Libya": "434", "Liechtenstein": "438", "Lithuania": "440", "Luxembourg": "442", "Macao": "446", "Macedonia: the Former Yugoslav Republic of": "807", "Madagascar": "450", "Malawi": "454", "Malaysia": "458", "Maldives": "462", "Mali": "466", "Malta": "470", "Marshall Islands": "584", "Martinique": "474", "Mauritania": "478", "Mauritius": "480", "Mayotte": "175", "Mexico": "484", "Micronesia: Federated States of": "583", "Moldova: Republic of": "498", "Monaco": "492", "Mongolia": "496", "Montenegro": "499", "Montserrat": "500", "Morocco": "504", "Mozambique": "508", "Myanmar": "104", "Namibia": "516", "Nauru": "520", "Nepal": "524", "Netherlands": "528", "New Caledonia": "540", "New Zealand": "554", "Nicaragua": "558", "Niger": "562", "Nigeria": "566", "Niue": "570", "Norfolk Island": "574", "Northern Mariana Islands": "580", "Norway": "578", "Oman": "512", "Pakistan": "586", "Palau": "585", "Palestine: State of": "275", "Panama": "591", "Papua New Guinea": "598", "Paraguay": "600", "Peru": "604", "Philippines": "608", "Pitcairn": "612", "Poland": "616", "Portugal": "620", "Puerto Rico": "630", "Qatar": "634", "Réunion": "638", "Romania": "642", "Russian Federation": "643", "Rwanda": "646", "Saint Barthélemy": "652", "Saint Helena: Ascension and Tristan da Cunha": "654", "Saint Kitts and Nevis": "659", "Saint Lucia": "662", "Saint Martin (French part)": "663", "Saint Pierre and Miquelon": "666", "Saint Vincent and the Grenadines": "670", "Samoa": "882", "San Marino": "674", "Sao Tome and Principe": "678", "Saudi Arabia": "682", "Senegal": "686", "Serbia": "688", "Seychelles": "690", "Sierra Leone": "694", "Singapore": "702", "Sint Maarten (Dutch part)": "534", "Slovakia": "703", "Slovenia": "705", "Solomon Islands": "090", "Somalia": "706", "South Africa": "710", "South Georgia and the South Sandwich Islands": "239", "South Sudan": "728", "Spain": "724", "Sri Lanka": "144", "Sudan": "729", "Suriname": "740", "Svalbard and Jan Mayen": "744", "Sweden": "752", "Switzerland": "756", "Syrian Arab Republic": "760", "Taiwan: Province of China": "158", "Tajikistan": "762", "Tanzania: United Republic of": "834", "Thailand": "764", "Timor-Leste": "626", "Togo": "768", "Tokelau": "772", "Tonga": "776", "Trinidad and Tobago": "780", "Tunisia": "788", "Turkey": "792", "Turkmenistan": "795", "Turks and Caicos Islands": "796", "Tuvalu": "798", "Uganda": "800", "Ukraine": "804", "United Arab Emirates": "784", "United Kingdom": "826", "United States": "840", "United States Minor Outlying Islands": "581", "Uruguay": "858", "Uzbekistan": "860", "Vanuatu": "548", "Venezuela: Bolivarian Republic of": "862", "Viet Nam": "704", "Virgin Islands: British": "092", "Virgin Islands: U.S.": "850", "Wallis and Futuna": "876", "Western Sahara": "732", "Yemen": "887", "Zambia": "894", "Zimbabwe": "716" } ``` ## ISO 3166-2 states/subdivisions For standardized state and subdivision ISO 3166-2 codes for each country, see the [ISO Online Browsing Platform](https://www.iso.org/obp/ui/#search). For example: See codes for [Ireland](https://www.iso.org/obp/ui/#iso:code:3166:IE) or [Great Britain](https://www.iso.org/obp/ui/#iso:code:3166:GB). **Format:** Use the country subdivision code defined in ISO 3166-2 minus the country code itself. For example, Illinois = IL. **For European merchants:** If the state is applicable for the billing address country, it's required for Strong Customer Authentication (SCA). # Currency Codes Source: https://developer.globalpayments.com/resources/codes/currency-codes.md Section: Resources Description: Use standard currency codes in your integration For zero exponent currencies, the lowest denomination must be submitted. For example: 265,219.28 ISK should be submitted as 265219. ```JSON { "Afghani": "AFN", "Algerian Dinar": "DZD", "Argentine Peso": "ARS", "Armenian Dram": "AMD", "Aruban Florin": "AWG", "Australian Dollar": "AUD", "Azerbaijan Manat": "AZN", "Bahamian Dollar": "BSD", "Bahraini Dinar": "BHD", "Baht": "THB", "Balboa": "PAB", "Barbados Dollar": "BBD", "Belarusian Ruble": "BYN", "Belize Dollar": "BZD", "Bermudian Dollar": "BMD", "Bolívar": "VEF", "Boliviano": "BOB", "Brazilian Real": "BRL", "Brunei Dollar": "BND", "Bulgarian Lev": "BGN", "Burundi Franc": "BIF", "Cabo Verde Escudo": "CVE", "Canadian Dollar": "CAD", "Chilean Peso": "CLP", "Colombian Peso": "COP", "Comorian Franc ": "KMF", "Congolese Franc": "CDF", "Cordoba Oro": "NIO", "Costa Rican Colon": "CRC", "Cuban Peso": "CUP", "Czech Koruna": "CZK", "Dalasi": "GMD", "Danish Krone": "DKK", "Denar": "MKD", "Djibouti Franc": "DJF", "Dobra": "STD", "Dominican Peso": "DOP", "Dong": "VND", "East Caribbean Dollar": "XCD", "Egyptian Pound": "EGP", "El Salvador Colon": "SVC", "Ethiopian Birr": "ETB", "Euro": "EUR", "Falkland Islands Pound": "FKP", "Fiji Dollar": "FJD", "Forint": "HUF", "Ghana Cedi": "GHS", "Gibraltar Pound": "GIP", "Gourde": "HTG", "Guarani": "PYG", "Guinean Franc": "GNF", "Guyana Dollar": "GYD", "Hong Kong Dollar": "HKD", "Hryvnia": "UAH", "Iceland Krona": "ISK", "Indian Rupee": "INR", "Iranian Rial": "IRR", "Iraqi Dinar": "IQD", "Jamaican Dollar": "JMD", "Jordanian Dinar": "JOD", "Kenyan Shilling": "KES", "Kina": "PGK", "Kuna": "HRK", "Kuwaiti Dinar": "KWD", "Kwanza": "AOA", "Kyat": "MMK", "Lao Kip": "LAK", "Lari": "GEL", "Lebanese Pound": "LBP", "Lek": "ALL", "Lempira": "HNL", "Leone": "SLL", "Liberian Dollar": "LRD", "Libyan Dinar": "LYD", "Lilangeni": "SZL", "Loti": "LSL", "Malagasy Ariary": "MGA", "Malawi Kwacha": "MWK", "Malaysian Ringgit": "MYR", "Mauritius Rupee": "MUR", "Mexican Peso": "MXN", "Moldovan Leu": "MDL", "Moroccan Dirham": "MAD", "Mozambique Metical": "MZN", "Mvdol": "BOV", "Naira": "NGN", "Nakfa": "ERN", "Namibia Dollar": "NAD", "Nepalese Rupee": "NPR", "Netherlands Antillean Guilder": "ANG", "New Israeli Sheqel": "ILS", "New Taiwan Dollar": "TWD", "New Zealand Dollar": "NZD", "Ngultrum": "BTN", "North Korean Won": "KPW", "Norwegian Krone": "NOK", "Ouguiya": "MRO", "Pa’anga": "TOP", "Pakistan Rupee": "PKR", "Pataca": "MOP", "Peso Convertible": "CUC", "Peso Uruguayo": "UYU", "Philippine Peso": "PHP", "Pound Sterling": "GBP", "Pula": "BWP", "Qatari Rial": "QAR", "Quetzal": "GTQ", "Rand": "ZAR", "Rial Omani": "OMR", "Riel": "KHR", "Romanian Leu": "RON", "Rufiyaa": "MVR", "Rupiah": "IDR", "Russian Ruble": "RUB", "Rwanda Franc": "RWF", "Saint Helena Pound": "SHP", "Saudi Riyal": "SAR", "Serbian Dinar": "RSD", "Seychelles Rupee": "SCR", "Singapore Dollar": "SGD", "Sol": "PEN", "Solomon Islands Dollar": "SBD", "Som": "KGS", "Somali Shilling": "SOS", "Somoni": "TJS", "South Sudanese Pound": "SSP", "Sri Lanka Rupee": "LKR", "Sucre": "XSU", "Sudanese Pound": "SDG", "Surinam Dollar": "SRD", "Swedish Krona": "SEK", "Swiss Franc": "CHF", "Syrian Pound": "SYP", "Taka": "BDT", "Tala": "WST", "Tanzanian Shilling": "TZS", "Tenge": "KZT", "Trinidad and Tobago Dollar": "TTD", "Tugrik": "MNT", "Tunisian Dinar": "TND", "Turkish Lira": "TRY", "Turkmenistan New Manat": "TMT", "UAE Dirham": "AED", "Uganda Shilling": "UGX", "Unidad de Fomento": "CLF", "Unidad de Valor Real": "COU", "US Dollar": "USD", "Uzbekistan Sum": "UZS", "Vatu": "VUV", "Won": "KRW", "Yemeni Rial": "YER", "Yen": "JPY", "Yuan Renminbi": "CNY", "Zambian Kwacha": "ZMW", "Zimbabwe Dollar": "ZWL", "Zloty": "PLN" } ``` # Support Source: https://developer.globalpayments.com/support/overview.md Section: Optional Description: Contact information, FAQs, and latest developer portal updates Please click the link below for Integration, Sales, Terminal and support moving to production. ### [Integration Support](https://developer.globalpayments.com/support/integration-support) Get help with technical questions during your integration. ### [Sales Support](https://developer.globalpayments.com/support/sales) Talk to our team to start your integration journey. ### [POS Terminal Support](https://developer.globalpayments.com/support/terminal) Get assistance for Point of Sale terminal related issues. ### [Integration Validation](https://developer.globalpayments.com/support/integration-valid) Ready to go live, we can guide you from Sandbox to Production. ### [Help Center](https://help.globalpayments.com) Access documentation for our suite of products. ### [Frequently Asked Questions](https://developer.globalpayments.com/support/FAQs) Your biggest questions answered. ### [Changelog](https://developer.globalpayments.com/changelog) See what's new with your favorite products. ### [Blog](https://developer.globalpayments.com/blog/overview) Written by developers for developers.