Zaakpay Payment Gateway Integration – OpenCart Part 2 |
X

Congrats, You are Subscribed to Receive Updates.

Zaakpay Payment Gateway Integration – OpenCart Part 2


Creating admin section codings are the first part of the tutorials. You can read here. Now we are going to code for front end operations. First open your controller payment class and copy paste the following code into it.

<?php
/*-------------------------------------------------------+
| Zaakpay Payment gateway integration - Opencart  
| https://www.kvcodes.com//2014/01/zaakpay-payment-gateway-integration-opencart-2/
+--------------------------------------------------------+
| Author: Varadharaj V  
| Email: varadharajv@kvcodes.com
+--------------------------------------------------------+*/

class ControllerPaymentZaakpay extends Controller {
	protected function index() {
    	$this->data['button_confirm'] = $this->language->get('button_confirm');
		$this->data['button_back'] = $this->language->get('button_back');		

		$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
    		$this->data['action'] = 'https://api.zaakpay.com/transact';
		$this->data['merchantIdentifier'] = $this->config->get('Zaakpay_merchantIdentifier');
		$secret_key = $this->config->get('Zaakpay_secret_key');
				$merchantIdentifier = $this->config->get('Zaakpay_merchantIdentifier');
						$ip=$_SERVER['REMOTE_ADDR'];
   			$merchantIpAddress = $ip;
		$this->data['secret_key'] = $this->config->get('Zaakpay_secret_key');
		$this->data['orderId']= $this->session->data['order_id']; 
		 $orderId = $this->data['orderId'];		
		 $this->data['returnUrl']= HTTPS_SERVER . 'index.php?route=common/response';
		 $returnUrl= HTTPS_SERVER . 'index.php?route=common/response';
		$this->data['buyerEmail']  	= $order_info['email'];
		$buyerEmail = $order_info['email'];
		$this->data['buyerFirstName']     = $order_info['payment_firstname'];
		$buyerFirstName = $order_info['payment_firstname'];

 $this->data['buyerLastName']     = $order_info['payment_lastname'];
				$buyerLastName = $order_info['payment_lastname'];

 $this->data['buyerAddress'] 	= $order_info['payment_address_1'];
				$buyerAddress = $order_info['payment_address_1'];

$this->data['buyerCity']    	= $order_info['payment_city'];
				$buyerCity = $order_info['payment_city'];
$this->data['buyerState'] 	= $order_info['payment_zone'];
				$buyerState = $order_info['payment_zone'];
				$buyerCountry = $order_info['payment_country'];
				$buyerPincode = $order_info['payment_postcode'];
				$buyerPhoneNumber = $order_info['telephone'];
						if($this->config->get('Zaakpay_test') == "on")
						{			
						$mode='0';
						}
						else
						{			
						$mode='1';
						}
$this->data['buyerCountry']   = $order_info['payment_country'];
		$this->data['buyerPincode']= $order_info['payment_postcode'];
$this->data['buyerPhoneNumber'] 	= $order_info['telephone'];
$this->data['txnType'] 	= "1";
$this->data['zpPayOption'] 	= "1";
		if($this->config->get('Zaakpay_test') == "on")
			$this->data['mode']    			= '0';
		else
			$this->data['mode']    			= '1';	
$this->data['currency'] 	= "INR";
$this->data['amount'] = (int) $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false) * 100;
$this->data['merchantIpAddress'] = $ip;
$this->data['purpose'] 	= "1";
$this->data['productDescription']	=   $this->session->data['payment_method']['title'];
		$txnDate=date('Y-m-d');			
		$this->data['txnDate'] 	= date('Y-m-d');
			$amount=	(int) $this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false) * 100;
			$txnType='1';
			$zpPayOption='1';
			$currency="INR";
			$purpose="1";
			$productDescription=$this->session->data['payment_method']['title'];
	/*		
if(isset($this->session->data['shipping_address_id'])){
			$shipping_address_id = $this->session->data['shipping_address_id'];	
			$shipping_address = $this->model_account_address->getAddress($shipping_address_id);

			$this->data['ShipToAddress']	= $shipping_address['address_1'].",".$shipping_address['address_2'];
			$this->data['ShipToCity']  	= $shipping_address['city'];
			$this->data['ShipToState']  	= $shipping_address['zone'];
			$this->data['ShipToCountry']   	= $shipping_address['country_id'];//Iso 3 char code is supported
			$this->data['ShipToPincode'] = $shipping_address['postcode'];
			$this->data['ShipToPhoneNumber']   	= $order_info['telephone'];
			$this->data['ShipToFirstname']	= $shipping_address['firstname'];
			$this->data['ShipToLastname']	= $shipping_address['lastname'];
		}
		else{
		$this->data['ShipToAddress']	= $order_info['payment_address_1'].",".$order_info['payment_address_2'];
			$this->data['ShipToCity']  	= $order_info['payment_city'];
			$this->data['ShipToState']  	= $order_info['payment_zone'];
			$this->data['ShipToCountry']   	=  $order_info['payment_country_id'];//Iso 3 char code is supported
			$this->data['ShipToPincode'] = $order_info['payment_postcode'];
			$this->data['ShipToPhoneNumber']   	=  $order_info['telephone'];
			$this->data['ShipToFirstname']	= $order_info['payment_firstname'];
			$this->data['ShipToLastname']	= $order_info['payment_lastname'];
		}

				//$product1Description = '';
				//$product2Description = '';
				//$product3Description = '';
				//$product4Description = '';

			if(isset($this->session->data['shipping_address_id'])){
			$shipping_address_id = $this->session->data['shipping_address_id'];	
			$shipping_address = $this->model_account_address->getAddress($shipping_address_id);
			$ShipToAddress =$shipping_address['address_1'].",".$shipping_address['address_2'];
				$ShipToCity = $shipping_address['city'];
				$ShipToState = $shipping_address['zone'];
				$ShipToCountry = $shipping_address['country'];
				$ShipToPincode = $shipping_address['postcode'];
				$ShipToPhoneNumber = $order_info['telephone'];
				$ShipToFirstname = 	$shipping_address['firstname'];
				$ShipToLastname = $shipping_address['lastname'];
		}
		else{

		$ShipToAddress	= $order_info['payment_address_1'].",".$order_info['payment_address_2'];
			$ShipToCity  	= $order_info['payment_city'];
			$ShipToState  	= $order_info['payment_zone'];
			$ShipToCountry   	=  $order_info['payment_country'];//Iso 3 char code is supported
			$ShipToPincode = $order_info['payment_postcode'];
			$ShipToPhoneNumber   	=  $order_info['telephone'];
			$ShipToFirstname	= $order_info['payment_firstname'];
			$ShipToLastname	= $order_info['payment_lastname'];
		}

*/
			$post_variables = Array(
"merchantIdentifier" => $merchantIdentifier,
"orderId" => $orderId,
"returnUrl" => $returnUrl,
"buyerEmail" => $buyerEmail,
"buyerFirstName" => $buyerFirstName,
"buyerLastName" => $buyerLastName,
"buyerAddress" => $buyerAddress,
"buyerCity" => $buyerCity,
"buyerState" => $buyerState,
"buyerCountry" => $buyerCountry,
"buyerPincode" => $buyerPincode,
"buyerPhoneNumber" => $buyerPhoneNumber,
"txnType" => $txnType,
"zpPayOption" => $zpPayOption,
"mode" => $mode,
"currency" => $currency,
"amount" => $amount, //Amount should be in paisa
"merchantIpAddress" => $merchantIpAddress,
"purpose" => $purpose,
"productDescription" => $productDescription,
/*
"ShipToAddress" => $ShipToAddress,
"ShipToCity" => $ShipToCity,
"ShipToState" => $ShipToState,
"ShipToCountry" => $ShipToCountry,
"ShipToPincode" => $ShipToPincode,
"ShipToPhoneNumber" => $ShipToPhoneNumber,
"ShipToFirstname" => $ShipToFirstname,
"ShipToLastname" => $ShipToLastname,
*/
"txnDate" => $txnDate
);

