HEX
Server: Apache
System: Linux server 5.4.0-56-generic #62-Ubuntu SMP Mon Nov 23 19:20:19 UTC 2020 x86_64
User: losadagest (10000)
PHP: 7.4.33
Disabled: opcache_get_status
Upload Files
File: /var/www/vhosts/aceitunaslosada.com/web/wp-content/plugins/redsysoficial/wc-redsys.php
<?php

/**
 * NOTA SOBRE LA LICENCIA DE USO DEL SOFTWARE
 *
 * El uso de este software está sujeto a las Condiciones de uso de software que
 * se incluyen en el paquete en el documento "Aviso Legal.pdf". También puede
 * obtener una copia en la siguiente url:
 * http://www.redsys.es/wps/portal/redsys/publica/areadeserviciosweb/descargaDeDocumentacionYEjecutables
 *
 * Redsys es titular de todos los derechos de propiedad intelectual e industrial
 * del software.
 *
 * Quedan expresamente prohibidas la reproducción, la distribución y la
 * comunicación pública, incluida su modalidad de puesta a disposición con fines
 * distintos a los descritos en las Condiciones de uso.
 *
 * Redsys se reserva la posibilidad de ejercer las acciones legales que le
 * correspondan para hacer valer sus derechos frente a cualquier infracción de
 * los derechos de propiedad intelectual y/o industrial.
 *
 * Redsys Servicios de Procesamiento, S.L., CIF B85955367
 */

if(!function_exists("escribirLog")) {
	require_once('apiRedsys/redsysLibrary.php');
}
if(!class_exists("RedsysAPI")) {
	require_once('apiRedsys/apiRedsysFinal.php');
}

class WC_Redsys extends WC_Payment_Gateway {

    public function __construct() {
        $this->id                 = 'redsys';
        //$this->icon               = home_url() . '/wp-content/plugins/redsys/pages/assets/images/Redsys.png';
        $this->method_title       = __( 'Pago con Tarjeta (REDSYS)', 'woocommerce' );
        $this->method_description = __( 'Esta es la opción de la pasarela de pago de Redsys.', 'woocommerce' );
        $this ->notify_url        = add_query_arg( 'wc-api', 'WC_redsys', home_url( '/' ) );
        $this->log                =  new WC_Logger();
        $this->idLog              = generateIdLog();

        $this->has_fields         = false;

        // Load the settings
        $this->init_settings();
        $this->init_form_fields();

        $this->title              = $this->get_option( 'title' );
        $this->description        = $this->get_option( 'description' );

        // Get settings
        $this->entorno            = $this->get_option( 'entorno' );
        $this->nombre             = $this->get_option( 'name' );
        $this->fuc                = $this->get_option( 'fuc' );
        $this->tipopago           = $this->get_option( 'tipopago' );
        $this->clave256           = $this->get_option( 'clave256' );
        $this->terminal           = $this->get_option( 'terminal' );
        $this->moneda             = $this->get_option( 'moneda' );
        $this->activar_log	  = $this->get_option( 'activar_log' );
        $this->idioma             = $this->get_option( 'idioma' );
        $this->estado             = $this->get_option( 'estado' );
        $this->activar_3ds        = $this->get_option( 'activar_3ds' );


        // Actions
        add_action( 'woocommerce_receipt_redsys', array( $this, 'receipt_page' ) );
        add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
        //Payment listener/API hook
        add_action( 'woocommerce_api_wc_redsys', array( $this, 'check_rds_response' ) );
    }

