PayLe REST API

Merchants can use PayLe REST API as their Payment gateway.
Currently we are supporting for Java and PHP integration

Requirements:

  • Merchant must have user account in payleq8.com
    • Merchant need to make a request for obtaining the keys for payment integration and system will provide
      • Account ID
      • Account password
      • Resource key

Merchants can use these detail for further development.

Sandbox mode development

This means merchants can use sandbox payment to test their implementation.

Merchant can get how much is the total amount to be charged by the customer by calling this endpoint.

As a example when payment amount is 10,

POST https://sandpay.payleq8.com/apifee/requestfullamounts?lang=en&initialAmount=10&businessCode=(merchant business code here)

Response JSON:

{
    "records": [
        {
            "name": "Knet",
            "fullAmount": 10.350,
            "id": 1
        },
        {
            "name": "Visa / Master Card",
            "fullAmount": 10.600,
            "id": 3
        }
    ],
    "errorMessages": null,
    "errorSetMessages": null,
    "validated": true,
    "httpcode": 200
}

NOTE:
Merchant need to send this full amount detail in payment process

Make The payment

For making the payment, you need to call the url like this.

 API-URL/Lang/TransactionData/TransactionID/Version

API-URL
API Root URL
This is going to be different for sandbox and production
Parameter :- https://sandpay.payleq8.com/payinit/
Required :- Yes

Lang
Transaction page language ( English – en / Arabic – ar )
Parameter :- en
Required :- Yes

Transaction Data
Mean encrypted transaction details. Encryption method will given by System ( JAVA or PHP )
Required :- Yes
Example:-

84AB86C59E0E1B0F13504C836C09F1106001BF4CEB8C7B0FB8E1768672FDA97D387DE86019353E6D1CBE8930F2E05395885EEC82E56940EF2D737E9C7611322C5F5AF1EF04EC423ED96C638017A2E1D51030C06D5F63F6540C6B194BA4F116F788BAE7401678E5E90B45162564DEFE58B42E7139609359C9C236F18A4B9933FCB6D04C89502FA9E16E43B7832F951D6491039B5AC03C02D856C135D4E5E70E42495DC5A0038362BDDE53FB5A4F194A2B40546A865F0763CE625B2998A7E1A3ACDC01B86B7F7D1F9CA2BCD1A52733D7447BBF03F419B13CC94A9202E3242AC9DD40A442B0D5617C3C239B985D2058D825A19DF368E723494726FB3C52C450DBDABC9AEE6686FA7B2C5751545076FA9641F896837E07422526E2582452C82207F1B55DE2CAD18C000C12BC923060BB5DAA

TransactionID
System given account id when request for get public payment integration
Parameter :- Transaction account id
Required :- Yes

Version
API Version
Parameter :- 0
Required :- Yes

Here is a complete sample URL:

https://sandpay.payleq8.com/payinit/en/84AB86C59E0E1B0F13504C836C09F1106001BF4CEB8C7B0FB8E1768672FDA97D387DE86019353E6D1CBE8930F2E05395885EEC82E56940EF2D737E9C7611322C5F5AF1EF04EC423ED96C638017A2E1D51030C06D5F63F6540C6B194BA4F116F788BAE7401678E5E90B45162564DEFE58B42E7139609359C9C236F18A4B9933FCB6D04C89502FA9E16E43B7832F951D6491039B5AC03C02D856C135D4E5E70E42495DC5A0038362BDDE53FB5A4F194A2B40546A865F0763CE625B2998A7E1A3ACDC01B86B7F7D1F9CA2BCD1A52733D7447BBF03F419B13CC94A9202E3242AC9DD40A442B0D5617C3C239B985D2058D825A19DF368E723494726FB3C52C450DBDABC9AEE6686FA7B2C5751545076FA9641F896837E07422526E2582452C82207F1B55DE2CAD18C000C12BC923060BB5DAA/Trsactionaccountid/0
For Java

Step1: Create Encrypt String

