/** * Prepare to analyse check url or return url call * @param array[string]string $parameters $_REQUEST by default * @param string $ctx_mode * @param string $key_test * @param string $key_prod * @deprecated see PayzenResponse constructor */ function loadResponse($parameters = null, $ctx_mode = null, $key_test = null, $key_prod = null) { $parameters = is_null($parameters) ? $_REQUEST : $parameters; $parameters = $this->uncharm($parameters); // Load site credentials if provided if (!is_null($ctx_mode)) { $this->set('vads_ctx_mode', $ctx_mode); } if (!is_null($key_test)) { $this->set('vads_key_test', $key_test); } if (!is_null($key_prod)) { $this->set('vads_key_prod', $key_prod); } $this->response = new PayzenResponse(); $this->response->load($parameters, $this->getCertificate()); }
// Cart errors if (!Validate::isLoadedObject($cart)) { $module->logger->logError("Cart #{$cartId} not found in database."); die('<span style="display:none">KO-' . Tools::getValue('vads_trans_id') . "=Impossible de retrouver la commande\n</span>"); } elseif ($cart->nbProducts() <= 0) { $module->logger->logError("Cart #{$cartId} was emptied before redirection."); die('<span style="display:none">KO-' . Tools::getValue('vads_trans_id') . "=Le panier a été vidé avant la redirection\n</span>"); } // Reload shop context if (Shop::isFeatureActive()) { Shop::setContext(Shop::CONTEXT_SHOP, (int) $cart->id_shop); } // Reload language context Context::getContext()->language = new Language((int) $cart->id_lang); /** @var PayzenResponse $payzenResponse */ $payzenResponse = new PayzenResponse($_POST, Configuration::get('PAYZEN_MODE'), Configuration::get('PAYZEN_KEY_TEST'), Configuration::get('PAYZEN_KEY_PROD')); // Check the authenticity of the request if (!$payzenResponse->isAuthentified()) { $module->logger->logError("Cart #{$cartId} : authentication error !"); die($payzenResponse->getOutputForGateway('auth_fail')); } // Search order in db $orderId = Order::getOrderByCartId($cart->id); if ($orderId == false) { // order has not been processed yet if ($payzenResponse->isAcceptedPayment()) { $newState = $module->isOneyPendingPayment($payzenResponse) ? Configuration::get('PAYZEN_OS_ONEY_PENDING') : Configuration::get('PS_OS_PAYMENT'); $module->logger->logInfo("Payment accepted for cart #{$cartId}. New order status is {$newState}."); $order = $module->saveOrder($cart, $newState, $payzenResponse); // response to server die($payzenResponse->getOutputForGateway('payment_ok'));
private function _processPaymentReturn() { /** @var PayzenResponse $payzenResponse */ $payzenResponse = new PayzenResponse($_REQUEST, Configuration::get('PAYZEN_MODE'), Configuration::get('PAYZEN_KEY_TEST'), Configuration::get('PAYZEN_KEY_PROD')); $cartId = $this->currentCart->id; // Check the authenticity of the request if (!$payzenResponse->isAuthentified()) { $this->module->logger->logError("Cart #{$cartId} : authentication error ! Redirect to home page."); Tools::redirectLink('index.php'); } // Search order in db $orderId = Order::getOrderByCartId($cartId); if ($orderId == false) { // order has not been processed yet if ($payzenResponse->isAcceptedPayment()) { $this->module->logger->logWarning("Payment for cart #{$cartId} has been processed by client return ! This means the check URL did not work."); $newState = $this->module->isOneyPendingPayment($payzenResponse) ? Configuration::get('PAYZEN_OS_ONEY_PENDING') : Configuration::get('PS_OS_PAYMENT'); $this->module->logger->logInfo("Payment accepted for cart #{$cartId}. New order status is {$newState}."); $order = $this->module->saveOrder($this->currentCart, $newState, $payzenResponse); // redirect to success page $this->_redirectSuccess($order, $this->module->id, $payzenResponse, true); } else { // payment KO if (Configuration::get('PAYZEN_FAILURE_MANAGEMENT') == Payzen::ON_FAILURE_SAVE || $this->module->isOney($payzenResponse)) { // save on failure option is selected or oney payment : save order and go to history page $newState = $payzenResponse->isCancelledPayment() ? Configuration::get('PS_OS_CANCELED') : Configuration::get('PS_OS_ERROR'); $this->module->logger->logWarning("Payment for order #{$cartId} has been processed by client return ! This means the check URL did not work."); $msg = $this->module->isOney($payzenResponse) ? 'FacilyPay Oney payment' : 'Save on failure option is selected'; $this->module->logger->logInfo("{$msg} : save failed order for cart #{$cartId}. New order status is {$newState}."); $this->module->saveOrder($this->currentCart, $newState, $payzenResponse); $this->module->logger->logInfo("Redirect to history page, cart ID : #{$cartId}."); Tools::redirect('index.php?controller=history'); } else { // option 2 choosen : get back to checkout process and show message $this->module->logger->logInfo("Payment failed, redirect to order checkout page, cart ID : #{$cartId}."); $controller = Configuration::get('PS_ORDER_PROCESS_TYPE') ? 'order-opc' : 'order' . (Tools::version_compare(_PS_VERSION_, '1.5.1', '>=') ? '&step=3' : ''); Tools::redirect('index.php?controller=' . $controller . '&payzen_pay_error=yes'); } } } else { // order already registered $this->module->logger->logInfo("Order already registered for cart #{$cartId}."); $order = new Order((int) $orderId); $oldState = $order->getCurrentState(); switch ($oldState) { case Configuration::get('PS_OS_ERROR'): case Configuration::get('PS_OS_CANCELED'): $this->module->logger->logInfo("Save on failure option is selected or FacilyPay Oney payment. Order for cart #{$cartId} is in a failed status."); if ($payzenResponse->isAcceptedPayment()) { // order saved with failed status while payment is successful $this->module->logger->logError("Payment success received from platform while order is in a failed status for cart #{$cartId}."); } else { // just display a failure confirmation message $this->module->logger->logInfo("Payment failure confirmed for cart #{$cartId}."); } $this->module->logger->logInfo("Redirect to history page. Cart ID : #{$cartId}."); Tools::redirect('index.php?controller=history'); break; case Configuration::get('PAYZEN_OS_ONEY_PENDING'): case $oldState == Configuration::get('PS_OS_OUTOFSTOCK') && $this->module->isOney($payzenResponse): $this->module->logger->logInfo("Order for cart #{$cartId} is saved but waiting FacilyPay Oney confirmation. Update order status according to payment result."); if ($payzenResponse->isPendingPayment()) { // redirect to success page $this->module->logger->logInfo("FacilyPay Oney pending status confirmed for cart #{$cartId}. Just redirect to success page."); $this->_redirectSuccess($order, $this->module->id, $payzenResponse); } else { // order is pending Oney confirmation, payment is not pending : error case $this->module->logger->logError("Order saved with FacilyPay Oney pending status while payment not pending, cart ID : #{$cartId}."); Tools::redirect('index.php?controller=order-confirmation&id_cart=' . $cartId . '&id_module=' . $this->module->id . '&id_order=' . $order->id . '&key=' . $order->secure_key . '&error=yes'); } break; case Configuration::get('PS_OS_PAYMENT'): case Configuration::get('PAYZEN_OS_PAYMENT_OUTOFSTOCK'): case $oldState == Configuration::get('PS_OS_OUTOFSTOCK') && !$this->module->isOney($payzenResponse): default: if ($payzenResponse->isAcceptedPayment()) { // redirect to success page $this->module->logger->logInfo("Payment success confirmed for cart #{$cartId}. Just redirect to success page."); $this->_redirectSuccess($order, $this->module->id, $payzenResponse); } else { // order saved with success status while payment failed $this->module->logger->logError("Order saved with success status while payment failed, cart ID : #{$cartId}."); Tools::redirect('index.php?controller=order-confirmation&id_cart=' . $cartId . '&id_module=' . $this->module->id . '&id_order=' . $order->id . '&key=' . $order->secure_key . '&error=yes'); } break; default: // order saved with unmanaged status, redirect client according to payment result $this->module->logger->logInfo("Order saved with unmanaged status for cart #{$cartId}, redirect client according to payment result."); if ($payzenResponse->isAcceptedPayment()) { // redirect to success page $this->module->logger->logInfo("Payment success for cart #{$cartId}. Redirect to success page."); $this->_redirectSuccess($order, $this->module->id, $payzenResponse); } else { $this->module->logger->logInfo("Payment failure for cart #{$cartId}. Redirect to history page."); Tools::redirect('index.php?controller=history'); } break; } } }
/** * Check PayZen response, save order and empty cart (if payment success) when server notification is received from payment platform. * * @param string $return_context session id * @param int $virtuemart_order_id virtuemart order primary key concerned by payment * @param string $new_status new order status * @return */ function plgVmOnPaymentNotification() { // platform params and payment data $data = JRequest::get('post'); $this->logInfo('plgVmOnPaymentNotification START ', 'error'); if (!array_key_exists('vads_order_id', $data) || !isset($data['vads_order_id'])) { $this->logInfo('plgVmOnPaymentNotification -- Another method was selected, do nothing : ', 'error'); return NULL; // Another method was selected, do nothing } // Retrieve order info from database if (!class_exists('VirtueMartModelOrders')) { require JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php'; } $virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber($data['vads_order_id']); // Order not found /* if (!$virtuemart_order_id) { $this->logInfo('plgVmOnPaymentNotification -- payment check attempted on non existing order : ' . $resp->get('order_id'), 'error'); $response .= '<span style="display:none">OK-'; $response .= $data['vads_hash']; $response .= "=Impossible de retrouver la commande\n"; $response .= '</span>'; die($response); } */ // Payment params if (!($payment_data = $this->getDataByOrderId($virtuemart_order_id))) { return FALSE; } $method = $this->getVmPluginMethod($payment_data->virtuemart_paymentmethod_id); if (!$this->selectedThisElement($method->payment_element)) { return FALSE; } $this->_debug = $method->debug; $custom = $this->_name . '_custom'; $return_context = $payment_data->{$custom}; // Load API if (!class_exists('PayzenResponse')) { require JPATH_VMPAYMENTPLUGIN_PAYZEN . DS . 'payzen' . DS . 'payzen_api.php'; } $resp = new PayzenResponse($data, $method->ctx_mode, $method->key_test, $method->key_prod); if (!$resp->isAuthentified()) { $this->logInfo('plgVmOnPaymentNotification -- suspect request sent to plgVmOnPaymentNotification, IP : ' . $_SERVER['REMOTE_ADDR'], 'error'); die($resp->getOutputForGateway('auth_fail')); } $order = VirtueMartModelOrders::getOrder($virtuemart_order_id); $order_status_code = $order['items'][0]->order_status; // Order not processed yet if ($order_status_code == 'P') { if ($resp->isAcceptedPayment()) { $currency = $resp->api->findCurrencyByNumCode($resp->get('currency'))->alpha3; $amount = $resp->get('amount') / 100 . ' ' . $currency; $new_status = $method->order_success_status; $this->logInfo('plgVmOnPaymentNotification -- payment process OK, ' . $amount . ' paid for order ' . $resp->get('order_id') . ', new status ' . $new_status, 'message'); echo $resp->getOutputForGateway('payment_ok'); } else { $new_status = $method->order_failure_status; $this->logInfo('plgVmOnPaymentNotification -- payment process error ' . $resp->message . ', new status ' . $new_status, 'ERROR'); echo $resp->getOutputForGateway('payment_ko'); } // Save platform response $this->managePaymentResponse($virtuemart_order_id, $resp, $new_status, $return_context, $data['vads_order_id']); } else { // Order already processed if ($resp->isAcceptedPayment()) { echo $resp->getOutputForGateway('payment_ok_already_done'); } else { echo $resp->getOutputForGateway('payment_ko_on_order_ok'); } } die; }