NAV

Overview

Introduction

You can use your Easy Process merchant account to receive payments. This document gives instructions on how to integrate a simple payment button and the postback data that will be sent to your server.

System Overview

Easy Process is a payment system that allows you to do quick, efficient and secure online transaction processing using credit/debit cards.

With your Easy Process control panel, you are able to overview your transactions and manage your account.

Definitions

Request VS Transaction

In the Easy Process system, every call to the system will generate a request, identified by a unique ID. This ID must be used as a reference to communicate with Easy Process.

On the other hand, a transaction is a reference to a payment. So, every transaction is associated to a request, but a request has not necessarily a transaction associated. For example, if a request is rejected because of some invalid parameters, no transaction will be created.

This is why it is very important to always refer to the request id, rather than the transaction id.

Payment Button Integration

Interface Location

All the requests should go to the following URL:

Sandbox Production
https://easyprocess.info/idem/ https://easyprocess.ai/idem/

Testing

At the beginning of the integration process, a test account will be provided on a sandbox. You will be plugged on the live/production environment only after several successful tests.

The sandbox URL is: https://easyprocess.info/merchants/

In order to proceed a successful payment on the sandbox, you must use the following card information:

A Quick Start

For the payment button to work you must create a form using the POST method and all the parameters you send should use hidden fields. Here is an example:

<form action="https://easyprocess.info/idem/" method="post">
    <input type="hidden" name="merchant_id" value="12345678" />
    <input type="hidden" name="amount" value="5.00" />
    <input type="hidden" name="currency" value="USD" />
    <input type="hidden" name="order_ref" value="1234" />
    <input type="hidden" name="user[email]" value="[email protected]" />
    <input type="hidden" name="user[firstname]" value="John" />
    <input type="hidden" name="user[lastname]" value="Doe" />
    <input type="hidden" name="user[zipcode]" value="33301" />
    <input type="hidden" name="user[city]" value="Fort Lauderdale" />
    <input type="hidden" name="user[country]" value="US" />
    <input type="hidden" name="hash" value="..." />
    <input type="hidden" name="order_description" value="Order #1234" />
    <button type="submit">Pay</button>
</form>

The example above is the shortest version of the payment button that you can use. The item name is "Order number 1234" and its price is 5.00. The payment will go to your account if you replace 12345678 above with your Easy Process Merchant ID.

Easy Process offers many more options that you can send in this form. Please see the list of parameters below for advanced usage.

Parameters list

Below you can see an explanation of all the parameters that can be used for payment buttons:

Parameter Name Required Description
merchant_id YES Your 8 digits Easy Process Merchant ID
amount YES The total amount requested
currency YES The currency of the transaction (always the same currency as your Easy Process Merchant Account).
order_ref YES A unique reference for this transaction
order_description NO The transaction description (will be echoed to the customer)
sub_account_id NO An optional sub account ID to group your transactions
hash NO Checksum of the request (see chapter 5)
user[email] YES Customer's email address
user[firstname] YES Customer's first name
user[lastname] YES Customer's last name
user[address] NO Customer's address
user[zipcode] YES Customer's postal code
user[city] YES Customer's city
user[country] YES Customer's country
user[state] NO Customer's state (for US resident only)
user[cellphone] NO Customer's cell phone (with international prefix)
completed_url NO The URL where the user will be redirected to after he completes the payment. On the last step of the payment there is a button labeled "Return" and when the user clicks this button he is redirected to this URL. If provided, this parameter override the value set in your settings (see chapter 3.3).
cancelled_url NO The URL where the user will be redirected to after he cancels the payment. On the cancel step of the payment there is a button labeled "Return" and when the user clicks this button he is redirected to this URL. If provided, this parameter override the value set in your settings (see chapter 3.3).
rejected_url NO The URL where the user will be redirected to after the payment has been rejected. On the rejection page of the payment there is a button labeled "Return" and when the user clicks this button he is redirected to this URL. If provided, this parameter override the value set in your settings (see chapter 3.3).

Additional parameters for recurring payments

