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: Manual integración para conexión por Redirección.pdf
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.
Formulario de Pago
En esta siguiente ilustración se ven los datos correctamente cumplimentados. Haremos click en "IR AL PASO 2":
Formulario 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:
Datos 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 La Caixa
A continuación, nos pide el código de identificación de nuestra tarjeta que introduciremos y aceptaremos:
Aceptar 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:
Pago 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



ENJOY!
Comentarios
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!
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
- 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!
- 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
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!
Espero tu actualización.
Saludos!
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 :)
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
<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!
Muchas gracias,
Un saludo.
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
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!!!
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.
Gracias
Muy buen post!
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 :)
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!.
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
Ya te envie el correo con el archivo tal y como me pediste.
De nuevo, mil gracias.
Saludos!
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
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
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
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
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.
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
Mira a ver si lo entiendes y cualquier cosa me dices!
un saludo
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
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
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.
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!!
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
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
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.
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
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
https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf.
$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
Perdona por la tardanza, ¿conseguiste recoger los datos del POST?
Saludos
Me funcionó de maravilla.
Ahora recojo los datos y puedo grabarlos en mi BBDD para tener un control exhaustivo de los pagos.
Muchas gracias.
Me alegra muchísimo que lo hayas conseguido poner a funcionar!
Un saludo
se entiende que la respuesta que da redsys para un pago positivo son dos una get y otra post para la misma url no?
el post se envia apena se verifica el pago y la get cuando se le da en el boton "OK/CERRAR" no?
el post para verificar el pago sea cual sea el sitio y la get para redireccionar ?
Cuando un cliente hace un pago a través de una pasarela de RedSys, si el pago sale BIEN ó SALE MAL, RedSys envía un POST de forma transparente con el resultado a nuestra URL configurada en url_merchant, y tenemos que recoger dicho POST para procesarlo en nuestro CMS o sistema que tengamos implementado.
Las páginas de OK y NO-OK, son solamente para cuando finalizan los pasos y el usuario haga click en ACEPTAR ó SALIR y se le redireccione a la página de OK ó NO-OK que hayamos creado, pero el pago ya se ha hecho (bien ó mal), indistintamente si el usuario hace click en el botón, ó cierra la ventana del navegador.
En el PDF de la API, punto 2 se ve el flujo que se sigue:
https://canales.redsys.es/canales/ayuda/documentacion/Manual%20integracion%20para%20conexion%20por%20Redireccion.pdf
Respondí al usuario Jordi en como se debe recoger dicho POST. Dale un vistazo a esas respuestas a ver si te sirven :)
Saludos
He estado revisando la APi de RedSys y parace que para Paygold funciona de manera diferente, por lo que entiendo que el método explicado en esta web, que es le método general no funcione ...
No dispongo de ningún TPV ni acceso a RedSys asique no podría probar nada en estos momentos.
Saludos
Te respondí en el comentario anterior. Ahora mismo ya no dispongo de cuenta ni acceso a RedSYS para poder probar la API, asique no puedo probar nada :(
Sorry