String TpId = “Account id that given by system ” ;// must be string
String ReqTranportalId = "tpid="+ TpId +"&";
   	 
    	String TpKey = “Account password that given by system ” ;// must be string
    	String ReqTranportalPassword = "tpkey="+ TpKey +"&";
   	 
    	String TranAmount = “Amount without commission calculation”;// must be string
    	String ReqAmount = "amount="+TranAmount+"&";
   	 
    	String TranFullAmount = “Amount with commission calculation”;// must be string
    	String ReqFullAmount = "fullamount="+TranFullAmount+"&";
           	 
    	String paymenttype = “Card type”;// “1 mean Knet, 3 mean Visa/Master” must be string	
    	String ReqPaymentType = "paymenttype="+ paymenttype +"&";
   	 
    	String businesscode =  “business code that given by system”;// must be string
    	String ReqBusinesscode = "businesscode="+ businesscode +"&";
   	 
    	String TranTrackid= “Unique key for identify transaction given by merchant”;// must be string
    	String ReqInvoiceKey="invoicekey="+TranTrackid+"&";
   	 
 	String udf1 = “return url must be give by merchant”;// must be string
    	String ReqUdf1 = "udf1="+ udf1 +"&";    
String udf2 = “merchant can define , not required”;// must be string
    	String ReqUdf2 = "udf2="+ udf2 +"&";    
	String udf3 = “merchant can define , not required”;// must be string
    	String ReqUdf3 = "udf3="+ udf3 +"&";
   	 
    	String paymentmedia = “Payment source”; //“0 mean mobile app, 1 mean web browser” must be string
    	String ReqPaymentMedia = "paymentmedia="+paymentmedia+"&";
   	
 //Buyer details 
String buyerMobile= “Buyer mobile number”;// must be string 

    	String ReqPaymentBuyerMobile = "buyermobile="+buyerMobile+"&";

	String buyerEmail= “Buyer email”;// must be string
    	String ReqPaymentBuyerEmail = "buyeremail="+buyerEmail+"&";

	String buyerName= “Buyer name”;// must be string
String ReqPaymentBuyerName = "buyername="+buyerName+"&";

String transactionRequestData = ReqPaymentMedia+ReqAmount+ReqFullAmount
        +ReqPaymentType+ReqBusinesscode+ReqInvoiceKey+ReqUdf1+ReqUdf2+ReqUdf3
        +ReqTranportalId+ReqTranportalPassword+ReqPaymentBuyerMobile
        +ReqPaymentBuyerEmail+ReqPaymentBuyerName;


String encriptData = call encryption method to encrypt data;
Example 
 String encriptData = encryptAES(transactionRequestData);// need to call encryptAES in PayleGatewayHelper Service class
For PHP

Step1:Create Encrypt String 

$TranportalId =  “Account id that given by system ” ;
    	$ReqTranportalId = "tpid=".$TranportalId."&";
   	 
    	$TranportalKey =  “Account password that given by system ” ;
    	$ReqTranportalKey = "tpkey=".$TranportalKey."&";
   	 
    	$TranAmount =  “Amount without commission calculation”;
    	$ReqAmount = "amount=".$TranAmount."&";
   	 
    	$TranFullAmount = “Amount with commission calculation”;
    	$ReqFullAmount = "fullamount=".$TranFullAmount."&";
           	 
    	$paymenttype =  “Card type”; // “1 mean Knet, 3 mean Visa/Master”
    	$ReqPaymentType = "paymenttype=".$paymenttype."&";
   	 
    	$businesscode =  “business code that given by system”;
    	$ReqBusinesscode = "businesscode=".$businesscode."&";
   	 
  	$invoicekey =  “Unique key for identify transaction given by merchant”;
    	$ReqInvoiceKey="invoicekey=".$invoicekey."&";

    	$udf1 = “return url must be give by merchant”;
    	$udf2 = “merchant can define , not required”;
    	$udf3 = “merchant can define , not required”;

    	$ReqUdf1 = "udf1=". $udf1 ."&";   
    	$ReqUdf2 = "udf2=". $udf2 ."&";    
    	$ReqUdf3 = "udf3=". $udf3 ."&";
   	 
    	$paymentmedia = “Payment source”; //“0 mean mobile app, 1 mean web browser” 
    	$ReqPaymentMedia = "paymentmedia=".$paymentmedia."&";
    	$buyerMobile = “Buyer mobile number”;
    	$buyerEmail = “Buyer email”;
    	$buyername = “Buyer name”;

   	 
    	$ReqPaymentBuyerMobile = "buyermobile=".$buyerMobile."&";
    	$ReqPaymentBuyerEmail = "buyeremail=".$buyerEmail."&";
