Problemas de conexión SOAP después de la actualización 1.9.3.0

12

He actualizado mi tienda Magento de 1.9.2.4 a 1.9.3.0

Utilizamos software de envío (Shipworks) que se conecta a través de un usuario SOAP / XML-RPC.

Después de la actualización, el registro de shipworks muestra esta respuesta en los registros:

<?xml version="1.0" encoding="UTF-8"?>
-<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
-<SOAP-ENV:Body>
-<SOAP-ENV:Fault>
<faultcode>1</faultcode>
<faultstring>Internal Error. Please see log for details.</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Así que encendí el registro de excepciones en Magento y obtuve el siguiente error:

2016-10-13T18:24:14+00:00 ERR (3): 
SoapFault exception: [1] Internal Error. Please see log for details. in /public_html/app/code/core/Mage/Api/Model/Server/Adapter/Soap.php:196
Stack trace:
#0 /public_html/app/code/core/Mage/Api/Model/Server/Handler/Abstract.php(140): Mage_Api_Model_Server_Adapter_Soap->fault('1', 'Internal Error....')
#1 /public_html/app/code/core/Mage/Api/Model/Server/Handler/Abstract.php(48): Mage_Api_Model_Server_Handler_Abstract->_fault('internal')
#2 /public_html/app/code/core/Mage/Api/Model/Server/Handler/Abstract.php(559): Mage_Api_Model_Server_Handler_Abstract->handlePhpError(4096, 'Argument 1 pass...', '/home/deepsix/p...', 559, Array)
#3 /public_html/app/code/core/Mage/Api/Model/Server/Handler/Abstract.php(299): Mage_Api_Model_Server_Handler_Abstract->processingMethodResult('<?xml version="...')
#4 [internal function]: Mage_Api_Model_Server_Handler_Abstract->call('ca4d34d100c92c8...', 'shipWorksApi.ge...', Array)
#5 /public_html/lib/Zend/Soap/Server.php(889): SoapServer->handle('<?xml version="...')
#6 /public_html/app/code/core/Mage/Api/Model/Server/Adapter/Soap.php(174): Zend_Soap_Server->handle()
#7 /public_html/app/code/core/Mage/Api/Model/Server.php(138): Mage_Api_Model_Server_Adapter_Soap->run()
#8 /public_html/app/code/core/Mage/Api/controllers/SoapController.php(40): Mage_Api_Model_Server->run()
#9 /public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Api_SoapController->indexAction()
#10 /public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('index')
#11 /public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#12 /public_html/app/code/core/Mage/Core/Model/App.php(365): Mage_Core_Controller_Varien_Front->dispatch()
#13 /public_html/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#14 /public_html/index.php(83): Mage::run('', 'store')
#15 {main}

Así que fui e hice una diferencia entre Abstract.php de 1.9.2.4 y 1.9.3.0 y obtuve lo siguiente:

290a291
>                 $result = array();
292c293
<                     return $model->$method((is_array($args) ? $args : array($args)));
---
>                     $result = $model->$method((is_array($args) ? $args : array($args)));
294c295
<                     return $model->$method($args);
---
>                     $result = $model->$method($args);
296c297
<                     return call_user_func_array(array(&$model, $method), $args);
---
>                     $result = call_user_func_array(array(&$model, $method), $args);
297a299
>                 return $this->processingMethodResult($result);
403a406
>                     $callResult = array();
405c408
<                         $result[] = $model->$method((is_array($args) ? $args : array($args)));
---
>                         $callResult = $model->$method((is_array($args) ? $args : array($args)));
407c410
<                         $result[] = $model->$method($args);
---
>                         $callResult = $model->$method($args);
409c412
<                         $result[] = call_user_func_array(array(&$model, $method), $args);
---
>                         $callResult = call_user_func_array(array(&$model, $method), $args);
410a414
>                     $result[] = $this->processingMethodResult($callResult);
544a549,585
>     }
> 
>     /**
>      * Prepare Api data for XML exporting
>      * See allowed characters in XML:
>      * @link http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char
>      *
>      * @param array $result
>      * @return mixed
>      */
>     public function processingMethodResult(array $result)
>     {
>         foreach ($result as &$row) {
>             if (!is_null($row) && !is_bool($row) && !is_numeric($row)) {
>                 $row = $this->processingRow($row);
>             }
>         }
>         return $result;
>     }
> 
>     /**
>      * Prepare Api row data for XML exporting
>      * Convert not allowed symbol to numeric character reference
>      *
>      * @param $row
>      * @return mixed
>      */
>     public function processingRow($row)
>     {
>         $row = preg_replace_callback(
>             '/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]/u',
>             function ($matches) {
>                 return '&#' . Mage::helper('core/string')->uniOrd($matches[0]) . ';';
>             },
>             $row
>         );
>         return $row;

Cualquier ayuda sería apreciada.

LandonL
fuente

Respuestas:

14

Mismo error con otra extensión aquí. system.log dice

El argumento 1 pasado a Mage_Api_Model_Server_Handler_Abstract :: processingMethodResult () debe ser del tipo de matriz, cadena dada, llamada en app / code / core / Mage / Api / Model / Server / Handler / Abstract.php ...

Creo que el problema es el nuevo método.

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

que solo acepta matrices. Por lo tanto, cada función Api que devuelve un valor escalar arrojará este error. Para conseguir este nuevo he copiado app/code/core/Mage/Api/Model/Server/Handler/Abstract.phpa app/code/local/Mage/Api/Model/Server/Handler/Abstract.phpy parcheado processingMethodResult:

public function processingMethodResult($result)
{
    if (is_array($result)) {
        foreach ($result as &$row) {
            if (!is_null($row) && !is_bool($row) && !is_numeric($row)) {
                if (is_array($row)) {
                    $row = $this->processingMethodResult($row);
                } else {
                    $row = $this->processingRow($row);
                }
            }
        }
    } else {
        if (!is_null($result) && !is_bool($result) && !is_numeric($result)) {
            $result = $this->processingRow($result);
        }
    }
    return $result;
}
Belga
fuente
¿Qué versión de magento estás ejecutando?
LandonL
Esto soluciona el problema. ¿Por qué el archivo magento core se cambiaría a array vs string de todos modos aquí?
LandonL
Excelente solución, gracias. ¿Alguien ha planteado esto como un error con Magento? Mucha gente va a ser mordida por esto.
BlueC
El cambio es más sobre PHP7, vea mi respuesta a continuación. Además, stackoverflow.com/a/4103536/158325 no es realmente un error, pero hace que la API PHP7 sea compatible.
B00MER
1
@LandonL: Actualicé de 1.9.2.4 a 1.9.3.0.
Belgor
1

Lo más probable es que el módulo ShipStation y / o la versión PHP que está ejecutando no sea compatible:

Adivinando el mensaje de error de PHP truncado que se devuelve:

Argument 1 pass...' es más probable Argument 1 passed to methodhere() must be an instance of string, string given

¿Qué versión de PHP está ejecutando? ¿Ha consultado con ShipStation para ver si tienen alguna versión más nueva y / o problemas de compatibilidad con la última versión / parches de Magento?

Además, puede agregar un poco más de registro aquí: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889 para capturar más del error de PHP truncado eso se devuelve, para obtener la validación de que es el error correcto que se devuelve.

Espero que esto ayude.

B00MER
fuente
¿Cómo obtendría más del error truncado? No estoy seguro de cómo aumentar la longitud de la línea.
LandonL
El sistema actualmente ejecuta php 5.6.25, llamé a Shipworks hoy, pero como la actualización 1.9.3.0 de magento acaba de salir ayer, no creo que hayan tenido la oportunidad de analizar el problema todavía.
LandonL
1

La respuesta de los belgas realmente me ayudó, pero terminé modificando el parche ligeramente para permitir que se incluyan objetos adicionales en el repositorio API.

Por ejemplo, ahora obtiene el conjunto de objetos de crédito de tienda y / o tarjeta de regalo de aheadWorks con la llamada Magento XML-RPC para obtener información sobre pedidos.

(código actualizado de la sugerencia de Björn Tantau - para trabajar mejor con objetos y colecciones)

public function processingMethodResult($result)
{
    if (is_object($result) && is_callable(array($result, 'toArray'))) {
        $result = $result->toArray();
    }
    if (is_array($result)) {
        foreach ($result as &$row) {
            if (is_object($row) && is_callable(array($row, 'toArray'))) {
                $row = $row->toArray();
            }
            if (!is_null($row) && !is_bool($row) && !is_numeric($row)) {
                if (is_array($row)) {
                    $row = $this->processingMethodResult($row);
                } else {
                    $row = $this->processingRow($row);
                }
            }
        }
    } else {
        if (!is_null($result) && !is_bool($result) && !is_numeric($result)) {
            $result = $this->processingRow($result);
        }
    }
    return $result;
}
Christoffer Bubach
fuente