$all = '';
foreach($post_variables as $name => $value) {
if($name !='button_confirm') { if($name !='button_back') { if($name != 'action') { if($name != 'secret_key') { if($name != 'checksum') {
$all .= "'";
if ($name == 'returnUrl') {
$all .= ControllerPaymentZaakpay::sanitizedURL($value);
} else {

$all .= ControllerPaymentZaakpay::sanitizedParamFn($value);
}
$all .= "'";
}}}}}
}

foreach($this->data as $name => $value) {
if($name !='button_confirm') { if($name !='button_back') { if($name != 'action') { if($name != 'secret_key') { if($name != 'checksum') {
if($name == 'returnUrl') {
$this->data[$name]= ControllerPaymentZaakpay::sanitizedURL($value);
} else {
$this->data[$name]= ControllerPaymentZaakpay::sanitizedParamFn($value);
}}}}}}}

if($this->config->get('Zaakpay_log') == "on")
	{			
		error_log("AllParams : ".$all);
		error_log("Secret Key : ".$secret_key);
	}

	$checksum = ControllerPaymentZaakpay::calculateChecksum($secret_key, $all);
	$this->data['checksum']      	= $checksum;

		$this->id = 'payment';
	if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/Zaakpay.tpl')) {
            $this->template = $this->config->get('config_template') . '/template/payment/Zaakpay.tpl';
        } else {
            $this->template = 'default/template/payment/Zaakpay.tpl';
        }

		$this->render();

	}

	function calculateChecksum($secret_key, $all) {
		$hash = hash_hmac('sha256', $all , $secret_key);
		$checksum = $hash;
		return $checksum;
	}

	function verifyChecksum($checksum, $all, $secret_key) {
		$cal_checksum = ControllerPaymentZaakpay::calculateChecksum($secret_key, $all);
		$bool = 0;
		if($checksum == $cal_checksum)	{
			$bool = 1;
		}

		return $bool;
	}

	function sanitizedParamFn($param) {
		$pattern[0] = "%,%";
	        $pattern[1] = "%#%";
	        $pattern[2] = "%\(%";
       		$pattern[3] = "%\)%";
	        $pattern[4] = "%\{%";
	        $pattern[5] = "%\}%";
	        $pattern[6] = "%<%";
	        $pattern[7] = "%>%";
	        $pattern[8] = "%`%";
	        $pattern[9] = "%!%";
	        $pattern[10] = "%\\$%";
	        $pattern[11] = "%\%%";
	        $pattern[12] = "%\^%";
	        $pattern[13] = "%=%";
	        $pattern[14] = "%\+%";
	        $pattern[15] = "%\|%";
	        $pattern[16] = "%\\\%";
	        $pattern[17] = "%:%";
	        $pattern[18] = "%'%";
	        $pattern[19] = "%\"%";
	        $pattern[20] = "%;%";
	        $pattern[21] = "%~%";
	        $pattern[22] = "%\[%";
	        $pattern[23] = "%\]%";
	        $pattern[24] = "%\*%";
	        $pattern[25] = "%&%";
        	$sanitizedParam = preg_replace($pattern, "", $param);
		return $sanitizedParam;
	}

	function sanitizedURL($param) {
		$pattern[0] = "%,%";
	        $pattern[1] = "%\(%";
       		$pattern[2] = "%\)%";
	        $pattern[3] = "%\{%";
	        $pattern[4] = "%\}%";
	        $pattern[5] = "%<%";
	        $pattern[6] = "%>%";
	        $pattern[7] = "%`%";
	        $pattern[8] = "%!%";
	        $pattern[9] = "%\\$%";
	        $pattern[10] = "%\%%";
	        $pattern[11] = "%\^%";
	        $pattern[12] = "%\+%";
	        $pattern[13] = "%\|%";
	        $pattern[14] = "%\\\%";
	        $pattern[15] = "%'%";
	        $pattern[16] = "%\"%";
	        $pattern[17] = "%;%";
	        $pattern[18] = "%~%";
	        $pattern[19] = "%\[%";
	        $pattern[20] = "%\]%";
	        $pattern[21] = "%\*%";
        	$sanitizedParam = preg_replace($pattern, "", $param);
		return $sanitizedParam;
	}
}
?>

