• Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
Mi Blog
❂ Cómo integrar una pasarela de pago TPV RedSys con PHP

❂ Cómo integrar una pasarela de pago TPV RedSys con PHP

Integrar tu pasarela de pago TPV RedSys con PHP es realmente sencillo. En el siguiente "tutorial" os voy a enseñar lo sencillo que resulta configurar la pasarela de pago para comprar productos en una página Web e integrarlo con PHP. Es obvio que faltan muchas cosas para montar una tienda online, pero el objetivo de este tutorial es solamente la parte de integración. Si quieres aprender como se hace, no lo dudes y sigue leyendo.

¿QUÉ ES TPV?

Un terminal punto de venta (TPV) es un dispositivo que ayuda en la tarea de gestión de un establecimiento comercial de venta al público que puede contar con sistemas informáticos especializados mediante una interfaz accesible para los vendedores.

Los TPV permiten la creación e impresión del ticket de venta mediante las referencias de productos, realizan diversas operaciones durante todo el proceso de venta, así como cambios en el inventario. También generan diversos reportes que ayudan en la gestión del negocio. Los TPV se componen de una parte hardware (dispositivos físicos) y otra software (sistema operativo y programa de gestión).

Se denominan TPV virtual a la plataforma de pago que se instala y configura en Internet para gestionar los pagos con tarjetas de débito/crédito para facilitar los pagos de los clientes a la hora de comprar productos.

1.- ELEMENTOS UTILIZADOS EN ESTE TUTORIAL

  • Servidor con Linux+Apache+PHP
  • Datos de configuración del TPV La Caixa
  • Tarjeta de débito "demo" para simular pagos en el TPV

2.- DOCUMENTACIÓN OFICIAL Y API PHP DE REDSYS

En la zona de Descargas de la web http://www.redsys.es/ tienes que descargarte el fichero correspondiente a la (API PHP) http://www.redsys.es/comercio-electronico/modulos/API_PHP.zip

Debes descomprimir dicho fichero y guardar el contenido en tu servidor Web, por ejemplo en www.tuweb.com/tpv/

El documento oficial de Integración del TPV con diferentes APIs, entre ellas la de PHP , puedes encontrarlo en la siguiente dirección: https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf

3.- FORMULARIO DE PRUEBAS

En esta primera imagen se ve el formulario de pruebas que he creado para la pasarela de pago de La Caixa con RedSys + PHP. Como se puede ver hay 3 campos:

  • Cantidad: Introducimos la cantidad en Euros, por ejemplo 375
  • Nº Factura: Aquí introduciremos el número de factura ó pedido. No se pueden repetir los números de pedidos.
  • Concepto: Introduciremos el concepto, el nombre o lo que queremos.

TPV RedSys con PHPFormulario de Pago

En esta siguiente ilustración se ven los datos correctamente cumplimentados. Haremos click en "IR AL PASO 2":

TPV RedSys con PHPFormulario cumplimentado

En esta pantalla mostramos la confirmación de los datos que hemos introducido en el formulario. Como se puede ver el precio es correcto 375€ y el número de factura ó pedido también está correcto. Este paso lo he puesto solamente para verificar los datos introducidos en el formulario. Haremos click en "PAGO SEGURO CON TARJETA" para pasarle estos datos al TPV de La Caixa de RedSys:

TPV RedSys con PHPDatos de confirmación

La siguiente pantalla corresponde con el TPV de La Caixa donde podemos ver los datos correctamente enviados. Deberemos introducir nuestro número de tarjeta, la caducidad y el Cod. Seguridad:

TPV RedSys con PHPTPV La Caixa

A continuación, nos pide el código de identificación de nuestra tarjeta que introduciremos y aceptaremos:

TPV RedSys con PHPAceptar pago

Y por último se muestra un resultado OK o NO OK de nuestra operación. Si ha salido todo "ok", al darle a finalizar nos hará una redirección a nuestra página configurada con al variable $urlweb_ok. Si ha ocurrido un error, nos redireccionará a la web asociada a la variable $urlweb_nok:

TPV RedSys con PHPPago Aceptado

4.- CÓDIGO FUENTE DE LA PÁGINA

El código fuente completo del fichero "index.php" es el siguiente y no merece de mucha explicación ya que son varios "ifs" en PHP y los datos de configuración del TPV que deberéis rellenar con vuestros datos.

<!DOCTYPE HTML>
<html>
<head>
<title>PRUEBA TPV</title>
</head>
<body style="text-align:center">