    function init_form_fields() {
        global $woocommerce;

        $this->form_fields = array(
                'enabled' => array(
                        'title'       => __( 'Activar Redsys:', 'woocommerce' ),
                        'label'       => __( 'Activar pago Redsys', 'woocommerce' ),
                        'type'        => 'checkbox',
                        'description' => '',
                        'default'     => 'yes'
                ),
                'title' => array(
                        'title'       => __( 'Título', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'Paymen method title that the customer will see on your website.', 'woocommerce' ),
                        'default'     => __( 'Pago con tarjeta', 'woocommerce' ),
                        'desc_tip'    => true,
                ),
                'description' => array(
                        'title'       => __( 'Descripción', 'woocommerce' ),
                        'type'        => 'textarea',
                        'description' => __( 'Payment method description that the customer will see on your website.', 'woocommerce' ),
                        'default'     => __( 'Esta es la opción de la pasarela de pago con tarjeta.', 'woocommerce' ),
                        'desc_tip'    => true,
                ),
                'entorno' => array(
                        'title'       => __( 'Entorno de Redsys', 'woocommerce' ),
                        'type'        => 'select',
                        'description' => __( 'Entorno del proceso de pago.', 'woocommerce' ),
                        'default'     => 'Sis-d',
                        'desc_tip'    => true,
                        'options'     => array(
                                'Sis-d' => __( 'Sis-d', 'woocommerce' ),
                                'Sis-i' => __( 'Sis-i', 'woocommerce' ),
                                'Sis-t' => __( 'Sis-t', 'woocommerce' ),
                                'Sis' 	=> __( 'Sis', 'woocommerce' )
                        )
                ),
                'name' => array(
                        'title'       => __( 'Nombre Comercio', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'Nombre Comercio.', 'woocommerce' ),
                        'default'     => __( 'Prueba', 'woocommerce' ),
                        'desc_tip'    => true,
                ),
                'fuc' => array(
                        'title'       => __( 'FUC Comercio', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'FUC del comercio.', 'woocommerce' ),
                        'default'     => __( '', 'woocommerce' ),
                        'desc_tip'    => true
                ),
                'tipopago' => array(
                        'title'       => __( 'Tipos de pago permitidos', 'woocommerce' ),
                        'type'        => 'select',
                        'description' => __( 'Tipos de pago permitidos.', 'woocommerce' ),
                        'default'     => ' ',
                        'desc_tip'    => true,
                        'options'     => array(
                                ' ' => __( 'Todos', 'woocommerce' ),
                                'C' => __( 'Solo tarjeta', 'woocommerce' ),
                                //'T' => __( 'Tarjeta y Iupay', 'woocommerce' )
                        )
                ),
                'clave256' => array(
                        'title'       => __( 'Clave secreta de encriptación (SHA-256)', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'Clave del comercio.', 'woocommerce' ),
                        'default'     => __( '', 'woocommerce' ),
                        'desc_tip'    => true,
                ),
                'terminal' => array(
                        'title'       => __( 'Terminal', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'Terminal del comercio.', 'woocommerce' ),
                        'default'     => __( '1', 'woocommerce' ),
                        'desc_tip'    => true,
                ),
                'moneda' => array(
                        'title'       => __( 'Tipo de Moneda', 'woocommerce' ),
                        'type'        => 'select',
                        'description' => __( 'Moneda del proceso de pago.', 'woocommerce' ),
                        'default'     => '978',
                        'desc_tip'    => true,
                        'options'     => array(
                                '978' => __( 'EURO', 'woocommerce' ),
                                '840' => __( 'DOLAR', 'woocommerce' ),
                                '826' => __( 'LIBRA', 'woocommerce' )
                        )
                ),
                'activar_log' => array(
                        'title'       => __( 'Activar Log', 'woocommerce' ),
                        'type'        => 'select',
                        'description' => __( 'Activar trazas de log.', 'woocommerce' ),
                        'default'     => 'no',
                        'desc_tip'    => true,
                        'options'     => array(
                                'no' => __( 'No', 'woocommerce' ),
                                'si' => __( 'Si', 'woocommerce' )
                        )
                ),
                'idioma' => array(
                        'title'       => __( 'Activar Idiomas', 'woocommerce' ),
                        'type'        => 'select',
                        'description' => __( 'Idioma del proceso de pago.', 'woocommerce' ),
                        'default'     => 'no',
                        'desc_tip'    => true,
                        'options'     => array(
                                'no' => __( 'No', 'woocommerce' ),
                                'si' => __( 'Si', 'woocommerce' )
                        )
                ),
                'estado' => array(
                    'title'       => __( 'Estado', 'redsys_wc' ),
                    'type'        => 'select',
                    'description' => __( 'Estado tras el pago.', 'redsys_wc' ),
                    'default'     => 'no',
                    'desc_tip'    => true,
                    'options'     => array()
            ),
                   'activar_3ds' => array(
                       'title'       => __( 'Activar el envío de datos adicionales para EMV 3DS', 'woocommerce'),
                    'type'        => 'select',
                    'description' => __( 'Activa el uso de EMV 3DS en el comercio.', 'woocommerce' ),
                    'default'     => 'no',
                    'desc_tip'    => true,
                    'options'     => array(
                            'no' => __( 'No', 'woocommerce' ),
                            'si' => __( 'Si', 'woocommerce' )
                    )
               ));
				
				$tmp_estados=wc_get_order_statuses();
				foreach($tmp_estados as $est_id=>$est_na){
					$this->form_fields['estado']['options'][substr($est_id,3)]=$est_na;
				}
    }

