SOAP-Verbindungsprobleme nach dem 1.9.3.0-Update

12

Ich habe meinen Magento Store von 1.9.2.4 auf 1.9.3.0 aktualisiert

Wir verwenden Versandsoftware (Shipworks), die über einen SOAP / XML-RPC-Benutzer eine Verbindung herstellt.

Nach der Aktualisierung der Shipworks-Protokollierung wird diese Antwort in den Protokollen angezeigt:

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

Also habe ich die Ausnahmeprotokollierung in Magento aktiviert und die folgende Fehlermeldung erhalten:

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}

Also habe ich einen Unterschied zwischen der Abstract.php von 1.9.2.4 und 1.9.3.0 gemacht und Folgendes erhalten:

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;

Jede Hilfe wäre dankbar.

LandonL
quelle

Antworten:

14

Gleicher Fehler mit einer anderen Erweiterung hier. system.log sagt

Argument 1, das an Mage_Api_Model_Server_Handler_Abstract :: processingMethodResult () übergeben wird, muss vom Typ Array sein, String, der in app / code / core / Mage / API / Model / Server / Handler / Abstract.php ... aufgerufen wird.

Ich denke, das Problem ist die neue Methode

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

das akzeptiert nur Arrays. Jede Api-Funktion, die einen skalaren Wert zurückgibt, löst diesen Fehler aus. Um dies wieder app/code/core/Mage/Api/Model/Server/Handler/Abstract.phpin app/code/local/Mage/Api/Model/Server/Handler/Abstract.phpGang zu bringen, habe ich kopiert und gepatcht 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
quelle
Welche Version von Magento verwenden Sie?
LandonL
Dies behebt das Problem. Warum sollte die Magento-Kerndatei hier ohnehin in Array vs String geändert werden?
LandonL
Ausgezeichnete Lösung, danke. Hat jemand dies als Fehler in Magento angesprochen? Viele Leute werden davon gebissen werden.
BlueC
Die Änderung betrifft eher PHP7, siehe meine Antwort unten. Außerdem ist stackoverflow.com/a/4103536/158325 kein wirklicher Fehler, macht aber die API PHP7-kompatibel.
B00MER
1
@ LandonL: Ich habe von 1.9.2.4 auf 1.9.3.0 aktualisiert.
Belgor
1

Höchstwahrscheinlich ist das ShipStation-Modul und / oder die von Ihnen verwendete PHP-Version nicht kompatibel:

Abschätzen der zurückgegebenen abgeschnittenen PHP-Fehlermeldung:

Argument 1 pass...' ist höchstwahrscheinlich Argument 1 passed to methodhere() must be an instance of string, string given

Welche PHP-Version verwenden Sie und haben Sie ShipStation konsultiert, um festzustellen, ob es neuere Versionen und / oder Kompatibilitätsprobleme mit den neuesten Magento-Versionen / Patches gibt.

Außerdem können Sie hier etwas mehr Protokollierung hinzufügen: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889 , um mehr von dem abgeschnittenen PHP-Fehler zu erfassen Dies wird zurückgegeben, um die Bestätigung zu erhalten, dass es sich um den korrekten zurückgegebenen Fehler handelt.

Hoffe das hilft.

B00MER
quelle
Wie würde ich mehr von dem abgeschnittenen Fehler bekommen? Ich bin nicht sicher, wie ich die Länge der Linie erhöhen soll.
LandonL
Das System läuft derzeit mit PHP 5.6.25, ich habe heute Shipworks angerufen, aber seit das Magento-Update 1.9.3.0 erst gestern herausgekommen ist, glaube ich, dass sie noch keine Chance hatten, sich mit dem Problem zu befassen.
LandonL
1

Belgors Antwort hat mir sehr geholfen, aber ich habe den Patch leicht modifiziert, damit zusätzliche Objekte in das API-Reposnse aufgenommen werden können.

Beispielsweise erhalten Sie jetzt mit dem Magento XML-RPC-Aufruf für Bestellinformationen aheadWorks storecredit- und / oder giftcard- Objekt-Arrays.

(Code aktualisiert auf Vorschlag von Björn Tantau - um besser mit Objekten und Sammlungen arbeiten zu können)

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
quelle