QBWC WSDL отсутствует

Мое приложение QBWC работало нормально, но сегодня утром бухгалтерия уведомила меня о том, что оно внезапно перестало работать. В частности, не удалось пройти аутентификацию. Я проверил QWCLog.txt и нашел это

20130510.14:25:19 UTC: QBWebConnector.SOAPWebService.do_authenticate(): QBWC1012: аутентификация не удалась из-за следующего сообщения об ошибке. SOAP-ERROR: разбор WSDL: не удалось загрузить с 'http://developer.intuit.com/uploadedFiles/Support/QBWebConnectorSvc.wsdl': не удалось загрузить внешний объект "http://developer.intuit.com/uploadedFiles/Support/QBWebConnectorSvc.wsdl"

Это новый (и я расширил регистрацию ошибок, чтобы видеть полные вызовы). Итак, я пошел к файлу WSDL и нашел... это 404?!

Я даже попробовал один из своих экземпляров AWS, чтобы убедиться, что это не только я

wget http://developer.intuit.com/uploadedFiles/Support/QBWebConnectorSvc.wsdl --2013-05-10 15:10:50-- http://developer.intuit.com/uploadedFiles/Support/QBWebConnectorSvc.wsdl Разрешение developer.intuit.com (developer.intuit.com)... 206.108.40.170 Подключение к developer.intuit.com (developer.intuit.com)|206.108 .40.170|:80... подключено. HTTP-запрос отправлен, ожидается ответ... 404 Not Found 2013-05-10 15:10:51 ОШИБКА 404: Not Found.

Кто-нибудь еще получает это? Есть ли новый URL, о котором я не знаю? Мне просто нужно, чтобы это снова заработало.


person Machavity♦    schedule 10.05.2013    source источник
comment
Вчера вечером было обновление сайта, и похоже, что оно было пропущено. Я посмотрю, что можно сделать.   -  person William Lorfing    schedule 10.05.2013
comment
Этот файл не менялся за пару лет, поэтому вам действительно не нужно его каждый раз тянуть. Вы должны иметь возможность использовать последнюю версию.   -  person William Lorfing    schedule 10.05.2013
comment
На самом деле я не пытался вытаскивать его каждый раз (и локальный сервер его кеширует). Образец кода, который я нашел, использовал его таким образом, и он работает так уже более года. Я нашел копию на Github, поэтому я добавил ее в свою локальную кодовую базу, и пока это работает. Тем не менее, многие люди указывают на этот URL-адрес для WSDL, поэтому вы можете подумать о том, чтобы вернуть его или добавить 301 в новое место. Копия, которую я нашел, находится здесь: github.com/consolibyte/quickbooks -php/blob/master/QuickBooks/   -  person Machavity♦    schedule 10.05.2013
comment
@WilliamLorfing Если Intuit может восстановить этот файл, они должны это сделать - поведение по умолчанию почти для каждой библиотеки SOAP заключается в том, чтобы вытащить WSDL из сети и кэшировать его на несколько часов, прежде чем обратиться и снова извлечь его. Если файл исчезнет, ​​это, скорее всего, сломает много вещей людей.   -  person Keith Palmer Jr.    schedule 10.05.2013
comment
@KeithPalmer-consolibyte Это правда, но, как ни странно, здесь это не применимо. В этом случае WSDL предназначен для реализации серверной части, поэтому вы блокируете кучу кода, который реализует WSDL только один раз. Сторона клиента, которая обычно извлекает WSDL, чтобы проверить, изменился ли он, а затем связывается с сервером, — это Quickbooks Web Connector, который не ведет себя как типичный клиент веб-сервисов и, откровенно говоря, не заботится о том, что какой-либо WSDL хранится где угодно.   -  person Chris Moschini    schedule 25.01.2015
comment
Жизнь становится хуже отсюда. Отсутствие WSDL — это лишь одна из причин неудачи документации Quickbooks WC: developer-static.intuit.com/qbSDK-current/doc/PDF/ Я составил список проблем здесь: goo.gl/rC6r65 Если у кого-то есть ответ на какой-либо из них, оставьте комментарий здесь, с удовольствием задам их отдельными вопросами, чтобы получить заслуженную карму.   -  person Chris Moschini    schedule 25.01.2015


Ответы (2)


Я согласен, что эта проблема в настоящее время существует.

Мне помогло: Старый код:
$server = new SoapServer($wsdl_url);
Новый код:
$server = new SoapServer('file:///home/to/wsdl/file');

И это то, что у меня есть в моем файле wsdl:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://developer.intuit.com/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://developer.intuit.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://developer.intuit.com/">
      <s:element name="authenticate">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="strUserName" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="strPassword" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="authenticateResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="authenticateResult" type="tns:ArrayOfString" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfString">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
        </s:sequence>
      </s:complexType>

<!-- added these two methods -->
    <s:element name="serverVersion">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="strVersion" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="serverVersionResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="serverVersionResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="clientVersion">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="strVersion" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="clientVersionResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="clientVersionResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>


      <s:element name="sendRequestXML">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ticket" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="strHCPResponse" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="strCompanyFileName" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="qbXMLCountry" type="s:string" />
            <s:element minOccurs="1" maxOccurs="1" name="qbXMLMajorVers" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="qbXMLMinorVers" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="sendRequestXMLResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="sendRequestXMLResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="receiveResponseXML">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ticket" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="response" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="hresult" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="receiveResponseXMLResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="receiveResponseXMLResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="connectionError">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ticket" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="hresult" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="connectionErrorResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="connectionErrorResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getLastError">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ticket" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getLastErrorResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="getLastErrorResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="closeConnection">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ticket" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="closeConnectionResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="closeConnectionResult" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>

  <wsdl:message name="authenticateSoapIn">
    <wsdl:part name="parameters" element="tns:authenticate" />
  </wsdl:message>
  <wsdl:message name="authenticateSoapOut">
    <wsdl:part name="parameters" element="tns:authenticateResponse" />
  </wsdl:message>