$ReqPaymentBuyerName = "buyername=".$buyername."&";

   	 $transactionRequestData = $ReqPaymentMedia.$ReqAmount.$ReqFullAmount.$ReqPaymentType.$ReqBusinesscode.$ReqInvoiceKey.$ReqUdf1.$ReqUdf2.$ReqUdf3.$ReqTranportalId.$ReqTranportalPassword.$ReqPaymentBuyerMobile.$ReqPaymentBuyerEmail.$ReqPaymentBuyerName;

$encriptData = call encryption method to encrypt data;
Example 
$phpclass = new PHP_AES_Cipher;
$encriptData = $phpclass->encrypt($transactionRequestData);// need to call encrypt in aescipher.php class
For PHP & JAVA

Step 02: Create request url

NOTE: You can use any url for development testing. But for the production environment you need to send us the final URL ( that you need for us to send the payment status parameters ) when you request for the production API Keys.

JAVA
String  redirectUrl= “https://sandpay.payleq8.com/payinit/en/”+encriptData+”/”+TpId+”/0”;

PHP
$redirectUrl= “https://sandpay.payleq8.com/payinit/en/”.$encriptData.”/”.$TpId.”/0”;

Step 03:

Call this url in java class
return "redirect:" + redirectUrl;

In PHP
header("Location:" .$redirectUrl);

Step 04:

After complete transaction process will send response given url by merchant (UDF1)

Response url will look like:

Given url + “?code=00&error=&refnumber=4592951491159139322&trackNumber=3784359362267089584&transDate=CAD67EA864563BB7BBA102881BFC06D6DF55F962A050A53B31A6D08051757486CC05061522C2CC20EAF88E1FC5B24C9F83E8ED7C4931CDDD55E320CBC257992F314DB02B5BE96CFE40A0353A7EC11B603AEAF71974C8F18D1CEBE8E471662EB456FDE815431539D2B7E40EA994416AEC3272F125017485D61EC509AE1C9F6DD6771E3E122BE8DBBED7869E38DEB5E65BAECF689678EB9F7D25996AD6AE784C5D0E68737C09D285408B609EF1CEE0404DF1370A4BEE724B20A0C0D26874E41F148A90AE2797C573CB66C1DC6B6BE95DF82AE0B9A9D6C654B1EBFA08EA74203CBA550C403032BA8330AA74ADFDD858F02526F29B9D77BCECC6E6ECF9F50ED4C0EF2D390F17456F21208B0BE950619514970065BB1AD7EB2E1EB67C4B20E42B890B2E605271A47605C154860F12F0D4A64E3F01C5CBA1CE93ADACCD5CA3467409912910404E131770E58DB6D20E3AE15A3D99D87273327F20000673807C3749ABC66EA27C26F09240D55436FFC423A99C7737C2B5743F0E0562B82712E723294420”;

Code:

Payment process status

00 = success payment initiation with no error;

Other codes meaning error or fail:

        Miss Match Amount = "01";
	Miss Match Payment Method = "02";
	Duplicate Key = "03";
	System Cannot Find Detail = "04";
	Bank Given Error = "05";
	System Cannot Find Transaction Detail = "06";
	Fail Transaction = "07";
	Cancel Transaction = "08";
	System Cannot Save Data = "09";
	System Technical Error = "10";
	System Error = "11";
	Validation Fail = "12";

