<?php
class TPV_Redsys {
  function __construct() {
    require_once ('../HelloSoft/script/apiRedsys.php'); // Librería de Redsys
  }
  function Pagar($importe, $articulo, $descripcion, $cantidad, $cfg, $d_URL, $d_URL_OK, $d_URL_KO) {
    $wk_importe = number_format($importe,2);
    $wk_importe = str_replace('.', '', $wk_importe);
    
    $TPV = new RedsysAPI; 
    
    $TPV->setParameter("DS_MERCHANT_AMOUNT", $wk_importe);
    $TPV->setParameter("DS_MERCHANT_ORDER", strval($articulo));
    $TPV->setParameter("DS_MERCHANT_PRODUCTDESCRIPTION", $descripcion);
    $TPV->setParameter("DS_MERCHANT_MERCHANTCODE", $cfg['TPV_Comercio']);
    $TPV->setParameter("DS_MERCHANT_CURRENCY", $cfg['TPV_Moneda']);
    $TPV->setParameter("DS_MERCHANT_TERMINAL", $cfg['TPV_Terminal']);
    $TPV->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $cfg['TPV_Transaccion']);
    $TPV->setParameter("DS_MERCHANT_MERCHANTURL", $cfg['TPV_URL']."?".$d_URL);
    $TPV->setParameter("DS_MERCHANT_URLOK", $cfg['TPV_URLOK']."?".$d_URL_OK);
    $TPV->setParameter("DS_MERCHANT_URLKO", $cfg['TPV_URLKO']."?".$d_URL_KO);
    $w_params = $TPV->createMerchantParameters(); // Calcular el parámetro Ds_MerchantParameters
    $w_firma  = $TPV->createMerchantSignature($cfg['TPV_ClaveSHA256']); //Calcular el parámetro Ds_Signature

    // Formulario de envio
    $this->formulario = "<form action='".$cfg['TPV_ServerTPV']."' method='POST'>";
    $this->formulario .= "<input type='hidden' name='Ds_SignatureVersion' value='".$cfg['TPV_SHA256']."'>";
    $this->formulario .= "<input type='hidden' name='Ds_MerchantParameters' value='".$w_params."'>";
    $this->formulario .= "<input type='hidden' name='Ds_Signature' value='".$w_firma."'>";
    $this->formulario .= "<input type='submit' value='Pagar ahora'>";
    $this->formulario .= "</form>";
      
  }
  function Devolver($importe, $articulo, $descripcion, $cfg, $d_URL, $d_URL_OK, $d_URL_KO) {
    $wk_importe = number_format($importe,2);
    $wk_importe = str_replace('.', '', $wk_importe);
    
    $TPV = new RedsysAPI; 
    
    $TPV->setParameter("DS_MERCHANT_AMOUNT", $wk_importe);
    $TPV->setParameter("DS_MERCHANT_ORDER", strval($articulo));
    $TPV->setParameter("DS_MERCHANT_PRODUCTDESCRIPTION", $descripcion);
    $TPV->setParameter("DS_MERCHANT_MERCHANTCODE", $cfg['TPV_Comercio']);
    $TPV->setParameter("DS_MERCHANT_CURRENCY", $cfg['TPV_Moneda']);
    $TPV->setParameter("DS_MERCHANT_TERMINAL", $cfg['TPV_Terminal']);
    $TPV->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $cfg['TPV_Txdevolver']);
    $TPV->setParameter("DS_MERCHANT_MERCHANTURL", $cfg['TPV_URLdev']."?".$d_URL);
    $TPV->setParameter("DS_MERCHANT_URLOK", $cfg['TPV_URLOKdev']."?".$d_URL_OK);
    $TPV->setParameter("DS_MERCHANT_URLKO", $cfg['TPV_URLKOdev']."?".$d_URL_KO);
    $w_params = $TPV->createMerchantParameters(); // Calcular el parámetro Ds_MerchantParameters
    $w_firma  = $TPV->createMerchantSignature($cfg['TPV_ClaveSHA256']); //Calcular el parámetro Ds_Signature
    
    // Formulario de envio
    $this->formulario = "<form action='".$cfg['TPV_ServerTPV']."' method='POST'>";
    $this->formulario .= "<input type='hidden' name='Ds_SignatureVersion' value='".$cfg['TPV_SHA256']."'>";
    $this->formulario .= "<input type='hidden' name='Ds_MerchantParameters' value='".$w_params."'>";
    $this->formulario .= "<input type='hidden' name='Ds_Signature' value='".$w_firma."'>";
    $this->formulario .= "<input type='submit' value='Devolver ahora'>";
    $this->formulario .= "</form>";
  }  
  function Retorno($post, $get, $cfg, $grabar, $directorio) {

    $TPV = new RedsysAPI; 
    
    if (!empty($post)){ // Respuesta online previa
      $version           = $post['Ds_SignatureVersion'];
      $datos             = $post['Ds_MerchantParameters'];
      $signatureRecibida = $post['Ds_Signature'];
      $decodec           = $TPV->decodeMerchantParameters($datos);	
      $firma             = $TPV->createMerchantSignatureNotif($cfg['TPV_ClaveSHA256'], $datos);
      $sw                = "S";
      $sufijo            = "";
    }
    elseif (!empty($get)){  //URL DE RESP. ONLINE
      $version           = $get['Ds_SignatureVersion'];
      $datos             = $get['Ds_MerchantParameters'];
      $signatureRecibida = $get['Ds_Signature'];
      $decodec           = $TPV->decodeMerchantParameters($datos);
      $firma             = $TPV->createMerchantSignatureNotif($cfg['TPV_ClaveSHA256'], $datos);
      $sw                = "S";
      $sufijo            = "GET";
    }
    else {$sw = "N";}
    
    if ($sw == "S"){
      if ($firma === $signatureRecibida OR $sufijo == "GET"){
        if ($grabar == "SI"){ 
          $f_errores = fopen($directorio."/TPV".$sufijo."_OK_".date("Ymd_His").".txt", "w") or die("Problemas en la creacion");
          $w_graba = $decodec."\r\n";
          fputs($f_errores, $w_graba);
          fclose($f_errores);
        }
        // Valores devueltos
        $this->articulo   = $TPV->vars_pay['Ds_Order'];
        $this->txtid      = $TPV->vars_pay['Ds_AuthorisationCode'];
        $this->respuesta  = $TPV->vars_pay['Ds_Response'];
        $this->tipotx     = $TPV->vars_pay['Ds_TransactionType'];
      }
      else {
        if ($grabar == "SI"){ 
          $f_errores = fopen($directorio."/TPV".$sufijo."_NOOK_".date("Ymd_His").".txt", "w") or die("Problemas en la creacion");
          $w_graba = $decodec."\r\n";
          fputs($f_errores, $w_graba);
          fclose($f_errores);
        }
        $this->respuesta = "ERROR";        
      }
      
    }
    else {
      $this->respuesta = "ERROR";        
    }
  }
}