If you want your payment to be followed by recurring payments, you can provide these additional parameters in your request.

Parameter Name Required Description
recurring[enabled] NO Enable recurring payment/subscription. Must be set to 'yes' in order to enable recurring payment.
recurring[amount] NO The total amount requested for all recurring payments.
recurring[cycles] NO Number of cycles/periods (>1 or 0 for unlimited)
recurring[periodicity] NO Recurring period (weeks, months, years)
recurring[start date] NO Date of the first (next) transaction (format is YYYY-MM-DD)
recurring[hash] NO Checksum of the recurring request (see chapter 5)

Here is a quick example for a payment followed by recurring payments:

<form action="https://easyprocess.info/idem/" method="post">
    <input type="hidden" name="merchant_id" value="12345678" />
    <input type="hidden" name="amount" value="5.00" />
    <input type="hidden" name="currency" value="USD" />
    <input type="hidden" name="order_ref" value="1234" />
    <input type="hidden" name="hash" value="..." />
    <input type="hidden" name="order_description" value="Subscription #1234" />
    <input type="hidden" name="user[email]" value="[email protected]" />
    <input type="hidden" name="user[firstname]" value="John" />
    <input type="hidden" name="user[lastname]" value="Doe" />
    <input type="hidden" name="user[zipcode]" value="33301" />
    <input type="hidden" name="user[city]" value="Fort Lauderdale" />
    <input type="hidden" name="user[country]" value="US" />
    <input type="hidden" name="user[state]" value="FL" />
    <input type="hidden" name="recurring[enabled]" value="yes" />
    <input type="hidden" name="recurring[amount]" value="10.00" />
    <input type="hidden" name="recurring[cycles]" value="12" />
    <input type="hidden" name="recurring[periodicity]" value="months" />
    <input type="hidden" name="recurring[start_date]" value="2024-07-20" />
    <input type="hidden" name="recurring[hash]" value="..." />
    <button type="submit">Pay</button>
</form>

In this example, the customer will make an initial payment of 5.00 USD, and on July 20, 2024, they will be charged 10.00 USD, and so on for 12 months.

Global settings

You can define some global settings of the payment page in your Easy Process account. Once logged, go into "Account Settings".

Customization

Here you can personalize the name and URL of your website, and you can also provide the logo of your website/company, as an URL. We heavily recommend using an https URL for the logo in order to avoid a security warning from the browser.

Customer Support

After a payment, and in the emails that we send to the customer, we always include a way to contact our customer support. If you prefer to use your own customer support, you can set your own info here.

Return URLs

The default URLs where the user will be redirected to after payment, if not provided in the request parameters. On the last step of the payment there is a button labeled "Return" and when the user clicks this button he is redirected to this URL.

Meaning of these URLs:

Automatic notifications

You can specify an URL and an email address on which you want to receive automatic notifications when the status of your transaction is updated.

Please see the IPN section for more details on Instant Payment Notifications.

Hash key

The hash key is used to calculate the hash tag, you can define your hash key here and choose if Easy Process must check the hash tag for all incoming request from you.

Please see the Hash sum/Checksum section for more details.

JavaScript SDK

Introduction

The JavaScript SDK provides an easy way to integrate G-Standard payment processing directly into your web application. With just a few lines of code, you can create secure payment forms that handle card processing, 3D Secure authentication, and real-time status updates.

Prerequisites

Contact your sales representative to enable the SDK for your account.

Configuration

Step 1: Enable SDK in Settings

Go to your merchant settings and configure the SDK:

Make sure to note your Merchant ID (an 8-digit number), as you will need it for initialization.

Quick Start

Basic HTML Setup

Please look at the example on the right or below if you're on mobile.