Note that :- code 00 does not mean payment is success

Error: If there is any error, it will show here

Refnumber: Unique key for the transaction by merchant

TrackNumber: Unique key by PayLe system to track transaction

TransData: Encrypted data by PayLe system

From here this data needs to be decrypted:

Example:

Java
String decriptData  = decryptAES(TransDate);// need to call decryptAES in PayleGatewayHelper Service class
PHP
$phpclass->decrypt(TransDate);// need to call encrypt in aescipher.php class

After decrypt it will see like below

decriptData = paymentmedia=1&earnamount=100.000&amount=100.000&fullamount=103.300&paymenttype=3&businesscode={business code}&invoicekey={given reference key by merchant}&udf1={given url here}&udf2=null&udf3=null&tranportalid={given transaction account id }&buyermobile=null&buyeremail=null&buyername=null&paymentid={given unique key by system}&result=1

After decrypt:

Paymentmedia 

mean payment source 0 through app, 1 through web browser

Earnamount

mean merchant earn amount that particular transaction

Amount

Mean payment amount without commission given in initial request

Full Amount

Mean payment  amount with commission calculation given in initial request

PaymentType

Mean card type (1 Knet, 3 Visa/Master) given in initial request

BusinessCode

Mean business code given in initial request

Invoice key

Mean given reference key by merchant in initial request

Udf1 ,udf2,udf3 

Mean user defined data given in initial request

Tranportalid

Mean given transaction account id by system in initial request

Buyermobile

Mean buyer mobile number given by merchant in initial request 

Buyeremail

Mean buyer email given by merchant in initial request 

Buyername

Mean buyer name given by merchant in initial request 

Result

Mean after complete process check whether it success or not

** this code is very important
Result code 

If code is 1
Payment was success and merchant earn money 
Else 
Payment was not success

Java:

Create a service class call  PayleGatewayHelper

import java.math.BigDecimal;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.springframework.stereotype.Service;

@Service
public class PayleGatewayHelper {
	private static final String HEX_DIGITS = "0123456789abcdef";
    private static final String RESOURCE_KEY = "**********";// given by payle system
    
	private  String encryptAES(String encryptString) throws Exception{   	 
    	byte[] encryptedText=null;
    	IvParameterSpec ivspec=null;
    	SecretKeySpec skeySpec=null;
    	Cipher cipher=null;
    	byte[]  text=null;
    	String s=null;
        	try{
           	 
            	ivspec = new IvParameterSpec(RESOURCE_KEY.getBytes("UTF-8"));
            	skeySpec = new SecretKeySpec(RESOURCE_KEY.getBytes("UTF-8"), "AES");
            	cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            	cipher.init(Cipher.ENCRYPT_MODE, skeySpec,ivspec);
            	text = encryptString.getBytes("UTF-8");
            	encryptedText = cipher.doFinal(text);
            	s = byteArrayToHexString(encryptedText);
           	 
        	}catch(Exception e){
            	e.printStackTrace();
        	}
        	finally
        	{
            	encryptedText=null;
            	ivspec=null;
            	skeySpec=null;
            	cipher=null;
            	text=null;
        	}
    	return s.toUpperCase();   	 
	}
    
	private static String byteArrayToHexString(byte[] data) {
    	return byteArrayToHexString(data, data.length);
	}
    
	private static String byteArrayToHexString(byte[] data, int length) {
    	StringBuffer buf = new StringBuffer();

    	for (int i = 0; i != length; i++) {
        	int v = data[i] & 0xff;

        	buf.append(HEX_DIGITS.charAt(v >> 4));
        	buf.append(HEX_DIGITS.charAt(v & 0xf));
    	}

    	return buf.toString();
	}
    