Than open your controller common class and copy paste the following code into it.

<?php
/*-------------------------------------------------------+
| Zaakpay Payment gateway integration - Opencart  
| https://www.kvcodes.com//2014/01/zaakpay-payment-gateway-integration-opencart-2/
+--------------------------------------------------------+
| Author: Varadharaj V  
| Email: varadharajv@kvcodes.com
+--------------------------------------------------------+*/

class ControllerCommonResponse extends Controller { 
public function index() { 

 $this->load->language('common/Zaakpay');
$this->data['button_confirm'] = $this->language->get('button_confirm');
$this->data['button_continue'] = $this->language->get('button_continue');
$this->data['heading_title'] = $this->language->get('heading_title');
$this->data['continue'] = HTTP_SERVER . 'index.php?route=common/home';

$secret_key = $this->config->get('Zaakpay_secret_key');
if(isset($_REQUEST['orderId'])) {

	 $response = array();
				$orderId=$_REQUEST['orderId'];
	 $response['orderId']=$orderId;
	 $response['responseCode']=$_REQUEST['responseCode'];
	 $response['responseDescription']=$_REQUEST['responseDescription'];
	 $response['checksum']=$_REQUEST['checksum'];
	 $this->data['response']=$response;

	$all = ControllerCommonResponse::getAllParams();
$bool = 0;
$bool = ControllerCommonResponse::verifyChecksum($response['checksum'], $all, $secret_key);
if($this->config->get('Zaakpay_log') == "on")
	{			
		error_log("AllParams : ".$all);
		error_log("Secret Key : ".$secret_key);
	}					
	$this->load->model('checkout/order');
if($bool==1)
{

	if($response['responseCode']=='100')
{
		if (isset($this->session->data['order_id'])) {
			$this->cart->clear();

			unset($this->session->data['shipping_method']);
			unset($this->session->data['shipping_methods']);
			unset($this->session->data['payment_method']);
			unset($this->session->data['payment_methods']);
			unset($this->session->data['guest']);
			unset($this->session->data['comment']);
			unset($this->session->data['order_id']);	
			unset($this->session->data['coupon']);
		}

$this->model_checkout_order->confirm($orderId,'5');

	 $this->data['responseMsg']='<div style="width:965px;float:left;padding:5px;margin:10px 0px;background-color:#66CCFF;color:#000000;-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px;" class="box-box"><p><center>Thank you for shopping with us. Your account has been charged and your transaction is successful. We will be shipping your order to you soon.</center></p></div><br/><br/>';
}
else
{	
	$this->model_checkout_order->confirm($orderId,'10');
	 $this->data['responseMsg']='<div style="width:965px;float:left;padding:5px;margin:10px 0px;background-color:#66CCFF;color:#000000;-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px;" class="box-box"><p><center>Thank you for shopping with us. However, the transaction has been declined!!.</center><p/></div><br/><br/><h2> ';
}
		}
		else
		{
		$this->model_checkout_order->confirm($orderId,'10');
		 $this->data['responseMsg']='<div style="width:965px;float:left;padding:5px;margin:10px 0px;background-color:#66CCFF;color:#000000;-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px;" class="box-box"><p><center>Security Error. Illegal access detected.</center><p/></div><br/><br/><h2> ';
		}
		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/common/response.tpl')) {
			$this->template = $this->config->get('config_template') . '/template/common/response.tpl';
		} else {
			$this->template = 'default/template/common/response.tpl';
		}

			$this->children = array(
			'common/header',
			'common/footer',
			'common/column_left',
			'common/column_right'
		);
		$this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));
	 }

	 }
	 	function calculateChecksum($secret_key, $all) {
		$hash = hash_hmac('sha256', $all , $secret_key);
		$checksum = $hash;
		return $checksum;
	}

	function getAllParams() {
		//ksort($_POST);
		$all = '';
		foreach($_POST as $key => $value)	{
			if($key != 'checksum') {
				$all .= "'";
				if ($key == 'returnUrl') {
					$all .= ControllerCommonResponse::sanitizedURL($value);
				} else {
					$all .= ControllerCommonResponse::sanitizedParam($value);
				}
				$all .= "'";
			}
		}

		return $all;
	}

		function verifyChecksum($checksum, $all, $secret) {
		$cal_checksum = ControllerCommonResponse::calculateChecksum($secret, $all);
		$bool = 0;
		if($checksum == $cal_checksum)	{
			$bool = 1;
		}

		return $bool;
	}

	function sanitizedParam($param) {
		$pattern[0] = "%,%";
	        $pattern[1] = "%#%";
	        $pattern[2] = "%\(%";
       		$pattern[3] = "%\)%";
	        $pattern[4] = "%\{%";
	        $pattern[5] = "%\}%";
	        $pattern[6] = "%<%";
	        $pattern[7] = "%>%";
	        $pattern[8] = "%`%";
	        $pattern[9] = "%!%";
	        $pattern[10] = "%\\$%";
	        $pattern[11] = "%\%%";
	        $pattern[12] = "%\^%";
	        $pattern[13] = "%=%";
	        $pattern[14] = "%\+%";
	        $pattern[15] = "%\|%";
	        $pattern[16] = "%\\\%";
	        $pattern[17] = "%:%";
	        $pattern[18] = "%'%";
	        $pattern[19] = "%\"%";
	        $pattern[20] = "%;%";
	        $pattern[21] = "%~%";
	        $pattern[22] = "%\[%";
	        $pattern[23] = "%\]%";
	        $pattern[24] = "%\*%";
	        $pattern[25] = "%&%";
        	$sanitizedParam = preg_replace($pattern, "", $param);
		return $sanitizedParam;
	}

	function sanitizedURL($param) {
		$pattern[0] = "%,%";
	        $pattern[1] = "%\(%";
       		$pattern[2] = "%\)%";
	        $pattern[3] = "%\{%";
	        $pattern[4] = "%\}%";
	        $pattern[5] = "%<%";
	        $pattern[6] = "%>%";
	        $pattern[7] = "%`%";
	        $pattern[8] = "%!%";
	        $pattern[9] = "%\\$%";
	        $pattern[10] = "%\%%";
	        $pattern[11] = "%\^%";
	        $pattern[12] = "%\+%";
	        $pattern[13] = "%\|%";
	        $pattern[14] = "%\\\%";
	        $pattern[15] = "%'%";
	        $pattern[16] = "%\"%";
	        $pattern[17] = "%;%";
	        $pattern[18] = "%~%";
	        $pattern[19] = "%\[%";
	        $pattern[20] = "%\]%";
	        $pattern[21] = "%\*%";
        	$sanitizedParam = preg_replace($pattern, "", $param);
		return $sanitizedParam;
	}

}
?> 

