Problèmes de connexion SOAP après la mise à jour 1.9.3.0

12

J'ai mis à jour ma boutique Magento de 1.9.2.4 à 1.9.3.0

Nous utilisons un logiciel d'expédition (Shipworks) qui se connecte via un utilisateur SOAP / XML-RPC.

Après la mise à jour, la journalisation shipworks affiche cette réponse dans les journaux:

<?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>

Je suis donc allé et activé la journalisation des exceptions dans Magento et j'ai obtenu l'erreur suivante:

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}

Je suis donc allé faire un diff entre le Abstract.php de 1.9.2.4 et 1.9.3.0 et obtenir ce qui suit:

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;

Toute aide serait appréciée.

LandonL
la source

Réponses:

14

Même erreur avec une autre extension ici. system.log dit

L'argument 1 passé à Mage_Api_Model_Server_Handler_Abstract :: processingMethodResult () doit être du type tableau, chaîne donnée, appelée dans app / code / core / Mage / Api / Model / Server / Handler / Abstract.php ...

Je pense que le problème est la nouvelle méthode

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

qui accepte uniquement les tableaux. Ainsi, chaque fonction Api renvoyant une valeur scalaire générera cette erreur. Pour obtenir ce nouveau i va copier app/code/core/Mage/Api/Model/Server/Handler/Abstract.phpà app/code/local/Mage/Api/Model/Server/Handler/Abstract.phpet patché 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;
}
Belgor
la source
quelle version de magento utilisez-vous?
LandonL
Cela résout le problème. Pourquoi le fichier core de magento serait-il changé en tableau vs chaîne de toute façon ici?
LandonL
Excellente solution, merci. Quelqu'un a-t-il signalé cela comme un bug avec Magento? Beaucoup de gens vont se faire mordre par ça.
BlueC
Le changement concerne davantage PHP7, voir ma réponse ci-dessous. De plus, stackoverflow.com/a/4103536/158325 ce n'est pas vraiment un bug, mais rend l'API PHP7 compatible.
B00MER
1
@LandonL: J'ai mis à jour de 1.9.2.4 à 1.9.3.0.
Belgor
1

Il est plus que probable que le module ShipStation et / ou la version PHP que vous utilisez ne sont pas compatibles:

Deviner le message d'erreur PHP tronqué qui est retourné:

Argument 1 pass...' est le plus probable Argument 1 passed to methodhere() must be an instance of string, string given

Quelle version de PHP utilisez-vous et avez-vous consulté ShipStation pour voir s'ils ont des problèmes de version et / ou de compatibilité plus récents avec les derniers correctifs / versions de Magento.

En outre, vous pouvez ajouter un peu plus de journalisation ici: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889 pour capturer davantage de l'erreur PHP tronquée qui est retourné, pour obtenir la validation qu'il s'agit de l'erreur correcte renvoyée.

J'espère que cela t'aides.

B00MER
la source
Comment pourrais-je obtenir plus de l'erreur tronquée? Je ne sais pas comment augmenter la longueur de la ligne.
LandonL
Le système exécute actuellement php 5.6.25, j'ai appelé shipworks aujourd'hui, mais depuis que la mise à jour magento 1.9.3.0 vient de sortir hier, je ne pense pas qu'ils aient encore eu l'occasion d'examiner le problème.
LandonL
1

La réponse des Belges m'a vraiment aidé, mais j'ai fini par modifier légèrement le correctif pour permettre l'inclusion d'objets supplémentaires dans le référentiel d'API.

Par exemple, vous obtenez désormais des matrices d' objets de stockage et / ou de carte - cadeauWorks avec l'appel Magento XML-RPC pour obtenir des informations sur la commande.

(code mis à jour à partir de la suggestion de Björn Tantau - pour mieux travailler avec les objets et les collections)

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
la source