< ?php
if ($_POST['submitPayment']) {
?><h3>PASO.2) Confirmar y pagar en pasarela de pago:</h3>
<p>Vas a realizar un pago de:</p>
<center><h1 style="color:RED">< ?php echo $_POST['cantidad'] . "€"?></h1></center>
<center><h3>Factura Nº: < ?php echo $_POST['factura'];?></h3></center>
< ?php } else { ?>
<h3>PASO.1) Introduce los datos y tipo de reserva:</h3>
< ?php }?>
<!-- PASARELA DE PAGO -->
< ?php
if ($_POST['submitPayment']) {
include "apiRedsys.php";
$miObj = new RedsysAPI;
// $url_tpv = 'https://sis-t.redsys.es:25443/sis/realizarPago'; // PASARELA DE PRUEBAS
$url_tpv = 'https://sis.redsys.es/sis/realizarPago'; // PASARELA DE PRODUCCIÓN
$version = "HMAC_SHA256_V1";
$clave = 'CLAVE'; //poner la clave SHA-256 facilitada por el banco
$name = 'EMPRESA';
$code = 'CODIGO ';
$terminal='1';
$order=$_POST['factura'] . $_POST['tipodepago'];
$totalpedido=$_POST['cantidad'];
$amount=$totalpedido*100;
$currency = '978';
$consumerlng = '001';
$transactionType = '0';
$urlMerchant = 'http://www.raulprietofernandez.net/tpv/validacion.php'; // URL DEL COMERCIO CMS
$urlweb_ok = 'http://www.raulprietofernandez.net/tpv/ok.php'; // URL OK
$urlweb_ko = 'http://www.raulprietofernandez.net/tpv/no-ok.php'; // URL NOK
$concepto = $_POST['concepto'];

$miObj->setParameter("DS_MERCHANT_AMOUNT",$amount);
$miObj->setParameter("DS_MERCHANT_CURRENCY",$currency);
$miObj->setParameter("DS_MERCHANT_ORDER",$order);
$miObj->setParameter("DS_MERCHANT_MERCHANTCODE",$code);
$miObj->setParameter("DS_MERCHANT_TERMINAL",$terminal);
$miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE",$transactionType);
$miObj->setParameter("DS_MERCHANT_MERCHANTURL",$urlMerchant);
$miObj->setParameter("DS_MERCHANT_URLOK",$urlweb_ok);
$miObj->setParameter("DS_MERCHANT_URLKO",$urlweb_ko);
$miObj->setParameter("DS_MERCHANT_MERCHANTNAME",$name);
$miObj->setParameter("DS_MERCHANT_CONSUMERLANGUAGE",$consumerlng);
$miObj->setParameter("DS_MERCHANT_PRODUCTDESCRIPTION",$concepto);



$params = $miObj->createMerchantParameters();
$signature = $miObj->createMerchantSignature($clave);

?>

<form id="realizarPago" action="< ?php echo $url_tpv; ?>" method="post" target="_self">
<input type='hidden' name='Ds_SignatureVersion' value='< ?php echo $version; ?>'>
<input type='hidden' name='Ds_MerchantParameters' value='< ?php echo $params; ?>'>
<input type='hidden' name='Ds_Signature' value='< ?php echo $signature; ?>'>
<input class="btn btn-lg btn-primary btn-block" type="submit" name="submitPayment" value="PAGO SEGURO CON TARJETA" />
</form>

< ?php } else { ?>
<p>Desde aquí puedes:</p>
<ul style="margin-left:55px">
<li>1.- Pagar la <strong>reserva</strong> del viaje</li>
<li>2.- Pagar la <strong>totalidad</strong> del viaje</li>
<li>3.- Pagar <strong>la parte que te quede por pagar</strong>.</li>
</ul>
</br></br>
<form class="form-amount" action="< ?php echo $_SERVER['PHP_SELF'];?>" method="post">
<div class="form-group">
<label for="tipodepago">Tipo de Pago</label>
<select id="tipodepago" name='tipodepago' class="form-control input-sm">
<option value="">SELECCIONA TIPO DE INGRESO</option>
<option value="-R">RESERVA DE VIAJE (200€)</option>
<option value="-C">PAGO COMPLETO DEL VIAJE</option>
<option value="-U">ÚLTIMO PAGO</option>
</select><br/>

<label for="amount">Cantidad</label>
<input type="text" id="cantidad" name="cantidad" autocomplete="off" class="form-control" placeholder="Por ejemplo: 450">
<label for="amount">Nº Factura <span style="color:red;font-style:italic">(no el nº de reserva)</span></label>
<input type="text" id="factura" name="factura" autocomplete="off" maxlength="12" class="form-control" placeholder="Por ejemplo: 000000923 (todos los números)">
<label for="amount">Concepto</label>
<input type="text" id="concepto" name="concepto" autocomplete="off" maxlength="125" class="form-control" placeholder="Por ejemplo: Manuel Gonzalez Perez - Viaje Valthorens 2016">
</div>
<input class="btn btn-lg btn-primary btn-block" name="submitPayment" type="submit" value="IR AL PASO 2">
</form>

< ?php }?>