	public static String decryptAES(String encryptedString) throws Exception{
    	SecretKeySpec skeySpec=null;
    	IvParameterSpec ivspec=null;
    	Cipher cipher =null;
    	byte[] textDecrypted=null;
    	try{    

    	byte[] b = hexStringToByteArray(encryptedString);
    	skeySpec = new SecretKeySpec(RESOURCE_KEY.getBytes("UTF-8"), "AES");
    	ivspec = new IvParameterSpec(RESOURCE_KEY.getBytes("UTF-8"));
    	cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    	cipher.init(Cipher.DECRYPT_MODE, skeySpec,ivspec);
    	textDecrypted = cipher.doFinal(b);
    	}catch(Exception e){
    	e.printStackTrace();
    	}
    	finally
    	{
    	skeySpec=null;
    	ivspec=null;
    	cipher =null;
	}

return(new String(textDecrypted));
}

private static byte[] hexStringToByteArray(String s) {
	int len = s.length();
	byte[] data = new byte[len / 2];
	for (int i = 0; i < len; i += 2) {
	data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
	.digit(s.charAt(i + 1), 16));
	}
	return data;
}
}

PHP:

Create class aescipher

<?php
class PHP_AES_Cipher {

	private static $OPENSSL_CIPHER_NAME = "aes-128-cbc"; //Name of OpenSSL Cipher
	private static $CIPHER_KEY_LEN = 16; //128 bits
private static $key =  "**********";// given by payle system

	/**
 	* Encrypt data using AES Cipher (CBC) with 128 bit key
 	*
 	* @param type $key - key to use should be 16 bytes long (128 bits)
 	* @param type $data - data to encrypt
 	* @return encrypted data in base64 encoding with iv attached at end after a :
 	*/

	static function encrypt($data) {
    	if (strlen($key) < PHP_AES_Cipher::$CIPHER_KEY_LEN) {
        	$key = str_pad("$key", PHP_AES_Cipher::$CIPHER_KEY_LEN, "0"); //0 pad to len 16
    	} else if (strlen($key) > PHP_AES_Cipher::$CIPHER_KEY_LEN) {
        	$key = substr($str, 0, PHP_AES_Cipher::$CIPHER_KEY_LEN); //truncate to 16 bytes
    	}



    	    	
    	$encryptedPayload = bin2hex (openssl_encrypt($data, PHP_AES_Cipher::$OPENSSL_CIPHER_NAME, $key, OPENSSL_RAW_DATA, $key));

    	return strtoupper($encryptedPayload);

	}


    

	/**
 	* Decrypt data using AES Cipher (CBC) with 128 bit key
 	*
 	* @param type $key - key to use should be 16 bytes long (128 bits)
 	* @param type $data - data to be decrypted in base64 encoding with iv attached at the end after a :
 	* @return decrypted data
 	*/
	static function decrypt( $data) {

    	 
    	if (strlen($key) < PHP_AES_Cipher::$CIPHER_KEY_LEN) {
        	$key = str_pad("$key", PHP_AES_Cipher::$CIPHER_KEY_LEN, "0"); //0 pad to len 16
    	} else if (strlen($key) > PHP_AES_Cipher::$CIPHER_KEY_LEN) {
        	$key = substr($str, 0, PHP_AES_Cipher::$CIPHER_KEY_LEN); //truncate to 16 bytes
    	}

    	$hex2bin = hex2bin($data);
    	$decryptedData = openssl_decrypt($hex2bin, PHP_AES_Cipher::$OPENSSL_CIPHER_NAME, $key, OPENSSL_RAW_DATA, $key);

    	// $parts = explode(':', $data); //Separate Encrypted data from iv.
    	// $decryptedData = openssl_decrypt(base64_decode($parts[0]), PHP_AES_Cipher::$OPENSSL_CIPHER_NAME, $key, OPENSSL_RAW_DATA, base64_decode($parts[1]));

    	return $decryptedData;
	}

}
?>
For The Production : 
1- Change the URL to --> https://trans.payleq8.com/gatewaypublicinit

Leave A Comment

Your email address will not be published. Required fields are marked *