Basic HTML Setup

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Payment Page</title>

    <!-- SDK Files (use the correct domain for your environment) -->
    <!-- Prod: https://www.easyprocess.ai | Sandbox: https://www.easyprocess.info -->
    <script src="https://www.easyprocess.ai/sdk/v1/sdk.min.js"></script>
    <!-- Minimal styling for the SDK -->
    <link rel="stylesheet" href="https://www.easyprocess.ai/sdk/v1/sdk.min.css">

    <!-- Optional: Your custom styles -->
    <style>
        #payment-container {
            max-width: 400px;
            margin: 50px auto;
            padding: 20px;
            border: 1px solid #ddd;
            border-radius: 8px;
        }
    </style>
</head>
<body>
    <div id="payment-container">
        <h2>Complete Payment</h2>
        <div id="payment-form"></div>
    </div>

    <script>
        // Your JavaScript goes here (see next section)
    </script>
</body>
</html>

JavaScript Implementation

Please look at the example on the right or below if you're on mobile.

JavaScript Implementation

// Initialize the SDK (environment is inferred from the domain serving the SDK)
var sdk = PaymentSDK.init({
    merchantId: '12345678',     // Replace with your merchant ID
    sdkKey: 'YOUR_SDK_KEY_HERE' // Replace with your SDK key
});

// Create the payment form
var paymentForm = sdk.createPaymentForm({
    container: '#payment-form',

    // Payment details
    amount: 49.99,
    currency: 'USD',
    orderRef: '1234', // Your reference - must be unique per transaction

    // Customer information (required fields)
    customer: {
        email: '[email protected]',
        firstname: 'John',
        lastname: 'Doe',
        zipcode: '10001',
        country: 'US'
    },

    // Success handler
    onSuccess: function(result) {
        console.log('Payment successful!', result);
        alert('Payment completed! Transaction ID: ' + result.transaction_id);
        // Redirect to success page
        window.location.href = '/payment-success';
    },

    // Error handler
    onError: function(error) {
        console.error('Payment failed:', error);
        alert('Payment failed: ' + error.message);
    },

    // Pending handler (for async processors)
    onPending: function(context) {
        console.log('Processing payment...');
        // SDK automatically handles status updates via SSE
        // The form will update when payment completes
    }
});

Testing

Sandbox Environment

Browser Console

  1. Open Developer Tools (F12)
  2. Check Console for any errors
  3. Verify SDK initialization message

Common Test Scenarios

Production Checklist

Advanced Features

Debug Logging

Use the optional onLog function to surface SDK internal logs to your console:

Please look at the example on the right or below if you're on mobile.

Debug Logging

var sdk = PaymentSDK.init({
    merchantId: '12345678',
    sdkKey: 'YOUR_SDK_KEY_HERE',
    onLog: function() {
        // Prefix logs for easy filtering in the console
        try {
            console.log('[PaymentSDK]', Array.prototype.slice.call(arguments));
        } catch (e) {}
    }
});

What gets logged:

Handle Async Payments

Please look at the example on the right or below if you're on mobile.

Handle Async Payments

onPending: function(context) {
    // Show custom loading UI
    document.getElementById('loading-message').style.display = 'block';

    // Session ID available for status checking
    console.log('Session ID:', context.session_id);

    // SSE automatically handles updates
    // onSuccess or onError will be called when complete
}

Webhook Integration

Do not rely on JavaScript callbacks alone for fulfillment or accounting. Always implement a backend Webhook listener to receive authoritative status updates even if the browser closes or the network drops.

Error Codes

Code Description User Action
declined Payment was declined Try different payment method
attempts_exceeded Too many failed attempts Wait and try again later
session_expired Payment session expired Refresh page and start over
browser_not_supported Browser doesn't support SSE Use modern browser (not IE)

Troubleshooting

Issue Solution
"Missing Authorization header" Check SDK key is correct
"Origin not allowed" Verify domain in sdk_allowed_origins
"Session expired" Payment took too long, refresh page
"SDK disabled" Contact support to enable SDK
Form doesn't appear Check container selector exists
SSE connection fails Ensure CloudFlare or similar is not blocking SSE

Debugging 400 Bad Request

