Git Product home page Git Product logo

sermepa's Introduction

Redsys

Latest Version on Packagist Software License Total Downloads Run Tests


Visual Studio Code This project is friendly supported by Visual Studio Code!


Historia

Esta clase nace porque no encontraba una clase de pasarela de pagos (TPV) que se pueda integrar directamente en una web. Existen muchas pero para varios CMS y no me servían, solo quería montar algo fácil que pueda usar. Los ejemplos que vienen en la documentación oficial eran muy simples así que decidi realizar esta clase y ahora lo comparto con todos.

Válido para Sermepa y Redsys.

Introducción

La clase sermepa actualmente Redsys sirve para generar el formulario que se comunicará con la pasarela de pagos que usan muchos bancos, como Santander, Sabadell, Lacaixa, etc.

Es una versión que irá creciendo y actualizándose poco a poco y mejorándolo. Si lo usas en algún proyecto y te ayudo en algo no dudes en decírmelo

Requerimientos mínimos

PHP 5 >= 5.3.0, PHP 7.1, 8.0

Créditos

Clase creada por Eduardo Diaz, Madrid 2012 Twitter: @eduardo_dx

Actualización

  • Agregado namespace.
  • Se actualiza para trabajar con sha256, que ha sido un requisito del banco.
  • Se cambian todos los nombres de la clases a ingles.
  • Se crean nuevos métodos.
  • Para facilitar la integración usamos funciones ya creadas.
  • Rest.

Instalación

Si usas composer tienes 2 opciones

1.- Por línea de comandos

composer require sermepa/sermepa

2.- Creas o agregas a tu archivo composer.json la siguiente dependencia:

{
   "require": {
      "sermepa/sermepa": "^1.3.2"
   }
}

Luego ejecutas:

composer update

Si en caso contrario no usas composer, bastará con clonar el repositorio

git clone https://github.com/ssheduardo/sermepa.git

¿Cómo usar la clase?

Ejemplo:

//Si usas composer
//include_once('vendor/autoload.php');

//Si clonaste la clase
//include_once('sermepa/src/Sermepa/Tpv/Tpv.php');

try{
    //Key de ejemplo
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $redsys = new Sermepa\Tpv\Tpv();
    $redsys->setAmount(rand(10,600));
    $redsys->setOrder(time());
    $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
    $redsys->setCurrency('978');
    $redsys->setTransactiontype('0');
    $redsys->setTerminal('1');
    $redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
    $redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
    $redsys->setUrlOk('http://localhost/ok.php'); //Url OK
    $redsys->setUrlKo('http://localhost/ko.php'); //Url KO
    $redsys->setVersion('HMAC_SHA256_V1');
    $redsys->setTradeName('Tienda S.L');
    $redsys->setTitular('Pedro Risco');
    $redsys->setProductDescription('Compras varias');
    $redsys->setEnvironment('test'); //Entorno test

    $signature = $redsys->generateMerchantSignature($key);
    $redsys->setMerchantSignature($signature);

    $form = $redsys->createForm();
} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}
echo $form;

Con esto generamos el form para la comunicación con la pasarela de pagos.

Nota

Con la integración del pago con referencia, ahora el importe puede ser 0. Según la documentación, si se quiere generar dicho identificador, se puede pasar el importe a 0 para obtener dicho valor, si en caso contrario no se utiliza el pago con referencia y se pasa el importe en 0, el banco nos mostrará un error.

Enviar datos de la tarjeta

Si queremos enviar los datos de la tarjeta para que no nos lo solicite la pasarela de pagos, podemos hacerlo de la siguiente forma.

try{
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $redsys = new Sermepa\Tpv\Tpv();
    $redsys->setAmount(rand(10,600));
    $redsys->setOrder(time());
    $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
    $redsys->setCurrency('978');
    $redsys->setTransactiontype('0');
    $redsys->setTerminal('1');
    $redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
    $redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
    $redsys->setUrlOk('http://localhost/ok.php'); //Url OK
    $redsys->setUrlKo('http://localhost/ko.php'); //Url KO
    $redsys->setVersion('HMAC_SHA256_V1');
    $redsys->setTradeName('Tienda S.L');
    $redsys->setTitular('Pedro Risco');

    $redsys->setPan('4548812049400004'); //Número de la tarjeta
    $redsys->setExpiryDate('2012'); //AAMM (año y mes)
    $redsys->setCVV2('123'); //CVV2 de la tarjeta

    $redsys->setEnvironment('test'); //Entorno test

    $signature = $redsys->generateMerchantSignature($key);
    $redsys->setMerchantSignature($signature);

    $form = $redsys->createForm();
} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}
echo $form;

Pago con referencia

Esta operativa nos permite guardar los datos de la tarjeta. SIS almacena la tarjeta y devuelve la referencia que deberá ser almacenada por el comercio.

Imaginemos que en el ejemplo anterior, queremos guardar los datos de la tarjeta, solo bastará con agregar el método setIdentifier(). Cuando se haga el llamado a la url de notificación, éste nos devolverá Ds_Merchant_Identifier y Ds_ExpiryDate.

//Para una nueva referencia agregar este método al ejemplo anterior
$redsys->setIdentifier();

//En la url de notificación nos devolverá algo como esto
Array
(
    [Ds_Date] => 17%2F02%2F2022
    [Ds_Hour] => 23%3A25
    [Ds_SecurePayment] => 1
    [Ds_Card_Number] => 491801******4602
    [Ds_ExpiryDate] => 3212
    [Ds_Merchant_Identifier] => 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c
    [Ds_Card_Country] => 724
    [Ds_Amount] => 0
    [Ds_Currency] => 978
    [Ds_Order] => 1645136683
    [Ds_MerchantCode] => 999008881
    [Ds_Terminal] => 001
    [Ds_Response] => 0000
    [Ds_MerchantData] =>
    [Ds_TransactionType] => 0
    [Ds_ConsumerLanguage] => 1
    [Ds_AuthorisationCode] => 005090
    [Ds_Card_Brand] => 1
    [Ds_Merchant_Cof_Txnid] => 2202172334011
    [Ds_ProcessedPayMethod] => 1
    [Ds_Control_1645136701458] => 1645136701458
)

