このURLを介してV2 WSDLをフェッチする場合:
www.example.com/shop/api/v2_soap?wsdl=1
リクエストに対して間違ったURLを定義しています:
<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>
上記を見るとわかるように、次のURLを返しています。
www.example.com/shop/index.php/?type=v2_soap
それははずですが:
www.example.com/shop/index.php/api/v2_soap/index/
私は多くのMagentoコアコードを調べてみましたが、53行目あたりの値は/app/code/core/Mage/Api/Model/Wsdl/Config/Base.phpに設定されていると思います。
// set up default WSDL template variables
$this->_wsdlVariables = new Varien_Object(
array(
'name' => 'Magento',
'url' => htmlspecialchars(Mage::getUrl('*/*/*', array('_query' => $queryParams)))
)
);
この部分が失敗しているようです:
Mage::getUrl('*/*/*' ...
それを次のように変更した場合:
Mage::getUrl('api/v2_soap/index' ...
正しいURLが返されます。
この質問はまったく同じ問題を説明しているようですが、答えはありませんでした。
助けてくれてありがとう!
更新
この問題の解決策はまだ見つかっていませんが、少し調べてみると一時的な解決策が見つかりました。基本的に、SoapClientクラスを拡張し、リクエストをインターセプトしてリクエストが送信される前にロケーションURLを微調整する手段として__doRequestメソッドをオーバーライドします。
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'] );