{"id":43,"date":"2011-07-30T14:43:38","date_gmt":"2011-07-30T14:43:38","guid":{"rendered":"http:\/\/modulosdepago.es\/blog\/?p=43"},"modified":"2011-12-04T16:53:27","modified_gmt":"2011-12-04T16:53:27","slug":"comportamientos-extranos-de-los-modulos-de-pago-de-prestashop-actualizado","status":"publish","type":"post","link":"https:\/\/modulosdepago.es\/blog\/comportamientos-extranos-de-los-modulos-de-pago-de-prestashop-actualizado\/","title":{"rendered":"Comportamientos extra\u00f1os de los m\u00f3dulos de pago de Prestashop (Actualizado)"},"content":{"rendered":"<p>Existe en Prestashop, por lo menos hasta la versi\u00f3n m\u00e1s reciente a d\u00eda de hoy ( Prestashop 1.4.3 ) un extra\u00f1o problema con los m\u00f3dulos de pago. Aunque no se si catalogarlo como bug ser\u00eda lo adecuado.<\/p>\n<p><em>(ACTUALIZACI\u00f3N) Han solucionado el problema en la 1.4.4<!--more--><\/em><\/p>\n<p>\u00bfHab\u00e9is notado alguna vez que a\u00fan funcionando bien un m\u00f3dulo de pago hay raras ocasiones en las que finaliza el pedido con \u00abError de pago\u00bb a pesar de que el pago ha ido bien? \u00bfHab\u00e9is hecho pruebas y hab\u00e9is detectado que el problema s\u00f3lo es reproducible en determinados servidores y con determinados importes en el pedido?<\/p>\n<p>Pues bien, aunque este problema no aflore o no se detecte en todas las instalaciones de Prestashop es algo que puede empezar a ocurrirnos en cualquier momento, y la causa es cuanto menos curiosa, la precisi\u00f3n finita de los n\u00fameros float.<\/p>\n<p>Si rastreamos el error llegaremos a el fichero PaymentModules.php en el m\u00e9todo validateOrder, concretamente a este trozo de c\u00f3digo:<\/p>\n<pre>\/\/ Amount paid by customer is not the right one -&gt; Status = payment error\r\nif ($order-&gt;total_paid != $order-&gt;total_paid_real)\r\n\t$id_order_state = _PS_OS_ERROR_;<\/pre>\n<p>Resulta que aunque $order-&gt;total_paid y $order-&gt;total_paid_real sean el \u00abmismo n\u00famero\u00bb la expresi\u00f3n del if evalua como verdadero. Es m\u00e1s, si hacemos un <strong>var_dump()<\/strong> de ambas variables nos dar\u00e1 el <strong>exactamente mismo resulado para ambas. <\/strong>\u00bfcomo es posible entonces que no sean iguales seg\u00fan el operador != de php?<\/p>\n<p>El quiz es el tipo de la variable y el qu\u00e9 o c\u00f3mo podemos ver realmente el verdadero valor de la variable. Aunque hagamos un var_dump de la variable, que en este caso son de tipo float, lo que veamos es la conversi\u00f3n del valor real de la variable a un tipo string para representarlo en el resultado de var_dump. Esto es lo que nos puede llevar a enga\u00f1o ya que no vemos el valor real que maneja la m\u00e1quina.<\/p>\n<p>Tal y <a title=\"Aviso precisi\u00f3n coma flotante\" href=\"http:\/\/www.php.net\/manual\/es\/language.types.float.php\">como nos avisan en php<\/a> la precisi\u00f3n de los float o n\u00fameros de punto flotante no es infinita. \u00abAs\u00ed que nunca se conf\u00eda en resultados de n\u00fameros flotantes hasta el \u00faltimo d\u00edgito y <strong>nunca se comparan n\u00fameros de punto flotante para igualdad<\/strong>\u00ab.<\/p>\n<p>En Prestashop parecen haber pasado este punto por alto en el trozo de c\u00f3digo indicado anteriormente. De momento nuestra soluci\u00f3n, mientras no propongan otra cosa desde prestashop, es cambiar ese trozo de c\u00f3digo por el siguiente:<\/p>\n<pre>\/\/ Amount paid by customer is not the right one -&gt; Status = payment error\r\nif ((string)$order-&gt;total_paid != (string)$order-&gt;total_paid_real)\r\n\t$id_order_state = _PS_OS_ERROR_;<\/pre>\n<p><em>(ACTUALIZACI\u00d3N) El c\u00f3digo por el que han optado para solucionarlo:<\/em><\/p>\n<pre>if (number_format($order-&gt;total_paid, 2) != number_format($order-&gt;total_paid_real, 2))<\/pre>\n<p>Espero que este post os evite los quebraderos de cabeza que nos ha supuesto este peque\u00f1o detalle a nosotros. Seguramente a lo largo y ancho del c\u00f3digo de Prestashop habr\u00e1 m\u00e1s comparaciones similares pero estando sobre aviso ser\u00e1 m\u00e1s f\u00e1cil detectar el problema.<\/p>\n<p><a href=\"http:\/\/forge.prestashop.com\/browse\/PSCFI-2800\">http:\/\/forge.prestashop.com\/browse\/PSCFI-2800<\/a><\/p>\n<p><a href=\"http:\/\/forge.prestashop.com\/browse\/PSCFI-1477\">http:\/\/forge.prestashop.com\/browse\/PSCFI-1477<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existe en Prestashop, por lo menos hasta la versi\u00f3n m\u00e1s reciente a d\u00eda de hoy ( Prestashop 1.4.3 ) un extra\u00f1o problema con los m\u00f3dulos de pago. Aunque no se si catalogarlo como bug ser\u00eda lo adecuado. (ACTUALIZACI\u00f3N) Han solucionado el problema en la 1.4.4<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[39,6,40,7],"class_list":["post-43","post","type-post","status-publish","format-standard","hentry","category-informacion-varia","tag-float","tag-modulos-de-pago","tag-php","tag-prestashop"],"_links":{"self":[{"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/posts\/43","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/comments?post=43"}],"version-history":[{"count":4,"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/posts\/43\/revisions"}],"predecessor-version":[{"id":173,"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/posts\/43\/revisions\/173"}],"wp:attachment":[{"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/media?parent=43"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/categories?post=43"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/modulosdepago.es\/blog\/wp-json\/wp\/v2\/tags?post=43"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}