Postponed (maintainer needs more info)
Project:
Mercado Pago Payment
Version:
7.x-2.1-alpha2
Component:
Code
Priority:
Minor
Category:
Bug report
Assigned:
Unassigned
Reporter:
Created:
30 Jun 2015 at 15:43 UTC
Updated:
12 Sep 2016 at 19:22 UTC
Jump to comment: Most recent
Comments
Comment #1
jrviorato commentedHola Akanelson,
Hice una prueba con la opción de pago Completing the checkout process, y parece que sí se ejecuta aún cuando el el cobro es en USD y el pago es en ARS. ¿Me podrías dar más detalles de cuál regla no se ejectecuta en el evento Completing the checkout process?
Por cierto, muchas gracias por todo tu apoyo.
Saludos
Jesús
Comment #2
drupal-son commentedJesus, simplemente lo que hago es crear 2 nuevas reglas (si quieres tambien puedes desactivar temporalmente cualquier otra que se dispare antes esos eventos para evitar cualquier confusion).
1. Nueva regla que se dispare en el evento "Completing the checkout process", sin condiciones, y a lo sumo con una acción para que despliegue un mensaje en pantalla para identificar que se ejecuto el evento.
2. Nueva regla que se dispare en el evento "When an order is first paid in full", sin condiciones, y a lo sumo con una acción para que despliegue un mensaje en pantalla para identificar que se ejecuto el evento.
Si genero una orden de un producto en $ARS, la regla "Completing the checkout process" se dispara correctamente.
Pago con MP en $ARS y el saldo de la orden queda en 0 $ARS.
Si genero una orden de un producto en $USD, la regla "Completing the checkout process" se dispara correctamente.
Pago con MP en $ARS al cambio del día y el saldo de la orden queda en 0 $USD.
En ninguna de las 2 ordenes se disparo el evento "When an order is first paid in full".
La idea es que esta regla que se dispara en dicho evento sea la responsable de cambiar el estado de la orden de "pending" a "completed" + el resto de las reglas de negocio asociadas.
Aqui te dejo los export de ambas reglas:
Comment #3
jrviorato commentedHola Akanelson,
Disculpa que tardara en contestar, hasta hoy tuve la oportunidad de revisar esto.
FIjate que revisé tu regla "When an order is first paid in full", pero me di cuenta que NO hay forma de verificar que sí se ejecutó. Esto pues tu regla manda un mensaje a pantalla del usuario; pero la forma en que drupal determina al usuario al que se le desplegará el mensaje es siguiendo el proceso de ejecución del PHP, en este caso el usuario que provoca la ejecución del código (el código que finalmente ejecuta el evento) es MercadoPago cuando éste visita tu página para notificarte que se pagó la orden, es a él al que Drupal intentará mostrar el mensaje, no a ti que estás pagando en la página.
Escribí otra regla para que ahora en lugar de desplegar un mensaje, mande un correo y así verficar que se dispare el evento. Esta es la regla que quedó.
A mi me terminó mandando un correo incluso antes de llegar a la página de completado (en el proceso de compra).
Por otro lado, leí varias veces tu comentario y entiendo que no tienes problema con la regla "Completing the checkout process". ¿Es correcto o te faltó poner un "NO se dispara correctamente" en alguna parte?
Si confirmas que la regla anterior te funciona, avísame para cambiar estatus del Issue.
Saludos y nuevamente gracias por tu revisión.
Jesús
Comment #4
drupal-son commentedJesus, no hay error, la regla de checkout complete se ejecuta correctamente.
Hice el cambio de la regla de first paid in full para que envie mail y ademas cambie el estado de la orden a complete.
Cuando la orde se emite en $ARS y MP cobra en la misma moneda que la orden, la regla se ejecuta, el mail se envia y la orden cambia a estado complete.
Cuando la orden se emite en $USD y MP cobra en $ARS, la regla no se ejecuta.
Incluso probe usar otra forma de pago para cuando la orden es en $USD, en este caso, pague con el sandobox de paypal que por supuesto simulo el pago en la misma moneda que la orden y en ese caso si se ejecuto la regla correctamente.
Es decir, que otras formas de pago, pagando ordenes en moneda $USD funcionan como es esperado, pero mercado_payment aparentemente no estaria ejecutando el evento first paid in full.
Es posible que en tus pruebas estes usando la misma moneda?
Puedes probar habilitar la moneda U$D, crear un producto con esa moneda y generar una orden en dolares pero tratar de pagarla con MP argentina ?
Si no puedas generar los tokens para argentina avisame y te envio los mios de sandbox por privado.
Al menos, trata de probar usar el sandbox de mercadopago pagando en $MX a ver si se comporta igual que pagando con $ARS.
Saludos
Comment #5
jrviorato commentedHola Akanelson,
Hice la prueba y efectivamente no se ejecuta la regla. Pero creo que este problema no tiene solución obvia.
Según entiendo, la regla debería ejecutarse cuando la orden fue pagada por completo. El problema ocurre cuando al pagar en otra moneda Drupal Commerce no sabe si el pago fue cubierto en su totalidad, por lo que Drupal lo marca como que no se debe nada, pero no manda ejecutar la regla de pagada por completo. Puedes hacer la prueba con otros módulos como, Payment Method Example, e intentar pagar una cantidad en USD con otra cantidad en ARS y te marcará como que no se debe nada pero la regla no se ejecutará.
Ahora, lo ideal sería hacer lo que hace PayPal, que realiza toda la operación en USD y si requiere hacer conversiones a ARS las hace, pero de eso no se entera la tienda. De tal manera que su notificación IPN llega a la tienda en la cantidad original USD.
El problema con MercadoPago es que en lugar de cobrar en USD, transforma el cobro a pesos y sigue el resto de las operaciones de la misma manera y el mayor problema es que la notificación de pago IPN llega ahora en pesos (ARS). No he enontrado manera de pedirle a MP que me diga la cantidad original en USD, he buscado en su API y no aparece. Probablemente no existe manera.
El módulo mercado_pago_payment no le queda otra más que guardar la notificación tal cuál llegó. Podría intentar convertir esa cantidad de vuelta e USD, sin embargo, es muy probable que mi conversión no coincida exactamente con la cantidad original de la orden (ya que podría estar usando un tipo de cambio distinto al que usó MP).
Otra posiblidad es que al yo detectar qué orden es la que se paga, pues usar la cantidad original de la orden. Sin embargo esto podría dar espacio a algún tipo de fraude. Como por ejemplo, que la gente use un medio de pago, como deposito en tiendas y pague una cantidad menor, MP me notifica a mi de que llegó un pago para la orden y yo al no saber convertirla de vuelta a USD la marque como pagada por completo.
Otra posibilidad, implica utilizar un módulo de Drupal, que se llama Commerce Multicurrency, que su intención es convertir la orden a pagar en la moneda que el usuario desea pagar. En este caso creo que se podría configurar para que convierta todos los precios de USD a ARS. Luego, cobrar la orden en ARS, de tal manera que la conversión de USD a ARS ahora esté en nuestras manos y no en las manos de MP. La notificación IPN de MP llegará entonces en ARS, pero nosotros únicamente debemos checar que coincida con la conversión hecha por Multicurrency y quedaría listo.
¿Cómo ves? Si gustar puedo explorar más sobre el uso de Multicurrency para ayudarte a resolver el problema en cuestión.
Saludos
Jesús
Comment #6
drupal-son commentedPues no estoy seguro de avanzar con la propuesta de multicurrency.
En particular, yo tengo productos definidos en USD y en ARS.
Los de USD deberian usarlos solo los extranjeros y los que estan en ARS es para los Argentinos.
En principio, lo que voy a hacer, es que la regla que determina las formas de pago a usar, seleccione solamente paypal para cuando la monda del producto sea USD y mercado_payment para cuando sea ARS. Imagino que debo poder armarlo de esa manera. Cuando ambas monedas coinciden, la regla se ejecuta bien.
Me llama mucho la atencion el comportamiento actual que describes, y tiene sentido, pero es raro que nadie haya tenido este problema.
En general, el evento de first paid in full es sumamente importante ya que otras reglas de negocios vienen atadas a ese evento. Practicamente la forma mas segura de entragar el producto/servicio adquirido en la tienda, se hace cuando la orden pasa a ese estado.
Como ha funcionado esto en otro paises con otras monedas distitnas a la moneda de origen del producto ? Que acaso nadie necesita depender del first paid in full ?
Que sucede si intentamos contactar al maintainer del commerce, Ryan Szrama, para ver cual es la forma correcta de encarar esto ?
O tambien a la gente de MercadoPago para ver si se puede acceder al monto y moneda original ? Esto tiene sentido poder accederlo.
Que opinas ?
Saludos,
Ariel
Comment #7
drupal-son commentedBueno, la regla de seleccion de formas de pago la pude hacer y funciona muy bien cuando en el carrito hay solo 1 item.
Pero descubri algo aun mas feo, si en el carrito pongo 2 items, unos en ARS y otro en USD, la suma total de la orden es en una sola moneda, o sea, suma los valores linealmente como si fueran todos de la misma moneda, esto es muy grosero.
No creo que ese caso de uso no este cubierto, debe haber algo para manejar esto de alguna forma elegante que no estamos viendo.
Comment #8
jrviorato commentedHola Ariel,
Pues siento que mucha gente no tiene este problema pues es raro el que desea mandar productos al extranjero. Y cuando esto ocurre, es mejor una opción de pago internacional como PayPal que una opción de pagos latinoamericana como MercadoPago. Por eso es la primera vez en 3 años que escucho a alguien con este problema.
Sería bueno saber cómo tienen contemplado este problema del Multicurrency los de Drupal Commerce. Pero en general me parece que PayPal es el sistema de pagos que está pensado para esta cuestión de compras entre naciones, y MercadoPago no tiene esta versatilidad. Como este sistema de pagos está pensado para MercadoLibre funcionan bajo la idea de que sólo se usará para transacciones locales en la moneda local. Creo que antes aceptaban USD pero lo removieron de MercadoLibre.
Yo creo que si le preguntamos a Szrama nos dirá que el problema está en MercadoPago; pues no notifica la cantidad correctamente. Por lo que creo que lo mejor es preguntarles a los de MercadoPago primero.
Por cierto, ¿has intentado usar los módulos de MercadoPago oficiales para plataformas como OpenCart? ¿Sabes si funcionan correctamente con múltiples tipos de moneda? Sugiero intentarlo, yo en su momento revisé sus módulos y no vi mucha diferencia con este, así que no esperaría que actuaran muy diferente; aunque la plataforma (OpenCart) podría darnos sorpresas.
Saludos
Jesús
Comment #9
jrviorato commentedPerdon Ariel,
Sí, se me hace que ahí la mejor opción es Multicurrency. Para manejar productos en varios tipos de moneda y venderlos en una sóla orden. Es lo único que he encontrado para este problema.
Esta parte sobre precios en diferentes monedas es un asunto de DrupalCommerce y sí está considerado. Mira aquí: https://drupalcommerce.org/user-guide/shopping-cart-and-multicurrency
Recomiendan el módulo Multicurrency.
Saludos
Jesús
Comment #10
matcorrao commentedEstimados:
Confirmo que el evento "When an order is first paid in full" no se está ejecutando en ninguna manera. En mi caso, sólo tenemos productos en ARS y Mercado Pago es la única opción disponible para pagar.
Me suscribo.
Desde ya, muchas gracias!
Comment #11
jrviorato commentedHola matcorrao,
Podrías darnos más detalles, ¿Cómo haces para saber que no se ejecuta el evento ""When an order is first paid in full"? Imagino que tienes una regla que debería hacer algo cuando ocurra tal evento y no hace lo que debería, ¿podrías pasarnos dicha regla? (Únicamente la exportas y nos copias el contenido del exportado)
Si tu problema no está relacionado con USD, entonces deberías iniciar otra discusión. Pues el problema en esta discusión era de manejo de varias monedas y cuando le pagaban en USD no se procesaba correctamente. Entonces, tu problema es distinto.
Agradecería que plantearas tu problema nuevamente en otra discusión y aprovecharas para anexar los detalles que te solicito al inicio.
Saludos,
Jesús
Comment #12
jrviorato commentedComment #13
facuchaer commentedBuenas, estoy teniendo el mismo inconveniente con la conversión de dólares a pesos.
qué les parece esta solución:
en drupal está el monto en dolares, por lo que al volver la compra antes de poner payment successful podría validar contra las api de mercado libre si el monto cobrado en pesos (devuelto por el payment) es igual a lo registrado en la order convertido según las api de mercadopago. pudiendo poner granularidad de minutos para poder saber exactamente si es monto correcto. también podría validar otros campos para verificar que no haya fraude. mail, ip, domicilio, etc. si todo está correcto ejecuta el evento paid in full.
necesito trabajar sobre este requerimiento, por lo que si les interesa y les parece bien el modelo, podría subirlo y solucionar este gap entre drupal y MP.
el proceso sería el mismo que el actual, salvo que antes de poner el payment como "Success":
1. obtengo el monto de la order.
2. obtengo la moneda del payment.
3. obtengo la fecha de MP:
[date_created] => 2016-08-17T15:12:28.000-04:00
[date_approved] => 2016-08-17T15:12:27.000-04:00
[money_release_date] => 2016-08-31T15:12:27.000-04:00
4. consulto a mp la conversión para esa fecha.
5. valido varios criterios para evitar fraude, con ellos el monto.
6. si todo está ok ejecturo evento paid in full.
qué les parece?
Comment #14
jrviorato commentedHola Facuchaer,
La idea suena interesante, hay algunos pasos que no estoy seguro de que se puedan lograr con la API de mercadoPago, como es el caso de consultar la conversión a la fecha; sería cosa de hacer las pruebas. Me gustaría ver el código, y ya en concreto podría decir más.
Por otro lado, creo que esto aún no resuelve el problema original de Akanelson. El quería que a los extranjeros se les cobrara en Dlls, y el problema era que MercadoPago convierte el cobro a ARS. Entonces, ya que lo pienso de nuevo, me surge la duda ¿cuál es el punto de poner precios en USD si MP les cobra en ARS? Aún aunque alguien tuviera una razón para esto, el comprador encontraría una discrepancia entre lo que costaba el artículo y lo que pagó por él, resultado de la conversión de USD a ARS (por parte de MP) y de ARS a USD cuando el usuario page con sus cuenta en USD.
Con esto en mente, ¿cuál sería el punto de poner precios en USD y cobrar con MP? Se me ocurre que tal vez alguien quiere que sus precios se actualizen de acuerdo con la cotización del dolar. En tal caso, los cambios que propones solucionarían ese problema. Pero me pregunto, ¿no será que ese problema ya lo resuelve commerce multicurrency ?
¿Qué opinas?
Saludos
Comment #15
facuchaer commented@jrviorato El tema de poner los precios en USD es que acá por ejemplo en argentina, el cambio es constante... y hay que estar constantemente modificando los precios según la cotización diaria. Otra cuestión es que sería para varios paises de latinoamerica, por lo que el inconveniente se multiplica.
Caso contrario hay que estar actualizando los precios de todos los paises de todos los productos, lo cual es bastante tedioso.
El de commerce currency es buena idea, tendría que implementar los tipos de cambio con mercado pago, para que no haya diferencias de cotizaciones.
En fin, terminé poniendo por el momento los precios en Args por cuestiones que lo necesitaban para ayer.
Comment #16
facuchaer commented