public function callbackAction() { $this->helper = Mage::helper('devopensource_redsys'); $params = $this->getRequest()->getPost(); if (count($params) > 0) { $datos = $_POST["Ds_MerchantParameters"]; $signature_response = $_POST["Ds_Signature"]; $redsys = new RedsysAPI(); $redsys->decodeMerchantParameters($datos); $sha256key = Mage::getStoreConfig('payment/redsys/sha256key', Mage::app()->getStore()); $signature = $redsys->createMerchantSignatureNotif($sha256key, $datos); $amount = $redsys->getParameter('Ds_Amount'); $orderId = $redsys->getParameter('Ds_Order'); $merchantcode = $redsys->getParameter('Ds_MerchantCode'); $terminal = $redsys->getParameter('Ds_Terminal'); $responsecode = $redsys->getParameter('Ds_Response'); $transaction = $redsys->getParameter('Ds_TransactionType'); $merchantcodemagento = Mage::getStoreConfig('payment/redsys/merchantcode', Mage::app()->getStore()); $terminalmagento = Mage::getStoreConfig('payment/redsys/terminal', Mage::app()->getStore()); $transactionmagento = Mage::getStoreConfig('payment/redsys/transaction', Mage::app()->getStore()); if ($signature === $signature_response && isset($orderId) && $transaction == $transactionmagento && $merchantcode == $merchantcodemagento && intval(strval($terminalmagento)) == intval(strval($terminal))) { $responsecode = intval($responsecode); if ($responsecode <= 99) { $order = Mage::getModel('sales/order')->loadByIncrementId($orderId); $transaction_amount = number_format($order->getBaseGrandTotal(), 2, '', ''); $amountOrder = (double) $transaction_amount; if ($amountOrder != $amount) { $order->addStatusHistoryComment($this->__("Error: Amount is diferent"), false); $this->helper->stateErrorTpv($order); $this->helper->restoreStock($order); } try { $this->helper->createInvoice($order); $this->helper->stateConfirmTpv($order); $order->sendNewOrderEmail(); } catch (Exception $e) { $order->addStatusHistoryComment($this->__("TPV Error: %s", $e->getMessage()), false); $order->save(); } } else { $errorMessage = $this->helper->comentarioReponse($responsecode); $order = Mage::getModel('sales/order')->loadByIncrementId($orderId); $this->helper->stateErrorTpv($order, $errorMessage); $this->helper->restoreStock($order); } } else { $order = Mage::getModel('sales/order')->loadByIncrementId($orderId); $order->addStatusHistoryComment($this->__("Error: Signature is wrong"), false); $this->helper->stateErrorTpv($order); $this->helper->restoreStock($order); } } else { $this->_redirect(''); } }
/** * @throws CakeException */ public function getNotificationData($data) { $version = $data["Ds_SignatureVersion"]; if ($version !== $this->_hash_version) { throw new CakeException("Invalid signature version ({$version}) received from Sermepa."); } $api = new RedsysAPI(); $parameters = $data["Ds_MerchantParameters"]; $signature = $api->createMerchantSignatureNotif($this->_settings->secretKey, $parameters); if ($data["Ds_Signature"] !== $signature) { throw new CakeException("Invalid signature in Sermepa notification."); } $parameters = $api->decodeMerchantParameters($parameters); $this->_notification = json_decode($parameters); return $this->_notification; }
/** * Check Notification * * @param object $config * @return array */ public function checkNotification($config) { // check data received from vendor if (!CHLibInputPost::string('Ds_MerchantParameters')) { return false; } // load redsys api object $redsys_api_object = new RedsysAPI(); // load data info api object $decoded_data = $redsys_api_object->decodeMerchantParameters(CHLibInputPost::string('Ds_MerchantParameters')); // signature check if (CHLibInputPost::string('Ds_Signature') == $redsys_api_object->createMerchantSignatureNotif($this->params->get('Signature'), $data)) { // check payment status if (!(int) $redsys_api_object->getParameter('Ds_Response')) { $booking_id = $redsys_api_object->getParameter('Ds_MerchantData'); $confirmation_object = (object) ['Ds_Response' => $redsys_api_object->getParameter('Ds_Response'), 'Ds_AuthorisationCode' => $redsys_api_object->getParameter('Ds_AuthorisationCode'), 'Ds_Order' => $redsys_api_object->getParameter('Ds_Order')]; return [$booking_id, $confirmation_object]; } } return [0, false]; }
public function checkResponse($postData = '') { $api = new RedsysAPI(); if ($this->_clave === null) { return false; } if (isset($postData)) { $version = $postData["Ds_SignatureVersion"]; $datos = $postData["Ds_MerchantParameters"]; $firmaBanco = $postData["Ds_Signature"]; if (isset($postData['Ds_Response'])) { $Ds_Response = $postData['Ds_Response']; $Ds_Response = (int) $Ds_Response; } $decodec = $api->decodeMerchantParameters($datos); $firma = $api->createMerchantSignatureNotif($this->_clave, $datos); if ($firma == $firmaBanco) { if (isset($Ds_Response)) { if ($Ds_Response < 100) { return true; } else { throw new Exception("Error en la transacción, código " . $Ds_Response); echo "Error en la transacción, código " . $Ds_Response; return false; } } else { return true; } } else { throw new Exception("Las firmas no coinciden"); echo "Las firmas no coinciden"; return false; } } else { throw new Exception("Debes pasar la variable POST devuelta por el banco"); echo "Debes pasar la variable POST devuelta por el banco"; return false; } }
require_once "../../../funciones.php"; require_once '../../../backoffice/PHPMailer-master/class.phpmailer.php'; require_once '../../../backoffice/PHPMailer-master/PHPMailerAutoload.php'; require_once "../../../html2pdf/vendor/autoload.php"; include 'apiRedsys.php'; // Se crea Objeto $miObj = new RedsysAPI(); if (!empty($_POST)) { //URL DE RESP. ONLINE $version = $_POST["Ds_SignatureVersion"]; $datos = $_POST["Ds_MerchantParameters"]; $signatureRecibida = $_POST["Ds_Signature"]; $decodec = $miObj->decodeMerchantParameters($datos); $kc = 'Mk9m98IfEblmPfrpsawt7BmxObt98Jev'; //Clave recuperada de CANALES $firma = $miObj->createMerchantSignatureNotif($kc, $datos); if ($firma === $signatureRecibida) { echo "FIRMA OK"; if (!empty($_SESSION['usuariofront']) || !empty($_SESSION['usuario'])) { $db = conectarBD(); if ($db->connect_errno > 0) { die('Imposible conectar [' . $db->connect_error . ']'); } $metodop = "ingreso banco"; $estado = "pedido"; if (isset($_SESSION['usuario'])) { // Usuario al que se le enviará el MAIL $user = $_SESSION['usuario']; } elseif (isset($_SESSION['usuariofront'])) { $user = $_SESSION['usuariofront']; }
public function cancelAction() { if (!empty($_GET) && Mage::getStoreConfig('payment/redsys/display_error_clients', Mage::app()->getStore())) { $this->helper = Mage::helper('devopensource_redsys'); $data = $_GET["Ds_MerchantParameters"]; $signature_response = $_GET["Ds_Signature"]; $redsys = new RedsysAPI(); $redsys->decodeMerchantParameters($data); $sha256key = Mage::getStoreConfig('payment/redsys/sha256key', Mage::app()->getStore()); $signature = $redsys->createMerchantSignatureNotif($sha256key, $data); $response = $redsys->getParameter('Ds_Response'); if ($signature === $signature_response) { $responsecode = intval($response); $error = $this->helper->comentarioReponse($responsecode); } } if (!isset($error)) { $error = $this->__('Denied transaction from Redsys.'); } $this->helper = Mage::helper('devopensource_redsys'); $session = Mage::getSingleton('checkout/session'); $this->helper->recoveryCart(); $session->addError($error); $this->_redirect('checkout/cart'); }
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!'; } } }
function build_direct_pay_page_ok() { /* BEGIN shortcode direct_pay_page_ko */ ob_start(); $options = get_option('direct_pay_settings'); require_once 'apiRedsys.php'; $miObj = new RedsysAPI(); $kc = $options['direct_pay_text_key_sha_256c']; $params = $_GET['Ds_MerchantParameters']; $new_signature = $miObj->createMerchantSignatureNotif($kc, $params); $signature = $_GET['Ds_Signature']; $test_signature = 0; if ($new_signature == $signature) { $test_signature = 1; } $myOrder = $miObj->getParameter('Ds_Order'); $myOrder = $myOrder - 1000; $post_pendiente = array('ID' => $myOrder, 'post_type' => 'payment', 'post_status' => 'Publish'); $post_id = wp_update_post($post_pendiente); ?> <?php if ($test_signature == 0) { ?> <p>¡Fallo en la firma!</p> <?php } ?> <p>El Pago con número <?php echo $myOrder; ?> ha sido realizado correctamente</p> <?php $out = ob_get_clean(); return $out; }
public function handlePaymentNotification() { $errors = array("101" => "Tarjeta caducada", "102" => "Tarjeta en excepción transitoria o bajo sospecha de fraude", "106" => "Intentos de PIN excedidos", "125" => "Tarjeta no efectiva", "129" => "Código de seguridad (CVV2/CVC2) incorrecto", "180" => "Tarjeta ajena al servicio", "184" => "Error en la autenticación del titular", "190" => "Denegación del emisor sin especificar motivo", "191" => "Fecha de caducidad errónea", "202" => "Tarjeta en excepción transitoria o bajo sospecha de fraude con retirada de tarjeta", "904" => "Comercio no registrado en FUC", "909" => "Error de sistema", "913" => "Pedido repetido", "944" => "Sesión Incorrecta", "950" => "Operación de devolución no permitida", "912" => "Emisor no disponible", "9912" => "Emisor no disponible", "9064" => "Número de posiciones de la tarjeta incorrecto", "9078" => "Tipo de operación no permitida para esa tarjeta", "9093" => "Tarjeta no existente", "9094" => "Rechazo servidores internacionales", "9104" => "Comercio con “titular seguro” y titular sin clave de compra segura", "9218" => "El comercio no permite op. seguras por entrada /operaciones", "9253" => "Tarjeta no cumple el check-digit", "9256" => "El comercio no puede realizar preautorizaciones", "9257" => "Esta tarjeta no permite operativa de preautorizaciones", "9261" => "Operación detenida por superar el control de restricciones en la entrada al SIS", "9915" => "A petición del usuario se ha cancelado el pago", "9929" => "Anulación de autorización en diferido realizada por el comercio", "9997" => "Se está procesando otra transacción en SIS con la misma tarjeta", "9998" => "Operación en proceso de solicitud de datos de tarjeta", "9999" => "Operación que ha sido redirigida al emisor a autenticar"); $module = self::retrieve('md', 'String', 'GET', false); $qfKey = self::retrieve('qfKey', 'String', 'GET', false); $miObj = new RedsysAPI(); $response = array(); $response["version"] = $_POST["Ds_SignatureVersion"]; $response["parameters"] = $_POST["Ds_MerchantParameters"]; $response["signature"] = $_POST["Ds_Signature"]; $decodecResponseJson = $miObj->decodeMerchantParameters($response["parameters"]); $decodecResponse = json_decode($decodecResponseJson); $firma = $miObj->createMerchantSignatureNotif($this->_paymentProcessor["password"], $response["parameters"]); // Validations if ($decodecResponse->Ds_MerchantCode != $this->_paymentProcessor["user_name"]) { CRM_Core_Error::debug_log_message("Redsys Response param Ds_MerchantCode incorrect"); return false; } // Contribution exists and is valid $contribution = new CRM_Contribute_BAO_Contribution(); $contribution->id = self::trimAmount($decodecResponse->Ds_Order); if (!$contribution->find(TRUE)) { CRM_Core_Error::debug_log_message("Could not find contribution record: {$contribution->id} in IPN request: " . print_r($params, TRUE)); echo "Failure: Could not find contribution record for {$contribution->id}<p>"; return FALSE; } if ($firma === $response["signature"]) { switch ($module) { case 'contribute': if ($decodecResponse->Ds_Response == self::REDSYS_RESPONSE_CODE_ACCEPTED) { $query = "UPDATE civicrm_contribution SET trxn_id='" . $decodecResponse->Ds_AuthorisationCode . "', contribution_status_id=1 where id='" . self::trimAmount($decodecResponse->Ds_Order) . "'"; CRM_Core_DAO::executeQuery($query); } else { $error = self::trimAmount($decodecResponse->Ds_Response); if (array_key_exists($error, $errors)) { $error = $errors[$error]; } $cancel_date = CRM_Utils_Date::currentDBDate(); $query = "UPDATE civicrm_contribution SET contribution_status_id=3, cancel_reason = '" . $error . "' , cancel_date = '" . $cancel_date . "' where id='" . self::trimAmount($decodecResponse->Ds_Order) . "'"; CRM_Core_DAO::executeQuery($query); } break; case 'event': if ($decodecResponse->Ds_Response == self::REDSYS_RESPONSE_CODE_ACCEPTED) { $query = "UPDATE civicrm_contribution SET trxn_id='" . $decodecResponse->Ds_AuthorisationCode . "', contribution_status_id=1 where id='" . self::trimAmount($decodecResponse->Ds_Order) . "'"; CRM_Core_DAO::executeQuery($query); } else { $error = self::trimAmount($decodecResponse->Ds_Response); if (array_key_exists($error, $errors)) { $error = $errors[$error]; } $cancel_date = CRM_Utils_Date::currentDBDate(); $query = "UPDATE civicrm_contribution SET contribution_status_id=3, cancel_reason = '" . $error . "' , cancel_date = '" . $cancel_date . "' where id='" . self::trimAmount($decodecResponse->Ds_Order) . "'"; CRM_Core_DAO::executeQuery($query); } break; default: require_once 'CRM/Core/Error.php'; CRM_Core_Error::debug_log_message("Could not get module name from request url"); } } }
public function okAction() { // PRODUCTION // print_r($_POST); // exit; if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == "http://jguasch.esy.es/redsys/lacaixaOK.php") { if (!empty($_POST)) { //URL DE RESP. ONLINE $miObj = new RedsysAPI(); $version = $_POST["Ds_SignatureVersion"]; $datos = $_POST["Ds_MerchantParameters"]; $signatureRecibida = $_POST["Ds_Signature"]; $decodec = $miObj->decodeMerchantParameters($datos); $kc = 'Mk9m98IfEblmPfrpsawt7BmxObt98Jev'; //Clave recuperada de CANALES $firma = $miObj->createMerchantSignatureNotif($kc, $datos); if ($firma != $signatureRecibida) { flash('msg', 'El servidor no responde correctamente', 'Error', 'error'); header('location: /'); return; } } try { $hash_compra = md5(uniqid(time())); $id_compra = $this->client->save(array("hash_compra" => $hash_compra, "estado" => "pagado", "username" => self::getSession("username")), "compras"); $productos = $this->_generate_products(); // Guardar compras por productos foreach ($productos as $id => $pro) { $this->client->save(array("idcompra" => $id_compra, "idproducto" => $pro['idproducto'], "cantidad" => $pro['q'], "idtalla" => $pro['size'], "idcolor" => $pro['color'], "username" => self::getSession("username")), "compras_productos_tallas_colores"); } $client = $this->client->toArray(self::getSession('username')); if (!empty($productos) && !empty($client)) { generate_facture($productos, $client); } return header('location: /'); } catch (Exception $e) { $error = $e->getMessage(); echo $error; exit; // return require VIEWS. 'error/500.php'; } return; } $error = "El host de peticion debe ser -> http://jguasch.esy.es/redsys/lacaixaOK.php"; require VIEWS . 'error/401.php'; return; }
$payment_id = db_get_field("SELECT payment_id FROM ?:orders WHERE order_id = ?i", $order_id); $processor_data = fn_get_payment_method_data($payment_id); $order_info = fn_get_order_info($order_id); $currency = $processor_data['processor_params']['currency']; $merchant = $processor_data['processor_params']['merchant_id']; $terminal = $processor_data['processor_params']['terminal']; $clave = $processor_data['processor_params']['clave']; if (strlen($order_id) > 6) { $order_n = $_REQUEST['order_id'] . ($order_info['repaid'] ? 'x' . $order_info['repaid'] : ''); } else { $order_n = str_repeat('0', 6 - strlen($order_id)) . $_REQUEST['order_id'] . ($order_info['repaid'] ? 'x' . $order_info['repaid'] : ''); } $merchant_parameters_encoded = $_REQUEST['Ds_MerchantParameters']; $signature_received = $_REQUEST['Ds_Signature']; $merchant_parameters = $redsys_api->decodeMerchantParameters($merchant_parameters_encoded); $signature_calculated = $redsys_api->createMerchantSignatureNotif($clave, $merchant_parameters_encoded); $amount = $currency == '978' ? $order_info['total'] * 100 : $order_info['total']; $pp_response = array(); $pp_response['order_status'] = ($redsys_api->getParameter('Ds_Response') == '0000' || $redsys_api->getParameter('Ds_Response') == '0099') && $signature_received === $signature_calculated ? 'P' : 'F'; $pp_response['reason_text'] = $response_mess[$redsys_api->getParameter('Ds_Response')]; if ($pp_response['order_status'] == 'P') { $pp_response['transaction_id'] = $redsys_api->getParameter('Ds_AuthorisationCode'); } fn_finish_payment($order_id, $pp_response); exit; } elseif ($mode == 'failed') { if (!empty($order_id) && fn_check_payment_script('servired.php', $order_id)) { $pp_response = array('order_status' => 'F', 'reason_text' => __('text_transaction_declined')); fn_finish_payment($order_id, $pp_response); fn_order_placement_routines('route', $order_id); }
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.'); } }
/** * Comprueba que la notificación de pago recibida es correcta y auténtica * * @param array $post_data Datos POST incluidos con la notificación * * @throws Payment_Exception * @return bool */ public function validate_notification($post_data = null, &$fee = 0) { if (!isset($post_data)) { $post_data = $_POST; } $redsys = new RedsysAPI(); $parameters = $post_data['Ds_MerchantParameters']; $redsys->decodeMerchantParameters($parameters); //Comprobar firma $received_signature = $post_data['Ds_Signature']; $signature = $redsys->createMerchantSignatureNotif($this->secret_key, $parameters); if ($signature !== $received_signature) { throw new Payment_Exception("Invalid signature, received '{$received_signature}', expected '{$signature}'"); } //Comprobar respuesta /* * 0000 a 0099 Transacción autorizada para pagos y preautorizaciones * 0900 Transacción autorizada para devoluciones y confirmaciones * */ $response = $redsys->getParameter('Ds_Response'); if ($response >= 101 && $response != 900) { $error_codes = self::error_codes(); $description = isset($error_codes[$response]) ? $error_codes[$response] : 'Unknown response code'; throw new Payment_Exception("Invalid Ds_Response '{$response}' ({$description})"); } //Calcular comisión if (is_numeric($this->fee)) { $fee = $this->amount * $this->fee; } else { call_user_func($this->fee, $response); } return true; }