Than move to model class copy paste the following code.

<?php 
/*-------------------------------------------------------+
| Zaakpay Payment gateway integration - Opencart  
| https://www.kvcodes.com//2014/01/zaakpay-payment-gateway-integration-opencart-2/
+--------------------------------------------------------+
| Author: Varadharaj V  
| Email: varadharajv@kvcodes.com
+--------------------------------------------------------+*/

class ModelPaymentZaakpay extends Model {
  	public function getMethod($address, $total) {
		$this->load->language('payment/Zaakpay');

		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('Zaakpay_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");

		if ($this->config->get('total') > $total) {
			$status = false;
		} elseif (!$this->config->get('geo_zone_id')) {
			$status = true;
		} elseif ($query->num_rows) {
			$status = true;
		} else {
			$status = false;
		}	

		$method_data = array();

		if ($status) {  
      		$method_data = array( 
        		'code'       => 'Zaakpay',
        		'title'      => $this->language->get('text_title'),
			'sort_order' => $this->config->get('sort_order')
      		);
    	}

    	return $method_data;
  	}
}
?>

After that move to Language payment class.

<?php
// Text
$_['text_title']        = 'Zaakpay';
$_['heading_title']     = 'Zaakpay';
$_['text_payment']		= 'Payment';
?>

than language common class

<?php
// Text
$_['heading_title']     = 'Zaakpay';
$_['text_title'] = 'Simplifying payments in India';
?>

than move to view template and open payment/zaakpay.tpl than copy paste the following codes into it

<form action="<?php echo $action; ?>" method="post" id="payment">

<input type="hidden" name="merchantIdentifier" value="<?php echo $merchantIdentifier; ?>" />
<input type="hidden" id="orderId" name="orderId" value="<?php echo $orderId; ?>"/>
<input type="hidden" name="returnUrl" id="returnUrl" value="<?php echo $returnUrl ; ?>"/>

