customerData = new RealexHelperCustomerData();
$this->_loggable = TRUE;
$this->tableFields = array_keys($this->getTableSQLFields());
$this->_tablepkey = 'id';
$this->_tableId = 'id';
$varsToPush = $this->getVarsToPush();
$this->setCryptedFields(array('shared_secret', 'rebate_password'));
$this->setConfigParameterable($this->_configTableFieldName, $varsToPush);
}
/**
* Create the table for this plugin if it does not yet exist.
*/
protected function getVmPluginCreateTableSQL () {
return $this->createTableSQL('Payment Realex_hpp_api Table');
}
/**
* Fields to create the payment table
* @return string SQL Fileds
*/
function getTableSQLFields () {
$SQLfields = array(
'id' => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT',
'virtuemart_order_id' => 'int(11) UNSIGNED',
'order_number' => 'char(64)',
'virtuemart_paymentmethod_id' => 'mediumint(1) UNSIGNED',
'payment_name' => 'varchar(5000)',
'payment_order_total' => 'decimal(15,5) NOT NULL',
'payment_currency' => 'smallint(1)',
'email_currency' => 'smallint(1)',
'cost_per_transaction' => 'decimal(10,2)',
'cost_percent_total' => 'decimal(10,2)',
'tax_id' => 'smallint(1)',
'realex_hpp_api_custom' => 'varchar(255)',
'realex_hpp_api_request_type_response' => 'varchar(32)',
'realex_hpp_api_response_result' => 'varchar(3)',
'realex_hpp_api_response_pasref' => 'varchar(50)',
'realex_hpp_api_response_authcode' => 'varchar(10)',
'realex_hpp_api_fullresponse_format' => 'varchar(10)',
'realex_hpp_api_fullresponse' => 'text',
);
return $SQLfields;
}
/**
* @param $cart
* @param $order
* @return bool|null
*/
public function plgVmConfirmedOrder ($cart, $order) {
if (!($this->_currentMethod = $this->getVmPluginMethod($order['details']['BT']->virtuemart_paymentmethod_id))) {
return NULL; // Another method was selected, do nothing
}
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
return FALSE;
}
if (!class_exists('VirtueMartModelOrders')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php');
}
if (!class_exists('VirtueMartModelCurrency')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'currency.php');
}
$this->setInConfirmOrder($cart);
$email_currency = $this->getEmailCurrency($this->_currentMethod);
$payment_name = $this->renderPluginName($this->_currentMethod, 'order');
$realexInterface = $this->_loadRealexInterface();
$realexInterface->loadCustomerData();
$realexInterface->debugLog('order number: ' . $order['details']['BT']->order_number, 'plgVmConfirmedOrder', 'debug');
$realexInterface->setCart($cart);
/*
if (!$realexInterface->validateConfirmedOrder()) {
vmInfo('VMPAYMENT_REALEX_HPP_API_PLEASE_SELECT_OPTION');
return false;
}
*/
$realexInterface->setOrder($order);
$realexInterface->setPaymentCurrency();
$realexInterface->setTotalInPaymentCurrency($order['details']['BT']->order_total);
// Prepare data that should be stored in the database
$dbValues['order_number'] = $order['details']['BT']->order_number;
$dbValues['payment_name'] = str_replace(array('\t', '\n'), '', $payment_name);
$dbValues['virtuemart_paymentmethod_id'] = $cart->virtuemart_paymentmethod_id;
$dbValues['realex_hpp_api_custom'] = $realexInterface->getContext();
$dbValues['cost_per_transaction'] = $this->_currentMethod->cost_per_transaction;
$dbValues['cost_percent_total'] = $this->_currentMethod->cost_percent_total;
$dbValues['payment_currency'] = $realexInterface->getPaymentCurrency();
$dbValues['email_currency'] = $email_currency;
$dbValues['payment_order_total'] = $realexInterface->getTotalInPaymentCurrency();
$dbValues['tax_id'] = $this->_currentMethod->tax_id;
$this->storePSPluginInternalData($dbValues);
VmConfig::loadJLang('com_virtuemart_orders', TRUE);
$selectedCCParams = array();
if ($this->_currentMethod->integration == 'redirect') {
if (!$realexInterface->doRealvault($selectedCCParams)) {
$html = $realexInterface->sendPostRequest();
vRequest::setVar('html', $html);
$cart->_confirmDone = FALSE;
$cart->_dataValidated = FALSE;
$cart->setCartIntoSession();
} else {
if (!JFactory::getUser()->guest AND $this->_currentMethod->realvault) {
$remoteCCFormParams = $realexInterface->getRemoteCCFormParams();
$html = $this->renderByLayout('remote_cc_form', $remoteCCFormParams);
vRequest::setVar('html', $html);
vRequest::setVar('display_title', false);
return;
}
$response = $realexInterface->requestReceiptIn($selectedCCParams);
$request_type = $realexInterface->request_type . '_request';
$this->_storeRealexInternalData($realexInterface->xml_request, $this->_currentMethod->virtuemart_paymentmethod_id, $order['details']['BT']->virtuemart_order_id, $order['details']['BT']->order_number, $request_type);
$realexInterface->manageResponseRequestReceiptIn($response);
$xml_response = simplexml_load_string($response);
$success = $realexInterface->isResponseSuccess($xml_response);
if ($success) {
$status = $this->_currentMethod->status_success;
$amountInCurrency = vmPSPlugin::getAmountInCurrency($order['details']['BT']->order_total, $order['details']['BT']->order_currency);
$currencyDisplay = CurrencyDisplay::getInstance($cart->pricesCurrency);
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CONFIRMED', $amountInCurrency['display'], $order['details']['BT']->order_number);
} else {
$order_history['comments'] = vmText::_('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CANCELLED');
$status = $this->_currentMethod->status_canceled;
}
$order_history['customer_notified'] = true;
$order_history['order_status'] = $status;
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($order['details']['BT']->virtuemart_order_id, $order_history, TRUE);
$payments = $this->getDatasByOrderId($realexInterface->order['details']['BT']->virtuemart_order_id);
$params = $realexInterface->getResponseParams($payments);
$params['payment_name'] = $this->renderPluginName($this->_currentMethod, 'order');
$html = $this->renderByLayout('response', $params);
vRequest::setVar('html', $html);
$this->customerData->clear();
if ($success) {
if (isset($payments[0]->realex_hpp_api_custom)) {
$cart->emptyCart();
}
}
}
} else {
$remoteCCFormParams = $realexInterface->getRemoteCCFormParams();
$html = $this->renderByLayout('remote_cc_form', $remoteCCFormParams);
vRequest::setVar('html', $html);
vRequest::setVar('display_title', false);
}
return true;
}
function updateOrderStatus ($order, $useTriggers = true) {
$realexInterface = $this->_loadRealexInterface();
$realexInterface->setOrder($order);
$realexInterface->setPaymentCurrency();
$realexInterface->setTotalInPaymentCurrency($order['details']['BT']->order_total);
$cart = VirtueMartCart::getCart();
$realexInterface->setCart($cart, false);
if (!($payments = $this->getDatasByOrderId($order['details']['BT']->virtuemart_order_id))) {
// JError::raiseWarning(500, $db->getErrorMsg());
return null;
}
$payment = end($payments);
$xml_response = simplexml_load_string($payment->realex_hpp_api_fullresponse);
$order_history = array();
$success = $realexInterface->isResponseSuccess($xml_response);
if ($success) {
$status = $this->_currentMethod->status_success;
$amountValue = vmPSPlugin::getAmountInCurrency($order['details']['BT']->order_total, $order['details']['BT']->order_currency);
//$amountValueInPaymentCurrency = vmPSPlugin::getAmountInCurrency($realexInterface->getTotalInPaymentCurrency(), $realexInterface->getPaymentCurrency());
$currencyDisplay = CurrencyDisplay::getInstance($realexInterface->cart->pricesCurrency);
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CONFIRMED', $amountValue['display'], $order['details']['BT']->order_number);
$order_history['success'] = true;
if (isset($xml_response->dccinfo) AND isset($xml_response->dccinfo->cardholderrate)) {
$order_history['comments'] .= "
";
if ($xml_response->dccinfo->cardholderrate != 1.0) {
$order_history['comments'] .= vmText::sprintf('VMPAYMENT_REALEX_HPP_API_DCC_PAY_OWN_CURRENCY_CHARGED', $this->getCardHolderAmount($xml_response->dccinfo->merchantamount), $xml_response->dccinfo->merchantcurrency, $this->getCardHolderAmount($xml_response->dccinfo->cardholderamount), $xml_response->dccinfo->cardholdercurrency);
} else {
$order_history['comments'] .= vmText::sprintf('VMPAYMENT_REALEX_HPP_API_DCC_PAY_MERCHANT_CURRENCY', $this->getCardHolderAmount($xml_response->dccinfo->merchantamount), $xml_response->dccinfo->merchantcurrency);
}
$order_history['comments'] .= "
";
} else {
}
} else {
if ($realexInterface->isResponseDeclined($xml_response)) {
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_DECLINED', $realexInterface->order['details']['BT']->order_number);
} else {
$order_history['comments'] = vmText::_('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CANCELLED');
}
$status = $this->_currentMethod->status_canceled;
$order_history['success'] = false;
}
$order_history['customer_notified'] = true;
$order_history['order_status'] = $status;
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($order['details']['BT']->virtuemart_order_id, $order_history, $useTriggers);
return $success;
}
function redirectToCart ($msg = NULL) {
if (!$msg) {
$msg = vmText::_('VMPAYMENT_REALEX_HPP_API_ERROR_TRY_AGAIN');
}
$this->customerData->clear();
$app = JFactory::getApplication();
$app->redirect(JRoute::_('index.php?option=com_virtuemart&view=cart&Itemid=' . vRequest::getInt('Itemid'), false), $msg);
}
/*********************/
/* Private functions */
/*********************/
private function _loadRealexInterface () {
if ($this->_currentMethod->integration == 'redirect') {
if (!class_exists('RealexHelperRealexRedirect')) {
require(JPATH_SITE . '/plugins/vmpayment/realex_hpp_api/realex_hpp_api/helpers/redirect.php');
}
$realexInterface = new RealexHelperRealexRedirect($this->_currentMethod, $this);
} else {
if ($this->_currentMethod->integration == 'remote') {
if (!class_exists('RealexHelperRealexRemote')) {
require(JPATH_SITE . '/plugins/vmpayment/realex_hpp_api/realex_hpp_api/helpers/remote.php');
}
$realexInterface = new RealexHelperRealexRemote($this->_currentMethod, $this);
} else {
Vmerror('Wrong Realex Integration method - developer error ' . $this->_currentMethod->integration, 'Wrong Realex Integration method ');
return NULL;
}
}
return $realexInterface;
}
public function plgVmOnPaymentResponseReceived (&$html) {
if (!class_exists('VirtueMartCart')) {
require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php');
}
if (!class_exists('shopFunctionsF')) {
require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php');
}
if (!class_exists('VirtueMartModelOrders')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php');
}
VmConfig::loadJLang('com_virtuemart_orders', TRUE);
// the payment itself should send the parameter needed.
$virtuemart_paymentmethod_id = vRequest::getInt('pm', 0);
$order_number = vRequest::getString('on', 0);
if (!($this->_currentMethod = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) {
return NULL; // Another method was selected, do nothing
}
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
return NULL;
}
if (!($virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber($order_number))) {
return NULL;
}
$payments = $this->getDatasByOrderId($virtuemart_order_id);
VmConfig::loadJLang('com_virtuemart');
$orderModel = VmModel::getModel('orders');
$order = $orderModel->getOrder($virtuemart_order_id);
$realexInterface = $this->_loadRealexInterface();
$realexInterface->loadCustomerData();
$realexInterface->setOrder($order);
$params = $realexInterface->getResponseParams($payments);
$params['payment_name'] = $this->renderPluginName($this->_currentMethod, 'order');
$html = $this->renderByLayout('response', $params);
$this->customerData->clear();
$cart = VirtueMartCart::getCart();
$cart->emptyCart();
//vRequest::setVar('display_title', false);
//vRequest::setVar('html', $html);
return TRUE;
}
public function plgVmOnUserPaymentCancel (&$order, $old_order_status) {
$virtuemart_paymentmethod_id = vRequest::getInt('pm', 0);
if (!($this->_currentMethod = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) {
return NULL; // Another method was selected, do nothing
}
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
return NULL;
}
JFactory::getApplication()->enqueueMessage(JText::_('VMPAYMENT_REALEX_HPP_API_ERROR_TRY_AGAIN'));
}
/**
* Display stored payment data for an order
*
* @see components/com_virtuemart/helpers/vmPSPlugin::plgVmOnShowOrderBEPayment()
*/
public function plgVmOnShowOrderBEPayment ($virtuemart_order_id, $virtuemart_paymentmethod_id) {
if (!$this->selectedThisByMethodId($virtuemart_paymentmethod_id)) {
return NULL; // Another method was selected, do nothing
}
if (!($this->_currentMethod = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) {
return FALSE;
}
if (!($payments = $this->getDatasByOrderId($virtuemart_order_id))) {
// JError::raiseWarning(500, $db->getErrorMsg());
return '';
}
$html = $this->showActionOrderBEPayment($virtuemart_order_id, $virtuemart_paymentmethod_id, $payments);
$code = "realex_hpp_api_response_";
$first = TRUE;
foreach ($payments as $payment) {
$html .= '
' . vmText::_('VMPAYMENT_REALEX_HPP_API_DATE') . ' | ' . $payment->created_on . ' |
';
// Now only the first entry has this data when creating the order
if ($first) {
$html .= $this->getHtmlRowBE('COM_VIRTUEMART_PAYMENT_NAME', $payment->payment_name);
// keep that test to have it backwards compatible. Old version was deleting that column when receiving an IPN notification
if ($payment->payment_order_total and $payment->payment_order_total != 0.00) {
$html .= $this->getHtmlRowBE('COM_VIRTUEMART_TOTAL', $payment->payment_order_total * 0.01 . " " . $payment->payment_currency);
}
$first = FALSE;
} else {
$realexInterface = $this->_loadRealexInterface();
if (isset($payment->realex_hpp_api_fullresponse) and !empty($payment->realex_hpp_api_fullresponse)) {
//$realex_data = json_decode($payment->realex_hpp_api_fullresponse);
if ($payment->realex_hpp_api_fullresponse_format == 'json') {
$realex_data = json_decode($payment->realex_hpp_api_fullresponse);
} elseif ($payment->realex_hpp_api_fullresponse_format == 'xml') {
$html .= $this->getHtmlRowBE('VMPAYMENT_REALEX_HPP_API_RESPONSE_TYPE', $payment->realex_hpp_api_request_type_response);
$realex_data = simplexml_load_string($payment->realex_hpp_api_fullresponse);
}
$html .= $realexInterface->onShowOrderBEPayment($realex_data, $payment->realex_hpp_api_fullresponse_format, $payment->realex_hpp_api_request_type_response, $virtuemart_order_id);
$html .= ' |
';
if ($payment->realex_hpp_api_fullresponse_format != 'xml') {
foreach ($realex_data as $key => $value) {
if ($key == 'SHA1HASH' OR $key == 'SAVED_PMT_DIGITS') {
$value = $realexInterface->obscureValue($value);
}
$html .= ' ' . $key . ': ' . $value . ' ';
}
} else {
$xml_realex_hpp_api_fullresponse = simplexml_load_string($payment->realex_hpp_api_fullresponse);
$xml_realex_hpp_api_fullresponse = $realexInterface->obscureSha1hash($xml_realex_hpp_api_fullresponse);
//$html .= " " . htmlentities(wordwrap($realex_hpp_api_fullresponse, 100, "\n", true)) . " ";
//$html .= $xml_realex_hpp_api_fullresponse->asXML();
$html .= " " . wordwrap(print_r($xml_realex_hpp_api_fullresponse, true), 100, "\n", true) . " ";
}
$html .= '
';
$html .= vmText::_('VMPAYMENT_REALEX_HPP_API_VIEW_TRANSACTION_LOG');
$html .= ' ';
$html .= ' |
';
} else {
//$html .= $realexInterface->onShowOrderBEPaymentByFields($payment);
}
}
}
$html .= '' . "\n";
$doc = JFactory::getDocument();
$js = "
jQuery().ready(function($) {
$('.RealexLogOpener').click(function() {
var logId = $(this).attr('rel');
$('#RealexLog_'+logId).toggle();
return false;
});
});";
$doc->addScriptDeclaration($js);
return $html;
}
private function showActionOrderBEPayment ($virtuemart_order_id, $virtuemart_paymentmethod_id, $payments) {
$orderModel = VmModel::getModel('orders');
$order = $orderModel->getOrder($virtuemart_order_id);
$options = array();
if ($this->isDelayedSettlement()) {
$options[] = JHTML::_('select.option', 'settlePayment', JText::_('VMPAYMENT_REALEX_HPP_API_ORDER_BE_CAPTURE'), 'value', 'text');
}
$options[] = JHTML::_('select.option', 'rebatePayment', JText::_('VMPAYMENT_REALEX_HPP_API_ORDER_BE_REBATE'), 'value', 'text');
$actionList = JHTML::_('select.genericlist', $options, 'action', '', 'value', 'text', 'capturePayment', 'action', true);
$html = '' . "\n";
$html .= $this->getHtmlHeaderBE();
$html .= '
' ;
return $html;
}
/**
* Order status changed
* @param $order
* @param $old_order_status
* @return bool|null
*/
public function plgVmOnUpdateOrderPayment (&$order, $old_order_status) {
//Load the method
if (!($this->_currentMethod = $this->getVmPluginMethod($order->virtuemart_paymentmethod_id))) {
return NULL; // Another method was selected, do nothing
}
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
return NULL;
}
//Load the payments
if (!($payments = $this->getDatasByOrderId($order->virtuemart_order_id))) {
// JError::raiseWarning(500, $db->getErrorMsg());
return null;
}
$updateOrderPaymentStatus = array(
$this->_currentMethod->status_capture,
$this->_currentMethod->status_canceled,
$this->_currentMethod->status_rebate,
);
if (!in_array($order->order_status, $updateOrderPaymentStatus)) {
//vmInfo(vmText::_('VMPAYMENT_REALEX_HPP_API_NO_ACTION'));
return true;
}
$orderModel = VmModel::getModel('orders');
$orderData = $orderModel->getOrder($order->virtuemart_order_id);
$requestSent = false;
$order_history_comment = '';
$realexInterface = $this->_loadRealexInterface();
$canDo = true;
if ($order->order_status == $this->_currentMethod->status_capture AND !$this->isDcc() AND $this->isDelayedSettlement() AND ($canDo = $this->canDoSettle($realexInterface, $old_order_status, $payments))) {
$requestSent = true;
$order_history_comment = vmText::_('VMPAYMENT_REALEX_HPP_API_UPDATE_STATUS_CAPTURE');
$realexInterface->setOrder($orderData);
$realexInterface->setPaymentCurrency();
$realexInterface->setTotalInPaymentCurrency($orderData['details']['BT']->order_total);
$realexInterface->loadCustomerData();
$response = $realexInterface->settleTransaction($payments);
} elseif ($order->order_status == $this->_currentMethod->status_canceled AND ($canDo = $this->canDoVoid($realexInterface, $old_order_status, $payments))) {
$requestSent = true;
$order_history_comment = vmText::_('VMPAYMENT_REALEX_HPP_API_UPDATE_STATUS_CANCELED');
$realexInterface->setOrder($orderData);
$realexInterface->setPaymentCurrency();
$realexInterface->setTotalInPaymentCurrency($orderData['details']['BT']->order_total);
$realexInterface->loadCustomerData();
$response = $realexInterface->voidTransaction($payments);
} elseif ($order->order_status == $this->_currentMethod->status_rebate AND ($canDo = $this->canDoRebate($realexInterface, $old_order_status, $payments))) {
$requestSent = true;
$response = $this->doRebate($realexInterface, $orderData, $payments);
}
if ($requestSent) {
if ($response) {
$db_values = $this->_storeRealexInternalData($response, $this->_currentMethod->virtuemart_paymentmethod_id, $orderData['details']['BT']->virtuemart_order_id, $orderData['details']['BT']->order_number, $realexInterface->request_type);
$xml_response = simplexml_load_string($response);
$success = $realexInterface->isResponseSuccess($xml_response);
if (!$success) {
$error = $xml_response->message . " (" . (string)$xml_response->result . ")";
$realexInterface->displayError($error);
return false;
//return NULL;
} else {
$order_history = array();
$order_history['comments'] = $order_history_comment;
$order_history['customer_notified'] = false;
$order_history['order_status'] = $order->order_status;
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($orderData['details']['BT']->virtuemart_order_id, $order_history, false);
return true;
}
} else {
vmError('VMPAYMENT_REALEX_HPP_API_NO_RESPONSE');
return false;
}
} else {
//vmInfo(vmText::_('VMPAYMENT_REALEX_HPP_API_NO_ACTION'));
}
return $canDo;
}
function plgVmOnSelfCallBE ($type, $name, &$render) {
if ($name != $this->_name || $type != 'vmpayment') {
return FALSE;
}
$virtuemart_paymentmethod_id = vRequest::getInt('virtuemart_paymentmethod_id');
//Load the method
if (!($this->_currentMethod = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) {
return NULL; // Another method was selected, do nothing
}
$amount = vRequest::getFloat('amount');
$actions = array('rebatePayment', 'settlePayment');
$action = vRequest::getCmd('action');
if (!in_array($action, $actions)) {
vmError('VMPAYMENT_REALEX_HPP_API_UPDATEPAYMENT_UNKNOWN_ACTION');
return NULL;
}
$virtuemart_order_id = vRequest::getInt('virtuemart_order_id');
if (!($payments = $this->getDatasByOrderId($virtuemart_order_id))) {
return null;
}
$orderModel = VmModel::getModel('orders');
$orderData = $orderModel->getOrder(vRequest::getInt('virtuemart_order_id'));
$requestSent = false;
$order_history_comment = '';
$realexInterface = $this->_loadRealexInterface();
$canDo = true;
if ($action == 'settlePayment') {
$requestSent = true;
$order_history_comment = vmText::_('VMPAYMENT_REALEX_HPP_API_UPDATE_STATUS_CAPTURE');
$realexInterface->setOrder($orderData);
$realexInterface->setPaymentCurrency();
$realexInterface->setTotalInPaymentCurrency($amount);
$realexInterface->loadCustomerData();
$response = $realexInterface->settleTransaction($payments);
} elseif ($action == 'rebatePayment') {
$requestSent = true;
$response = $this->doRebate($realexInterface, $orderData, $payments, $amount);
}
if ($requestSent) {
if ($response) {
$db_values = $this->_storeRealexInternalData($response, $this->_currentMethod->virtuemart_paymentmethod_id, $orderData['details']['BT']->virtuemart_order_id, $orderData['details']['BT']->order_number, $realexInterface->request_type);
$xml_response = simplexml_load_string($response);
$success = $realexInterface->isResponseSuccess($xml_response);
if (!$success) {
$error = $xml_response->message . " (" . (string)$xml_response->result . ")";
$realexInterface->displayError($error);
} else {
$order_history = array();
$order_history['comments'] = $order_history_comment;
$order_history['customer_notified'] = false;
$order_history['order_status'] = $orderData['details']['BT']->order_status;
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($orderData['details']['BT']->virtuemart_order_id, $order_history, false);
}
} else {
vmError('VMPAYMENT_REALEX_HPP_API_NO_RESPONSE');
}
}
$app = JFactory::getApplication();
$link = 'index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id=' . $virtuemart_order_id;
$app->redirect(JRoute::_($link, FALSE));
}
/**
* Merchants can Rebate for any amount up to 115% of the original order value.
* Pop up will ask for the amount
* @param $realexInterface
* @param $orderData
* @param $payments
*/
function doRebate ($realexInterface, $orderData, $payments, $amount = false) {
$order_history_comment = vmText::_('VMPAYMENT_REALEX_HPP_API_UPDATE_STATUS_REBATE');
$realexInterface->setOrder($orderData);
$realexInterface->setPaymentCurrency();
if ($amount === false) {
$amount = $orderData['details']['BT']->order_total;
}
$realexInterface->setTotalInPaymentCurrency($amount);
$realexInterface->loadCustomerData();
$response = $realexInterface->rebateTransaction($payments);
return $response;
}
/**
* Check if Dcc option
* @return bool
*/
private function isDcc () {
if ($this->_currentMethod->dcc) {
return true;
}
return false;
}
/** check if the setelement is set to Delayed */
private function isDelayedSettlement () {
if (($this->_currentMethod->settlement == 'delayed')) {
return true;
}
return false;
}
/**
* Check if Can do settle
* @param $realexInterface
* @param $old_order_status
* @param $payments
* @return bool
*/
private function canDoSettle ($realexInterface, $old_order_status, $payments) {
// Delayed settlement
if (!($old_order_status == $this->_currentMethod->status_success)) {
vmError('VMPAYMENT_REALEX_HPP_API_ERROR_CANNOT_SETTLE');
return false;
}
return true;
}
/**
* Before settlement, it is possible to void an authorisation
* Void (if same day or delayed settlement)
*
* @param $old_order_status
* @param $payments
* @param $realexInterface
* @return bool
*/
private function canDoVoid ($realexInterface, $old_order_status, $payments) {
if ($this->_currentMethod->settlement == 'auto') {
if (!($old_order_status == $this->_currentMethod->status_success)) {
vmError('VMPAYMENT_REALEX_HPP_API_ERROR_CANNOT_VOID');
return false;
}
} else {
if (!($old_order_status == $this->_currentMethod->status_success OR $old_order_status == $this->_currentMethod->status_capture)) {
vmError('VMPAYMENT_REALEX_HPP_API_ERROR_CANNOT_VOID');
return false;
}
}
return true;
}
/**
* And in live mode, merchants can only rebate transactions the day after they've settled.
* It maybe would be best not to allow merchants to attempt rebate on the same day a transactions is processed.
* @param $old_order_status
* @param $payments
* @param $realexInterface
* @return bool
*/
private function canDoRebate ($realexInterface, $old_order_status, $payments) {
if ($this->transactionIsDcc($realexInterface, $payments)) {
vmError(vmText::_('VMPAYMENT_REALEX_HPP_API_ERROR_REBATE_DCC_TRANSACTION'));
return false;
}
if ($this->_currentMethod->settlement == 'auto') {
if (!($old_order_status == $this->_currentMethod->status_success)) {
vmError('VMPAYMENT_REALEX_HPP_API_ERROR_CANNOT_REBATE');
return false;
}
} else {
if (!($old_order_status == $this->_currentMethod->status_capture)) {
vmError('VMPAYMENT_REALEX_HPP_API_ERROR_CANNOT_REBATE');
return false;
}
}
/*
if ($this->_currentMethod->settlement=='auto') return true;
if (!($settleTime = $this->transactionIsSettled($realexInterface, $payments))) {
vmError(vmText::sprintf('VMPAYMENT_REALEX_HPP_API_ERROR_REBATE_SETTLE_FIRST', $payments[0]->order_number));
return false;
}
//And in live mode, merchants can only rebate transactions the day after they've settled.
if ($this->_currentMethod->shop_mode == 'sandbox') {
return true;
}
*/
return true;
}
private function transactionIsSettled ($realexInterface, $payments) {
$payment = $realexInterface->getTransactionData($payments, array($realexInterface::REQUEST_TYPE_SETTLE));
if (!$payment) {
return false;
}
return $payment->created_on;
}
private function transactionIsDcc ($realexInterface, $payments) {
if (!$this->_currentMethod->dcc) {
return false;
}
$payment = $realexInterface->getTransactionData($payments, array($realexInterface::REQUEST_TYPE_SETTLE));
if (!$payment) {
return false;
}
return true;
}
private function transactionIsAuth ($realexInterface, $payments) {
$payment = $realexInterface->getLastTransactionData($payments, array(
$realexInterface::REQUEST_TYPE_AUTH,
$realexInterface::REQUEST_TYPE_RECEIPT_IN
));
if (!$payment) {
return false;
}
return $payment->created_on;
}
function plgVmOnUpdateOrderLinePayment (&$order) {
if (!($this->_currentMethod = $this->getVmPluginMethod($order->virtuemart_paymentmethod_id))) {
return NULL; // Another method was selected, do nothing
}
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
return NULL;
}
}
/**
* Create the table for this plugin if it does not yet exist.
* This functions checks if the called plugin is active one.
* When yes it is calling the standard method to create the tables
*
*/
public function plgVmOnStoreInstallPaymentPluginTable ($jplugin_id) {
if ($jplugin_id != $this->_jid) {
return FALSE;
}
$this->_currentMethod = $this->getPluginMethod(vRequest::getInt('virtuemart_paymentmethod_id'));
if ($this->_currentMethod->published) {
$required_parameters = array('merchant_id', 'shared_secret', 'subaccount');
foreach ($required_parameters as $required_parameter) {
if (empty ($this->_currentMethod->$required_parameter)) {
$text = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PARAMETER_REQUIRED', vmText::_('VMPAYMENT_REALEX_HPP_API_' . $required_parameter), $this->_currentMethod->payment_name, $this->_currentMethod->virtuemart_paymentmethod_id);
vmWarn($text);
}
}
}
$this->createPayerRefTable();
$this->createPmtRefTable();
return $this->onStoreInstallPluginTable($jplugin_id);
}
private function createPmtRefTable () {
$db = JFactory::getDBO();
$q = 'SELECT `extension_id` FROM `#__extensions` WHERE `folder` = "vmuserfield" and `state`="0" AND `element` = "' . $this->_name . '"';
$db->setQuery($q);
$extension_id = $db->loadResult();
if (empty($extension_id)) {
$app = JFactory::getApplication();
$app->enqueueMessage(JText::_('VMPAYMENT_REALEX_HPP_API_NO_PLUGIN_INSTALLED'));
return;
}
// publish the plugin
$q = "UPDATE `#__extensions` SET `enabled` = '1' WHERE `extension_id` =" . $extension_id;
$db->setQuery($q);
$db->query();
// is this plugin already
$q = 'SELECT `virtuemart_userfield_id` FROM `#__virtuemart_userfields` WHERE `userfield_jplugin_id` = ' . $extension_id;
$db->setQuery($q);
$virtuemart_userfield_id = $db->loadResult();
if (empty($virtuemart_userfield_id)) {
//$app = JFactory::getApplication();
//$app -> enqueueMessage(JText::_('VMUSERFIELD_REALEX_NO_PLUGIN_ALREADY_INSTALLED'));
$userFieldsModel = VmModel::getModel('UserFields');
$data['virtuemart_userfield_id'] = 0;
$data['published'] = 1;
$data['userfield_jplugin_id'] = $extension_id;
$data['required'] = 0;
$data['account'] = 1;
$data['shipment'] = 0;
$data['registration'] = 0;
$data['vNames'] = array();
$data['vValues'] = array();
$data['name'] = 'realex_hpp_api';
$data['type'] = 'pluginrealex_hpp_api';
$data['title'] = 'Payment means';
$ret = $userFieldsModel->store($data);
if (!$ret) {
vmError(JText::_('VMPAYMENT_REALEX_HPP_API_CREATE_USERFIELD_FAILED') . " " . $data['name'] . " " . $ret);
} else {
vmInfo(JText::_('VMPAYMENT_REALEX_HPP_API_CREATE_USERFIELD_OK') . " " . $data['name']);
}
}
JLoader::import('joomla.plugin.helper');
JPluginHelper::importPlugin('vmuserfield');
JFactory::getApplication()->triggerEvent('plgVmOnStoreInstallPluginTable', array(
'userfield',
'realex_hpp_api'
));
}
/**
* Fields to create the payment table
* @return string SQL Fileds
*/
private function getPayerRefTableSQLFields () {
// We must save both , since the customer number can be changed
$SQLfields = array(
'id' => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT',
'virtuemart_user_id' => 'int(11) UNSIGNED',
'payer_ref' => 'char(32)',
'merchant_id' => 'varchar(128)',
);
return $SQLfields;
}
/**
* @param $tableComment
* @return string
*/
private function createPayerRefTable ($tablesFields = 0) {
$payerRefTableName = $this->getPayerRefTableName();
$query = "CREATE TABLE IF NOT EXISTS `" . $payerRefTableName . "` (";
$SQLfields = $this->getPayerRefTableSQLFields();
$loggablefields = $this->getTableSQLLoggablefields();
foreach ($SQLfields as $fieldname => $fieldtype) {
$query .= '`' . $fieldname . '` ' . $fieldtype . " , ";
}
foreach ($loggablefields as $fieldname => $fieldtype) {
$query .= '`' . $fieldname . '` ' . $fieldtype . ", ";
}
$query .= " PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Realex PayerRef Table' AUTO_INCREMENT=1 ;";
$db = JFactory::getDBO();
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(1, $payerRefTableName . '::createPayerRefTable: ' . JText::_('COM_VIRTUEMART_SQL_ERROR') . ' ' . $db->stderr(TRUE));
echo $payerRefTableName . '::createPayerRefTable: ' . JText::_('COM_VIRTUEMART_SQL_ERROR') . ' ' . $db->stderr(TRUE);
}
}
/**
* This event is fired after the payment method has been selected. It can be used to store
* additional payment info in the cart.
*
* @param VirtueMartCart $cart : the actual cart
* @return null if the payment was not selected, true if the data is valid, error message if the data is not vlaid
*
*/
public function plgVmOnSelectCheckPayment (VirtueMartCart $cart) {
return $this->onSelectCheck($cart);
}
/**
* plgVmDisplayListFEPayment
* This event is fired to display the pluginmethods in the cart (edit shipment/payment) for exampel
*
* @param object $cart Cart object
* @param integer $selected ID of the method selected
* @return boolean True on succes, false on failures, null when this plugin was not selected.
* On errors, JError::raiseWarning (or JError::raiseError) must be used to set a message.
*
*/
public function plgVmDisplayListFEPayment (VirtueMartCart $cart, $selected = 0, &$htmlIn) {
if ($this->getPluginMethods($cart->vendorId) === 0) {
if (empty($this->_name)) {
$app = JFactory::getApplication();
$app->enqueueMessage(vmText::_('COM_VIRTUEMART_CART_NO_' . strtoupper($this->_psType)));
return false;
} else {
return false;
}
}
$htmla = array();
foreach ($this->methods as $this->_currentMethod) {
if ($this->checkConditions($cart, $this->_currentMethod, $cart->pricesUnformatted)) {
$html = '';
$cart_prices = array();
$cart_prices['withTax'] = '';
$cart_prices['salesPrice'] = '';
$methodSalesPrice = $this->setCartPrices($cart, $cart_prices, $this->_currentMethod);
//if ($selected == $method->virtuemart_paymentmethod_id) {
// $this->customerData->load();
//}
$html .= '
';
$payment_name = $this->renderPluginName($this->_currentMethod, 'DisplayListFEPayment');
//$html .= $this->getPluginHtml($this->_currentMethod, $selected, $methodSalesPrice);
$realexInterface = $this->_loadRealexInterface();
if ($realexInterface == NULL) {
vmdebug('renderPluginName', $this->_currentMethod);
break;
}
$realexInterface->loadCustomerData();
if ($selected == $this->_currentMethod->virtuemart_paymentmethod_id) {
$checked = 'checked="checked"';
} else {
$checked = '';
}
/*
$ccDropdown = "";
if ($this->_currentMethod->integration == 'redirect') {
if (!JFactory::getUser()->guest AND $this->_currentMethod->realvault) {
$selected_cc = $this->customerData->getVar('saved_cc_selected');
$ccDropdown = $realexInterface->getCCDropDown($this->_currentMethod->virtuemart_paymentmethod_id, JFactory::getUser()->id, $selected_cc);
}
}
*/
$html .= $this->renderByLayout('redirect_form', array(
//'creditcardsDropDown' => $ccDropdown,
'virtuemart_paymentmethod_id' => $this->_currentMethod->virtuemart_paymentmethod_id,
'payment_name' => $payment_name,
'checked' => $checked,
));
$htmla[] = $html;
}
}
$htmlIn[] = $htmla;
return true;
}
/**
* Check if the payment conditions are fulfilled for this payment method
* @param VirtueMartCart $cart
* @param int $activeMethod
* @param array $cart_prices
* @return bool
*/
protected function checkConditions ($cart, $method, $cart_prices) {
$method->min_amount = (float)$method->min_amount;
$method->max_amount = (float)$method->max_amount;
$address = (($cart->ST == 0) ? $cart->BT : $cart->ST);
$amount = $this->getCartAmount($cart_prices);
$amount_cond = ($amount >= $method->min_amount AND $amount <= $method->max_amount OR ($method->min_amount <= $amount AND ($method->max_amount == 0)));
$countries = array();
if (!empty($method->countries)) {
if (!is_array($method->countries)) {
$countries[0] = $method->countries;
} else {
$countries = $method->countries;
}
}
// probably did not gave his BT:ST address
if (!is_array($address)) {
$address = array();
$address['virtuemart_country_id'] = 0;
}
if (!isset($address['virtuemart_country_id'])) {
$address['virtuemart_country_id'] = 0;
}
if (in_array($address['virtuemart_country_id'], $countries) || count($countries) == 0) {
if ($amount_cond) {
return TRUE;
}
}
return FALSE;
}
/**
* plgVmonSelectedCalculatePricePayment
* Calculate the price (value, tax_id) of the selected method
* It is called by the calculator
* This function does NOT to be reimplemented. If not reimplemented, then the default values from this function are taken.
* @cart: VirtueMartCart the current cart
* @cart_prices: array the new cart prices
* @return null if the method was not selected, false if the shiiping rate is not valid any more, true otherwise
*
*
*/
public function plgVmonSelectedCalculatePricePayment (VirtueMartCart $cart, array &$cart_prices, &$cart_prices_name) {
return $this->onSelectedCalculatePrice($cart, $cart_prices, $cart_prices_name);
}
/*
* @param $method plugin
* @param $where from where tis function is called
*/
function renderPluginName ($method, $where = 'checkout') {
$display_logos = "";
if (!class_exists('RealexHelperCustomerData')) {
require(JPATH_SITE . DS . 'plugins' . DS . 'vmpayment' . DS . 'realex_hpp_api' . DS . 'realex_hpp_api' . DS . 'helpers' . DS . 'customerdata.php');
}
$this->_currentMethod = $method;
$realexInterface = $this->_loadRealexInterface();
if ($realexInterface == NULL) {
vmdebug('renderPluginName', $method);
return;
}
$realexInterface->getCustomerData();
$extraInfo = '';
if ($realexInterface->customerData->getVar('selected_method') == $method->virtuemart_paymentmethod_id) {
//$extraInfo = $realexInterface->getExtraPluginInfo();
//$extraInfo['cc_number'] =$realexInterface->cc_mask($extraInfo['cc_number']);
}
$logos = $method->payment_logos;
if (!empty($logos)) {
$display_logos = $this->displayLogos($logos) . ' ';
}
$payment_name = $method->payment_name;
$html = $this->renderByLayout('render_pluginname', array(
'where' => $where,
'shop_mode' => $method->shop_mode,
'virtuemart_paymentmethod_id' => $method->virtuemart_paymentmethod_id,
'logo' => $display_logos,
'payment_name' => $payment_name,
'extraInfo' => $extraInfo,
'payment_description' => $method->payment_desc,
));
$html = $this->rmspace($html);
return $html;
}
private function rmspace ($buffer) {
return preg_replace('~>\s*\n\s*<~', '><', $buffer);
}
public function plgVmgetPaymentCurrency ($virtuemart_paymentmethod_id, &$paymentCurrencyId) {
if (!($method = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) {
return null; // Another method was selected, do nothing
}
if (!$this->selectedThisElement($method->payment_element)) {
return false;
}
$this->getPaymentCurrency($method);
$paymentCurrencyId = $method->payment_currency;
//! $method->payment_currency might not be correct
}
/**
* plgVmOnCheckAutomaticSelectedPayment
* Checks how many plugins are available. If only one, the user will not have the choice. Enter edit_xxx page
* The plugin must check first if it is the correct type
* @param VirtueMartCart cart: the cart object
* @return null if no plugin was found, 0 if more then one plugin was found, virtuemart_xxx_id if only one plugin is found
*
*/
function plgVmOnCheckAutomaticSelectedPayment (VirtueMartCart $cart, array $cart_prices = array(), &$methodCounter = 0) {
return $this->onCheckAutomaticSelected($cart, $cart_prices, $paymentCounter);
}
/**
* This method is fired when showing the order details in the frontend.
* It displays the method-specific data.
*
* @param integer $order_id The order ID
* @return mixed Null for methods that aren't active, text (HTML) otherwise
*/
public function plgVmOnShowOrderFEPayment ($virtuemart_order_id, $virtuemart_paymentmethod_id, &$payment_name) {
$this->onShowOrderFE($virtuemart_order_id, $virtuemart_paymentmethod_id, $payment_name);
return true;
}
/**
* This method is fired when showing when priting an Order
* It displays the the payment method-specific data.
*
* @param integer $_virtuemart_order_id The order ID
* @param integer $method_id method used for this order
* @return mixed Null when for payment methods that were not selected, text (HTML) otherwise
*/
public function plgVmonShowOrderPrintPayment ($order_number, $method_id) {
return $this->onShowOrderPrint($order_number, $method_id);
}
public function plgVmDeclarePluginParamsPayment ($name, $id, &$data) {
return $this->declarePluginParams('payment', $name, $id, $data);
}
public function plgVmSetOnTablePluginParamsPayment ($name, $id, &$table) {
return $this->setOnTablePluginParams($name, $id, $table);
}
public function plgVmOnPaymentNotification () {
if (!class_exists('VirtueMartModelOrders')) {
require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php');
}
if (!class_exists('VirtueMartCart')) {
require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php');
}
$notificationTask = vRequest::getCmd('notificationTask', '');
// this is not our notification
if (empty($notificationTask)) {
return;
}
if ($notificationTask == 'jumpRedirect') {
$this->jumpRedirect();
} elseif ($notificationTask == 'handleRedirect') {
$this->handleRedirect();
} elseif ($notificationTask == 'handleRemoteDccForm') {
$this->handleRemoteDccForm();
} elseif ($notificationTask == 'handleRemoteCCForm') {
$this->handleRemoteCCForm();
} elseif ($notificationTask == 'handleVerify3D') {
$this->handleVerify3D();
} elseif ($notificationTask == 'handle3DSRequest') {
$this->handle3DSRequest();
}
return true;
}
private function handleRedirect () {
$realex_data = vRequest::getPost();
$this->debugLog('plgVmOnPaymentNotification :' . var_export($realex_data, true), 'debug');
if (!isset($realex_data['ORDER_ID'])) {
return false;
}
$order_number = $realex_data['ORDER_ID'];
if (empty($order_number)) {
return FALSE;
}
if (!($virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber($order_number))) {
return FALSE;
}
if (!($payments = $this->getDatasByOrderId($virtuemart_order_id))) {
return FALSE;
}
$orderModel = VmModel::getModel('orders');
$order = $orderModel->getOrder($virtuemart_order_id);
$this->_currentMethod = $this->getVmPluginMethod($order['details']['BT']->virtuemart_paymentmethod_id);
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
//echo "selectedThisElement PB";
return FALSE;
}
$realexInterface = $this->_loadRealexInterface();
if (!$realexInterface->validateResponseHash($realex_data)) {
$this->returnToVm($realex_data, false, $order['details']['BT']->virtuemart_paymentmethod_id);
return FALSE;
}
$result = $realex_data['RESULT'];
$realexInterface->setOrder($order);
//$cart = VirtueMartCart::getCart();
//$realexInterface->setCart($cart, false);
$order_history = array();
$success = ($result == $realexInterface::RESPONSE_CODE_SUCCESS);
if ($success) {
$status = $this->_currentMethod->status_success;
$amountInCurrency = vmPSPlugin::getAmountInCurrency($order['details']['BT']->order_total, $order['details']['BT']->order_currency);
//$currencyDisplay = CurrencyDisplay::getInstance($cart->pricesCurrency);
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CONFIRMED', $amountInCurrency['display'], $order_number);
if (isset($realex_data['DCCCHOICE']) and $realex_data['DCCCHOICE'] == $realexInterface::RESPONSE_DCC_CHOICE_YES) {
$order_history['comments'] .= "
";
$order_history['comments'] .= vmText::sprintf('VMPAYMENT_REALEX_HPP_API_DCC_PAY_OWN_CURRENCY_CHARGED', $this->getCardHolderAmount($realex_data['DCCMERCHANTAMOUNT']), $realex_data['DCCMERCHANTCURRENCY'], $this->getCardHolderAmount($realex_data['DCCCARDHOLDERAMOUNT']), $realex_data['DCCCARDHOLDERCURRENCY']);
}
$userfield = $realexInterface->cardStorageResponse($realex_data);
$realexInterface->storeNewPayment($userfield);
if (isset($realex_data['REALWALLET_CHOSEN']) and $realex_data['REALWALLET_CHOSEN'] == 1) {
if ($userfield) {
$cardStorageResponseText = vmText::_('VMPAYMENT_REALEX_HPP_API_CARD_STORAGE_SUCCESS');
} else {
$cardStorageResponseText = vmText::_('VMPAYMENT_REALEX_HPP_API_CARD_STORAGE_FAILED');
}
$order_history['comments'] .= "
";
$order_history['comments'] .= $cardStorageResponseText;
}
} else {
/**
* Note: If a transaction is processed through your account that triggers one of the scenarios that you have set up to reject,
* HPP will send a post back to your response script with a Result Code of 110 and a relevant error message. The transaction will not be processed.
*/
$order_history['comments'] = vmText::_('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CANCELLED');
// here we check if wee need to add the message
/*
if ($realex_data['RESULT'] == (int)$realexInterface::RESPONSE_CODE_NOT_VALIDATED) {
$order_history['comments'] .= "
";
$order_history['comments'] .= $realex_data['MESSAGE'];
}
*/
$status = $this->_currentMethod->status_canceled;
}
$order_history['customer_notified'] = true;
$order_history['order_status'] = $status;
$db_values['payment_name'] = $this->renderPluginName($this->_currentMethod, 'order');
$db_values['virtuemart_order_id'] = $virtuemart_order_id;
$db_values['order_number'] = $order_number;
$db_values['virtuemart_paymentmethod_id'] = $this->_currentMethod->virtuemart_paymentmethod_id;
$db_values['realex_hpp_api_response_result'] = $realex_data['RESULT'];
$db_values['realex_hpp_api_request_type_response'] = $realexInterface::REQUEST_TYPE_AUTH;
$db_values['realex_hpp_api_response_pasref'] = isset($realex_data['PASREF']) ? $realex_data['PASREF'] : "";
$db_values['realex_hpp_api_response_authcode'] = isset($realex_data['AUTHCODE']) ? $realex_data['AUTHCODE'] : "";
$db_values['realex_hpp_api_fullresponse'] = json_encode($realex_data);
$db_values['realex_hpp_api_fullresponse_format'] = 'json';
$this->storePSPluginInternalData($db_values);
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($virtuemart_order_id, $order_history, TRUE);
if ($result == $realexInterface::RESPONSE_CODE_SUCCESS) {
if (isset($payments[0]->realex_hpp_api_custom)) {
$this->emptyCart($payments[0]->realex_hpp_api_custom, $order_number);
}
}
//$this->displayMessageToRealex($realexInterface, $realex_data, $success, $order_history['comments'], $payments[0]->virtuemart_paymentmethod_id);
$this->returnToVm($realex_data, $success, $order['details']['BT']->virtuemart_paymentmethod_id);
}
private function initRealexInterface ($loadCDFromPost = true) {
// TODO check if cart is empty
$virtuemart_paymentmethod_id = vRequest::getInt('pm', false);
$this->_currentMethod = $this->getVmPluginMethod($virtuemart_paymentmethod_id);
if (!$this->selectedThisElement($this->_currentMethod->payment_element)) {
vmError('Programmer error: missing the pm parameter');
$this->redirectToCart();
return FALSE;
}
$realexInterface = $this->_loadRealexInterface();
$realexInterface->loadCustomerData($loadCDFromPost);
$order_number = vRequest::getString('order_number', false);
if (!($virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber($order_number))) {
$this->redirectToCart();
return FALSE;
}
$orderModel = VmModel::getModel('orders');
$order = $orderModel->getOrder($virtuemart_order_id);
$realexInterface->setOrder($order);
$realexInterface->setPaymentCurrency();
$realexInterface->setTotalInPaymentCurrency($order['details']['BT']->order_total);
return $realexInterface;
}
private function handleRemoteDccForm () {
$realexInterface = $this->initRealexInterface(false);
$cart = VirtueMartCart::getCart();
$realexInterface->setCart($cart, false);
if (!($payments = $this->getDatasByOrderId($realexInterface->order['details']['BT']->virtuemart_order_id))) {
$this->redirectToCart();
return FALSE;
}
$dcc_payment = $realexInterface->getTransactionData($payments, array(
$realexInterface::REQUEST_TYPE_DCCRATE,
$realexInterface::REQUEST_TYPE_REALVAULT_DCCRATE
));
if (!$dcc_payment) {
$this->redirectToCart();
return FALSE;
}
$this->handleRemoteCCForm($dcc_payment->realex_hpp_api_fullresponse);
/*
$realexInterface->confirmedOrderDccRequest($dcc_payment->realex_hpp_api_fullresponse);
$this->updateOrderStatus($realexInterface->order);
$this->customerData->clear();
$cart->emptyCart();
$submit_url = JURI::root() . 'index.php?option=com_virtuemart&view=pluginresponse&task=pluginresponsereceived&pm=' . $this->_currentMethod->virtuemart_paymentmethod_id . '&on=' . $realexInterface->order['details']['BT']->order_number . '&Itemid=' . vRequest::getInt('Itemid') . '&lang=' . vRequest::getCmd('lang', '');
$app = JFactory::getApplication();
$app->redirect(JRoute::_($submit_url));
*/
}
private function handleRemoteCCForm ($response_dcc = NULL, $loadFromPost = true) {
$realexInterface = $this->initRealexInterface($loadFromPost);
$realvaultData = false;
if (!$this->validateCCForm($realexInterface, $realvaultData)) {
return;
}
if ($this->_currentMethod->dcc AND empty($response_dcc)) {
$response = $realexInterface->requestDccRate($realvaultData);
$realexInterface->manageResponseDccRate($response);
$xml_response = simplexml_load_string($response);
/*
* 105: Card not supported by eDCC
* 00: Card supported by eDCC
*/
$success = $realexInterface->isResponseSuccess($xml_response);
if ($success) {
$remoteDCCFormParams = $realexInterface->getRemoteDCCFormParams($xml_response);
$html = $this->renderByLayout('remote_cc_form', $remoteDCCFormParams);
echo $html;
return;
} else {
//vmError($xml_response->message);
//$this->redirectToCart();
//$response = $realexInterface->requestAuth();
//$realexInterface->manageResponseRequestAuth($response);
}
}
if ($realvaultData) {
$pmt_type = $realvaultData->realex_hpp_api_saved_pmt_type;
} else {
$pmt_type = NULL;
}
if ($this->_currentMethod->threedsecure and $realexInterface->isCC3DSVerifyEnrolled($pmt_type)) {
$response3DSVerifyEnrolled = $realexInterface->request3DSVerifyEnrolled($realvaultData);
$realexInterface->manageResponse3DSVerifyEnrolled($response3DSVerifyEnrolled);
$eci = $realexInterface->getEciFrom3DSVerifyEnrolled($response3DSVerifyEnrolled);
$xml_response3DSVerifyEnrolled = simplexml_load_string($response3DSVerifyEnrolled);
$result = (string)$xml_response3DSVerifyEnrolled->result;
// 503 - no entry for MERCHANT in RealMPI merchant_details table
if ($eci === false and $result != 503) {
//$this->_storeRealexInternalData($response, $this->_currentMethod->virtuemart_paymentmethod_id, $realexInterface->order['details']['BT']->virtuemart_order_id, $realexInterface->order['details']['BT']->order_number, $realexInterface->request_type);
if ($result == $realexInterface::RESPONSE_CODE_SUCCESS) {
$realexInterface->redirect3DSRequest($response3DSVerifyEnrolled);
return;
} else {
// we should be here if Result=110 + enrolled =U // result=5xx and enrolled not available // result =220 (ENROLLED_RESULT_FATAL_ERROR)
$this->redirectToCart();
return FALSE;
}
} else {
$xml_response3DSVerifyEnrolled = simplexml_load_string($response3DSVerifyEnrolled);
$xml_response3DSVerifyEnrolled->addChild('eci', $eci);
$xml_response_dcc = simplexml_load_string($response_dcc);
//$response = $realexInterface->requestAuth($response_dcc, $xml_response3DSVerifyEnrolled);
if ($realvaultData) {
$response = $realexInterface->requestReceiptIn($realvaultData, $xml_response_dcc, $xml_response3DSVerifyEnrolled);
} else {
$response = $realexInterface->requestAuth($xml_response_dcc, $xml_response3DSVerifyEnrolled);
}
$realexInterface->manageResponseRequestAuth($response);
}
} else {
//$userfield = $realexInterface->handleCardStorage($saved_cc_selected);
// TODO eci missing?
$xml_response_dcc = NULL;
if ($response_dcc) {
$xml_response_dcc = simplexml_load_string($response_dcc);
}
if ($realvaultData) {
$response = $realexInterface->requestReceiptIn($realvaultData, $xml_response_dcc);
} else {
$response = $realexInterface->requestAuth($xml_response_dcc);
}
$realexInterface->manageResponseRequestAuth($response);
}
//$payments = $this->getDatasByOrderId($realexInterface->order['details']['BT']->virtuemart_order_id);
$success = $this->updateOrderStatus($realexInterface->order, false);
if ($success) {
$saved_cc_selected = $this->customerData->getVar('saved_cc_selected');
$userfield = $realexInterface->handleCardStorage($saved_cc_selected);
$realexInterface->storeNewPayment($userfield);
$this->customerData->clear();
$cart = VirtueMartCart::getCart();
$cart->emptyCart();
$submit_url = JURI::root() . 'index.php?option=com_virtuemart&view=pluginresponse&task=pluginresponsereceived&pm=' . $this->_currentMethod->virtuemart_paymentmethod_id . '&on=' . $realexInterface->order['details']['BT']->order_number . '&Itemid=' . vRequest::getInt('Itemid') . '&lang=' . vRequest::getCmd('lang', '');
$app = JFactory::getApplication();
$app->redirect(JRoute::_($submit_url));
} else {
$this->redirectToCart();
}
}
private function validateCCForm ($realexInterface, &$realvaultData) {
$realvaultData = false;
$return = false;
if (!JFactory::getUser()->guest AND $this->_currentMethod->realvault) {
$saved_cc_selected = $this->customerData->getVar('saved_cc_selected');
if ($saved_cc_selected > 0) {
$realvaultData = $realexInterface->getStoredCCsData($saved_cc_selected);
if (!$cvv_realvault = $realexInterface->validateCvv()) {
$remoteCCFormParams = $realexInterface->getRemoteCCFormParams(NULL, true);
$html = $this->renderByLayout('remote_cc_form', $remoteCCFormParams);
echo $html;
return false;
}
$realvaultData->cc_cvv_realvault = $this->customerData->getVar('cc_cvv_realvault');
$this->customerData->saveCustomerRealVaultData((array)$realvaultData);
return true;
} else {
if ($this->_currentMethod->integration == 'redirect') {
$html = $realexInterface->sendPostRequest();
echo $html;
$cart = VirtueMartCart::getCart();
$cart->_confirmDone = FALSE;
$cart->_dataValidated = FALSE;
$cart->setCartIntoSession();
return false;
} else {
if (!$realexInterface->validateRemoteCCForm()) {
$remoteCCFormParams = $realexInterface->getRemoteCCFormParams();
$html = $this->renderByLayout('remote_cc_form', $remoteCCFormParams);
echo $html;
return false;
} else {
return true;
}
}
}
} else {
if (!$realexInterface->validateRemoteCCForm()) {
$remoteCCFormParams = $realexInterface->getRemoteCCFormParams();
$html = $this->renderByLayout('remote_cc_form', $remoteCCFormParams);
echo $html;
return false;
} else {
return true;
}
}
return $return;
}
/**
* @return bool
*/
private function handleVerify3D () {
$realexInterface = $this->initRealexInterface();
$realvaultData = false;
if (!$this->validateCCForm($realexInterface, $realvaultData)) {
return;
}
$cart = VirtueMartCart::getCart();
$realexInterface->setCart($cart, false);
$response3DSVerifyEnrolled = $realexInterface->request3DSVerifyEnrolled($realvaultData);
$eci = $realexInterface->manageResponse3DSVerifyEnrolled($response3DSVerifyEnrolled);
$xml_response3DSVerifyEnrolled = simplexml_load_string($response3DSVerifyEnrolled);
$result = (string)$xml_response3DSVerifyEnrolled->result;
if (!$eci and $result != '503') {
$realexInterface->redirect3dsRequest($response3DSVerifyEnrolled);
return;
}
$saved_cc_selected = NULL;
if ($eci !== false or $result == '503') {
$realexInterface->handleCardStorage($saved_cc_selected);
$xml_response3DSVerifyEnrolled = simplexml_load_string($response3DSVerifyEnrolled);
$response = $realexInterface->requestAuth(NULL, $xml_response3DSVerifyEnrolled);
$realexInterface->manageResponseRequestAuth($response);
$xml_response = simplexml_load_string($response);
$success = $realexInterface->isResponseSuccess($xml_response);
} else {
$success = false;
}
$order_history = array();
if ($success) {
$status = $this->_currentMethod->status_success;
$amountValue = vmPSPlugin::getAmountInCurrency($realexInterface->order['details']['BT']->order_total, $realexInterface->order['details']['BT']->order_currency);
$currencyDisplay = CurrencyDisplay::getInstance($realexInterface->cart->pricesCurrency);
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CONFIRMED', $amountValue['display'], $realexInterface->order['details']['BT']->order_number);
} else {
$order_history['comments'] = vmText::_('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CANCELLED');
$status = $this->_currentMethod->status_canceled;
}
$order_history['customer_notified'] = true;
$order_history['order_status'] = $status;
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($realexInterface->order['details']['BT']->virtuemart_order_id, $order_history, TRUE);
//$payments = $this->getDatasByOrderId($realexInterface->order['details']['BT']->virtuemart_order_id);
//$html = $realexInterface->getResponseParams($payments);
$this->customerData->clear();
$cart->emptyCart();
$submit_url = JURI::root() . 'index.php?option=com_virtuemart&view=pluginresponse&task=pluginresponsereceived&pm=' . $this->_currentMethod->virtuemart_paymentmethod_id . '&on=' . $realexInterface->order['details']['BT']->order_number . '&Itemid=' . vRequest::getInt('Itemid') . '&lang=' . vRequest::getCmd('lang', '');
$app = JFactory::getApplication();
$app->redirect(JRoute::_($submit_url));
return true;
}
private function handle3DSRequest () {
$realexInterface = $this->initRealexInterface(false);
$cart = VirtueMartCart::getCart();
$realexInterface->setCart($cart, false);
$saved_cc_selected = $this->customerData->getVar('saved_cc_selected');
$realvault = false;
if ($saved_cc_selected > 0) {
$realvault = $realexInterface->getStoredCCsData($saved_cc_selected);
$realvault->cc_cvv_realvault = $this->customerData->getVar('cc_cvv_realvault');
$this->customerData->saveCustomerRealVaultData((array)$realvault);
}
if (!($payments = $this->getDatasByOrderId($realexInterface->order['details']['BT']->virtuemart_order_id))) {
$this->redirectToCart();
return FALSE;
}
$dcc_payment = $realexInterface->getTransactionData($payments, array(
$realexInterface::REQUEST_TYPE_DCCRATE,
$realexInterface::REQUEST_TYPE_REALVAULT_DCCRATE
));
if ($dcc_payment) {
$xml_dcc_payment = simplexml_load_string($dcc_payment->realex_hpp_api_fullresponse);
} else {
$xml_dcc_payment = NULL;
}
$response3DSVerifysig = $realexInterface->request3DSVerifysig($realvault);
$realexInterface->manageResponse3DSVerifysig($response3DSVerifysig);
$eci = $realexInterface->getEciFrom3DSVerifysig($response3DSVerifysig, $this->_currentMethod->require_liability);
$xml_response3DSVerifysig = simplexml_load_string($response3DSVerifysig);
if ($eci !== false) {
$xml_response3DSVerifysig->threedsecure->eci = $eci;
if ($realvault) {
$response = $realexInterface->requestReceiptIn($realvault, $xml_dcc_payment, $xml_response3DSVerifysig);
} else {
$response = $realexInterface->requestAuth($xml_dcc_payment, $xml_response3DSVerifysig);
}
$realexInterface->manageResponseRequestAuth($response);
$xml_response = simplexml_load_string($response);
$success = $realexInterface->isResponseSuccess($xml_response);
} else {
$success = false;
}
$order_history = array();
$redirectToCart = false;
if ($success) {
$userfield = $realexInterface->handleCardStorage($saved_cc_selected);
$realexInterface->storeNewPayment($userfield);
$status = $this->_currentMethod->status_success;
$amountValue = vmPSPlugin::getAmountInCurrency($realexInterface->order['details']['BT']->order_total, $realexInterface->order['details']['BT']->order_currency);
$currencyDisplay = CurrencyDisplay::getInstance($realexInterface->cart->pricesCurrency);
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CONFIRMED', $amountValue['display'], $realexInterface->order['details']['BT']->order_number);
if (isset($xml_response->dccinfo) AND isset($xml_response->dccinfo->cardholderrate)) {
$order_history['comments'] .= "
";
if ($xml_response->dccinfo->cardholderrate != 1.0) {
$order_history['comments'] .= vmText::sprintf('VMPAYMENT_REALEX_HPP_API_DCC_PAY_OWN_CURRENCY_CHARGED', $this->getCardHolderAmount($xml_response->dccinfo->merchantamount), $xml_response->dccinfo->merchantcurrency, $this->getCardHolderAmount($xml_response->dccinfo->cardholderamount), $xml_response->dccinfo->cardholdercurrency);
} else {
$order_history['comments'] .= vmText::sprintf('VMPAYMENT_REALEX_HPP_API_DCC_PAY_MERCHANT_CURRENCY', $this->getCardHolderAmount($xml_response->dccinfo->merchantamount), $xml_response->dccinfo->merchantcurrency);
}
$order_history['comments'] .= "
";
} else {
}
} else {
$msgToShopper = '';
$status = $this->_currentMethod->status_canceled;
if ($realexInterface->isResponseDeclined($xml_response3DSVerifysig)) {
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_DECLINED', $realexInterface->order['details']['BT']->order_number);
$msgToShopper = $xml_response3DSVerifysig->message;
} elseif ($realexInterface->isResponseWrongPhrase($xml_response3DSVerifysig)) {
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CANCELLED', $realexInterface->order['details']['BT']->order_number);
$msgToShopper = $xml_response3DSVerifysig->message;
} elseif ($realexInterface->isResponseAlreadyProcessed($xml_response3DSVerifysig)) {
$order_history['comments'] = $xml_response3DSVerifysig->message;
$msgToShopper = $xml_response3DSVerifysig->message;
// log this response, but do not change the order status
$status = $realexInterface->order['details']['BT']->order_status;
/* } elseif ($xml_response and $realexInterface->isResponseInvalidPaymentDetails($xml_response)) {
$order_history['comments'] =$xml_response->message;
if ($realvault) {
$accountURL=JRoute::_('index.php?option=com_virtuemart&view=user&layout=edit');
$msgToShopper=vmText::sprintf('VMPAYMENT_REALEX_HPP_API_INVALID_PAYMENT_DETAILS_REALVAULT',$xml_response->message, $accountURL);
} else {
$msgToShopper=vmText::sprintf('VMPAYMENT_REALEX_HPP_API_INVALID_PAYMENT_DETAILS',$xml_response->message);
}
*/
} else {
$order_history['comments'] = vmText::sprintf('VMPAYMENT_REALEX_HPP_API_PAYMENT_STATUS_CANCELLED', $realexInterface->order['details']['BT']->order_number);
}
$redirectToCart = true;
}
$order_history['customer_notified'] = true;
$order_history['order_status'] = $status;
// $this->updateOrderStatus($realexInterface->order, $redirectToCart);
$modelOrder = VmModel::getModel('orders');
$modelOrder->updateStatusForOneOrder($realexInterface->order['details']['BT']->virtuemart_order_id, $order_history, false);
/*
$payments = $this->getDatasByOrderId($realexInterface->order['details']['BT']->virtuemart_order_id);
$html = $realexInterface->getResponseParams($payments);
$this->customerData->clear();
$cart = VirtueMartCart::getCart();
$cart->emptyCart();
vRequest::setVar('display_title', false);
vRequest::setVar('html', $html);
echo $html;
*/
//$html = $realexInterface->getResponseParams($payments);
if ($redirectToCart) {
$this->redirectToCart($msgToShopper);
} else {
$this->customerData->clear();
$cart = VirtueMartCart::getCart();
$cart->emptyCart();
$submit_url = JURI::root() . 'index.php?option=com_virtuemart&view=pluginresponse&task=pluginresponsereceived&pm=' . $this->_currentMethod->virtuemart_paymentmethod_id . '&on=' . $realexInterface->order['details']['BT']->order_number . '&Itemid=' . vRequest::getInt('Itemid') . '&lang=' . vRequest::getCmd('lang', '');
$app = JFactory::getApplication();
$app->redirect(JRoute::_($submit_url));
}
return true;
}
/**
* This message allows to redirect from Realex payment form to VM
* @param $realex_data
* @param $success
* @param $virtuemart_paymentmethod_id
*/
private function returnToVm ($realex_data, $success, $virtuemart_paymentmethod_id) {
$html = '';
// add spin image
$html .= '';
echo $html;
}
function getCardHolderAmount ($dcccardholderamount) {
return sprintf("%01.2f", $dcccardholderamount * 0.01);
}
/*******************/
/* Credit Card API */
/*******************/
public function _getCVVImages ($cvv_images) {
$img = '';
if ($cvv_images) {
$img = $this->displayLogos($cvv_images);
$img = str_replace('"', "'", $img);
}
return $img;
}
public function plgVmOnRealexDeletedStoredCard ($element, $storedCC, &$success) {
if (!$this->selectedThisElement($element)) {
return FALSE;
}
$vendorId = 1;
if ($this->getPluginMethods($vendorId) === 0) {
return false;
}
foreach ($this->methods as $method) {
if ($method->merchant_id == $storedCC['merchant_id']) {
// the crypted fields are decrypted with that function
if (!($this->_currentMethod = $this->getVmPluginMethod($method->virtuemart_paymentmethod_id))) {
return FALSE; // this should not happen
}
break;
}
}
$realexInterface = $this->_loadRealexInterface();
if (!$realexInterface) {
return false;
}
$success = $realexInterface->deleteStoredCard($storedCC);
return $success;
}
public function plgVmOnRealexUpdateStoredCard ($element, $storedCC, &$success) {
if (!$this->selectedThisElement($element)) {
return FALSE;
}
$vendorId = 1;
if ($this->getPluginMethods($vendorId) === 0) {
return false;
}
foreach ($this->methods as $method) {
if ($method->merchant_id == $storedCC['merchant_id']) {
// the crypted fields are decrypted with that function
if (!($this->_currentMethod = $this->getVmPluginMethod($method->virtuemart_paymentmethod_id))) {
return FALSE; // this should not happen
}
break;
}
}
if (empty($this->_currentMethod)) {
Vmerror('No payment has been found with ' . $storedCC['merchant_id']);
return FALSE;
}
//vmdebug('plgVmOnRealexUpdateStoredCard',$this->_currentMethod );
$realexInterface = $this->_loadRealexInterface();
if (!$realexInterface) {
return false;
}
$success = $realexInterface->updateStoredCard($storedCC);
return $success;
}
/**
* @return string
*/
function getPayerRefTableName () {
return $this->_tablename . '_payerref';
}
/**
* @param $response
* @param $virtuemart_paymentmethod_id
* @param $virtuemart_order_id
* @param $order_number
* @param $request_type
* @return mixed
*/
function _storeRealexInternalData ($response, $virtuemart_paymentmethod_id, $virtuemart_order_id, $order_number, $request_type) {
$xml_response = simplexml_load_string($response);
//$db_values['payment_name'] = $this->renderPluginName($this->_currentMethod, 'order');
$db_values['virtuemart_order_id'] = $virtuemart_order_id;
$db_values['order_number'] = $order_number;
$db_values['virtuemart_paymentmethod_id'] = $virtuemart_paymentmethod_id;
$db_values['realex_hpp_api_response_result'] = (string)$xml_response->result;
if (isset($xml_response->pasref)) {
$db_values['realex_hpp_api_response_pasref'] = (string)$xml_response->pasref;
}
if (isset($xml_response->authcode)) {
$db_values['realex_hpp_api_response_authcode'] = (string)$xml_response->authcode;
}
$db_values['realex_hpp_api_request_type_response'] = $request_type;
$db_values['realex_hpp_api_fullresponse_format'] = 'xml';
$db_values['realex_hpp_api_fullresponse'] = $response;
$this->storePSPluginInternalData($db_values);
return $db_values;
}
private function jumpRedirect () {
// url sent in get
$url = vRequest::getVar('gateway_url');
unset($_POST['gateway_url']);
?>
Transferring...
set('RealexToken', $token, 'vm');
}
function checkToken ($token) {
$session = JFactory::getSession();
$sessionToken = $session->get('RealexToken', 0, 'vm');
if ($token == $sessionToken) {
return true;
}
return false;
}
function clearToken () {
$session = JFactory::getSession();
$session->clear('RealexToken', 'vm');
}
} // class
// No closing tag