ปัญหาการเชื่อมต่อ SOAP หลังจากอัพเดต 1.9.3.0


12

ฉันได้ทำการอัพเดต Magento Store จาก 1.9.2.4 เป็น 1.9.3.0

เราใช้ซอฟต์แวร์จัดส่ง (Shipworks) ที่เชื่อมต่อผ่านผู้ใช้ SOAP / XML-RPC

หลังจากการบันทึกการอัพเดท shipworks แสดงการตอบสนองนี้ในบันทึก:

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

ดังนั้นฉันจึงไปและเปิดการบันทึกข้อยกเว้นใน Magento และได้รับข้อผิดพลาดต่อไปนี้:

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}

ดังนั้นฉันได้ไปและทำแตกต่างระหว่าง Abstract.php จาก 1.9.2.4 และ 1.9.3.0 และได้รับต่อไปนี้:

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;

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

คำตอบ:


14

ข้อผิดพลาดเดียวกันกับส่วนขยายอื่นที่นี่ system.log พูดว่า

อาร์กิวเมนต์ 1 ส่งผ่านไปยัง Mage_Api_Model_Server_Handler_Abstract :: processingMethodResult () จะต้องเป็นอาร์เรย์ประเภทสตริงที่กำหนดให้เรียกใน app / code / core / Mage / Api / รุ่น / เซิร์ฟเวอร์ / Handler / Abstract.php ...

ฉันคิดว่าปัญหาเป็นวิธีการใหม่

Mage_Api_Model_Server_Handler_Abstract::processingMethodResult(array $result)

ซึ่งยอมรับเฉพาะอาร์เรย์ ดังนั้นทุกฟังก์ชันของ Api ที่ส่งคืนค่าสเกลาร์จะทำให้เกิดข้อผิดพลาดนี้ เพื่อให้ได้สิ่งนี้อีกครั้งฉันได้คัดลอกapp/code/core/Mage/Api/Model/Server/Handler/Abstract.phpไปapp/code/local/Mage/Api/Model/Server/Handler/Abstract.phpและแก้ไข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;
}

คุณใช้วีโอไอพีรุ่นใด
LandonL

วิธีนี้แก้ไขปัญหาได้ ทำไมไฟล์วีโอไอพีคอร์จะถูกเปลี่ยนเป็นอาเรย์และสตริงที่นี่หรือไม่
LandonL

แก้ไขได้ดีมากขอบคุณ มีใครยกเรื่องนี้เป็นบั๊กกับ Magento ไหม? ผู้คนมากมายจะถูกกัดโดยสิ่งนี้
BlueC

การเปลี่ยนแปลงมีมากขึ้นรอบ PHP7 ดูคำตอบของฉันด้านล่าง นอกจากนี้stackoverflow.com/a/4103536/158325มันไม่ได้เป็นข้อบกพร่องจริงๆ แต่ทำให้ API PHP7 เข้ากันได้
B00MER

1
@LandonL: ฉันอัปเดตจาก 1.9.2.4 เป็น 1.9.3.0
Belgor

1

มากกว่าโมดูล ShipStation และ / หรือเวอร์ชั่น PHP ที่คุณใช้งานอยู่ไม่สามารถทำงานร่วมกันได้:

คาดเดาข้อความแสดงข้อผิดพลาด PHP ที่ถูกตัดทอนที่ส่งคืน:

Argument 1 pass...' มีแนวโน้มมากที่สุด Argument 1 passed to methodhere() must be an instance of string, string given

คุณใช้ PHP เวอร์ชันใดและคุณได้ปรึกษากับ ShipStation เพื่อดูว่าพวกเขามีปัญหาเกี่ยวกับเวอร์ชั่นและ / หรือความเข้ากันได้กับเวอร์ชั่น / แพตช์ Magento รุ่นล่าสุดหรือไม่

นอกจากนี้คุณสามารถเพิ่มการบันทึกอีกเล็กน้อยได้ที่นี่: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Zend/Soap/Server.php#L889เพื่อจับข้อผิดพลาด PHP ที่ถูกตัดทอนมากขึ้น กำลังส่งคืนเพื่อรับการตรวจสอบว่าเป็นข้อผิดพลาดที่ถูกต้องที่ส่งคืน

หวังว่านี่จะช่วยได้


ฉันจะได้รับข้อผิดพลาดที่ถูกตัดทอนมากขึ้นได้อย่างไร ฉันไม่แน่ใจว่าจะเพิ่มความยาวของเส้นได้อย่างไร
LandonL

ขณะนี้ระบบกำลังใช้งาน php 5.6.25 ฉันเรียกว่า shipworks วันนี้ แต่เนื่องจาก magento update 1.9.3.0 เพิ่งออกมาเมื่อวานนี้ฉันไม่เชื่อว่าพวกเขามีโอกาสได้ดูปัญหา
LandonL

1

คำตอบจากชาวเบลเยียมช่วยฉันได้จริงๆ แต่ฉันก็ปรับเปลี่ยนแพทช์เล็กน้อยเพื่อให้สามารถรวมออบเจ็กต์พิเศษใน reposnse API ได้

ตัวอย่างเช่นตอนนี้คุณจะได้รับการจัดเก็บล่วงหน้าและ / หรือวัตถุอาร์เรย์บัตรของขวัญด้วย Magento XML-RPC โทรสำหรับข้อมูลการสั่งซื้อ

(รหัสปรับปรุงจากข้อเสนอแนะโดยBjörn Tantau - เพื่อให้ทำงานได้ดีขึ้นกับวัตถุและคอลเลกชัน)

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.