Как настроить пользовательский api для Magento с помощью SOAP V2?

Я на Magento 1.4.1.1, и я пытаюсь настроить пользовательскую функцию в API с помощью SOAP v2. У меня он работает для SOAP v1, но мне нужен v2, чтобы C # мог его использовать. Для v2 функция появляется в WSDL, но alwasy возвращает эту ошибку: процедура «testFoo» отсутствует.

Вот мои файлы:

/app/etc/modules/ABT_Test.xml

<?xml version="1.0"?> <config> <modules> <ABT_Test> <active>true</active> <codePool>local</codePool> </ABT_Test> </modules> </config> 

/app/code/local/ABT/Test/etc/config.xml

 <?xml version="1.0"?> <config> <modules> <ABT_Test> <active>true</active> <codePool>local</codePool> <version>1.0</version> </ABT_Test> </modules> <global> <models> <test> <class>ABT_Test_Model</class> </test> </models> </global> </config> 

/app/code/local/ABT/Test/etc/api.xml

 <?xml version="1.0"?> <config> <api> <resources> <test> <model>test/api</model> <title>ABT Test Api</title> <methods> <foo translate="title" module="test"> <title>Foo Test</title> <method>foo</method> <acl>test/foo</acl> </foo> </methods> </test> </resources> <v2> <resources_function_prefix> <test>test</test> </resources_function_prefix> </v2> </api> </config> 

/app/code/local/ABT/Test/etc/wsdl.xml

 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns:typens="urn:{{var wsdl.name}}" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" name="{{var wsdl.name}}" targetNamespace="urn:{{var wsdl.name}}"> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" /> </schema> </types> <message name="testFooRequest"> <part name="sessionId" type="xsd:string" /> </message> <message name="testFooResponse"> <part name="result" type="typens:boolean" /> </message> <portType name="{{var wsdl.handler}}PortType"> <operation name="testFoo"> <documentation>Test Foo</documentation> <input message="typens:testFooRequest" /> <output message="typens:testFooResponse" /> </operation> </portType> <binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="testFoo"> <soap:operation soapAction="urn:{{var wsdl.handler}}Action" /> <input> <soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body namespace="urn:{{var wsdl.name}}" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding> </definitions> 

/app/code/local/ABT/Test/Model/API.php

 <?php class ABT_Test_Model_Api extends Mage_Api_Model_Resource_Abstract { public function foo() { return true; } } ?> 

/app/code/local/ABT/Test/Model/API/V2.php

 <?php class ABT_Test_Model_Api_V2 extends ABT_Test_Model_Api { } ?> 

И вот код, который я использую для тестирования API:

 <?php $mageUser = '########'; $mageApiKey = '########'; //SOAP V1 echo "SOAP V1 <br />"; $mageUrl = 'http://www.########.com/api/soap/?wsdl'; $soap = new SoapClient($mageUrl, array('cache_wsdl' => 0)); try { $sessionID = $soap->login($mageUser, $mageApiKey); var_dump($soap->call($sessionID, 'test.foo', array())); } catch (Exception $e) { echo 'Exception: ' . $e->getMessage() . '<br />'; } //SOAP V2 echo "SOAP V2 <br />"; $mageUrl2 = 'http://www.########.com/api/v2_soap/?wsdl'; $soap2 = new SoapClient($mageUrl2, array('cache_wsdl' => 0)); try { $sessionID2 = $soap2->login($mageUser, $mageApiKey); var_dump($soap2->testFoo($sessionID2)); } catch (Exception $e) { echo 'Exception: ' . $e->getMessage() . '<br />'; } ?> 

Я закрыл имя пользователя, пароль и URL. Функция отображается в v2 WSDL, а код php распознает, что он находится в WSDL, но я все еще получаю ошибку: процедура «testFoo» отсутствует.

Так что я пропущу?

EDIT: Я сделал то, что предложил Зява, и это показало мой пример. Затем я скопировал папку и сделал точный (чувствительный к регистру) поиск и замену для использования значимого имени и имени модуля. Я был осторожен, чтобы выбрать имена, которые, как я думал, не были бы резервными словами. В новом модуле вызов WSDL v1 работает отлично, но v2 дает то же сообщение «Процедура» xxx «нет». Затем я отправил и переименовал метод в тесте с «Foo» на «Fooz», и я получил это сообщение: «Путь к ресурсу не вызываем». Мне интересно, что я получаю другое сообщение. Это заставляет меня думать, что есть некоторый кеш / конфигурация / что-то, что вызывает проблему. Есть идеи?

Сначала я должен предупредить вас, что Magento сейчас не поддерживает формат SOAP v2, api / v2_soap /? Wsdl – это только вторая версия мыла api .

1.

 <models> <test> <class>ABT_Test_Model</class> </test> </models> 

Поскольку вы пишете модуль, который не является ядром, вы должны написать <abt_test>

2. <model>test/api</model> . В вашем случае должна быть <model>abt_test/api</model> .

3. <acl>test/foo</acl> .

Этот раздел acl существует в вашем adminhtml.xml?

по благодати,

ваш код настолько совершенен!

Добавить

 .... <resources_alias> <test>test</test> </resources_alias> ..... 

одинаковый уровень с

 <resources> and <v2> 

на Api.xml

и он будет работать хорошо.

У меня есть одна и та же проблема, и я попытался очистить файл tmp, поскольку я разместил его с помощью xampp, он не работал, я получал Procedure ххх not present exception , мне пришлось отключить управление кешем на странице администрирования сервера .
Как отключить кеш на странице администратора
На странице администрирования в системе есть раздел, называемый управлением кэшем, который отключает все на этапе разработки, или любые изменения, которые вы не будете отражать в wsdl.