</body>
</html>

Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

Importante: Tienes que eliminar el espacio antes de la interrogación "< ?php" de todas las coincidencias del fichero. He tenido que hacer esto para que Apache no lo interpretase.

ACTUALIZACIÓN 17/11/2017

Recientemente he implementado otro TPV de RedSys con control de usuarios y pagos. Puedes ver el resultado en las siguientes imagenes o en esta url: http://www.raulprietofernandez.net/blog/webs/nueva-web-con-tpv-redsys-y-control-de-pagos

Las características funcionales del portal son las siguientes:

  • Validación de formularios
  • Revisión de datos antes del pago
  • Envio de datos al TPV a través de HTTPS y la APi de RedSYS
  • Panel de control protegido
  • Listado de todos los pagos y su estado
  • Filtrado de pagos por (pendiente, ok y error)
  • Borrado de registros y purgado de la base de datos
  • Generación de QRCodes para cada transaccción
  • Desactivación del ticket una vez usado el QRCODE
  • Envío de confirmación por Email al cliente
  • Envío por Email al clinete con el QRCode adjunto

TPV REDSYS CMS

TPV REDSYS CMS

TPV REDSYS CMS

ENJOY!


Raúl Prieto Fernández

Sitio Web: /

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

Comentarios  

adrian
+1 # adrian 19-01-2017 13:12
Hola Raul, gracias por el código,

he revisado todo pero hay algo que no me permite seguir del paso 2, le doy a continuar, se refresca y los valores se pierden y se vuelve a mostrar el paso 2 sin datos las variables.

Otra duda, la url producción que hay que poner es no?: http://sis-d.redsys.es/sis/realizarPago

Otra duda que he visto en el código, en el form action no hay que poner ningún valor?:



Espero tu ayuda, gracias!
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 20-01-2017 16:58
Hola Adrián:

La URL de producción es esta:

$url_tpv = 'https://sis.redsys.es/sis/realizarPago'; // PASARELA DE PRODUCCIÓN

Respecto a las variables, primero debes usar la pasarela de pruebas que te hayan dado desde RedSys o tu banco, posiblemente sea por eso que no te funciona.

En mis pruebas, la pasarela de pruebas era esta:

$url_tpv = 'https://sis-t.redsys.es:25443/sis/realizarPago'; // PASARELA DE PRUEBAS

Desde el PASO 2, al darle al botón debería enviar un POST con los datos introducidos en el paso 1. Has revisado todas las claves del banco ? y el HASH ?

Coméntame lo que sea y te ayudo, pero es bastante sencillo. Otra cosa que puede darte error es el formato de Factura. Si le metes por ejemplo 30 letras ó caracteres falla porque tiene un límite.

Un saludo
Responder
adrian
+1 # adrian 21-01-2017 10:48
Hola Raúl, pues sigo igual, y mira que he probado:

- Los datos y claves del negocio online están correctos, además que ya estaba en producción el negocio y funcionando.

- He comprobado una cosa, y no se si puede ser por la api que he subido de redsys (última versión), por si tienes la que tu has usado, genial. Pero si en el include de la api, pongo la ruta completa:

include "http://www.ejemplo.com/tpv/apiRedsys.php";
el botón del segundo paso no sale.

Si pongo solo el nombre del fichero si, pero no funciona claro, me pega el vacio de las variables como te comenté.

Lo del tema que el formulario no tenga action es así no?



Gracias por tu ayuda!
Responder
adrian
+1 # adrian 21-01-2017 11:18
Hola Raúl, que tal!.

- Los datos del negocio están correctos y el tpv en producción funcionando.

- Entiendo que el hash te refieres a la variable: HMAC_SHA256_V1 la cual he dejado como la tienes.

- He comprobado una cosa haciendo pruebas, y es el include de la api de redsys, pero me parece que puede estar fallando esto, la version de php de la api de redsys es la 5.2, y mi version web de php es mayor, puede influir esto?.