Ahora bien, si queremos realizar otro cobro sin que nos pidan los datos de la tarjeta para ese mismo usuario, bastará con pasar el Ds_Merchant_Identifier anterior en el método setIdentifier().

Cada banco tiene un sistema de seguridad a través de un código de SMS, tarjeta de coordenadas, etc. que se mostrará para completar la transacción.

$redsys->setIdentifier(2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c);

//En la url de notificación nos devolverá algo como esto
Array
(
    [Ds_Date] => 17%2F02%2F2022
    [Ds_Hour] => 23%3A28
    [Ds_SecurePayment] => 1
    [Ds_Card_Number] => 491801******4602
    [Ds_Merchant_Identifier] => 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c
    [Ds_Card_Country] => 724
    [Ds_Amount] => 12000
    [Ds_Currency] => 978
    [Ds_Order] => 1645136909
    [Ds_MerchantCode] => 999008881
    [Ds_Terminal] => 001
    [Ds_Response] => 0000
    [Ds_MerchantData] =>
    [Ds_TransactionType] => 0
    [Ds_ConsumerLanguage] => 1
    [Ds_AuthorisationCode] => 078737
    [Ds_Card_Brand] => 1
    [Ds_Merchant_Cof_Txnid] => 2202172334011
    [Ds_ProcessedPayMethod] => 1
    [Ds_Control_1645136925978] => 1645136925978
)

Si no queremos que nos muestre ninguna pantalla y directamente realice el pago debemos hacer uso del método setMerchantDirectPayment():

$redsys->setMerchantDirectPayment(true);

También podemos hacer los cobros recurrentes a traves de Rest.

try{
    //Key de ejemplo
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $redsys = new Sermepa\Tpv\Tpv();
    $redsys->setAmount(rand(20,80));
    $redsys->setOrder(time());
    $redsys->setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco

    $redsys->setCurrency('978');
    $redsys->setTransactiontype('0');
    $redsys->setTerminal('1');
    $redsys->setIdentifier('2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c');
    $redsys->setVersion('HMAC_SHA256_V1');
    $redsys->setEnvironment('restTest'); //Rest entorno test
    $redsys->setMerchantCofIni('N');
    $redsys->setMerchantDirectPayment(true);

    $redsys->setMerchantCofTxnid(2202172334011);

    $signature = $redsys->generateMerchantSignature($key);
    $redsys->setMerchantSignature($signature);

    $response = json_decode($redsys->send(), true);

    $parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
    $DsResponse = $parameters["Ds_Response"];
    $DsResponse += 0;
    if ($redsys->check($key, $response) && $DsResponse <= 99) {
        //Si es todo correcto ya podemos hacer lo que necesitamos, para este ejemplo solo mostramos los datos.
        print_r($parameters);
    } else {
        //acciones a realizar si ha sido erroneo
    }

} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}

Redirección automática

Podemos forzar la redirección sin pasar por el método createForm() (gracias a la colaboración de jaumecornado)

$redsys->executeRedirection();

Este método llamaría a createForm() y lanzaría el submit por javascript.

Comprobación de Pago

Podemos comprobar si se ha realizado el pago correctamente (gracias a la colaboración de markitosgv). Para ello necesitamos setear la clave del banco y pasar la variable $_POST que nos devuelve en la URL de notificación o de retorno. Tener en cuenta que debemos realizar esta comprobación en la url de notificación. Por ejemplo, en el fichero que es llamado por la URL de retorno:

try{
    $redsys = new Sermepa\Tpv\Tpv();
    $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

    $parameters = $redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);
    $DsResponse = $parameters["Ds_Response"];
    $DsResponse += 0;
    if ($redsys->check($key, $_POST) && $DsResponse <= 99) {
        //acciones a realizar si es correcto, por ejemplo validar una reserva, mandar un mail de OK, guardar en bbdd o contactar con mensajería para preparar un pedido
    } else {
        //acciones a realizar si ha sido erroneo
    }
} catch (\Sermepa\Tpv\TpvException $e) {
    echo $e->getMessage();
}

Nota

Por defecto se conecta por la pasarela de pruebas. Para cambiar a un entorno real, usar el método setEnvironment('live'), con esto ya estará activo.

Los entornos que tenemos son:
 - test
 - live
 - restLive
 - restTest

Métodos útiles

Asignar parámetros

Este método recibe un array asociativo con los nuevos valores a asignar.

Ejemplo:

$parameters = ['DS_MERCHANT_CHARGEEXPIRYDATE' => '2020', 'DS_MERCHANT_COF_INI' => 'S'];
$redsys->setParameters($parameters);

Asignar nombre a id y name del formulario

$redsys->setNameForm('nombre_formulario');
$redsys->setIdForm('id_formulario');

Cambiar el idioma de la pasarela de pago

//Esto mostraría la pasarela de pago en inglés
$redsys->setLanguage('002');

Códigos de idiomas disponibles:

  • 001: Castellano
  • 002: Inglés
  • 003: Catalán
  • 004: Francés
  • 005: Alemán
  • 006: Holandés
  • 007: Italiano
  • 008: Sueco
  • 009: Portugués
  • 010: Valenciano
  • 011: Polaco
  • 012: Gallego
  • 013: Euskera

Asignar nombre, id, value y style (css) al botón submit

$redsys->setAttributesSubmit('btn_submit', 'btn_id', 'Enviar', 'font-size:14px; color:#ff00c1');