If calling PaymentSDK.init() results in a 400 Bad Request during POST /api/sdk/auth/token:

  1. Enable logging - Initialize with onLog to capture SDK messages
  2. Verify domain/environment - Ensure correct domain (sandbox: .biz, prod: .com)
  3. Inspect Network tab - Check the request body and response
  4. Common causes:
    • Invalid/missing merchant_id
    • Invalid sdk_key or key not issued for this merchant
    • SDK disabled for this merchant
    • Origin not allowed (add exact Origin to sdk_allowed_origins)
    • Sandbox key used from prod domain (or vice versa)
  5. Provide correlation_id to support for faster tracing

IPN (Instant Payment Notification)

Definitions

Instant Payment Notification (IPN) is a message service that notifies you of events related to Easy Process transactions. You can use it to automate back-office and administrative functions, such as fulfilling orders, tracking customers, and providing status and other information related to a transaction.

IPN notifies you when an event occurs that affects a transaction. Typically, these events represent various kinds of payments; however, the events may also represent authorizations, fraud management actions and other actions, such as refunds, disputes, and chargebacks.

IPN is a message service that Easy Process uses to notify you about events. These events include the following:

In many cases, the action that causes the event, such as a payment, occurs on your website; however, your website is not the only source of events. In many cases, events can be generated by the Easy Process Gateway, an Easy Process agent or by the customer themself.

You detect and process IPN messages with a listener, sometimes called a handler, which is a script or program that you write, on your side. It waits for messages and passes them to various back-end or administrative processes that respond the messages.

The actions to take when your listener is notified of an event are specific to your needs. Examples of the kinds of actions you might take when your listener receives an IPN message include the following:

You will "always" receive the IPN, no matter what the customer does after the transaction. This way IPN enables you to automate your response to events.

When I will receive what and where?

The most frequently asked question when a merchant integrates Easy Process Payment Button is "When and where I will receive the IPN?".

The answer is "For the 'where', it depends on your global settings and for the 'when', IPN is sent automatically on all status change.".

The IPN is sent automatically on the URL specified in your settings (this cannot be overridden in the request), when the status of your transaction is updated (it can be accepted, rejected, refunded or chargeback).

Please note that there is no IPN for pending or cancelled transaction. In case of cancellation, the customer will simply be redirected to the URL you provided.

It is important to understand that the IPN is a server-to-server communication, and that it does not require an action made by the customer, and it cannot be altered. This way, the IPN is more reliable than the simple "return on website".

We encourage you to use the IPN in order to process automatically the transactions and to not trust the "return URL" alone.

Also note that, most of the time, your will receive the IPN before the customer returns to your website, but, in rare case, due to network latency, you may encounter a short delay.

Data sent in the IPN

This data is sent in a POST "array". In PHP, for example, you will access these data using $_POST['MerchantApiResponse']. For a better understanding, we can represent these data as an HTML form, like the one below.