- Que ficheros tienes subido de la api tú Raúl.

Saludos
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 23-01-2017 09:11
Hola Adrián:!

Estoy viendo que el TPV que uso en producción funciona perfectamente, pero en el código que he puesto en este tutorial efectivamente en el paso 2 algo está fallando.

Voy a revisarlo y en cuanto tenga el fallo ( no creo que tarde mucho ) hago una actualización.

Gracias!
Responder
adrian
+1 # adrian 23-01-2017 09:26
Perfecto!, ya decia yo que algo no me cuadraba xD

Espero tu actualización.

Saludos!
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 23-01-2017 10:05
Hola de nuevo:

No he podido realizar el 100% de los pasos porque no quiero "meter transacciones" en la pasarela de producción y la de pruebas ya no tengo acceso, pero acabo de "copiar/pegar" el código que actualmente está funcionando en producción.

He probado y ahora en el paso 2 ya se envían los datos a la API de RedSys, pero me da fallo porque "he vaciado" la clave de cifrado lógicamente:)

Prueba a copiar y pegar el nuevo código que he actualizado en este post (dale F5 a tu navegador para evitar que tengas la web cacheada).


Recuerda eliminar el espacio en todos los "< ?php". Tengo que hacerlo porque sino el CMS me interpreta el código php.

Recuerda también que tienes que configurar todos los valores siguientes:

$url_tpv = 'https://sis-t.redsys.es:25443/sis/realizarPago'; // PASARELA DE PRUEBAS
//$url_tpv = 'https://sis.redsys.es/sis/realizarPago'; // PASARELA DE PRODUCCIÓN
$clave = 'PONER CLAVE AQUI'; //poner la clave SHA-256 facilitada por el banco
$name = 'EMPRESA'; // INTRODUCE EL NOMBRE DE TU EMPRESA
$code = 'CÓDIGO'; // INTRODUCE EL CODIGO DE COMERCIO
$terminal='1'; // INTRODUCE EL TERMINAL
$urlMerchant = 'http://www.raulprietofernandez.net'; //Escribir la URL de nuestra Web
$urlweb_ok = 'http://www.raulprietofernandez.net/tpv/ok.php'; //Escribir la URL de redirección cuando el pago salga correcto
$urlweb_ko = 'http://www.raulprietofernandez.net/tpv/ko.php'; //Escribir la URL de redirección cuando el pago salga erróneo


Guarda el código en un fichero php dentro del mismo directorio donde tengas el apiRedsys.php

Prueba a ver ahora :)
Responder
adrian
# adrian 23-01-2017 10:40
Hola Raul,
salta al tpv del banco, pero algún valor no tiene que estar enviándose bien porque da error el tpv del banco.

He visto la variable:
$order=$_POST['factura'] . $_POST['tipodepago'];

pero donde declaras $tipodepago?, veo que la recoges pero no se envia no?

Saludos
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 23-01-2017 11:36
El tipo de pago está declarado aquí:

<label for="tipodepago">Tipo de Pago
<select id="tipodepago" name='tipodepago' class="form-control input-sm">
<option value="">SELECCIONA TIPO DE INGRESO
<option value="-R">RESERVA DE VIAJE (200€)
<option value="-C">PAGO COMPLETO DEL VIAJE
<option value="-U">ÚLTIMO PAGO
</select>


Es un pequeño "tunning" que hice del formulario.

Espero que te sirva el código y ya me contarás que tal te funciona la integración ahora que ya hemos visto por Chat que te funciona.

Un saludo!
Responder
Ruben
+1 # Ruben 23-05-2017 19:48
Buenas tarde he estado probando tu código y al dar al paso 2 no me carga el boton de pagar seguro, los demás datos introducidos si me aparecen, me podrias ayudar para ver porque ocurre esto.

Muchas gracias,

Un saludo.
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 24-05-2017 08:57
Hola Rubén:

Habría la posibilidad de ver el código que estás integrando ó acceder al equipo para echarle un vistazo a ver que te puede estar fallando? Seguro que es algo sencillo de arreglar :-)

Un saludo
Responder
Angel
# Angel 25-06-2017 11:32
Hola, lo primero... Gracias por el código y más por la explicación!!!! Tengo un par de dudas...

Al terminar de hacer el pago, cómo podríamos hacer para que llegara un mail resumen a quien paga y otro de administración para el admin. He utilizado esta Redsys con Woocommerce y lo hace sólo... Pero si quiero programar directamente con esta API??? Es importante para mí, mil gracias!!!
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 29-06-2017 12:57
Hola Angel:

Pues revisando la APi desgraciadamente creo que eso no se puede hacer : https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf

Por tanto, lo que habría que hacer es un desarrollo entero donde gestionar el usuario+email+resultado del pago.


En principio, si quieres algo sencillo se me ocurre ( esto es lo que yo intentaría ):

1.- Crear un sistema de autenticación con Email en PHP+MySQL
2.- Crear un portal de Login donde el email del usuario se guarde en una variable de sessión
3.- Hacer el pago de forma "normal" con el ejemplo explicado mas arriba
4.- En la página de OK y NO-OK, como el usuario tiene la misma sesión, esa variable se le puede pasar a OK.php y a NO-OK.php por tanto se puede enviar un email (plantilla) al email del usuario de la session.

Es lo que se me ocurre para empezar a desarrollar viendo que la API no permite hacer lo que dices ( al menos que yo vea en el PDF ).

Woocommerce ti lo hace porque hace exactamente (o similar) a lo que te he contado arriba.

Pero lo dicho, es un desarrollo largo desde 0 y con muchas cosas a tener en cuenta.


Un saludo y a ver si tienes suerte con las ideas que te he dado.
Responder
QW
# QW 04-09-2017 09:41
¿Como puedo quitar la factura del formulario sin que de error y la segunda pantalla de confirmacion?

Gracias

Muy buen post!
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 11-09-2017 13:18
Hola:

Desgraciadamente no se puede, si te miras el PDF de la API https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf podrás ver en la página 39 que pone esto:

Número de pedido | Ds_Merchant_Order: Obligatorio

Un saludo :)
Responder
Vladimir Arce
# Vladimir Arce 08-11-2017 01:55
Hola!

Primeramente y antetodo agradecerte este manualcillo.

Por desgracia me pasa como a un compañero que comenta mas arriba, el boton en el paso 2 no me carga.

Me he cerciorado que los datos "mios" estén bien introducidos, pero eso, no quiere aparecer el boton de "realizar pago seguro" ni a la de 3 :(

Si pudiera echarme 1 mano te lo agredeceria enormemente.

Saludos y muchas gracias de antemano!.
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 08-11-2017 09:48
Hola Vladimir:

Envíame tu fichero php por email y lo reviso y te respondo. Mi email es: raul.lnx ARROBA gmail.com

Cambia la clave y datos de tu tpv que sean confidenciales. Esos datos no son necesarios para el problema que tu tienes.

Un saludo
Responder
Vladimir Arce
# Vladimir Arce 09-11-2017 10:23
Buenas nuevamente Raúl,

Ya te envie el correo con el archivo tal y como me pediste.

De nuevo, mil gracias.

Saludos!
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 09-11-2017 11:11
Hola Vladimir:

Si, ya vi tu correo.

Cuando tenga un ratillo le doy un vistazo a tu fichero y te respondo por mail y te notifico por aquí.

Un saludo
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 09-11-2017 15:34
Hola:

Te adjunto (por email) el php modificado, solo he tocado 2-3 lineas:

1.- Tu línea de time he usado "date" (manias mias)

$order = date('ymdHis');

Pero ojo, esta linea va en el primer IF (linea 20) si quieres que en la segunda pantalla de confirmacion salga el dato. Si lo pones en el segundo if, como esa variable no está definicda aun, no saldrá nunca.

2.- La siguiente linea cambia por esto:

< center>Factura Nº: < ?php echo $order;?>

En lugar de

< center>Factura Nº: < ?php echo $_POST['factura'];?>

Ojo, he tenido que poner espacios en las líneas para que salieran bien en los comentarios.

Como ves, al hacer POST ya funciona. Si vas a usar como factura el "date" o "time", puedes borrar todo lo asociado al "select-box"

Un saludo
Responder
Edward León
# Edward León 09-11-2017 14:31
Saludos,

Como indicarle a mi aplicación el estado de la operación, esto para poder ejecutar codigo PHP para otras tareas, ya sea para caso OK o KO.

Gracias
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 09-11-2017 15:42
Hola Edward:

Cuando el pago es correcto el TPV redirige al usuario a la siguiente URL configurada:

$urlweb_ok = 'http://www.raulprietofernandez.net/tpv/ok.php'; // PAGO CORRECTO

Cuando el pago es erróneo, redirige a este otro:
$urlweb_ko = 'http://www.raulprietofernandez.net/tpv/no-ok.php' ; // PAGO ERRÓNEO

En esas páginas ya eres tu quien debe mostrar un mensaje u otro :). Desde un simple "PAGO CORRECTO" ó "PAGO FALLIDO" en texto plano, hasta una Web muy elaborada ;)

