Epay payment gateway integration in TYPO3 extbase extension.

The process is, after booking we will create the new booking record containing booked product info like product name, its total price etc.

The booking record creation action will be like this,

public function createAction(\TYPO3\myext\Domain\Model\Packagebooking $newPackagebooking) {

//create package
$this->packagebookingRepository->add($newPackagebooking);

//get created package id
$persistenceManager = GeneralUtility::makeInstance(‘TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager’);
$persistenceManager->persistAll();
$pUidNew = $newPackagebooking->getUid();

/* Redirect to payment */
$this->redirect(‘payment’, ‘Packagebooking’ ,NULL ,array(‘packagebooking’=>$pUidNew));
}

After record creation we will redirect to payment Action.

public function paymentAction($packagebooking) {
/*
* MD5 key: mymd5key
* merchant id: 123456
*
*/

//get the booked record. $packagebooking contains the uid of the last created booking record
$packagebooking = $this->packagebookingRepository->findByUid($packagebooking);

//generate return url
$accepturl = $this->controllerContext
->getUriBuilder()->reset()
->setTargetPageUid($this->settings[‘orderConfirmationPid’])
->setNoCache(1)
->setArguments(array(
‘tx_myext_checkout’ => array(
‘orderid’ => $packagebooking->getUid(),
‘action’ => ‘paymentconfirm’,
‘controller’ => ‘Packagebooking’,
)
))->buildFrontendUri();
$accepturl = GeneralUtility::getIndpEnv(‘TYPO3_SITE_URL’).$accepturl;

//Generate javascript required for payment gateway api
$paymentwindowJs = ”;
$paymentParams = array(
‘merchantnumber’ => “123456”,
‘amount’ => $packagebooking->getTotalprice() * 100,
‘currency’ => “DKK”,
‘windowstate’=> “2”,
‘orderid’ => $packagebooking->getUid(),
‘accepturl’ => $accepturl
);
$paymentwindowJs .='<script type=”text/javascript”>’;
$paymentwindowJs .=’paymentwindow = new PaymentWindow({‘;
foreach ($paymentParams as $key => $value) {
$paymentwindowJs .= “‘” . $key . “‘: \”” . $value . “\”,\n”;
}
$paymentwindowJs .= “‘hash’:”.'”‘.md5(implode(“”, array_values($paymentParams)) . “mymd5key”).'”‘;
$paymentwindowJs .= ‘});’;
$paymentwindowJs .=’paymentwindow.append(“payment-div”);paymentwindow.open();</script>’;

$this->view->assignMultiple(
array(
‘paymentwindowJs’ => $paymentwindowJs
)
);
}

Payment action template will be like this

<f:layout name=”Default” />
<f:section name=”main”>
<h1>Payment</h1>
<div class=”thankyoumessage”>
<div id=”payment-div”></div>
</div>

<script charset=”UTF-8″ src=”https://ssl.ditonlinebetalingssystem.dk/integration/ewindow/paymentwindow.js” type=”text/javascript”></script>
<f:format.raw>{paymentwindowJs}</f:format.raw>

</f:section>

Aftere this we will proceed in payment by Epay api. After the payment has been done, we will redirec to confirmation page having confirmation plugin.

Below is the confirmation action, here we will calculate the MD5 hash from the return url and compare it with the received hash. And update the payment record accordingly.

public function paymentconfirmAction() {
$posted = GeneralUtility::_GET(‘tx_myext_checkout’);
$posted[‘txnid’] = GeneralUtility::_GET(‘txnid’);
$posted[‘ordernumber’] = GeneralUtility::_GET(‘orderid’);
$posted[‘paymenttype’] = GeneralUtility::_GET(‘paymenttype’);
$posted[‘hash’] = GeneralUtility::_GET(‘hash’);

//Check for bad hash
$params = $_GET;
$var = “”;
foreach ($params as $key => $value) {
if(is_array($value)) {
foreach ($_GET[‘tx_myext_checkout’] as $key => $value) {
$var .= $value;
}
} elseif($key != “hash”) {
$var .= $value;
}
}

$genstamp = md5($var . “mymd5key”);

if($genstamp != $_GET[“hash”]) {
$status = ‘Hash is not valid’;
} else {
//Hash is OK
$status = ‘Transaction success’;
}

$this->packagebookingRepository->updateOrderEpay($posted, $status);
$this->view->assign(‘status’, $status);
}

Hope this helps someone!