Problemi di connessione SOAP dopo l'aggiornamento 1.9.3.0


12

Ho aggiornato il mio Magento Store da 1.9.2.4 a 1.9.3.0

Utilizziamo software di spedizione (Shipworks) che si collega tramite un utente SOAP / XML-RPC.

Dopo l'aggiornamento, la registrazione di Shipworks mostra questa risposta nei registri:

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

Così sono andato e ho attivato la registrazione delle eccezioni in Magento e ho ricevuto il seguente errore:

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}

Quindi ho fatto una differenza tra Abstract.php da 1.9.2.4 e 1.9.3.0 e ho ottenuto quanto segue:

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;

Qualsiasi aiuto sarebbe apprezzato.

Risposte:


14

Stesso errore con un'altra estensione qui. dice system.log

L'argomento 1 passato a Mage_Api_Model_Server_Handler_Abstract :: processingMethodResult () deve essere di tipo array, stringa fornita, chiamato in app / code / core / Mage / Api / Model / Server / Handler / Abstract.php ...

Penso che il problema sia il nuovo metodo

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

che accetta solo array. Quindi ogni funzione Api che restituisce un valore scalare genererà questo errore. Per ottenere questo andare di nuovo ho copiato app/code/core/Mage/Api/Model/Server/Handler/Abstract.phpper app/code/local/Mage/Api/Model/Server/Handler/Abstract.phpe 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;
}

quale versione di magento stai eseguendo?
LandonL

Questo risolve il problema. Perché il file core magento dovrebbe essere modificato in array vs stringa comunque qui?
LandonL

Ottima soluzione, grazie. Qualcuno ha sollevato questo come un bug con Magento? Molte persone verranno morse da questo.
BlueC,

Il cambiamento riguarda più PHP7, vedi la mia risposta di seguito. Inoltre, stackoverflow.com/a/4103536/158325 non è in realtà un bug, ma rende l'API PHP7 compatibile.
B00MER,

1
@LandonL: ho aggiornato dall'1.9.2.4 all'1.9.3.0.
Belgor,

1

Molto probabilmente il modulo ShipStation e / o la versione PHP in esecuzione non sono compatibili:

Indovinare il messaggio di errore PHP troncato restituito:

Argument 1 pass...' è molto probabilmente Argument 1 passed to methodhere() must be an instance of string, string given

Quale versione di PHP stai utilizzando e ti sei consultato con ShipStation per vedere se hanno versioni più recenti e / o problemi di compatibilità con le ultime versioni / patch di Magento.

Inoltre, puoi aggiungere un po 'più di registrazione qui: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889 per acquisire più dell'errore PHP troncato che viene restituito, per ottenere la convalida che si tratta dell'errore corretto restituito.

Spero che sia di aiuto.


Come otterrei più dell'errore troncato? Non sono sicuro di come aumentare la lunghezza della linea.
LandonL

Il sistema sta attualmente eseguendo php 5.6.25, oggi ho chiamato i cantieri navali, ma poiché l'aggiornamento mag.3 1.9.3.0 è appena uscito ieri, non credo che abbiano ancora avuto la possibilità di esaminare il problema.
LandonL

1

La risposta di Belgors mi ha davvero aiutato, ma ho finito per modificare leggermente la patch per consentire l'inclusione di oggetti extra nel repository API.

Ad esempio, ora puoi procedere con Storecredit e / o array di oggetti giftcard con la chiamata Magento XML-RPC per informazioni sull'ordine.

(codice aggiornato dal suggerimento di Björn Tantau - per lavorare meglio con oggetti e collezioni)

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.