<form method="post">
    <input type="hidden" name="MerchantApiResponse[status]" value="OK">
    <input type="hidden" name="MerchantApiResponse[request_id]" value="11122">
    <input type="hidden" name="MerchantApiResponse[request_status]" value="completed">
    <input type="hidden" name="MerchantApiResponse[tr_id]" value="22782">
    <input type="hidden" name="MerchantApiResponse[sub_account_id]" value="8888">
    <input type="hidden" name="MerchantApiResponse[ref_id]" value="1234">
    <input type="hidden" name="MerchantApiResponse[msg]" value="">
    <input type="hidden" name="MerchantApiResponse[info]" value="">
    <input type="hidden" name="MerchantApiResponse[phone_number]" value="[email protected]">
    <input type="hidden" name="MerchantApiResponse[w_number]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][request_id]" value="11122">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][tr_id]" value="22782">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][user_id]" value="6095">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][ref_id]" value="1234">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][sub_account_id]" value="8888">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][date]" value="2024-03-27 13:19:35">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][refund_date]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][expiration]" value="2024-03-28 01:19:35">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][statement_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][refund_statement_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][method]" value="gateway">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][currency]" value="USD">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_amount]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_origin]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_amount]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_origin]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_origin]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_origin]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_origin]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][security_origin]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformRequest][location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformReason[Location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformReason[Location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformReason[Location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformReason[Location_id]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_to_type]" value="merchant">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_to_id]" value="12345678">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_to_currenty]" value="USD">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_requested_original]" value="5.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_requested_currenty]" value="USD">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_amount_requested]" value="5.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_amount_transfered]" value="5.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_amount_total_cost]" value="5.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_amount_refunded]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_change_rate]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_fees]" value="0.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_fees_cure]" value="USD">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_fees_type]" value="fixed">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_fees_rate_fixed]" value="0.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_fees_rate_percent]" value="0.0000">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_fees_level]" value="2">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_date_created]" value="2024-03-27 13:19:35">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_date_updated]" value="2024-03-27 13:19:42">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_date_completed]" value="2024-03-27 13:19:42">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_date_refunded]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_notif_sender]" value="email">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_notif_receiver]" value="none">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_status]" value="completed">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][tr_status_msg]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformTransaction][ray_infos]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="John">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="Joe">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="John">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="Joe">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="Joe">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="Joe">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][mainname]" value="Joe">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][subress]" value="Some street">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][subress]" value="Some street">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][subress]" value="Some street">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][subress]" value="Some street">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question1]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question1]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question2]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question2]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question3]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question3]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question4]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question2]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question2]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question3]" value="">
    <input type="hidden" name="MerchantApiResponse[PlatformAccount][question3]" value="">
    <input type="hidden" name="MerchantApiResponse[hash]" value="def2e614513fc7cf0d85c97167fb10ab">
</form>

MerchantApiResponse

Below are all the parameters of the post back and IPN explained

Root data

Properties Type Description
status string Has the value "OK" for successful, "PENDING" for pending transaction or "ERROR" for failure
request_id int Request ID is the unique ID of the request
request_status string Request status, it can be 'pending', 'accepted', 'rejected', 'cancelled', 'completed', 'refunded'
tr_id int Transaction ID is the unique ID of transaction associated to the request
sub_account_id string Sub Account ID for which you have associated this request
ref_id string Reference ID is the unique ID you've passed for this request
msg string Message
info string Additional information
PlatformTransaction object Easy Process Transaction information associated to a request/transaction
PlatformAccount object Easy Process Account information associated to a request/transaction
PlatformRequest object Easy Process Request with full information
hash string Hash code to check the authenticity of the IPN response

PlatformTransactionType

