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
- merchant: Refers to the merchant of Easy Process who is processing transactions for its customers.
- customer: Refers to the party attempting to process a transaction.
- request: Every call to the Easy Process system will generate a request, identified by a unique ID.
- transaction: A transaction is an act of payment. It is always associated to a request.
- gateway: Refer to the Easy Process payment page on which the customer will be redirected when he clicks on the Payment Button.
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:
- Card number: 4444333322221111
- Validity: 05/28
- CVV: 235
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:
- success: when payment has been accepted
- cancelled: when the customer has cancelled the payment by himself
- rejected: when the payment has been rejected
- pending: when the payment is pending for manual action (signature or verification)
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:
- SDK Key: Define a key/token that will be used to authenticate your requests to the SDK
- Allowed Origins: Specify the origins that are permitted to use the SDK (e.g.,
https://yoursite.com,https://www.yoursite.com)
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
- Load SDK from the sandbox domain:
https://www.easyprocess.info/sdk/v1/sdk.min.js - Test cards for synchronous processors:
- Success:
4444333322221111 - Decline: Any other valid card number
- Success:
- Test cards for async processors:
- Success:
4242424242424242 - Decline: Any other valid card number
- Success:
Browser Console
- Open Developer Tools (F12)
- Check Console for any errors
- Verify SDK initialization message
Common Test Scenarios
- Successful payment
- Declined card
- Invalid card number
- Expired card
- Missing required fields
Production Checklist
- [ ] Load SDK from production domain (
https://www.easyprocess.ai) - [ ] Verify CORS origins are correctly configured
- [ ] Test with real payment amounts
- [ ] Implement proper error handling
- [ ] Add logging for troubleshooting
- [ ] Set up webhook endpoints for backend processing
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:
- SDK initialization details (including domain-inferred environment)
- SSE connection events (open, message, error)
- Status updates received from the stream
- Non-fatal parse or network errors
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.
- What it is: Server-to-server notification on status changes (completed, rejected, refunded, etc.)
- Why it matters: More reliable than browser redirects; ensures consistent backend updates
- What to do: Expose a secure endpoint that validates the message and finalizes your order on terminal status
- Learn more: See the IPN section in this documentation
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:
- Enable logging - Initialize with
onLogto capture SDK messages - Verify domain/environment - Ensure correct domain (sandbox:
.biz, prod:.com) - Inspect Network tab - Check the request body and response
- Common causes:
- Invalid/missing
merchant_id - Invalid
sdk_keyor 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)
- Invalid/missing
- Provide
correlation_idto 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:
- Payments
- Refunds
- Rejected request/transaction
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:
- Trigger order fulfillment or enable media downloads when a check clears or a payment is made
- Update your list of customers
- Update accounting records
- Create specialized "to do" lists based on the kind of event
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. | |
| 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:
- one for the Payment Button request: you will have to calculate this hash and send it into your Payment Button.
- Another one in the IPN: you will have to calculate it, and to compare with the one provided in the response.
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):
- merchant_id
- amount
- currency
- order_ref
- your private key
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:
- recurring amount
- cycles
- periodicity
- start_date
- your private key
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):
- request_id
- amount
- currency
- status
- your private key
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
- PO Boxes are not allowed. Transaction created with such address will be rejected.
- Limits like "no more than 3 transactions of the same kind in one day, and 5 in one week, 10 in the month" can apply depending of your agreement.
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:
- Transaction monitoring
- Refunding transactions
- Viewing transaction details
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.