	<input type="hidden" name="buyerEmail" id="buyerEmail" value="<?php echo $buyerEmail; ?>"  />
	<input type="hidden" name="buyerFirstName" id="buyerFirstName" value="<?php echo $buyerFirstName; ?>" />
<input type="hidden" name="buyerLastName" id="buyerLastName" value="<?php echo $buyerLastName; ?>" />
<input type="hidden" name="buyerAddress" id="buyerAddress" value="<?php echo $buyerAddress; ?>" /> 
<input type="hidden" name="buyerCity" id="buyerCity" value="<?php echo $buyerCity; ?>" />
<input type="hidden" name="buyerState" id="buyerState" value="<?php echo $buyerState; ?>" />
<input type="hidden" name="buyerCountry" id="buyerCountry" value="<?php echo $buyerCountry; ?>" />
	<input type="hidden" name="buyerPincode" id="buyerPincode" value="<?php echo $buyerPincode; ?>" />
	<input type="hidden" name="buyerPhoneNumber" id="buyerPhoneNumber" value="<?php echo $buyerPhoneNumber; ?>" />
	<input type="hidden" name="txnType" id="txnType" value="<?php echo $txnType ; ?>" />
	<input type="hidden" name="zpPayOption" id="zpPayOption" value="<?php echo $zpPayOption ; ?>" />
	<input type="hidden" name="mode" id="mode" value="<?php echo $mode ; ?>" /> 
	<input type="hidden" name="currency" value="<?php echo $currency ; ?>" />
	<input type="hidden" name="amount" id="amount" value="<?php echo $amount ; ?>" />
	<input type="hidden" name="merchantIpAddress" id="merchantIpAddress" value="<?php echo $merchantIpAddress ; ?>" />
<input type="hidden" name="purpose" id="purpose" value="<?php echo $purpose ; ?>" />
<input type="hidden" name="productDescription" id="productDescription" value="<?php echo $productDescription ; ?>" />
<!-- <input type="hidden" name="product1Description" id="product1Description" value=""/> -->

