public function notifyAction() { //header( 'Content-Type:text/html; charset=UTF-8' ); $idLog = generateIdLog(); $logActivo = Mage::getStoreConfig('payment/redsys/logactivo', Mage::app()->getStore()); $mantenerPedidoAnteError = Mage::getStoreConfig('payment/redsys/errorpedido', Mage::app()->getStore()); $orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId(); $this->escribirLog($idLog . " -- " . "Notificando desde Redsys ", $logActivo); if (!empty($_POST)) { //URL RESP. ONLINE /** Recoger datos de respuesta * */ $version = $_POST["Ds_SignatureVersion"]; $datos = $_POST["Ds_MerchantParameters"]; $firma_remota = $_POST["Ds_Signature"]; $this->escribirLog($idLog . " -- " . "Ds_SignatureVersion: " . $version, $logActivo); $this->escribirLog($idLog . " -- " . "Ds_MerchantParameters: " . $datos, $logActivo); $this->escribirLog($idLog . " -- " . "Ds_Signature: " . $firma_remota, $logActivo); // Se crea Objeto $miObj = new RedsysAPI(); /** Se decodifican los datos enviados y se carga el array de datos * */ $decodec = $miObj->decodeMerchantParameters($datos); /** Clave * */ $kc = Mage::getStoreConfig('payment/redsys/clave256', Mage::app()->getStore()); /** Se calcula la firma * */ $firma_local = $miObj->createMerchantSignatureNotif($kc, $datos); /** Extraer datos de la notificación * */ $total = $miObj->getParameter('Ds_Amount'); $pedido = $miObj->getParameter('Ds_Order'); $codigo = $miObj->getParameter('Ds_MerchantCode'); $terminal = $miObj->getParameter('Ds_Terminal'); $moneda = $miObj->getParameter('Ds_Currency'); $respuesta = $miObj->getParameter('Ds_Response'); $fecha = $miObj->getParameter('Ds_Date'); $hora = $miObj->getParameter('Ds_Hour'); $id_trans = $miObj->getParameter('Ds_AuthorisationCode'); $tipoTrans = $miObj->getParameter('Ds_TransactionType'); // Recogemos los datos del comercio $codigoOrig = Mage::getStoreConfig('payment/redsys/num', Mage::app()->getStore()); $terminalOrig = Mage::getStoreConfig('payment/redsys/terminal', Mage::app()->getStore()); $monedaOrig = Mage::getStoreConfig('payment/redsys/moneda', Mage::app()->getStore()); $tipoTransOrig = Mage::getStoreConfig('payment/redsys/trans', Mage::app()->getStore()); // Obtenemos el código ISO del tipo de moneda if ($monedaOrig == "0") { $monedaOrig = "978"; } else { $monedaOrig = "840"; } // INI MOD #7375 // Limpiamos 0 por delante agregados para pasarlo como parámetro $pedido = ltrim($pedido, '0'); // FIN MOD #7375 // Inicializamos el valor del status del pedido $status = ""; // Validacion de firma y parámetros if ($firma_local === $firma_remota && checkImporte($total) && checkPedidoNum($pedido) && checkFuc($codigo) && checkMoneda($moneda) && checkRespuesta($respuesta) && $tipoTrans == $tipoTransOrig && $codigo == $codigoOrig && intval(strval($terminalOrig)) == intval(strval($terminal))) { // Respuesta cumple las validaciones $respuesta = intval($respuesta); $this->escribirLog($idLog . " - Código de respuesta: " . $respuesta, $logActivo); if ($respuesta < 101) { //Mage::log('Redsys: Pago aceptado'); $this->escribirLog($idLog . " - Pago aceptado.", $logActivo); //Correo electrónico $correo = Mage::getStoreConfig('payment/redsys/correo', Mage::app()->getStore()); $mensaje = Mage::getStoreConfig('payment/redsys/mensaje', Mage::app()->getStore()); $nombreComercio = Mage::getStoreConfig('payment/redsys/nombre', Mage::app()->getStore()); //Datos del cliente $customer = Mage::getSingleton('customer/session')->getCustomer(); if ($correo != "0") { $email_to = $customer->getEmail(); $email_subject = "-MAGENTO- Pedido realizado"; if (mail($email_to, $email_subject, $mensaje, "From:" . $nombreComercio)) { echo "Correo enviado"; } else { echo "No se puedo enviar el correo"; } } //Fin de correo //Id pedido $ord = $pedido; $orde = $ord; $this->escribirLog($idLog . " - Order increment id " . $orde, $logActivo); $order = Mage::getModel('sales/order')->loadByIncrementId($orde); $transaction_amount = number_format($order->getBaseGrandTotal(), 2, '', ''); $amountOrig = (double) $transaction_amount; if ($amountOrig != $total) { $this->escribirLog($idLog . " -- " . "El importe total no coincide.", $logActivo); //Mage::log('Redsys: Diferente importe'); // Diferente importe $state = 'new'; $status = 'canceled'; $comment = 'Redsys ha actualizado el estado del pedido con el valor "' . $status . '"'; $isCustomerNotified = true; $order->setState($state, $status, $comment, $isCustomerNotified); $order->registerCancellation("")->save(); $order->save(); //$this->_redirect('checkout/onepage/failure'); $this->escribirLog($idLog . " -- " . "El pedido con ID de carrito " . $orde . " es inválido.", $logActivo); } try { if (!$order->canInvoice()) { $order->addStatusHistoryComment('Redsys, imposible generar Factura.', false); $order->save(); } //START Handle Invoice $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice(); $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE); $invoice->register(); $invoice->getOrder()->setCustomerNoteNotify(true); $invoice->getOrder()->setIsInProcess(true); $order->addStatusHistoryComment('Redsys ha generado la Factura del pedido', false); $transactionSave = Mage::getModel('core/resource_transaction')->addObject($invoice)->addObject($invoice->getOrder()); $transactionSave->save(); //END Handle Invoice //START Handle Shipment //$shipment = $order->prepareShipment(); //$shipment->register(); //$order->setIsInProcess(true); //$order->addStatusHistoryComment('Redsys ENVIO.', false); //$transactionSave = Mage::getModel('core/resource_transaction') // ->addObject($shipment) // ->addObject($shipment->getOrder()) // ->save(); //END Handle Shipment //Email al cliente $order->sendNewOrderEmail(); echo "Pedido: {$ord} se ha enviado correctamente\n"; //Se actualiza el pedido $state = 'new'; $status = 'processing'; $comment = 'Redsys ha actualizado el estado del pedido con el valor "' . $status . '"'; $isCustomerNotified = true; $order->setState($state, $status, $comment, $isCustomerNotified); $order->save(); $this->escribirLog($idLog . " -- " . "El pedido con ID de carrito " . $orderId . " es válido y se ha registrado correctamente.", $logActivo); // INI MOD #7375 Borramos el carrito porque el módulo no lo hacía $session->setQuoteId($order->getQuoteId()); $session->getQuote()->setIsActive(false)->save(); // FIN MOD #7375 // //$this->_redirect('checkout/onepage/success'); } catch (Exception $e) { $order->addStatusHistoryComment('Redsys: Exception message: ' . $e->getMessage(), false); $order->save(); } } else { $this->escribirLog($idLog . " - Pago no aceptado", $logActivo); $ord = $pedido; $orde = $ord; $order = Mage::getModel('sales/order')->loadByIncrementId($orde); $state = 'new'; $status = 'canceled'; $comment = 'Redsys ha actualizado el estado del pedido con el valor "' . $status . '"'; $this->escribirLog($idLog . " - Actualizado el estado del pedido con el valor " . $status, $logActivo); $isCustomerNotified = true; $order->setState($state, $status, $comment, $isCustomerNotified); $order->registerCancellation("")->save(); $order->save(); //$this->_redirect('checkout/onepage/failure'); } } else { $this->escribirLog($idLog . " - Validaciones NO superadas", $logActivo); $ord = $pedido; $orde = $ord; $order = Mage::getModel('sales/order')->loadByIncrementId($orde); $state = 'new'; $status = 'canceled'; $comment = 'Redsys ha actualizado el estado del pedido con el valor "' . $status . '"'; $isCustomerNotified = true; $order->setState($state, $status, $comment, $isCustomerNotified); $order->registerCancellation("")->save(); $order->save(); //$this->_redirect('checkout/onepage/failure'); } } else { if (!empty($_GET)) { //URL OK Y KO /** Recoger datos de respuesta * */ $version = $_GET["Ds_SignatureVersion"]; $datos = $_GET["Ds_MerchantParameters"]; $firma_remota = $_GET["Ds_Signature"]; // Se crea Objeto $miObj = new RedsysAPI(); /** Se decodifican los datos enviados y se carga el array de datos * */ $decodec = $miObj->decodeMerchantParameters($datos); /** Clave * */ $kc = Mage::getStoreConfig('payment/redsys/clave256', Mage::app()->getStore()); /** Se calcula la firma * */ $firma_local = $miObj->createMerchantSignatureNotif($kc, $datos); /** Extraer datos de la notificación * */ $total = $miObj->getParameter('Ds_Amount'); $pedido = $miObj->getParameter('Ds_Order'); $codigo = $miObj->getParameter('Ds_MerchantCode'); $terminal = $miObj->getParameter('Ds_Terminal'); $moneda = $miObj->getParameter('Ds_Currency'); $respuesta = $miObj->getParameter('Ds_Response'); $fecha = $miObj->getParameter('Ds_Date'); $hora = $miObj->getParameter('Ds_Hour'); $id_trans = $miObj->getParameter('Ds_AuthorisationCode'); $tipoTrans = $miObj->getParameter('Ds_TransactionType'); // Recogemos los datos del comercio $codigoOrig = Mage::getStoreConfig('payment/redsys/num', Mage::app()->getStore()); $terminalOrig = Mage::getStoreConfig('payment/redsys/terminal', Mage::app()->getStore()); $monedaOrig = Mage::getStoreConfig('payment/redsys/moneda', Mage::app()->getStore()); $tipoTransOrig = Mage::getStoreConfig('payment/redsys/trans', Mage::app()->getStore()); // Obtenemos el código ISO del tipo de moneda if ($monedaOrig == "0") { $monedaOrig = "978"; } else { $monedaOrig = "840"; } // INI MOD #7375 // Limpiamos 0 por delante agregados para pasarlo como parámetro $pedido = ltrim($pedido, '0'); // FIN MOD #7375 if ($firma_local === $firma_remota && checkImporte($total) && checkPedidoNum($pedido) && checkFuc($codigo) && checkMoneda($moneda) && checkRespuesta($respuesta) && $tipoTrans == $tipoTransOrig && $codigo == $codigoOrig && intval(strval($terminalOrig)) == intval(strval($terminal))) { $respuesta = intval($respuesta); $orde = $pedido; $order = Mage::getModel('sales/order')->loadByIncrementId($orde); if ($respuesta < 101) { $transaction_amount = number_format($order->getBaseGrandTotal(), 2, '', ''); $amountOrig = (double) $transaction_amount; if ($amountOrig != $total) { $this->_redirect('checkout/onepage/failure'); } else { $this->_redirect('checkout/onepage/success'); } } else { if (strval($mantenerPedidoAnteError) == 1) { $_order = new Mage_Sales_Model_Order(); $orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId(); $_order->loadByIncrementId($orderId); $items = $_order->getAllVisibleItems(); $cart = Mage::getSingleton('checkout/cart'); foreach ($items as $itemId => $item) { $this->escribirLog($idLog . " - Cargado carrito con " . $item->getName(), $logActivo); $cart->addOrderItem($item); } $cart->save(); } $this->_redirect('checkout/onepage/failure'); } } else { $this->_redirect('checkout/onepage/failure'); } } else { echo 'No hay respuesta por parte de Redsys!'; } } }
function check_rds_response() { $this->idLog = generateIdLog(); $logActivo = $this->activar_log; if (!empty($_REQUEST)) { if (!empty($_POST)) { //URL DE RESP. ONLINE /** Recoger datos de respuesta **/ $version = $_POST["Ds_SignatureVersion"]; $datos = $_POST["Ds_MerchantParameters"]; $firma_remota = $_POST["Ds_Signature"]; // Se crea Objeto $miObj = new RedsysAPI(); /** Se decodifican los datos enviados y se carga el array de datos **/ $decodec = $miObj->decodeMerchantParameters($datos); /** Clave **/ $kc = $this->get_option('clave256'); /** Se calcula la firma **/ $firma_local = $miObj->createMerchantSignatureNotif($kc, $datos); /** Extraer datos de la notificación **/ $total = $miObj->getParameter('Ds_Amount'); $pedido = $miObj->getParameter('Ds_Order'); $codigo = $miObj->getParameter('Ds_MerchantCode'); $moneda = $miObj->getParameter('Ds_Currency'); $respuesta = $miObj->getParameter('Ds_Response'); $id_trans = $miObj->getParameter('Ds_AuthorisationCode'); $pedido = intval($pedido); if ($firma_local === $firma_remota && checkRespuesta($respuesta) && checkMoneda($moneda) && checkFuc($codigo) && checkPedidoNum($pedido) && checkImporte($total)) { // Formatear variables $respuesta = intval($respuesta); if ($respuesta < 101 && checkAutCode($id_trans)) { $order = new WC_Order($pedido); $order->update_status('processing', __('Awaiting REDSYS payment', 'woocommerce')); //$this->log->add( 'redsys', 'Operación finalizada. PEDIDO ACEPTADO '); $this->escribirLog($this->idLog . " -- " . "Operación finalizada. PEDIDO ACEPTADO", $logActivo); $order->reduce_order_stock(); // Remove cart WC()->cart->empty_cart(); //wp_redirect(WC()->plugin_url()."/includes/gateways/redsys/pages/sucess.php?pedido=".$pedido); } else { $order = new WC_Order($pedido); $order->update_status('cancelled', __('Awaiting redsys payment', 'woocommerce')); WC()->cart->empty_cart(); //$this->log->add( 'redsys', 'Operación finalizada. PEDIDO CANCELADO '); $this->escribirLog($this->idLog . " -- " . "Operación finalizada. PEDIDO CANCELADO", $logActivo); //wp_redirect(WC()->plugin_url()."/includes/gateways/redsys/pages/failure.php?pedido=".$pedido); } } else { // Fallo de firma o algún otro parámetro // Se vacía siempre el carro por motivos de seguridad $order = new WC_Order($pedido); $order->update_status('cancelled', __('Awaiting REDSYS payment', 'woocommerce')); WC()->cart->empty_cart(); //$this->log->add( 'redsys', 'Operación finalizada. PEDIDO CANCELADO '); $this->escribirLog($this->idLog . " -- " . "Error de firma. Operación finalizada. PEDIDO CANCELADO", $logActivo); //wp_redirect(WC()->plugin_url()."/includes/gateways/redsys/pages/failure.php?pedido=".$pedido); } } else { wp_die('<img src="' . plugins_url() . '/redsys/pages/assets/images/Redsys.png" alt="Redys" height="70" width="242"/><br> <img src="' . plugins_url() . '/redsys/pages/assets/images/cross.png" alt="Desactivado" title="Desactivado" /> <b>REDSYS</b>: Fallo en el proceso de pago.<br>Su pedido ha sido cancelado.'); } } else { wp_die('<img src="' . plugins_url() . '/redsys/pages/assets/images/Redsys.png" alt="Redys" height="70" width="242"/><br> <img src="' . plugins_url() . '/redsys/pages/assets/images/cross.png" alt="Desactivado" title="Desactivado" /> <b>REDSYS</b>: Fallo en el proceso de pago.<br>Su pedido ha sido cancelado.'); } }