<!-- added this part -->
  <wsdl:message name="serverVersionSoapIn">
    <wsdl:part name="parameters" element="tns:serverVersion" />
  </wsdl:message>
  <wsdl:message name="serverVersionSoapOut">
    <wsdl:part name="parameters" element="tns:serverVersionResponse" />
  </wsdl:message>
  <wsdl:message name="clientVersionSoapIn">
    <wsdl:part name="parameters" element="tns:clientVersion" />
  </wsdl:message>
  <wsdl:message name="clientVersionSoapOut">
    <wsdl:part name="parameters" element="tns:clientVersionResponse" />
  </wsdl:message>


  <wsdl:message name="sendRequestXMLSoapIn">
    <wsdl:part name="parameters" element="tns:sendRequestXML" />
  </wsdl:message>
  <wsdl:message name="sendRequestXMLSoapOut">
    <wsdl:part name="parameters" element="tns:sendRequestXMLResponse" />
  </wsdl:message>
  <wsdl:message name="receiveResponseXMLSoapIn">
    <wsdl:part name="parameters" element="tns:receiveResponseXML" />
  </wsdl:message>
  <wsdl:message name="receiveResponseXMLSoapOut">
    <wsdl:part name="parameters" element="tns:receiveResponseXMLResponse" />
  </wsdl:message>
  <wsdl:message name="connectionErrorSoapIn">
    <wsdl:part name="parameters" element="tns:connectionError" />
  </wsdl:message>
  <wsdl:message name="connectionErrorSoapOut">
    <wsdl:part name="parameters" element="tns:connectionErrorResponse" />
  </wsdl:message>
  <wsdl:message name="getLastErrorSoapIn">
    <wsdl:part name="parameters" element="tns:getLastError" />
  </wsdl:message>
  <wsdl:message name="getLastErrorSoapOut">
    <wsdl:part name="parameters" element="tns:getLastErrorResponse" />
  </wsdl:message>
  <wsdl:message name="closeConnectionSoapIn">
    <wsdl:part name="parameters" element="tns:closeConnection" />
  </wsdl:message>
  <wsdl:message name="closeConnectionSoapOut">
    <wsdl:part name="parameters" element="tns:closeConnectionResponse" />
  </wsdl:message>
  <wsdl:portType name="QBWebConnectorSvcSoap">

    <!-- add this chunk -->
    <wsdl:operation name="serverVersion">
      <wsdl:input message="tns:serverVersionSoapIn" />
      <wsdl:output message="tns:serverVersionSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="clientVersion">
      <wsdl:input message="tns:clientVersionSoapIn" />
      <wsdl:output message="tns:clientVersionSoapOut" />
    </wsdl:operation>


    <wsdl:operation name="authenticate">
      <wsdl:input message="tns:authenticateSoapIn" />
      <wsdl:output message="tns:authenticateSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="sendRequestXML">
      <wsdl:input message="tns:sendRequestXMLSoapIn" />
      <wsdl:output message="tns:sendRequestXMLSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="receiveResponseXML">
      <wsdl:input message="tns:receiveResponseXMLSoapIn" />
      <wsdl:output message="tns:receiveResponseXMLSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="connectionError">
      <wsdl:input message="tns:connectionErrorSoapIn" />
      <wsdl:output message="tns:connectionErrorSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="getLastError">
      <wsdl:input message="tns:getLastErrorSoapIn" />
      <wsdl:output message="tns:getLastErrorSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="closeConnection">
      <wsdl:input message="tns:closeConnectionSoapIn" />
      <wsdl:output message="tns:closeConnectionSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="QBWebConnectorSvcSoap" type="tns:QBWebConnectorSvcSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
    <!-- this too was added... -->
    <wsdl:operation name="serverVersion">
      <soap:operation soapAction="http://developer.intuit.com/serverVersion" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="clientVersion">
      <soap:operation soapAction="http://developer.intuit.com/clientVersion" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="authenticate">
      <soap:operation soapAction="http://developer.intuit.com/authenticate" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="sendRequestXML">
      <soap:operation soapAction="http://developer.intuit.com/sendRequestXML" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="receiveResponseXML">
      <soap:operation soapAction="http://developer.intuit.com/receiveResponseXML" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="connectionError">
      <soap:operation soapAction="http://developer.intuit.com/connectionError" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getLastError">
      <soap:operation soapAction="http://developer.intuit.com/getLastError" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="closeConnection">
      <soap:operation soapAction="http://developer.intuit.com/closeConnection" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="QBWebConnectorSvc">
    <wsdl:port name="QBWebConnectorSvcSoap" binding="tns:QBWebConnectorSvcSoap">
      <soap:address location="https://idn.vogelfam.net/QBMSDonorSample/QBWebConnectorSvc.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
person TheDuke    schedule 10.05.2013
comment
На самом деле вам даже не нужна декларация file://. Я прошел полный путь, и он работал нормально. - person Machavity♦; 11.05.2013
comment
У меня не работало без объявления file://. Может быть, что-то с VirtualBox или, может быть, CMS, которую я использую (drupal). - person TheDuke; 11.05.2013

ссылка на QBWC WSDL внутри Руководство программиста QuickBooks Web Connector по-прежнему возвращает ошибку 404. Это сообщение на доске поддержки Intuit указывает, что вы можете загрузите (предположительно) актуальную версию WSDL здесь .

person JohnB    schedule 23.02.2014