 <!-- <input type="hidden" name="product2Description" id="product2Description" value=""/> -->

 <!-- <input type="hidden" name="product3Description" id="product3Description" value=""/> -->

<!-- <input type="hidden" name="product4Description" id="product4Description" value=""/> -->
<!--
 <input type="hidden" name="shipToAddress" id="shipToAddress" value="" /> 
 <input type="hidden" name="shipToCity" id="shipToCity" value=""/>

 <input type="hidden" name="shipToState" id="shipToState" value=""/> 

 <input type="hidden" name="shipToCountry" id="shipToCountry" value=""/>

 <input type="hidden" name="shipToPincode" id="shipToPincode" value=""/>

 <input type="hidden" name="shipToPhoneNumber" id="shipToPhoneNumber" value=""/>

 <input type="hidden" name="shipToFirstname" id="shipToFirstname" value=""/>
	<input type="hidden" name="shipToLastname" id="shipToLastname" value=""/>

	-->
<input type="hidden" name="txnDate" id="txnDate" value="<?php echo $txnDate; ?>"/>
  	<input type="hidden" name="checksum" id="checksum" value="<?php echo $checksum; ?>"  />   
 <div class="buttons">
    <div class="right"><a onclick="$('#payment').submit();" class="button"><span><?php echo $button_confirm; ?></span></a></div>
  </div>			
</form>

and finally , open your template common/zaakpay.tpl

 <?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>
 <div class="middle">

  <?php echo $responseMsg; ?>		

</div>
<?php echo $footer; ?>

That’s it for Editing work . Now you have done the Integration of Zaakpay with OpenCart.

 

download the whole zip here.

Download ZaakPay

 

 

commenter

About Varadharaj V

The founder of Kvcodes, Varadharaj V is an ERP Analyst and a Web developer specializing in WordPress(WP), WP Theme development, WP Plugin development, Frontaccounting(FA), Sales, Purchases, Inventory, Ledgers, Payroll & HRM, CRM, FA Core Customization, PHP and Data Analyst. Database Management Advance Level

Comment Below

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

*

Current ye@r *

Menu

Sidebar