Exemplo n.º 1
0
 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!';
         }
     }
 }
Exemplo n.º 2
0
            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.');
                }
            }