Masalah koneksi SOAP setelah pembaruan 1.9.3.0

12

Saya telah memperbarui Magento Store saya dari 1.9.2.4 ke 1.9.3.0

Kami menggunakan perangkat lunak pengiriman (Shipworks) yang terhubung melalui pengguna SOAP / XML-RPC.

Setelah pembaruan, pembuatan kapal menunjukkan respons ini di log:

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

Jadi saya pergi dan menyalakan pengecualian, masuk Magento dan mendapatkan kesalahan berikut:

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}

Jadi saya telah pergi dan melakukan perbedaan antara Abstract.php dari 1.9.2.4 dan 1.9.3.0 dan mendapatkan yang berikut:

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;

Bantuan apa pun akan dihargai.

LandonL
sumber

Jawaban:

14

Kesalahan yang sama dengan ekstensi lain di sini. system.log berkata

Argumen 1 diteruskan ke Mage_Api_Model_Server_Handler_Abstract :: processingMethodResult () harus dari jenis array, string yang diberikan, disebut dalam app / kode / inti / Mage / Api / Model / Server / Handler / Abstract.php ...

Saya pikir masalahnya adalah metode baru

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

yang hanya menerima array. Jadi setiap fungsi Api mengembalikan nilai skalar akan membuang kesalahan ini. Untuk mendapatkan ini bakalan lagi saya disalin app/code/core/Mage/Api/Model/Server/Handler/Abstract.phpke app/code/local/Mage/Api/Model/Server/Handler/Abstract.phpdan ditambal 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
sumber
Magento versi apa yang Anda jalankan?
LandonL
Ini memang memperbaiki masalah. Mengapa file inti magento diubah menjadi array vs string di sini?
LandonL
Perbaikan luar biasa, terima kasih. Adakah yang mengangkat ini sebagai bug pada Magento? Banyak orang akan digigit oleh ini.
BlueC
Perubahannya lebih pada PHP7, lihat jawaban saya di bawah ini. Juga, stackoverflow.com/a/4103536/158325 itu sebenarnya bukan bug, tetapi membuat API PHP7 kompatibel.
B00MER
1
@LandonL: Saya memperbarui dari 1.9.2.4 ke 1.9.3.0.
Belgor
1

Kemungkinan besar modul ShipStation dan / atau versi PHP yang Anda jalankan tidak kompatibel:

Menebak pesan kesalahan PHP terpotong yang dikembalikan:

Argument 1 pass...' kemungkinan besar Argument 1 passed to methodhere() must be an instance of string, string given

Apa versi PHP yang Anda jalankan dan Anda berkonsultasi dengan ShipStation untuk melihat apakah mereka memiliki versi yang lebih baru dan / atau masalah kompatibilitas dengan versi / patch Magento terbaru.

Juga, Anda dapat menambahkan sedikit lebih banyak log di sini: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889 untuk menangkap lebih banyak kesalahan PHP yang terpotong itu dikembalikan, untuk mendapatkan validasi bahwa itu adalah kesalahan yang benar dikembalikan.

Semoga ini membantu.

B00MER
sumber
Bagaimana saya bisa mendapatkan lebih banyak kesalahan terpotong? Saya tidak yakin bagaimana meningkatkan panjang garis.
LandonL
Sistem saat ini menjalankan php 5.6.25, saya menelepon shipworks hari ini, tetapi karena pembaruan magento 1.9.3.0 baru saja keluar kemarin, saya tidak percaya mereka memiliki kesempatan untuk melihat masalah ini.
LandonL
1

Jawaban Belgors benar-benar membantu saya, tetapi saya akhirnya memodifikasi tambalan sedikit untuk memungkinkan objek tambahan untuk dimasukkan dalam reposnse API.

Sebagai contoh, Anda sekarang mendapatkan array-kredit storecredit dan / atau gift -array objectWows depan dengan panggilan Magento XML-RPC untuk informasi pesanan.

(kode diperbarui dari saran oleh Björn Tantau - untuk bekerja lebih baik dengan benda & koleksi)

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
sumber