Un saludo
Responder
Hernan
# Hernan 19-11-2017 23:17
Hola Raul! Muchas gracias, me ha servido mucho y sin ser programador la plataforma de prueba funciona.
Solo me gustaria agregar un paso mas al formulario, pero no se como hacerlo. Es decir, que el primer paso seria para ingresar los datos del producto que vendo, el segundo para ingresar los datos personales (de momento estan todos dentro del mismo paso), y el tercero con un resumen de los datos ingresados para que finalmente el usuario confirme y lo lleve a pagar.
Existe la posibilidad de que me digas como hacer para separar ese primer paso en 2? Desde ya muchas gracias por tu grandsima ayuda.
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 24-11-2017 10:02
Hola Hernan:

A ver si consigo explicarme de com otendrías que hacerlo. Tienes 3 pantallas:

1.- Primeros datos (nombre y apellidos)(por ejemplo) + botón enviar
2.- Al darle a enviar, esos 2 datos se envian al mismo fichero php con PHP_SELF
3.- Tienes que meter un IF que diga que: "si se ha hecho post en el formulario 1" muestre el segundo formulario. Pero al principio ed ese IF tienes que recoger
las dos variables que has enviado en el primer formulario ( con $_POST('nombre_variable') )
4.- Esas 2 variables tienes que ponerlas en el segundo formulario, como tipo "" para que cuando hagas enviar desde el segundo formulario, se envien
los datos del segundo formulario ( cantidad a ingresas por ejemplo ) y los otros 2 datos aunque estén ocultos también se enviarán al tpv.

De esta forma se enviarán todos los datos al formulario....

No se si me he explicado bien , pero me cuesta menos ver el código que explicarlo :D

Mira a ver si lo entiendes y cualquier cosa me dices!

un saludo
Responder
Ana
# Ana 23-11-2017 21:05
Te he dejado una consulta en tu email. Al llegar a la pasarela del banco el error es "Error en datos enviados. Contacte con su comercio."
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 24-11-2017 09:46
Hola Ana:

Parece que el número de pedido está vacío. Al TPV hay que enviarle N datos tal y como él se espera, si no se reciben da fallos así.

Para ver el por qué del error, lo mejor es hacer esto:

1.- Realizar la simulación de la transacción hasta que da el error en el TPV.
2.- Una vez ha dado el fallo, en la web hacer boton derecho ver codigo fuente
3.- Buscar una linea que ponga algo asi (similar a lo siguiente)

< ! --ERROR SIS00012->

4.- Ese error lo buscas en google o en el PDF de la API y te saldrá que dato es el erróneo, por ejemplo en esta web tienes muchos

https://dwalins.com/2014/codigo-de-respuesta-de-sermepa-redsys/

Una vez visto el por qué del fallo, habría que mirar el código a ver su sucede si ese datos se envia mal, o no se envía.

Busca a ver que fallo te da primero y me dices

Un saludo
Responder
Rodrigo
# Rodrigo 29-11-2017 15:02
Buenas,
tengo unas dudas con los pagos y no se si podrás ayudarme con ello. Estoy realizando la implementación de la pasarela de pagos con Redsys con pagos por referenca, para no tener que almacenar los datos de las tarjetas de crédito, todo parece funcionar correctamente pero tengo que recibir en los datos de la respuesta de la pasarela de pagos unos datos que no se como almacenarlos por que no los veo por ningún lado, estos serían [Ds_Merchant_identifier] y [DS_ExpiryDate], llevo dos días dandole vueltas y no veo la solución, he probado otras APIs que he visto por internet pero el resultado es el mismo, No se como almacenar los datos recibidos en segundo plano de la respuesta. Tras el pago me envía a la url OK luego el pago se procesa correctamente pero no soy capaz de almacenar los datos con getParameter. Si sabes como explicarme la forma de hacerlo te lo agradezco.
Un saludo
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 29-11-2017 16:15
Hola Rodrigo:

Desgraciadamente no todos los datos son devueltos por el TPV de RedSys a nuestra web "tpv-ok".

Para ver los datos que te devuelve el TPV de RedSys, en la página de "OK" tienes que añadir esta linea para ver que devuelve el TPV a tu Web.

print_r($miObj); //DEBUG