    function process_payment( $order_id ) {
        global $woocommerce;
        $order = new WC_Order($order_id);
        $logActivo=$this->activar_log;

        //Esquema de logs de Redsys
        //$this->log->add( 'redsys', 'Acceso a la opción de pago con tarjeta de REDSYS ');
        $this->escribirLog_wc($this->idLog." -- "."Acceso a la opción de pago con tarjeta de REDSYS",$logActivo);

        // Return receipt_page redirect
        return array(
            'result' 	=> 'success',
            'redirect'	=> $order->get_checkout_payment_url( true )
        );
    }

    function generate_redsys_form( $order_id ) {
            // Version
        $merchantModule = 'wo_redsys_3.3.0';


        //Recuperamos los datos de config.
        $logActivo=$this->get_option('activar_log');
        $nombre=$this->get_option('name');
        $codigo=$this->get_option('fuc');
        $terminal=$this->get_option('terminal');
        $moneda=$this->get_option('moneda');
        $clave256=$this->get_option('clave256');	
        $tipopago=$this->get_option('tipopago');
        $idioma=$this->get_option('idioma');
        $entorno=$this->get_option('entorno');

        //Esquema de logs de Redsys
        //$this->log->add( 'redsys', 'Acceso al formulario de pago con tarjeta de REDSYS ');
        $this->escribirLog_wc($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( (float) ($order->get_total()), 2, '.', '' );
        $transaction_amount = str_replace('.','',$transaction_amount);
        $transaction_amount = floatval($transaction_amount);

        // Descripción de los productos
        $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);
        $numpedido = str_pad($order_id . "z" . time()%1000, 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", 0); //TransactionType must be 0.
        $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);
        $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);

        ///// 3DSecure
		if ($this->activar_3ds == 'si')
			include 'redsys_3ds.php';
        
        //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
            //, 'this_path' => $this->_path
        );

          //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="https://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>';
    }

    function check_rds_response() {
        $this->idLog = generateIdLog();
        $logActivo=$this->activar_log;
		$estado=$this->estado;
				
        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($estado,__( 'Awaiting REDSYS payment', 'woocommerce' ));
                        //$this->log->add( 'redsys', 'Operación finalizada. PEDIDO ACEPTADO ');
                        $this->escribirLog_wc($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_wc($this->idLog." -- "."Operación finalizada. PEDIDO CANCELADO",$logActivo);
                        //wp_redirect(WC()->plugin_url()."/includes/gateways/redsys/pages/failure.php?pedido=".$pedido);
                    }
                }// if (firma_local=firma_remota)
                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_wc($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="'.home_url().'/wp-content/plugins/redsys/pages/assets/images/cross.png" alt="Desactivado" title="Desactivado" />
                Fallo en el proceso de pago.<br>Su pedido ha sido cancelado.' );
            }
        } 
        else{
            wp_die( '<img src="'.home_url().'/wp-content/plugins/redsys/pages/assets/images/cross.png" alt="Desactivado" title="Desactivado" />
            Fallo en el proceso de pago.<br>Su pedido ha sido cancelado.' );
        }

    }

    function receipt_page( $order ) {
        $logActivo=$this->activar_log;
        $this->escribirLog_wc($this->idLog." -- "."Acceso a la página de confirmación de la opción de pago con tarjeta de REDSYS",$logActivo);
        echo '<p>'.__('Gracias por su pedido, por favor pulsa el botón para pagar con Tarjeta.', 'redsys').'</p>';
        echo $this -> generate_redsys_form($order);
    }

    function escribirLog_wc($texto,$activo) {
        if($activo=="si"){
            // Log
            $this->log->add( 'redsys', $texto."\r\n");
        }
    }
}