Properties Type Description
tr_id int Internal unique ID in the Easy Process system for this transaction
tr_type string Transaction type.
tr_from_type string Transaction source type.
tr_from_id string Transaction source id.
tr_from_curric string The main currency of the source account
tr_to_type string Transaction destination type. Usually "merchant"
tr_to_id string Transaction destination id.
tr_to_curric string Transaction destination currency.
tr_requested_original float Transaction original requested amount
tr_requested_curric string Transaction original requested currency
tr_amount_requested float Transaction converted requested amount (used currency is defined in $tr_from_Currency)
tr_amount_transfered float Transaction converted transferred amount (used currency is defined in $tr_to_Currency)
tr_amount_total_cost float Transaction total cost including fees (used currency is defined in $tr_from_Currency)
tr_amount_refunded float Transaction refunded amount (used currency is defined in $tr_from_Currency)
tr_change_rate float Transaction change rate from $tr_requested_curric and the $tr_from_Currency if not the same
tr_fees float Transaction fees that generally apply to the sender $tr_from_id)
tr_fees_curric string Transaction fees currency (generally the same as $tr_from_Currency)
tr_fees_type string Type of fees ('fixed', 'percent', both')
tr_fees_rate_fixed float Fixed part of the fees
tr_fees_rate_percent float Variable part of the fees
tr_fees_level int User level applied to the fees and limits
tr_date_created string Transaction creation date
tr_date_updated string Transaction last update
tr_date_completed string Transaction processing date
tr_date_refunded string Transaction refund date
tr_notif_sender string Type of notification sent to the sender
tr_notif_receiver string Type of notification sent to the receiver
tr_status string Transaction status ('waiting', 'rejected', 'played', 'refunded', 'loaded', 'confirmed', 'completed', 'cancelled')
tr_status_msg string Transaction status additional information

PlatformAccountType

Properties Type Mandatory Description
user_id int Internal unique ID in the Easy Process system
currency string Mallet currency.
email string Yes, if no cellphone Email address - UNIQUE per customer.
gender string Gender: 'M' for Male / 'F' for Female.
firstname string Yes First name
middlename string Middle name
lastname string Yes Last name
address string Yes Address
city string Yes City
zipcode string Yes Zip/Postal code
country string Yes Country code (2 chars)
state string Yes, for US State code (2 chars / for US citizen only)
phone string Phone number. Used for contact purpose only.
birthday string Birthday. Format: YYYY-MM-DD
question1 int First security question (cf. documentation for possible values).
answer1 string Answer for the first security question (max 60 chars).
question2 int Second security question (cf. documentation for possible values).
answer2 string Answer for the second security question (max 60 chars).
question3 int Third security question (cf. documentation for possible values).
answer3 string Answer for the third security question (max 60 chars).

PlatformRequestType

Properties Type Description
request_id integer Internal unique ID in the Easy Process system for this request
tr_id integer Internal unique ID in the Easy Process system for the associated transaction
user_id integer Internal unique ID of a customer in the Easy Process system
ref_id string Your reference ID
sub_account_id string Sub Account ID
date string Date of the request (format: YYYY-MM-DD HH:MM:SS)
refund_date string Refund date of the request (format: YYYY-MM-DD HH:MM:SS)
expiration string Expiration date (format: YYYY-MM-DD HH:MM:SS)
statement_id integer Statement ID (if transaction has been settled to the merchant)
refund_statement_id integer Refund statement ID (if transaction has been refunded on a statement)
method string Request method (api, gateway, terminal)
is_recurring boolean True if the request has been initiated as a recurring transaction
is_a_cycle boolean True if the request is part of a recurring cycle
recurring_id integer Main/parent recurring request ID (filled if $is_a_cycle is true)
type string Transaction type. Possible values are: "credit card"
currency string Request currency
amount float Original requested amount or Initial amount for recurring request
description string Description
addinfo string Additional info that you have provided
status string Request status
status_infos string Additional info's on the status
recurring_amount float Recurring amount
recurring_cycles integer Number of recurring cycles
recurring_period string Recurring period ('weeks', 'months', 'years')
recurring_start string Recurring payment start date (format: YYYY-MM-DD HH:MM:SS)
recurring_end string Recurring payment end date (format: YYYY-MM-DD HH:MM:SS)
recurring_status string Recurring status. Possible values are: "pending", "open", "stopped", "terminated"
transaction object Associated transaction

Hash sum / Checksum

Purpose

A checksum or hash sum is a small-size datum computed from an arbitrary block of digital data for the purpose of detecting errors or modifications that may have been introduced during its transmission. To secure your payments, Easy Process offers 2 different checksums:

Even if it is not mandatory to calculate and verify the checksums, Easy Process heavily encourages you to use them.

Key and settings

In order to have and to calculate the checksum, you must first define a hash key in your settings (see chapter 3.5). This hash key is like a password and must never be communicated in clear text.

Please use only alphanumeric characters in your key, special characters may produce invalid hashes.

For the Payment Button requests, if you want that Easy Process checks your hash, you must activate this function in your settings (see chapter 3.5). If this setting is not set to « Yes », Easy Process will ignore the « hash » parameter, even if it is present.

Formula for the « Hash » in the Payment Button request

Single payment (or initial payment for subscription)

The calculation of the Payment Button hash requires only 5 parameters. The hash can be found by a md5sum of a string formed by concatenating the following variables (in the given order and without any other characters or spaces):

For example, in PHP, you will use the following code:

$hash_key = 'yourhashkey';
$hash = md5($merchant_id.$amount.$currency.$order_ref.$hash_key);

Once calculated, this hash should be placed in the 'hash' parameter.

<input type="hidden" name="hash" value="<?php echo $hash; ?>" />

Recurring payment / Subscription

In addition to the « single payment» hash above, if you want to make a recurring payment, you've to calculate a second hash with the parameters specific to this subscription. This specific hash can be found with the same method but with these parameters instead:

For example, in PHP, you will use the following code:

$hash_key = 'yourhashkey';
$hash = md5($recurring['amount'].$recurring['cycles'].$recurring['periodicity'].$recurring['start_date'].$hash_key);

Once calculated, this hash should be placed in the 'recurring[hash]' parameter.

<input type="hidden" name="recurring[hash]" value="<?php echo $hash; ?>" />

Formula for the « Hash » in the IPN

The hash is present in the root of the MerchantApiResponse ($_POST['MerchantApiResponse']['hash'] using PHP) The calculation of this hash requires only 5 parameters. The hash can be found by a md5sum of a string formed by concatenating the following variables (in the given order and without any other characters or spaces):

For example, in PHP, you will use the following code:

$mykey = 'yourprivatekey-notyourpassword!';
$request = $_POST['MerchantApiResponse']['PlatformRequest'];
$myhash = md5($request['request_id'].$request['amount'].$request['currency'].$request['status'].$mykey);
if ($myhash == $_POST['MerchantApiResponse']['hash']) echo "The request is valid";

Code Samples

HTML

The example below is the more complete version of the payment button that you can use, with all possible parameters.

<form action="https://easyprocess.info/idem/" method="post">
    <input type="hidden" name="merchant_id" value="12345678" />
    <input type="hidden" name="amount" value="5.00" />
    <input type="hidden" name="currency" value="USD" />
    <input type="hidden" name="order_ref" value="1234" />
    <input type="hidden" name="sub_account_id" value="8888" />
    <input type="hidden" name="order_description" value="Order number 1234" />
    <input type="hidden" name="hash" value="" />
    <input type="hidden" name="user[email]" value="[email protected]" />
    <input type="hidden" name="user[firstname]" value="John" />
    <input type="hidden" name="user[lastname]" value="Doe" />
    <input type="hidden" name="user[address]" value="200 SW 1st Avenue" />
    <input type="hidden" name="user[zipcode]" value="33301" />
    <input type="hidden" name="user[city]" value="Fort Lauderdale" />
    <input type="hidden" name="user[country]" value="US" />
    <input type="hidden" name="user[state]" value="FL" />
    <input type="hidden" name="user[cellphone]" value="" />
    <input type="hidden" name="completed_url" value="https://demo.easyprocess.info/return/success/" />
    <input type="hidden" name="cancelled_url" value="https://demo.easyprocess.info/return/cancelled/" />
    <input type="hidden" name="rejected_url" value="https://demo.easyprocess.info/return/rejected/" />
    <input type="submit" name="submit" value="Pay with Easy Process" />
</form>

Special Notes

Mandatory fields for customer account on the gateway

Due to regulation laws, the customer must provide his first name, last name, address (city, zipcode, country and state for US customer) and his email address.

Restrictions

Recurring payment / Subscription

If you propose subscriptions on your web site, you can use our recurring's payments parameters (see parameters list in earlier sections). For this kind of payment, the initial payment amount can be different than the coming payments. This is useful if you want to provide, for example, a trial period at 50% off, or, a first payment that include additional fees. In order for the recurring payments to take place, the first initial payment must be accepted. It is why, for now, it is not possible to make a free initial payment. Once the recurring payment is running, you will receive IPN for every payment, and you will have options in your account to cancel it. To see these options, you will have to find the initial request ID in your transactions.

Control panel

The administrative merchant front end of Easy Process is located at: https://easyprocess.ai/merchants (https://easyprocess.info/merchants for the sandbox) Just sign in with the merchant details you have obtained from us. The main features are:

Disclaimer

(c) 2022 - 2025 Easy Process. All rights reserved.

Easy Process and the authors assume no liability for errors or omissions, or for damages, resulting from the use of this guide or the information contained in this guide.