/**
  * Check for PayTpv IPN Response
  * */
 function check_paytpv_resquest()
 {
     if (!isset($_REQUEST['tpvLstr'])) {
         return;
     }
     if (isset($_REQUEST['Order'])) {
         $datos_order = explode("_", $_REQUEST['Order']);
         // En los pagos de suscripcion viene {id_order}_{numpago}
         $ref = $datos_order[0];
         $order = new WC_Order((int) substr($ref, 0, 8));
     }
     if ($_REQUEST['tpvLstr'] == 'pay' && $order->status != 'completed') {
         //PAGO CON TARJETA GUARDADA
         $card = $_POST['card'];
         $saved_card = PayTPV::savedCard($order->user_id, $card);
         // Verificar contraseña usuario.
         if ($this->commerce_password && !$this->validPassword($order->user_id, $_POST['commerce_password'])) {
             if (!$this->validPassword($order->user_id, $_POST['commerce_password'])) {
                 $url = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(woocommerce_get_page_id('pay'))));
                 if (function_exists('wc_add_notice')) {
                     wc_add_notice(__('Invalid commerce password', 'wc_paytpv'), 'error');
                 } else {
                     // WC < 2.1
                     $woocommerce->add_error(__('Invalid commerce password', 'wc_paytpv'));
                     $woocommerce->set_messages();
                 }
                 wp_redirect($url, 303);
                 exit;
             }
         }
         // Obtenemos el terminal para el pedido
         $arrTerminalData = $this->TerminalCurrency($order);
         $importe = $arrTerminalData["importe"];
         $currency_iso_code = $arrTerminalData["currency_iso_code"];
         $term = $arrTerminalData["term"];
         $pass = $arrTerminalData["pass"];
         $paytpv_order_ref = $order->id;
         $secure_pay = $this->isSecureTransaction($order, $arrTerminalData, $card, $saved_card["paytpv_iduser"]) ? 1 : 0;
         // PAGO SEGURO redireccionamos
         if ($secure_pay) {
             $URLOK = $this->get_return_url($order);
             $URLKO = $order->get_cancel_order_url();
             $OPERATION = "109";
             //exec_purchase_token
             $signature = md5($this->clientcode . $saved_card["paytpv_iduser"] . $saved_card["paytpv_tokenuser"] . $term . $OPERATION . $paytpv_order_ref . $importe . $currency_iso_code . md5($pass));
             $fields = array('MERCHANT_MERCHANTCODE' => $this->clientcode, 'MERCHANT_TERMINAL' => $term, 'OPERATION' => $OPERATION, 'LANGUAGE' => $this->_getLanguange(), 'MERCHANT_MERCHANTSIGNATURE' => $signature, 'MERCHANT_ORDER' => $paytpv_order_ref, 'MERCHANT_AMOUNT' => $importe, 'MERCHANT_CURRENCY' => $currency_iso_code, 'IDUSER' => $saved_card["paytpv_iduser"], 'TOKEN_USER' => $saved_card["paytpv_tokenuser"], '3DSECURE' => $secure_pay, 'URLOK' => $URLOK, 'URLKO' => $URLKO);
             $query = http_build_query($fields);
             $salida = $this->getIframeUrl($secure_pay) . $query;
             header('Location: ' . $salida);
             exit;
         }
         // PAGO NO SEGURO --------------------------------------------------------------------------
         // Test Mode
         if ($this->environment == 1) {
             $charge['DS_RESPONSE'] = 1;
             $order->add_order_note(__('PayTpv payment completed', 'woocommerce'));
             $_REQUEST['AuthCode'] = 'Test_mode';
             $order->payment_complete($_REQUEST['AuthCode']);
             update_post_meta((int) $order->id, 'PayTPV_Referencia', __('Test Mode. Not Real Payment', 'wc_paytpv'));
         } else {
             $client = $this->get_client();
             $charge = $client->execute_purchase($order, $saved_card["paytpv_iduser"], $saved_card["paytpv_tokenuser"], $term, $pass, $currency_iso_code, $importe, $paytpv_order_ref);
         }
         if ((int) $charge['DS_RESPONSE'] == 1) {
             // Se procesa en la notificacion
             /*
             $order->add_order_note( __( 'PayTpv payment completed', 'woocommerce' ) );
             $order->payment_complete($charge[ 'DS_MERCHANT_AUTHCODE' ]);
             update_post_meta( ( int ) $order->id, 'PayTPV_Referencia', $charge[ 'DS_MERCHANT_ORDER' ]);
             */
             update_post_meta((int) $order->id, 'PayTPV_IdUser', $saved_card["paytpv_iduser"]);
             update_post_meta((int) $order->id, 'PayTPV_TokenUser', $saved_card["paytpv_tokenuser"]);
             $url = $this->get_return_url($order);
         } else {
             $url = $order->get_cancel_order_url();
         }
         wp_redirect($url, 303);
     }
     if ($_REQUEST['tpvLstr'] == 'notify' && isset($_POST["TransactionType"])) {
         //NOTIFICACIÓN
         switch ($_POST["TransactionType"]) {
             // add_User
             case 107:
                 $terminal = $this->paytpv_terminals[0];
                 $term = $terminal["term"];
                 $pass = $terminal["pass"];
                 $user_id = $_POST["Order"];
                 $DateTime = isset($_POST['DateTime']) ? $_POST['DateTime'] : "";
                 $Signature = isset($_POST['Signature']) ? $_POST['Signature'] : "";
                 $SIGNATURE = md5($this->clientcode . $term . $_POST["TransactionType"] . $_POST['Order'] . $DateTime . md5($pass));
                 if ($_REQUEST['TransactionType'] == '107' && $_REQUEST['Response'] == 'OK' && ($Signature == $SIGNATURE || $this->environment == 1)) {
                     if (isset($_REQUEST['IdUser'])) {
                         // Save User Card
                         $result = $this->saveCard(null, $user_id, $_REQUEST['IdUser'], $_REQUEST['TokenUser'], $_POST["TransactionType"]);
                     }
                 }
                 // Modo Test
                 if ($this->environment == 1) {
                     $res["urlok"] = wc_get_page_permalink('myaccount');
                     print json_encode($res);
                     exit;
                 }
                 print "Notificacion Procesada";
                 exit;
                 break;
                 // execute_purchase
             // execute_purchase
             case 1:
             case 109:
                 $arrTerminalData = $this->TerminalCurrency($order);
                 $currency_iso_code = $arrTerminalData["currency_iso_code"];
                 $term = $arrTerminalData["term"];
                 $pass = $arrTerminalData["pass"];
                 $AMOUNT = round($order->get_total() * 100);
                 $mensaje = $this->clientcode . $term . $_REQUEST['TransactionType'] . $_REQUEST['Order'] . $_REQUEST['Amount'] . $currency_iso_code;
                 $SIGNATURE = md5($mensaje . md5($pass) . $_REQUEST['BankDateTime'] . $_REQUEST['Response']);
                 if (($_REQUEST['TransactionType'] == '1' || $_REQUEST['TransactionType'] == '109') && $_REQUEST['Response'] == 'OK' && ($_REQUEST['ExtendedSignature'] == $SIGNATURE || $this->environment == 1)) {
                     if (isset($_REQUEST['IdUser'])) {
                         $save_card = get_post_meta((int) $order->id, 'paytpv_savecard', true);
                         if ($save_card !== "0") {
                             // Save User Card
                             $result = $this->saveCard($order, $order->user_id, $_REQUEST['IdUser'], $_REQUEST['TokenUser'], $_POST["TransactionType"]);
                             $paytpv_iduser = $result["paytpv_iduser"];
                             $paytpv_tokenuser = $result["paytpv_tokenuser"];
                         } else {
                             $paytpv_iduser = $_REQUEST['IdUser'];
                             $paytpv_tokenuser = $_REQUEST['TokenUser'];
                         }
                         update_post_meta((int) $order->id, 'PayTPV_IdUser', $paytpv_iduser);
                         update_post_meta((int) $order->id, 'PayTPV_TokenUser', $paytpv_tokenuser);
                     }
                     $order->add_order_note(__('PayTpv payment completed', 'woocommerce'));
                     $order->payment_complete($_REQUEST['AuthCode']);
                     update_post_meta((int) $order->id, 'PayTPV_Referencia', $_REQUEST['Order']);
                     // Modo Test
                     if ($this->environment == 1) {
                         $url = $this->get_return_url($order);
                         $res["urlok"] = $url;
                         print json_encode($res);
                         exit;
                     }
                     print "Notificacion Procesada";
                 } else {
                     print "Notificacion NO Procesada";
                 }
                 break;
         }
         print "Error";
         exit;
     }
     // Save Card in execute_purchase
     if ($_REQUEST['tpvLstr'] == 'savecard') {
         //NOTIFICACIÓN
         update_post_meta((int) $order->id, 'paytpv_savecard', $_POST["paytpv_agree"]);
         exit;
     }
     // Save Card Description
     if ($_REQUEST['tpvLstr'] == 'saveDesc') {
         //NOTIFICACIÓN
         $card_desc = $_POST["card_desc"];
         $id_card = $_GET["id"];
         $saved_cards = Paytpv::saveCardDesc($id_card, $card_desc);
         $res["resp"] = 0;
         print json_encode($res);
         exit;
     }
     // Remove User Card
     if ($_REQUEST['tpvLstr'] == 'removeCard') {
         //NOTIFICACIÓN
         $id_card = $_GET["id"];
         $saved_cards = Paytpv::removeCard($id_card);
         $res["resp"] = 0;
         print json_encode($res);
         exit;
     }
     // Load Test Mode iframe Payment
     if ($_REQUEST['tpvLstr'] == 'testmode') {
         //NOTIFICACIÓN
         $dsecure = isset($_REQUEST["dsecure"]) ? $_REQUEST["dsecure"] : "";
         if ($dsecure == 1) {
             print wc_get_template('payment_3ds_test.php', array(), '', PAYTPV_PLUGIN_DIR . 'template/');
         } else {
             print wc_get_template('payment_test_mode.php', array(), '', PAYTPV_PLUGIN_DIR . 'template/');
         }
         exit;
     }
     // Check Test Mode Card
     if ($_REQUEST['tpvLstr'] == 'checkcard') {
         //NOTIFICACIÓN
         // add_user
         if ($_POST['TransactionType'] == 107) {
             $secure_pay = 0;
         } else {
             // Obtenemos el terminal para el pedido
             $arrTerminalData = $this->TerminalCurrency($order);
             $secure_pay = $this->isSecureTransaction($order, $arrTerminalData, 0, 0) ? 1 : 0;
         }
         $res["dsecure"] = $secure_pay;
         if ($secure_pay == 1) {
             sleep(2);
         }
         // Test Mode
         $res["checked"] = 0;
         $arrTestCard = array(5325298401138208, 5540568785541245, 5407696658785988);
         $mm = 5;
         $yy = 20;
         $merchan_cvc2 = 123;
         if (in_array($_POST["merchan_pan"], $arrTestCard) && $_POST["mm"] == $mm && $_POST["yy"] == $yy && $_POST["merchan_cvc2"] == $merchan_cvc2) {
             $res["checked"] = 1;
         }
         print json_encode($res);
         exit;
     }
     print "Error Notificacion";
     exit;
 }