mercadopago / DEPRECATED-sdk-php

DEPRECATED - MercadoPago PHP SDK
MIT License
1 stars 10 forks source link

Problema con Notificaciones de pagos (IPN) 2.0 #26

Open hittten opened 9 years ago

hittten commented 9 years ago

Entiendo perfectamente que hay que tener una url publica configurada, por ejemplo: http://www.yoursite.com/notifications

En donde mercadopago envia los siguientes datos: topic = payment id = identificador-de-la-operación

Ahora bien por lo que se lee en la documentación solo se puede tener una URL publica definida en nuestra cuenta de mercadopago. Si tengo dos aplicaciones web que se gestionan con la misma cuenta de mercadopago no puedo tener 2 URL publicas definidas, una para cada aplicacion.

Pero no pasa nada, resulta que en la API de mercadopago puedes definir una url tal como lo dice aqui: https://developers.mercadopago.com/documentacion/api/preferences basta con definir el siguiente parámetro: "notification_url": "https://www.your-site.com/ipn".

Imaginemos el siguiente escenario: dos aplicaciones web:

Ambas con sistemas en php diferentes que pertenecen a la misma empresa, la cual quiere gestionar los pagos con la misma cuenta de mercado libre. Entonces tenemos una URL publica definida en la cuenta de mercadopago para la "app1.domino.com/notificaciones", que se define aqui: https://www.mercadopago.com/mlv/herramientas/notificaciones, y para la "app2" en el objeto php en el array de $preference_data definimios "notification_url": "app2.dominio.com/notificaciones".

Luego tenemos nuestro archivo php que recibe los datos tal como se muestra en el siguiente ejemplo: https://github.com/mercadopago/sdk-php/blob/master/examples/instant-payment-notifications/receive-ipn.php, llamemoslo "ipn.php", para fines explicativos.

Perfecto hasta ahora todo bien. Pero cuando empezamos a realizar las pruebas con sandbox, en app2 nos encontramos con lo siguiente:

Al momento en que el usuario hace clic en el boton pagar recibimos el siguiente get: Array ( [topic] => merchant_order [id] => 646XXXXX )

Donde en nuestro archivo ipn.php de app1 salta una excepcion que hemos capturado con el siguiente mensaje "not found", donde esa ID que empieza por 64 no se parece en nada a lo que deberia ser 14XXXXXXXX

Al momento en que el usuario realiza el pago simplemente no llega nada a ipn.php, pero si tomo el colection_id que me genera el mercadopago al momento de pagar, y lo paso manualmente a ipn.php entonces funciona, la exception no salta y puedo ver la información. Pero pago otra cosa mas extraña si analizo el campo "payer" el array no se parece en nada al que le mandé inicialmente en mi array $preference_data, donde defino:

"payer" => array( "name" => "nombre", "surname" => "apellido" )

llega algo como esto:

"payer" => array( "first_name" => null, "last_name" => null )

Tampoco llegan los items definidos. ni las variables como deberían ser segun la documentacion.

Ahora bien preguntas y dudas:

Quisiera saber si no esta soportado por el SDK-PHP tener una URL public definica en la cuenta y al mismo tiempo el atributo "notification_url" de $preference_data.

Gracias

fernandovn commented 8 years ago

Yo tengo las mismas dudas y problemas, ¿Pudiste solucionar o encontrar más información al respecto?

Saludos,

hittten commented 8 years ago

no, tuve que hacer otra cosa, para manejar todo manualmente. Y ahora mismo no recuerdo que, esto fue hace dos años.

Tal vez el SDK ahora esté mucho mejor.

gemins commented 7 years ago

Gente, si arman sus propios references desde la api, pueden asignar la url de acceso del IPN segun lo comenta la documentación.

Create preference POST /checkout/preferences

Valor: notification_url

Lo que me esta pasando a mi es que no me deja meter ninguna URL todas me dan error:

La URL ingresada no responde un HTTP status correcto. Debe responder 200 o 201.

Si alguno esta al tanto de cual puede ser el problema, se los agradecería.

dgrosso commented 7 years ago

@gemins me pasaba lo mismo, y viendo el access log me di cuenta que era un problema de que mandan la request por POST, y en ningún lugar de la documentación lo dice.

@imasson te taggeo en la respuesta porque sos el único que respondió a un tema reciente al respecto. Por favor actualicen la documentación!!

gemins commented 7 years ago

Si es una boludes. Es método es POST no GET, cambialo en el Route del frameworl y vas a ver que anda. Igual lo resolví de otro modo usando el modal de ellos para el pago y al regresar después de terminar el pago me devuelve el ir del pago. Ahí pego contra la api y listo. Abrazos.

El 24/2/2017 8:06 AM, "Daniel Grosso" notifications@github.com escribió:

@gemins https://github.com/gemins me pasaba lo mismo, y viendo el access log me di cuenta que era un problema de que mandan la request por POST, y en ningún lugar de la documentación lo dice.

@imasson https://github.com/imasson te taggeo en la respuesta porque sos el

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/mercadopago/sdk-php/issues/26#issuecomment-282265847, or mute the thread https://github.com/notifications/unsubscribe-auth/ALkQg9QyNfCQjAyzPeXkqpywgDM9nmg5ks5rfrmpgaJpZM4CsjBz .

imasson commented 7 years ago

Gracias @dgrosso

Saludos!

gemins commented 7 years ago

@dgrosso ahora entiendo que vos me respondiste a mi, pero me llego un mail con un mensaje tuyo preguntandome si lo solucione, aun que no veo la pregunta aca, justo en otro foro había puesto esto mismo que me dijiste: https://groups.google.com/forum/#!topic/mercadopago-developers/qvZTWF14z5M El tema del metodo POST me di cuenta debugueando la respuesta tambien.

Por otro lado, el tema de hacer que sean distintos los endpoints es por medio del campo notification_url, ese es el que va a utilizar MP para enviar el aviso del pago.

Tiene que crear los métodos de pago dinámicamente con sus framework y funciona perfectamente.

Otra posibilidad, que use yo, es instalar el sistema de apertura del bloque de pago con Modal, una función javascript que brinda MercadoPago también entre sus librerías. Este modal es el único que tiene un callback, al terminar el pago y cerrar el modal, se puede llamar a una función y leer la variable de respuesta con el ID de pago y demás. Con esto lo que hago es hacer un envio al API y confirmar el pago por mi cuenta, de igual modo (por si algo falla) el IPN va a comunicar con la API y confirmar el pago, si este no se registro bien después de cerrar el modal, lo confirmo con el IPN.

SALUDOS!