Si usáis redirección podéis ocultar el botón con display:none

Generar formulario

$redsys->createForm();

Obtener un array con todos los datos asignados

$redsys->getParameters();

Por ejemplo, esto nos devuelve:

Array
(
    [DS_MERCHANT_AMOUNT] => 1700
    [DS_MERCHANT_ORDER] => 160224230429
    [DS_MERCHANT_MERCHANTCODE] => XXXXXX
    [DS_MERCHANT_CURRENCY] => 978
    [DS_MERCHANT_TRANSACTIONTYPE] => 0
    [DS_MERCHANT_TERMINAL] => 1
    [DS_MERCHANT_PAYMETHODS] => C
    [DS_MERCHANT_MERCHANTURL] => http://demo.com/notificacion.php
    [DS_MERCHANT_URLOK] => http://demo.com/accept
    [DS_MERCHANT_URLKO] => http://demo.com/cancel
    [DS_MERCHANT_MERCHANTNAME] => Tu empresa
    [DS_MERCHANT_TITULAR] => Usuario
    [DS_MERCHANT_PRODUCTDESCRIPTION] => Tu descripción
)

Obtener un array de los datos devueltos por Ds_MerchantParameters

$redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);

Esto nos devuelve:

[Ds_Date] => 12/11/2015
[Ds_Hour] => 14:04
[Ds_SecurePayment] => 1
[Ds_Card_Number] => 454881******0004
[Ds_Card_Country] => 724
[Ds_Amount] => 7300
[Ds_Currency] => 978
[Ds_Order] => 1447333990
[Ds_MerchantCode] => 999008881
[Ds_Terminal] => 001
[Ds_Response] => 0000
[Ds_MerchantData] =>
[Ds_TransactionType] => 0
[Ds_ConsumerLanguage] => 1
[Ds_AuthorisationCode] => 906611

Obtener Versión

$redsys->getVersion()

Devuelve el valor asignado en setVersion(), por ejemplo: HMAC_SHA256_V1;

Obtener MerchantSignature

$redsys->getMerchantSignature()

Devuelve el valor asignado en setMerchantSignature(), por ejemplo: Cia90trhTPGxtJDmK6WDhqXzU+98LbuKZKAKYHMjtMs=

Change log

Please see CHANGELOG for more information about what has changed recently.

Licencia

The MIT License (MIT). Please see License File for more information.

Donación

¿Te gustaría apoyarme? ¿Aprecias mi trabajo? ¿Lo usas en proyectos comerciales?

¡Siéntete libre de hacer una pequeña donación! 😉

paypal

sermepa's People

Contributors

alphp avatar diegomarty avatar ericmp33 avatar jaumecornado avatar marcverney avatar markitosgv avatar ordago avatar rogervila avatar ssheduardo avatar vguardiola avatar xpiga avatar xsolsona avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sermepa's Issues

IUPAY

¿Cómo puedo mostrar el IUPAY?
¿Si no, lo tiene se le puede agregar?

Pago por referencia (Pago 1-Clic, sin autorización)

Desde el 11 Dic 2015 es posible el pago por referencia (sin autenticación) que permite realizar compras sin necesitar ninguna acción por parte del usuario (guardas un token en el servidor junto con la fecha de caducidad de la tarjeta).

Utiliza el nuevo campo Ds_Merchant_DirectPayment entre otros.

Hay planes de implementar esta funcionalidad? Alguien está trabajando en ello?

Recuperar información de la compra

Primero de todo darte las gracias por este código.
He implementado tu código y me lleva correctamente al banco para realizar el pago y luego me devuelve a la página indicada en la variable $setUrlOk, el problema es que no consigo recuperar los datos de la transacción en la página indicada en $setUrlOk.

Este es el código que añado a la pagina definida en $setUrlOk:

    include_once('public/assets/sermepa/src/Sermepa/Tpv/Tpv.php'); 
    $redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);

Y este el error que me aparece: Undefined variable: redsys.
Que estoy haciendo mal? Gracias por adelantado y un saludo,

Problema con generateMerchantSignature($key)

Buenos dias,
Estaba haciendo una página web de compra y venta de fotos en localhost. Al tenerla acaba la he subido a un servidor, pero ahora mismo que esta en el servidor no me genera la signatura.

  • En consola siempre me aparece el mismo error "Failed to load resource: the server responded with a status of 500 (Internal Server Error)". Me gustaria saber por que es.
    Le doy la url de la página, si realiza todo el proceso cuando se encuentre en la pestaña de compra(Deberá rellenar los campos emails) verá que no me genera ninguna signatura y no me la posiciona en su lugar correcto.
    URL: https://www.rider1000foto.com
    La plataforma esta en modo "Test", asi que no estoy haciendo publicidad.
    Muchas gracias,
    Saludos

Wrong importe value

When using importe like : 149.70, due to the intval it returns 14969 et NOT 14970 as expected.

SOAP wsdl

Este desarrollo soporta SOAP wsdl?

Erro al comprobar firma en notificación

Hola chicos,

Pues resulta que si cancelo la compra o me da algún error en el pago, llama a la notificación en el cual yo llamo al método check($key='', $postData), pues bien, siempre me devuelve 1 sea cual sea el caso, o sea que las firmas coinciden. A alguien más le pasa?

Buenos días

Para utilizar Redsys, debo renombrar todas las clases??

Evitar redirección

Hola Eduardo, aquí uno más que ha encontrado tu trabajo ;)

Ando tanteándolo y testeándolo, acabo de hacer alguna prueba y llevar a cabo un pago ficticio de forma correcta.

En mi caso, si finalmente incorporo a mi proyecto esta 'pasarela' de pago, me gustaría que no se ejecutara la redirección automáticamente, sino que fuera el usuario quien controlara la acción pulsando un botoncito. Pensé que si comentaba la línea