Teniendo en cuenta que la variable $miObj es la que corresponde con:
$miObj = new RedsysAPI;


Solo puedes recuperar las variables que te saldrán en el array que recuperes con el "print_r". Si quieres recuperar otras variables, tienes que primero guardar tus datos antes de la transaccion en una base de datos locla y luego al recibir el OK del TPV volver a recupererlar de tu base de datos local....

Gracias por leer mi blog y espero que te sirve de ayuda.
Responder
Rodrigo
# Rodrigo 29-11-2017 16:19
Muchas gracias a ti,
voy a probar esto que me dices a ver si lo soluciono y veo si me devuelve bien los datos, ya que hablé con el servicio técnico y me dijeron que estaban devolviendo los datos que necesito.

Un saludo!!
Responder
Rodrigo
# Rodrigo 29-11-2017 17:41
Buenas de nuevo!!
si me devuelve esto:
RedsysAPI Object ( [vars_pay] => Array ( ) )
¿quiere decir que me llega vacio el Array?
O tendría que recorrerlo de alguna manera especial.

Un saludo
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 29-11-2017 17:49
Hola:

Si todo está bien, ese array llega vacío.

Por ejemplo en mi caso, si descomento la línea de debug y hago una operación me llega esto:

RedsysAPI Object ( [vars_pay] => Array ( [Ds_Date] => 27%2F11%2F2017 [Ds_Hour] => 12%3A43 [Ds_SecurePayment] => 1 [Ds_Amount] => 30000 [Ds_Currency] => 978 [Ds_Order] => 171127124141 [Ds_MerchantCode] => 335678939 [Ds_Terminal] => 001 [Ds_Response] => 0000 [Ds_TransactionType] => 0 [Ds_MerchantData] => [Ds_AuthorisationCode] => 562946 [Ds_ConsumerLanguage] => 1 [Ds_Card_Country] => 724 [Ds_Card_Brand] => 1 ) )


Un saludo
Responder
David
# David 22-02-2018 16:02
lo he descomentado y me lo llega igual vacío
Responder
David
# David 22-02-2018 15:37
Hola Raúl!

Gracias por tu explicación.

Lo que pasa es que no entiendo que me devuelva redsys a validacion.php para comparar los datos de compra con los datos de que anteriormente se añadieron a la base de datos.

Gracias.
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 22-02-2018 16:07
Hola David:

El código que he publicado (y la explicación) en este tutorial, es para integrar en PHP un sencillo formulario con la pasarela de Pago de RedSYS TPV.

Si te fijas en la página (6 de 51) de la APi de redsys:

https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf

apartado "Descripción general del flujo", se puede ver el flujo que deben seguir las transacciones. En el ejemplo de este tutorial, se estan haciendo los pasos: 1, 2 y 4 (saltándonos el paso 3 de la notificación online).

Voy a explicarte un poco como funciona, y asi le puede servir también a otras personas:

Paso1: El usuario entra en el formulario y/o tienda online, rellena formulario de compra/pago y le da a ENVIAR/OK.

Paso2: Los datos son enviados a la API de RedSYS y valida los datos. El usuario mete los datos de su tarjeta de crédito y le da a PAGAR.

Paso3: (Notificación Online) El resultado del pago Redsys lo envia automáticamente en una petición POST HTTP a la URL que tengamos configurada en:

$urlMerchant = 'http://www.raulprietofernandez.net/tpv/validacion .php'; // URL DEL COMERCIO CMS

Por tanto, si quieres guardar el resultado de la transacción debes recoger ese POST que envía RedSYS a tu URL y guardarlo (en base de datos , txt, o lo que tu quieras)

Paso4: Una vez el pago se hace OK ó FALLA, el usuario hará click en "OK/CERRAR" y se le redirigirá a la $url_ok o a la $url_nok. El usuario también puede cerrar la ventana del navegador, pero en el paso 3 RedSYS ya habrá enviado a nuestro CMS el resultado del pago.


Por tanto el paso número 3 es el que nos garantiza que el pago se ha hecho (bien o mal) en función de los datos que recojas del POST que envia RedSYS.

La $urlMerchant es la url de tu fichero PHP encargado de procesar el POST y "hacer lo que tu quieras con él". Realmente en este tutorial la variable está configurada, pero como puedes ver no hay nada relativo a ella porque digamos que forma parte del CMS encargado de recibir el estado del pago.

Hacer un tutorial de toda esa parte sería escribir un libro, ya que es un CMS "completo" por muy sencillo que queramos hacerlo... :)

