Sự cố kết nối SOAP sau khi cập nhật 1.9.3.0


12

Tôi đã cập nhật Cửa hàng Magento của mình từ 1.9.2.4 đến 1.9.3.0

Chúng tôi sử dụng phần mềm vận chuyển (Shipworks) kết nối thông qua người dùng SOAP / XML-RPC.

Sau khi cập nhật nhật ký đóng tàu cho thấy phản hồi này trong nhật ký:

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

Vì vậy, tôi đã đi và bật đăng nhập ngoại lệ trong Magento và nhận được lỗi sau:

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}

Vì vậy, tôi đã thực hiện một khác biệt giữa Abstract.php từ 1.9.2.4 và 1.9.3.0 và nhận được những điều sau đây:

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;

Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


14

Cùng một lỗi với một phần mở rộng khác ở đây. system.log nói

Đối số 1 được truyền cho Mage_Api_Model_Server_Handler_Abauge :: processMethodResult () phải thuộc mảng kiểu, chuỗi đã cho, được gọi trong app / code / core / Mage / Api / Model / Server / Handler / Abstract.php ...

Tôi nghĩ vấn đề là phương pháp mới

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

mà chỉ chấp nhận mảng. Vì vậy, mỗi hàm Api trả về giá trị vô hướng sẽ đưa ra lỗi này. Để có được điều này sẽ một lần nữa tôi sao chép app/code/core/Mage/Api/Model/Server/Handler/Abstract.phpđến app/code/local/Mage/Api/Model/Server/Handler/Abstract.phpvà vá 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;
}

phiên bản magento nào bạn đang chạy?
LandonL

Điều này không khắc phục vấn đề. Tại sao tập tin lõi magento sẽ được thay đổi thành mảng vs chuỗi dù sao ở đây?
LandonL

Sửa chữa tuyệt vời, cảm ơn bạn. Có ai đã nêu ra điều này như một lỗi với Magento chưa? Rất nhiều người sẽ bị cắn bởi điều này.
BlueC

Sự thay đổi là nhiều hơn về PHP7, xem câu trả lời của tôi dưới đây. Ngoài ra, stackoverflow.com/a/4103536/158325 nó không thực sự là một lỗi, nhưng làm cho API PHP7 tương thích.
B00mer

1
@LandonL: Tôi đã cập nhật từ 1.9.2.4 lên 1.9.3.0.
Belgor

1

Nhiều khả năng mô-đun ShipStation và / hoặc phiên bản PHP bạn đang chạy không tương thích:

Đoán ra thông báo lỗi PHP bị cắt cụt đã trả về:

Argument 1 pass...' là có khả năng nhất Argument 1 passed to methodhere() must be an instance of string, string given

Phiên bản PHP nào bạn đang chạy và bạn đã tham khảo ý kiến ​​với ShipStation để xem liệu họ có bất kỳ phiên bản mới hơn và / hoặc các vấn đề tương thích với phiên bản / bản vá Magento mới nhất không.

Ngoài ra, bạn có thể thêm một chút đăng nhập tại đây: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889 để nắm bắt thêm lỗi PHP bị cắt ngắn đó là bị trả về, để xác nhận rằng đó là lỗi chính xác được trả về.

Hi vọng điêu nay co ich.


Làm thế nào tôi có thể nhận được nhiều hơn các lỗi cắt ngắn? Tôi không chắc chắn làm thế nào để tăng chiều dài của dòng.
LandonL

Hệ thống hiện đang chạy php 5.6.25, tôi đã gọi shipworks hôm nay, nhưng vì bản cập nhật magento 1.9.3.0 vừa mới ra mắt ngày hôm qua, tôi không tin rằng họ đã có cơ hội xem xét vấn đề này.
LandonL

1

Câu trả lời của người Bỉ thực sự giúp ích cho tôi, nhưng cuối cùng tôi đã sửa đổi bản vá một chút để cho phép các đối tượng bổ sung được đưa vào reposnse API.

Ví dụ: bây giờ bạn có được frontec repositoryecredit và / hoặc giftcard các mảng đối tượng với lệnh gọi Magento XML-RPC để biết thông tin đặt hàng.

(mã được cập nhật từ đề xuất của Bjorn Tantau - để hoạt động tốt hơn với các đối tượng & bộ sưu tập)

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.