// $pasarela->ejecutarRedireccion();

conseguiría ese control de la acción, pero al comentarla y ejecutar el código aparece el mensaje 'las firmas no coinciden'.

No sé si me equivoco en mi planteamiento o estoy pasando algo por alto, pero no doy con ello, por eso te agradecería, cuando quieras y puedas, alguna orientación.

Saludos.

Cómo extender _setParameters?

Creamos una clase en nuestra aplicación que extiende de la clase original de este repositorio.

Al crear métodos nuevos para que asignen otros _setParameters nos dimos cuenta que no los agrega al _setParameters original de la clase padre.

Al parecer debido a que la propiedad está definida como private, cambiando a protected sí que lo permitió.

Aunque para realizar el cambio tuvimos que copiar la clase original dentro del código de la app para poder alterarla.

TPV class not found

hi sir,
I just want to ask that how can I confirm payment is successful or not.

I am using this class but it returns me this error.

$redsys = new Sermepa\Tpv\Tpv();

TPV class not found.
even that i have already installed in my laravel application.

Ds_Merchant_PartialPayment

Hola, buen día,
tengo la necesidad de hacer una integración de tu librería con pagos fraccionados, en mi caso en el BBVA. Y me han dicho desde el banco que hay que incorporar el campo "Ds_Merchant_PartialPayment" donde se envían los plazos de financiación siempre y cuando no sea un pago al contado.

Imagino que sea tan sencillo como hacer un nuevo método que agregue un item más a Parameters, tal como así: $this->_setParameters['DS_MERCHANT_PARTIALPAYMENT'] = '03' (3 meses sin intereses). El valor por defecto es '02' : Pago con tarjeta al contado.

Pero quería confirmarlo contigo y el resto de la comunidad. Qué me dices?

Los códigos que tengo hasta ahora y me falta probar/validar son:
image

Implementación en componente Joomla

Hola!! Lo primero de todo gracias por tu aporte, es justamente lo que estaba buscando. Quiero añadir esta forma de pago a un componente de gestor de eventos en joomla, pero no hay nada creado. Creo que la mejor opción es, ya que no soy muy ducho con PHP, la pasarela paypal por la de Sermepa, para ello extraigo la parte del código que creo se necesita modificar. Si me puedes ayudar o presupuestar, te lo agradecería:

public function getRedirect()
{
$action = KRequest::get('post.action', 'string');

    if ($action == "add") 
    {
        $event = $this->getService('com://site/ohanah.model.events')->id(KRequest::get('post.ohanah_event_id', 'int'))->getItem();
        $url = 'index.php?option=com_ohanah&view=event&id='.$event->id.'&Itemid='.KRequest::get('post.Itemid', 'int');

        if ($event->ticket_cost) 
        {

            if ($event->payment_gateway == 'custom') {  
                $url = $event->custom_payment_url;
            } else if ($event->payment_gateway == 'paypal') {
                $number_of_tickets = KRequest::get('post.number_of_tickets', 'int');

                $url = 'https://www.paypal.com/cgi-bin/webscr?cmd=_xclick'.
                        '&business='.JComponentHelper::getParams('com_ohanah')->get('paypal_email').
                        '&email='.KRequest::get('post.email', 'raw').
                        '&amount='.$event->ticket_cost.
                        '&quantity='.$number_of_tickets.
                        '&custom='.KRequest::get('post.ohanah_registration_id', 'int').
                        '&currency_code='.$event->payment_currency.
                        '&item_name='.$number_of_tickets.' tickets to '.$event->title.
                        '&return='.urlencode('http://'.$_SERVER["HTTP_HOST"].JRoute::_('index.php?option=com_ohanah&view=event&id='.$event->id.'&Itemid='.KRequest::get('post.Itemid', 'int'))).
                        '&cancel_return='.urlencode('http://'.$_SERVER["HTTP_HOST"].JRoute::_('index.php?option=com_ohanah&view=event&id='.$event->id.'&Itemid='.KRequest::get('post.Itemid', 'int')));
            }
        }

        if (!$this->_message) {
            return $result = array(
                'message'       => JText::_('YOU_HAVE_JOINED_THIS_EVENT'),
                'messageType'   => 'Notice',
                'url'           => JRoute::_($url, false),
            );
        } else {
            return $result = array(
                'message'       => $this->_message,
                'messageType'   => 'Notice',
                'url'           => JRoute::_($url, false),
            );
        }

    }
    else 
    {           
        $result = array();

        if(!empty($this->_redirect))
        {
            $url = $this->_redirect;

            //Create the url if no full URL was passed
            if(strrpos($url, '?') === false) 
            {
                $url = 'index.php?option=com_'.$this->getIdentifier()->package.'&'.$url;
            }

            $result = array(
                'url'           => JRoute::_($url, false),
                'message'       => $this->_message,
                'messageType'   => $this->_messageType,
            );
        }

        return $result;
    }
}

Como enviar los datos.

No consigo encontrar como enviar los datos generados con la clase al webservice de Redsys. Podrías ayudarme? No encuentro en que función envias los datos.

Gracias

No puedo comprobar el pago

Hola, ¿podéis por favor confirmar que las notificaciones de pago siguen funcionando como hasta ahora?

Llevo un día loco, a la url especificada en $redsys->setNotification no accede redsys nunca pese a dar el ok a la transacción. Hace unos meses hice unas pruebas y me funcionó todo correctamente. Ahora, ese mismo código, sin ninguna modificación, funciona correctamente excepto la notificación. ¿A alguien más le pasa?

Muchas gracias.

get para ciertos parametros

Estoy usando este componente, pero veo que no dispone de algunos métodos.

Como uso Drupal, quiero usar mi propio sistema form (el de drupal), pero hay un par de métodos que hecho de menos.

  • getVersion()
  • getSignature()