Por ejemplo hice hace unos meses un pequeño CMS donde si implementé todos esto pasos. El cliente queria gestionar usuarios y los cobros y su estado....

Sin el paso 3, el estado de los pagos en el CMS y en el TPV de RedSYS puede estar diferentes.
Con el paso 3, deben estar en el mismo estado (pagado/no pagado/error...) la misma transacción.

www.raulprietofernandez.net/blog/webs/nueva-web-con-tpv-redsys-y-control-de-pagos

Esspero haber resuelto tu duda.

Un saludo
Responder
Frederick
# Frederick 10-04-2018 17:17
Buenas tardes, tengo una inquietud con este código, al momento de ver los datos que arroja el TPV de Redsys a la pagina ok.php me salen varios errores. Sera que hice mal esa pagina? (ok.php). Como debería ser el cogido de dicha pagina?
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 10-04-2018 17:33
Hola Frederick:

Pues realmente la url de ok.php y la de no-ok.php no son nada importantes, y me explico.

Cuando un usuario hace el pago en la Web de ResSys y sale bien, se muestra un botón al final "OK/ACEPTAR". Si el usuario hace click va a la página de OK.php donde podemos mostrar cualquier mensaje, desde un simple "ok" hasta una web muy elaborada y bonita.

Lo mismo para el caso del no-ok.

Si lo que tu quieres es recoger lo que devuelve RedSYS , es la variable $urlMerchant. RedSys envia un POST nada mas hacer la transacción (sea válida o de error) y nosotros tenemos que recoger los datos y esa web hay que crearla ( no está explicado en este tutorial).

Si buscar por internet, hay tutoriales en PHP para "recoger" los datos de un array POST (ahora mismo no lo recuerdo de memoria), pero RedSYS envia un array de datos con la transacción, fecha, resultado y poco mas ..... eso lo puedes recoger y guardar en BBDD.


Saludos
Responder
Ral Prieto Fernndez
# Raúl Prieto Fernández 10-04-2018 17:36
Por cierto ! Se me olvidó comentarte, échale un ojo al flujo de las transacciones en la página 6 de 51 de la API de RedSYS

https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf.
Responder
Jota
# Jota 03-09-2018 18:57
Hola Raúl!, vi tu script hace unos meses y lo configuré genial, gracias! ahora estoy probando a recoger los datos que devuelve por Post para hacer una tabla parecida a la tuya con los pagos y hago lo siguiente:

$sql = "INSERT INTO pagos (fecha, hora, precio)
('$_POST[Ds_Currency]','$_POST[Ds_Hour]','$_POST[Ds_Amount]')
";

Pero no guarda nada, he probado de varias maneras y mirando en la web de servired, las notificaciones que muestra para http son:
Ds_SignatureVersion=
Ds_MerchantParameters=
Ds_Signature=

Mientras que si veo la que envía por correo da todas
Ds_TransactionType:; Ds_Card_Country; Ds_Card_Brand: Ds_Date:Ds_SecurePayment:1; Ds_Order:e; Ds_Hour:22:19; Ds_Response:0000; Ds_AuthorisationCode:Ds_Currency:; Ds_ConsumerLanguage:1; Ds_MerchantCode:; Ds_Amount:1000; Ds_Terminal:; Server URL: sis-t.redsys.es

Sabes qué puede fallar?
Da una respuesta HTTP 200, entiendo que está bien
Un saludo y gracias de antemano
Responder

Escribir un comentario

Información básica sobre Protección de Datos

Responsable: Raúl Prieto Fernández +info

Finalidad: Moderar los comentarios a los artículos publicados en el blog. +info

Legitimación: Consentimiento del interesado +info

Destinatarios: No se comunicarán datos a persona u organización alguna. +info +info

Derechos: Tiene derecho a Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la información adicional. +info

Plazo de conservación de los datos: Hasta que no se solicite su supresión por el interesado.

Información adicional: Puede consultar la información adicional y detallada sobre Protección de Datos Personales en mi página web raulprietofernandez.net +info

Código de seguridad
Refescar


LOGIN / ENTRAR

BUSCAR EN EL BLOG

TWITTER TIMELINE

Booking.com

ENCUESTA

¿Cual es el mejor Sistema Operativo?

Como es lógico, esta web utiliza cookies propias y de terceros para elaborar información estadística y mostrar publicidad personalizada a través del análisis de tu navegación, conforme a la política de cookies.

  Si continúas navegando, aceptas su uso.