Khi tìm nạp WSDL V2 qua URL này:
www.example.com/shop/api/v2_soap?wsdl=1
Đó là xác định URL sai cho các yêu cầu:
<service name="MagentoService">
<port name="Mage_Api_Model_Server_V2_HandlerPort" binding="typens:Mage_Api_Model_Server_V2_HandlerBinding">
<soap:address location="http://example.com/shop/index.php/?type=v2_soap"/>
</port>
</service>
Như bạn có thể thấy ở trên, nó đang trả về URL này:
www.example.com/shop/index.php/?type=v2_soap
Mặc dù nó phải là:
www.example.com/shop/index.php/api/v2_soap/index/
Tôi đã tìm hiểu rất nhiều mã lõi Magento và tôi tin rằng giá trị đó được đặt trong /app/code/core/Mage/Api/Model/Wsdl/Config/Base.php xung quanh dòng 53:
// set up default WSDL template variables
$this->_wsdlVariables = new Varien_Object(
array(
'name' => 'Magento',
'url' => htmlspecialchars(Mage::getUrl('*/*/*', array('_query' => $queryParams)))
)
);
Phần này là những gì dường như là thất bại:
Mage::getUrl('*/*/*' ...
Nếu tôi thay đổi điều đó thành:
Mage::getUrl('api/v2_soap/index' ...
URL chính xác được trả lại.
Câu hỏi này dường như được mô tả chính xác cùng một vấn đề, nhưng không bao giờ có câu trả lời cho nó:
Cảm ơn trước sự giúp đỡ nào!
CẬP NHẬT
Mặc dù tôi chưa tìm được giải pháp lâu dài cho vấn đề này, tôi đã tìm thấy giải pháp tạm thời sau khi tìm kiếm xung quanh một chút. Về cơ bản, tôi mở rộng lớp SoapClient và ghi đè phương thức __doRequest như một phương tiện chặn các yêu cầu và điều chỉnh URL vị trí trước khi yêu cầu được gửi:
class SoapClientLocation extends \SoapClient
{
public function __doRequest( $req, $location, $action, $version = SOAP_1_1, $one_way = NULL )
{
$location = str_replace( '?type=v2_soap', 'api/v2_soap/index/', $location, $one_way );
return parent::__doRequest( $req, $location, $action, $version );
}
}
$this->client = new SoapClientLocation( $this->config['api']['url'] );