De esta manera podría usar el objeto TPV sin tener que estar manteniendo variables locales.

Question: ¿Cómo hacer pagos directos?

Buenas!

He seguido todos los pasos indicados para realizar pagos directos con referencia y tengo el siguiente código:

       `Redsys::setAmount($amount);

        Redsys::setOrder($order);

        Redsys::setMerchantcode(config('redsys.merchantcode'));

        Redsys::setCurrency('978');

        Redsys::setTransactiontype('0');

        Redsys::setTerminal(config('redsys.terminal'));

        Redsys::setMethod('T');

        Redsys::setNotification(config('redsys.url_notification'));

        Redsys::setUrlOk(config('redsys.url_ok'));

        Redsys::setUrlKo(config('redsys.url_ko'));

        Redsys::setVersion('HMAC_SHA256_V1');

        Redsys::setTradeName(config('redsys.tradename'));

        Redsys::setTitular(config('redsys.titular'));

        Redsys::setProductDescription($description);

        Redsys::setIdentifier($card_reference);

        Redsys::setEnviroment(config('redsys.enviroment'));

        $signature = Redsys::generateMerchantSignature(config('redsys.key'));

        Redsys::setMerchantSignature($signature);

        Redsys::setMerchantDirectPayment(true);`

Este código tal cual ejecuta el pago? No me genera ningún error, no me llega nada a la url de notificación ni a la de OK ni KO, he puesto varios logs para ver si entra en algún sitio pero nada...

Los pagos normales introduciendo la tarjeta en el formulario de Redsys funcionan correctamente con la redirección y recojo los datos correctamente en la url OK pero en este código, ¿qué me falta para generar el pago y comprobar sus datos?

Muchas gracias!

Problema con la MERCHANTURL

Buenas, estoy probando tu clase para una tienda virtual que estoy montando y me encuentro con un problemilla. El pago lo realiza bien, pero cuando salgo de redsys e intento guardar los datos del pago me salta directamente a la URLOK sin pasar por la MERCHANTURL. He probado ya mil cosas y no se si el fallo esta en mi codigo o en la plataforma de pago. Muchas gracias por tu tiempo.

No obtiene datos desde API REST

Buenas, he integrado con tu librería la pasarela de pago y va todo bien, el problema viene cuando intento hacer la comprobación del pago, en mi api rest tengo:

try{
$key = config('redsys.key');
$parameters = Redsys::getMerchantParameters($request->input('Ds_MerchantParameters'));
$DsResponse = $parameters["Ds_Response"];
$DsResponse += 0;
if ($redsys->check($key, $_POST) && $DsResponse <= 99) {
$user = new User();
$user->password = '1234';
$user->email = '[email protected]';
$user->rol_id = '1';
$user->save();
$user->success = true;
$user->msg = 'Usuario insertado correctamente';
} else {
$user = new User();
$user->password = '1234';
$user->email = '[email protected]';
$user->rol_id = '1';
$user->save();
$user->success = true;
$user->msg = 'Usuario insertado correctamente';
}
} catch (\Exception $e) {
echo $e->getMessage();
}

y lo pongo en :
$redsys->setNotification('http://127.0.0.1:8000/api/payment/comprobar'); //Url de notificacion
La ruta de la api es tengo esas dos por si acaso:
Route::get('comprobar', 'RedsysController@comprobar');
Route::post('comprobar', 'RedsysController@comprobar');

y cuando cancelo un pago no me genera el usuario en la db, alguna idea de por que puede ser ?

Cambio de Algorítmo SHA-1 a SHA-256

Hola, hoy me han comentado que los comercios que esten funcionando con el algoritmo SHA-1 dejaran de funcionar el día 23 de noviembre de este año, estoy utilizando esta librería pero veo que tiene el SHA-1.
Habría que sustituir la función

sha1($string);

por

hash( 'sha256', $string );

¿Sería correcto?

Gracias

Migración a SHA-256

Question: ¿Es posible hacer pre autorizaciones sin acciones del usuario?

Buenas Eduardo,

Antes de nada, darte mis felicitaciones por la claridad de tu código y ayudarnos a todos en integrar la pasarela.

Estoy haciendo pruebas con las preautorizaciones, ya he conseguido que la pasarela no haga uso de 3d secure hablando con el banco.

La duda que nadie me aclara es:

Existe alguna tarjeta o alguna situación en que la preautorización exija hacer uso de una pantalla maquetada por Redsys?

Sé que la pregunta es muy difusa. Estoy integrando tu código junto a una app nativa ios y no sé si es mala idea. No sé si es mejor hacerlo con un iframe por si existe alguna situación en que se exija completar un dato extra en una pantalla de Redsys.

Es decir, con tu código y una pasarela configurada con webservice y sin 3d secure... se requiere de alguna acción del usuario?

Gracias por tu ayuda

Question: Redsys ya no devuelve el Ds_Card_Number??

Buenas,
Antes que nada muchísimas gracias por esta aportación!

Estoy implementándolo en modo test y en los datos que me devuelve el pago no aparece el Ds_Card_Number para poder almacenar los últimos 4 dígitos de la tarjeta.

Recibo los siguientes datos en el array. ¿Hay algún método para obtenerlo o es Redsys quién ha dejado de retornarlo?

Ds_Terminal:001;
Ds_Response:0000;
Ds_Amount:300;
Ds_SecurePayment:1;
Ds_Card_Country:724;
Ds_Card_Brand:1;
Ds_ConsumerLanguage:1;
Ds_Date:22/05/2018;
Ds_Merchant_Identifier:42e3397351e5df1512b24e5d5cbcb464e4baaa89;
Ds_ExpiryDate:2012;
Ds_Order:000000000047;
Ds_MerchantCode:344473699;
Ds_TransactionType:0;
Ds_Hour:13:46;
Ds_AuthorisationCode:178541;
Ds_Currency:978;

