public function redirectAction()
    {
        $logActivo = Mage::getStoreConfig('payment/redsys/logactivo', Mage::app()->getStore());
        //Obtenemos los valores de la configuración del módulo
        $entorno = Mage::getStoreConfig('payment/redsys/entorno', Mage::app()->getStore());
        $nombre = Mage::getStoreConfig('payment/redsys/nombre', Mage::app()->getStore());
        $codigo = Mage::getStoreConfig('payment/redsys/num', Mage::app()->getStore());
        $clave256 = Mage::getStoreConfig('payment/redsys/clave256', Mage::app()->getStore());
        $terminal = Mage::getStoreConfig('payment/redsys/terminal', Mage::app()->getStore());
        $moneda = Mage::getStoreConfig('payment/redsys/moneda', Mage::app()->getStore());
        $trans = Mage::getStoreConfig('payment/redsys/trans', Mage::app()->getStore());
        $notif = Mage::getStoreConfig('payment/redsys/notif', Mage::app()->getStore());
        $ssl = Mage::getStoreConfig('payment/redsys/ssl', Mage::app()->getStore());
        $error = Mage::getStoreConfig('payment/redsys/error', Mage::app()->getStore());
        $idiomas = Mage::getStoreConfig('payment/redsys/idiomas', Mage::app()->getStore());
        $tipopago = Mage::getStoreConfig('payment/redsys/tipopago', Mage::app()->getStore());
        $correo = Mage::getStoreConfig('payment/redsys/correo', Mage::app()->getStore());
        $mensaje = Mage::getStoreConfig('payment/redsys/mensaje', Mage::app()->getStore());
        //Obtenemos datos del pedido
        $_order = new Mage_Sales_Model_Order();
        $orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId();
        $_order->loadByIncrementId($orderId);
        //Actualizamos estado del pedido a "pendiente"
        //INI MOD #7506
        //Si se modifica el estado aquí el pedido vuelve a pending cuando el usuario
        //pulsa el botón de atrás de su navegador
        //        $state = 'new';
        //        $status = 'pending';
        //        $comment = 'Redsys ha actualizado el estado del pedido con el valor "' . $status . '"';
        //        $isCustomerNotified = true;
        //        $_order->setState($state, $status, $comment, $isCustomerNotified);
        //        $_order->save();
        //FIN MOD #7506
        //Datos del cliente
        $customer = Mage::getSingleton('customer/session')->getCustomer();
        //Datos de los productos del pedido
        $productos = '';
        $items = $_order->getAllVisibleItems();
        foreach ($items as $itemId => $item) {
            $productos .= $item->getName();
            $productos .= "X" . $item->getQtyToInvoice();
            $productos .= "/";
        }
        //Formateamos el precio total del pedido
        $transaction_amount = number_format($_order->getBaseGrandTotal(), 2, '', '');
        //Establecemos los valores del cliente y el pedido
        $numpedido = str_pad($orderId, 12, "0", STR_PAD_LEFT);
        $cantidad = (double) $transaction_amount;
        $titular = $customer->getFirstname() . " " . $customer->getMastname() . " " . $customer->getLastname() . "/ Correo:" . $customer->getEmail();
        //Generamos el urlTienda -> respuesta ON-LINE que deberá ser la establecida bajo las pautas de WooCommerce
        if ($ssl == "0") {
            $urltienda = Mage::getBaseUrl() . 'redsys/index/notify';
        } else {
            $urltienda = Mage::getBaseUrl() . 'redsys/index/notify';
        }
        // INI MOD #7375
        $urlok = Mage::getBaseUrl() . 'redsys/index/success';
        $urlko = Mage::getBaseUrl() . 'redsys/index/cancel';
        // FIN MOD #7375
        //
        // Obtenemos el valor de la config del idioma
        if ($idiomas == "0") {
            $idioma_tpv = "0";
        } else {
            $idioma_web = substr(Mage::getStoreConfig('general/locale/code', Mage::app()->getStore()->getId()), 0, 2);
            switch ($idioma_web) {
                case 'es':
                    $idioma_tpv = '001';
                    break;
                case 'en':
                    $idioma_tpv = '002';
                    break;
                case 'ca':
                    $idioma_tpv = '003';
                    break;
                case 'fr':
                    $idioma_tpv = '004';
                    break;
                case 'de':
                    $idioma_tpv = '005';
                    break;
                case 'nl':
                    $idioma_tpv = '006';
                    break;
                case 'it':
                    $idioma_tpv = '007';
                    break;
                case 'sv':
                    $idioma_tpv = '008';
                    break;
                case 'pt':
                    $idioma_tpv = '009';
                    break;
                case 'pl':
                    $idioma_tpv = '011';
                    break;
                case 'gl':
                    $idioma_tpv = '012';
                    break;
                case 'eu':
                    $idioma_tpv = '013';
                    break;
                default:
                    $idioma_tpv = '002';
            }
        }
        // Obtenemos el código ISO del tipo de moneda
        // INI MOD #7375
        if ($moneda == "0") {
            $moneda = "978";
        } else {
            if ($moneda == "1") {
                $moneda = "840";
            } else {
                if ($moneda == "2") {
                    $moneda = "826";
                } else {
                    $moneda = "978";
                }
            }
        }
        // FIN MOD #7375
        // Obtenemos los tipos de pago permitidos
        if ($tipopago == "0") {
            $tipopago = " ";
        } else {
            if ($tipopago == "1") {
                $tipopago = "C";
            } else {
                $tipopago = "T";
            }
        }
        $miObj = new RedsysAPI();
        $miObj->setParameter("DS_MERCHANT_AMOUNT", $cantidad);
        $miObj->setParameter("DS_MERCHANT_ORDER", strval($numpedido));
        $miObj->setParameter("DS_MERCHANT_MERCHANTCODE", $codigo);
        $miObj->setParameter("DS_MERCHANT_CURRENCY", $moneda);
        $miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $trans);
        $miObj->setParameter("DS_MERCHANT_TERMINAL", $terminal);
        $miObj->setParameter("DS_MERCHANT_MERCHANTURL", $urltienda);
        // INI MOD #7375
        $miObj->setParameter("DS_MERCHANT_URLOK", $urlok);
        $miObj->setParameter("DS_MERCHANT_URLKO", $urlko);
        // FIN MOD #7375
        $miObj->setParameter("Ds_Merchant_ConsumerLanguage", $idioma_tpv);
        $miObj->setParameter("Ds_Merchant_ProductDescription", $productos);
        $miObj->setParameter("Ds_Merchant_Titular", $nombre);
        $miObj->setParameter("Ds_Merchant_MerchantData", sha1($urltienda));
        $miObj->setParameter("Ds_Merchant_MerchantName", $nombre);
        $miObj->setParameter("Ds_Merchant_PayMethods", $tipopago);
        $miObj->setParameter("Ds_Merchant_Module", "magento_redsys_2.8.3");
        //Datos de configuración
        $version = getVersionClave();
        //Clave del comercio que se extrae de la configuración del comercio
        // Se generan los parámetros de la petición
        $request = "";
        $paramsBase64 = $miObj->createMerchantParameters();
        $signatureMac = $miObj->createMerchantSignature($clave256);
        $this->escribirLog('Redsys: Redirigiendo a TPV pedido: ' . strval($numpedido), $logActivo);
        // Obtenemos el valor de la consulta para saber el entorno del TPV.
        if ($entorno == "1") {
            echo '<form action="http://sis-d.redsys.es/sis/realizarPago/utf-8" method="post" id="redsys_form" name="redsys_form">';
        } else {
            if ($entorno == "2") {
                echo '<form action="https://sis-i.redsys.es:25443/sis/realizarPago/utf-8" method="post" id="redsys_form" name="redsys_form">';
            } else {
                if ($entorno == "3") {
                    echo '<form action="https://sis-t.redsys.es:25443/sis/realizarPago/utf-8" method="post" id="redsys_form" name="redsys_form">';
                } else {
                    echo '<form action="https://sis.redsys.es/sis/realizarPago/utf-8" method="post" id="redsys_form" name="redsys_form">';
                }
            }
        }
        // Establecemos el valor de los input
        echo '
				<input type="hidden" name="Ds_SignatureVersion" value="' . $version . '" />
				<input type="hidden" name="Ds_MerchantParameters" value="' . $paramsBase64 . '" />
				<input type="hidden" name="Ds_Signature" value="' . $signatureMac . '" />
				</form>
			
				<h3> Cargando el TPV... Espere por favor. </h3>		
                
				<script type="text/javascript">
					document.redsys_form.submit();
				</script>
                ';
    }