Un saludo y muchas gracias.

me falla a la hora de recibir los datos de vuelta...

Hola @ssheduardo , he estado probando la librería y todo funciona correctamente, sólo que a la hora de comprobar los datos devueltos, me falla en la llamada: $pasarela->comprobar($_POST)
y es porque estoy viendo que los datos me vienen en $_GET
que vengan en POST o GET hay alguna forma de definirlo?
prefiero que me vengan en POST porque después me los pega detrás de la "url ok" en este caso...

Un saludo y gracias

A vueltas con la dichosa URL de pruebas

Buenas,

he abierto un nuevo issue porque ya me estoy volviendo loca. Ahora no funciona ni la que teníamos de alternativa.

El viernes pasado estuve implementando la clase para otro cliente diferente, pero lo tuve que dejar porque redsys empezó a lanzar error 500, así que lo dejé para cuando terminaran de hacer lo que estuvieran haciendo.

Hoy me he puesto a actualizar la clase con los últimos cambios y no funciona. He vuelto a la versión que tenía la última vez que todo había funcionado, pues nada, error.

Ya desesperada me he vuelto a descargar el ejemplo, lo he subido tal cual, y nada, ni siquiera el de ellos funciona.

Luego he probado con las ul que había encontrado en prestashop o magento y aquí podeis comprobar que no van:
http://popnoart.com/redsys/ejemploGeneraPet.php

Eso si, en real funciona sin problemas, pero en pruebas nada.

¿Alguien más con este problema?

recurring transaction

Hi, we need add other merchant data than you described such as:

  • DS_MERCHANT_DATEFRECUENCY
  • DS_MERCHANT_CHARGEEXPIRYDATE
  • DS_MERCHANT_SUMTOTAL
    and for second transaction DS_MERCHANT_AUTHORISATIONCODE

Perhaps, it would be more convenient if you added a method, for example, setParameter ?
Where we can set any parameter

Error al encriptar 3des

Buenas, he estado probando con tu repositorio, y con una version de php 5.3.27 (exigencias de un cliente)y la encriptación a 3DES para la firma no la realiza correctamente por lo que he usado la función mcrypt_encrypt con la que si la realiza correctamente. Tampoco me he puesto a investigar mucho porqué fallaba ya que necesitaba una solución rápida .Te copio aquí la solución por si hiciera hiciera falta.

private function encrypt_3DES($data, $key){
/*
$iv = "\0\0\0\0\0\0\0\0";
$data_padded = $data;
if (strlen($data_padded) % 8) {
$data_padded = str_pad($data_padded,strlen($data_padded) + 8 - strlen($data_padded) % 8, "\0");
}
//$ciphertext = openssl_encrypt($data_padded, "DES-EDE3-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
$ciphertext = openssl_encrypt($data_padded, "DES-EDE3-CBC", $key, true, $iv);
return $ciphertext;
*/
$iv = implode(array_map('chr', array(0, 0, 0, 0, 0, 0, 0, 0)));
return mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CBC, $iv);
}

Probar la clase para iniciados

Hola Eduardo,

Me ha caido en las manos la implantación de un TPV virtual de Santander para un hotspot, el caso es que tengo que, desde el entorno de pruebas, testearlo.

No tengo mucha experiencia en programación web asi que necesito saber como puedo probar esta clase desde una web con los parametros que me han asignado.

Muchas gracias.

Robert

Error en parametro

Buenas tardes,
Soy nuevo en PHP, estoy intentando acceder a la TPV VIRTUAL de BBVA
Estoy utilizando la clase tpv.php
Tengo varios temas (todos con la clave: $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7'"

  1. Cuando el código del banco real y el entorno: live, dice: error en datos enviados
  2. Si por el contrario utilizo el entorno test(con el mismo código que me suplio el banco): Funciona , pero me dice; luego Notice: Undefined index: Ds_MerchantParameters in C:\xampp\htdocs\sermepa\tpvnotificacionKO.php on line 8

que es la parte de notificiacion.php
$parameters = $redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);

Mi pregunta: Que me falta para poder ponerlo a funcionar en modo live, donde esta el error?
La versión que estoy utilizando es la última que vi en github

Gracias mil

Me ha encantado

Me ha encantado.

Voy hacer una versión para le framework cakePhp partiendo de esta base. ( y la subiré a git)

Sí tengo que añadir algo más, porque quiero hacerlo para pagos recurrentes, subo mejoras a esto

Quitar formulario al confirmar una preautorización (TransactionType=2)

Hola Eduardo! Ante todo miles de gracias por todo. Funciona genial y estoy más que agradecido. Sólo tengo una duda que espero me podáis responder si es posible. Estoy trabajando con preautorizaciones y sus confirmaciones. Todo funciona genial, excepto que me gustaría que al confirmar la preautorización (tipo de transacción = 2), no apareciera ningún formulario de Redsys diciendo nada, y que tan sólo se confirmara la preautorización y si es correcta que simplemente cargue el "noti_ok.php" para mostrar el mensaje de éxito. ¿Es esto posible? Actualmente, al confirmar la preautorización, me aparece un formulario de Redsys BBVA (en mi caso) donde salen los datos de la transacción y que ha sido exitosa, y si doy a "Continuar" ya me carga el noti_ok.php. Pero no quiero que salga nada del BBVA al confirmar la preautorización y salte directo al noti_ok.php. Espero haberme explicado! (No sé si tiene que ver con el método executeRedirection()??). Mi código:

```
$redsys->setMerchantcode('xxxxxxxx'); //Reemplazar por el código que proporciona el banco
$redsys->setCurrency('978');
$redsys->setTransactiontype("2");
$redsys->setTerminal('1');
$redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
$redsys->setNotification($ruta."redsys_notificacion.php"); //Url de notificacion

$redsys->setUrlOk($ruta."redsys_noti_ok.php"); //Url OK 
$redsys->setUrlKo($ruta."redsys_noti_ko.php"); //Url KO
$redsys->setVersion('HMAC_SHA256_V1');
$redsys->setTradeName('Masconsultas');
$redsys->setIdentifier(); 
$redsys->setAttributesSubmit('btn_submit', 'btn_id', 'Enviar', 'Display:none');
$redsys->setProductDescription('Compras varias');
$redsys->setEnvironment('test'); //Entorno test
$signature = $redsys->generateMerchantSignature($key);
$redsys->setMerchantSignature($signature);
$redsys->executeRedirection();

                // $form = $redsys->createForm();

} catch (\Sermepa\Tpv\TpvException $e) {

echo $e->getMessage();

}

Recibir parametros en la notificación

Creo que sería útil tener un método para poder recoger los parámetros ya decodificados en la notificación.

Probablemente en el método check($key, $postData), se podrían guardar los parámetros decodificados y luego crear otro método para poder recoger el valor.

Es muy útil, por ejemplo, recoger el ID del pedido en la notificación para poder validarla.

Recurring Payment

I've some questions:

  • Can you provide an example of how to execute an recurring transaction?

  • I also want to know, that I have subscription based site, frequency of each month, so do I need to manually redirect the user to Redsys for payment (even for recurring, then I guess there is no need of recurring call)?

    Like in Paypal, with their Preapproval API when I make future calls we have to use that preapproval key to trigger payment request without the need of user signin for approval and pay.

  • I thought setMerchantDirectPayment would trigger payment without redirecting user to offsite, what's the use of this parameter?

Duda Variable

Hola Edu, para empezar agradecerte que compartas tu trabajo con los demas.

Al turron, lo que me pasa es lo siguiente, tengo por asi decirlo un id del objeto que voy a comprar, uso la pasarela de pago y al volver a mi pagina, con la url ok ó ko quiero actualizar un campo de mi objeto, pero ese ID lo he perdido. Hay alguna manera de pasar ese id a la pasarela de pago y que me lo devuelva?

Otra cosa, en tu ejemplo hablas de que se recibirá un post con los datos de la transaccion, que datos exactamente son los que devuelve y como puedo recogerlos?

Un saludo y gracias de antemano

Plataforma de pruebas

Hola!

Buena classe, iba a hacer justamente esta cuando me encontré con està, miraré de aprovecharla.

Por cierto, algo que no tiene mucho que ver con la classe, sabes si los entornos de pruebas siempre son los mismos para cada cuenta?

SIS0042 :-(

Hola Eduardo, tengo un problema para integrar el módulo. He probado varias configuraciones y no salgo del error SIS0042 (la firma enviada no es correcta, a pesar que en pantalla sale importe 0 no asignado)

No le configuro ni el Tradename ni el Titular porque no dispongo de esta información, no se si son necesarios para la firma.

El código de comercio sale correcto, el importe 0 sin embargo. Estoy intentando hacerlo en test y con la clave "qwertyasdf0123456789". Es con el Banco de Sabadell.

Lo he probado en local y en un servidor de pruebas por si hubiera algún problema con el "localhost".

Algún consejo o pista? Hay que activar el entorno de pruebas de Redsys del cliente o siempre esta disponible.

Muchas gracias!!

Duda

Buenas, gracias por el código. Mi pregunta quizás sea un poco estúpida, es la siguiente:

Una vez configurado los distintos parámetros, en función de estos iré a un link u otro, verdad, y también en función de estos datos, la página tendrá un estilo u otro, no? De que TVP se supone que es la configuración del ejemplo?

El estilo tampoco se puede cambiar, no?

Gracias por el aporte

Hola!!

Un pregunta! si utilizo este parametro 'ejecutarRedireccion' el 'create_form' es necesario, ho se tendria de imprimir el create_form y depues el ejecutarRedireccion?

Bien, voy a probar... te comento...
Gracias por el porte! :D

Probando los cambios

Buenas,

lo primero muchas gracias por el trabajo, se agradece un montón!

Me cabo de poner a actualizar uno de los sitios que tengo que migrar y he empezado a hacer pruebas. Los clientes no me han pasado muchos datos así que estoy usando los de prueba que tenía de hace un par de años, y no se si son válidos todavía.

He probado el número de tarjeta para denegada y va bien, pero al probar la aceptada es cuando me falla dando el error que pongo en el título, y del cual no consigo encontrar referencias:

Y en pantalla:
No se puede realizar la operación
El sistema está ocupado, inténtelo más tarde

Los datos parecen ir bien, así que no se si es cosa de que las tarjetas que uso de prueba ya no sirven:

//Autorizada
Número de tarjeta: 4548812049400004
Caducidad: 12/20
Código CVV2: 123
Código CIP: 123456
//Denegada
Número de tarjeta: 1111111111111117
Caducidad: 12/20

¿Alguno tiene idea de dónde puedo estar metiendo la pata?

Alguien tiene problemas con la tarjeta de pruebas autorizada?

Buenas,

estoy teniendo problemas para realizar pruebas, y creo que el problema viene de la tarjeta autorizada. Me salta siempre este mensaje sin llegar a pasar por la petición de la clave del banco (el CIP):

No se puede realizar la operación
La comunicación con el comercio no es posible en estos momentos. Por favor, inténtelo más tarde.

Probando con la denegada me salta este mensaje:

No se puede realizar la operación
Tarjeta ajena al servicio. (SIS0093)

No recuerdo de otras veces si esto es lo que debe salir, pero parece correcto.

En todo caso me funciona bien las urls de notificación, ok y ko.
He probado también con el ejemplo de "Enviar datos de la tarjeta" y mismo mensaje.

Las tarjetas que uso son:
Nº Tarjeta Autorizada: 4548812049400004
Fecha cad: 12/20
cvv: 123
CIP: 123456

Nº Tarjeta Denegada: 1111111111111117
Fecha cad: 12/20

A alguien le pasa?

Error SIS0007

Me devuelve error SIS0007, y, según la documentación:

Error al desmontar el XML de entrada o error producido al acceder mediante un sistema de firma antiguo teniendo configurado el tipo de clave HMAC SHA256.

Alguna idea?

Url_Notification con parametros

Hola, con la libreria anterior tenia como urlNotification una web que pasandole el numero de pedido por GET marcaba como que habia pagado, pero ahora no funciona, si ejecuto la url funciona, pero parece ser que el TPV no accede a esa direccion.

Comprobación del pago

Hola,

Desde la actualización a sha-256 el método getMerchantParameters() no me funciona correctamente.

En el momento de llamar $decodec = $this->decodeParameters($parameters); el resultado para $decodec es:
"{"Ds_Date":"18%2F07%2F2016","Ds_Hour":"18%3A41","Ds_SecurePayment":"1","Ds_Card_Country":"724","Ds_Amount":"950","Ds_Currency":"978","Ds_Order":"160718124025","Ds_MerchantCode":"0619XXXXX","Ds_Terminal":"001","Ds_Response":"0000","Ds_MerchantData":"16","Ds_TransactionType":"0","Ds_ConsumerLanguage":"1","Ds_AuthorisationCode":"3927"

Luego al llamar a $decodec_array=$this->JsonToArray($decodec); el resultado es nulo, con lo que la posterior comprobación del pago siempre es negativa

¿Alguna sugerencia?

Muchas gracias

Cambio Firma

Hola, como ya sabéis se está cambiando el método de firma de SHA1 a SHA256, por tanto esta librería quedará obsoleta para esa fecha si no realizamos el cambio.

Además se han realizado otros cambios, ahora por ejemplo el formulario tan sólo lleva 3 parámetros:

<input type="text" name="Ds_SignatureVersion" value="<?php echo $version; ?>"/></br>
<input type="text" name="Ds_MerchantParameters" value="<?php echo $params; ?>"/></br>
<input type="text" name="Ds_Signature" value="<?php echo $signature; ?>"/></br>
  • Ds_MerchantParameters:
    • Es un array de los parámetros: Necesitamos pasarlos a JSON y luego codificar en base64
  • Ds_Signature
    • Se decodifica la clave proporcionada por el banco y se encripta junto con los parámetros anteriores; por último todo se codifica en base64
  • Ds_SignatureVersion
    • Especificaremos la versión de la firma: HMAC_SHA256_V1

La comprobación también cambiaría.

Iniciación

Buenas, primero dejame agradecerte tu trabajo, ahora entro en materia:

Partiendo de la base que no tengo mucha idea de PHP, he estado mirando tu clase y es lo que en mi humilde opinión puede valer para un proyecto que ha caído en mis manos, el caso es que soy diseñador gráfico con algún que otro conocimiento de html5 y css3. Después de adaptar una pequeña web me han encargado implementar la pasarela de pago (algo que me viene grande).

Como soy diseñador na mente inquieta he estudiado tu trabajo y e intentado implementarlo en la siguiente dirección:

payment.hostalirati.com/pago

Aparte que me da un error que no comprendo, para ser mas claros, como debería de hacerla funcionar? Tengo que crear un formulario? Una web aparte? La verdad que voy algo perdido.

Muchas gracias de antemano

¿Cómo configurar notificación?

Hola Eduardo,
gracias por compartir tu código. Estoy empleando tu pasarela de sermepa, y quisiera emplear, a parte de la url_ko y la url_ok, la url_notificación.

Para ello, yo añado a mi pasarela lo siguiente:

$pasarela->url_notificacion('http://miurlpropia.com/notif.php');

Y en mi notif.php lo siguiente:

<html>
<head>
<title>
</title>
</head>
<body>
<p> OK </p>
<?php
echo "Notification recieved.<br />\n";
require 'lib/phpmailer/PHPMailerAutoload.php';
$mail = new PHPMailer();  // create a new object
$mail->IsSMTP(); // enable SMTP
$mail->SMTPDebug = 0;  // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true;  // authentication enabled
$mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for GMail
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465; 
$mail->Username = "[email protected]";  
$mail->Password = "empresaAcme";         
$mail->From = "[email protected]";
$mail->FromName = "Compañía Acme";
$mail->Subject = "Notification Sistema Acme";
$mail->Body = $_POST["url_notificacion"];
$mail->AddAddress("[email protected]");
if(!$mail->Send()) {
    echo 'Mail error: '.$mail->ErrorInfo; 
} else {
    echo 'Notification sent!';
}
?>

Sin embargo, no me envía el email, cosa que sí logro en la url a la que redirige el url_ok. ¿Qué estoy haciendo mal?

Saludos,
Carlos.

setParameters como protected

Hola,

Estoy usando tu librería, que me parecer super útil, pero me he encontrado con un problemilla. Estoy intentando extenderla, porque necesito hacer pagos recurrentes y de momento no están contemplados en tu librería. Al intentar extenderla he querido acceder a setParameters desde mi nueva clase, pero al ser private pues claro, error al canto jajaja.

Sería interesante que pusieras setParameters como protected, o añadieras un método público para editarlo.

¡Gracias!

Precio total (Amount) equivocado

Hola, he hecho una prueba de compra y yo le paso a la libreria un precio de 21,9 y cuando he ido a pagar me ponia 219€, puede ser que hayan modificado el tener que multiplicarlo por 100? Con la versión anterior me funcionaba bien

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.