Example #2
0
            function generate_redsys_form($order_id)
            {
                // Version
                $merchantModule = 'woocommerce_redsys_2.8.4';
                //Recuperamos los datos de config.
                $nombre = $this->nombre;
                $codigo = $this->fuc;
                $terminal = $this->terminal;
                $trans = $this->trans;
                $moneda = $this->moneda;
                $clave256 = $this->clave256;
                $tipopago = $this->tipopago;
                $logActivo = $this->activar_log;
                $idioma = $this->idioma;
                $entorno = $this->entorno;
                //Esquema de logs de Redsys
                //$this->log->add( 'redsys', 'Acceso al formulario de pago con tarjeta de REDSYS ');
                $this->escribirLog($this->idLog . " -- " . "Acceso al formulario de pago con tarjeta de REDSYS", $logActivo);
                //Callback
                $urltienda = $this->notify_url;
                //Objeto tipo pedido
                $order = new WC_Order($order_id);
                //Calculo del precio total del pedido
                $transaction_amount = number_format((double) $order->get_total(), 2, '.', '');
                $transaction_amount = str_replace('.', '', $transaction_amount);
                $transaction_amount = floatval($transaction_amount);
                // Descripción de los productos
                $products = WC()->cart->cart_contents;
                foreach ($products as $product) {
                    $productos .= $product['quantity'] . 'x' . $product['data']->post->post_title . '/';
                }
                $numpedido = str_pad($order_id, 12, "0", STR_PAD_LEFT);
                // Obtenemos el valor de la config del idioma
                if ($idioma == "no") {
                    $idiomaFinal = "0";
                } else {
                    $idioma_web = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
                    switch ($idioma_web) {
                        case 'es':
                            $idiomaFinal = '001';
                            break;
                        case 'en':
                            $idiomaFinal = '002';
                            break;
                        case 'ca':
                            $idiomaFinal = '003';
                            break;
                        case 'fr':
                            $idiomaFinal = '004';
                            break;
                        case 'de':
                            $idiomaFinal = '005';
                            break;
                        case 'nl':
                            $idiomaFinal = '006';
                            break;
                        case 'it':
                            $idiomaFinal = '007';
                            break;
                        case 'sv':
                            $idiomaFinal = '008';
                            break;
                        case 'pt':
                            $idiomaFinal = '009';
                            break;
                        case 'pl':
                            $idiomaFinal = '011';
                            break;
                        case 'gl':
                            $idiomaFinal = '012';
                            break;
                        case 'eu':
                            $idiomaFinal = '013';
                            break;
                        default:
                            $idiomaFinal = '002';
                    }
                }
                // Generamos la firma
                $miObj = new RedsysAPI();
                $miObj->setParameter("DS_MERCHANT_AMOUNT", $transaction_amount);
                $miObj->setParameter("DS_MERCHANT_ORDER", $numpedido);
                $miObj->setParameter("DS_MERCHANT_MERCHANTCODE", $codigo);
                $miObj->setParameter("DS_MERCHANT_CURRENCY", $moneda);
                $miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $trans);
                $miObj->setParameter("DS_MERCHANT_TERMINAL", $terminal);
                $miObj->setParameter("DS_MERCHANT_MERCHANTURL", $urltienda);
                $miObj->setParameter("DS_MERCHANT_URLOK", $this->get_return_url($order));
                $miObj->setParameter("DS_MERCHANT_URLKO", $order->get_cancel_order_url());
                $miObj->setParameter("Ds_Merchant_ConsumerLanguage", $idiomaFinal);
                $miObj->setParameter("Ds_Merchant_ProductDescription", $productos);
                $miObj->setParameter("Ds_Merchant_Titular", $order->billing_first_name . $order->billing_last_name . $order->billing_address_1);
                $miObj->setParameter("Ds_Merchant_MerchantData", sha1($urltienda));
                $miObj->setParameter("Ds_Merchant_MerchantName", $nombre);
                $miObj->setParameter("Ds_Merchant_PayMethods", $tipopago);
                $miObj->setParameter("Ds_Merchant_Module", $merchantModule);
                //Datos de configuración
                $version = getVersionClave();
                //Clave del comercio que se extrae de la configuración del comercio
                // Se generan los parámetros de la petición
                $request = "";
                $paramsBase64 = $miObj->createMerchantParameters();
                $signatureMac = $miObj->createMerchantSignature($this->clave256);
                $resys_args = array('Ds_SignatureVersion' => $version, 'Ds_MerchantParameters' => $paramsBase64, 'Ds_Signature' => $signatureMac);
                //Se establecen los input del formulario con los datos del pedido y la redirección
                $resys_args_array = array();
                foreach ($resys_args as $key => $value) {
                    $resys_args_array[] = "<input type='hidden' name='{$key}' value='{$value}'/>";
                }
                //Se establece el entorno del SIS
                if ($entorno == "Sis-d") {
                    $action = "http://sis-d.redsys.es/sis/realizarPago/utf-8";
                } else {
                    if ($entorno == "Sis-i") {
                        $action = "https://sis-i.redsys.es:25443/sis/realizarPago/utf-8";
                    } else {
                        if ($entorno == "Sis-t") {
                            $action = "https://sis-t.redsys.es:25443/sis/realizarPago/utf-8";
                        } else {
                            $action = "https://sis.redsys.es/sis/realizarPago/utf-8";
                        }
                    }
                }
                //Formulario que envía los datos del pedido y la redirección al formulario de acceso al TPV
                return '<form action="' . $action . '" method="post" id="redsys_payment_form">
				' . implode('', $resys_args_array) . '
				<input type="submit" class="button-alt" id="submit_redsys_payment_form" value="' . __('Pagar con Tarjeta', 'redsys') . '" /> <a class="button cancel" href="' . $order->get_cancel_order_url() . '">' . __('Cancelar Pedido', 'redsys') . '</a>
				
				 </form>';
            }