【问题标题】:QBWC WSDL missing缺少 QBWC WSDL
【发布时间】:2013-05-10 15:17:19
【问题描述】:

我的 QBWC 应用程序一直运行良好,但今天早上我收到通知说它突然停止运行。具体来说,它未能通过身份验证。我检查了 QWCLog.txt 并找到了这个

20130510.14:25:19 UTC:QBWebConnector.SOAPWebService.do_authenticate():QBWC1012:由于以下错误消息,身份验证失败。 SOAP 错误:解析 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:未找到。

还有其他人得到这个吗?有我不知道的新网址吗?我只需要让它再次工作。

【问题讨论】:

  • 昨晚有一个网站更新,看起来错过了。我会看看能做些什么。
  • 这个文件几年没变过,真的不用每次都拉。您应该可以使用最新版本。
  • 我并不是每次都想拉它(本地服务器确实缓存它)。我发现的示例代码就是这样使用它的,它已经这样运行了一年多。我在 Github 上找到了一份副本,所以我把它放到了我的本地代码库中,并且现在可以使用。尽管如此,还是有很多人指向 WSDL 的那个 URL,所以您可能需要考虑将其放回原处或将 301 添加到新位置。我找到的副本在这里:github.com/consolibyte/quickbooks-php/blob/master/QuickBooks/…
  • @WilliamLorfing 如果 Intuit 可以恢复这个文件,他们应该 - 几乎每个 SOAP 库的默认行为是从网络上拉下 WSDL 并将其缓存几个小时,然后再伸出援手并再次拉动它。如果文件消失,它可能会破坏很多人的东西。
  • @KeithPalmer-consolibyte 确实如此,但奇怪的是不适用于这里。在这种情况下,WSDL 是为您实现的服务器端部分,所以您锁定在一堆代码中,只实现一次 WSDL。客户端通常会获取 WSDL 以检查它是否已更改,然后与服务器通信,它是 Quickbooks Web 连接器,它的行为不像典型的 Web 服务客户端,坦率地说,它并不关心是否有任何 WSDL存储在任何地方。

标签: quickbooks intuit-partner-platform qbwc


【解决方案1】:

QuickBooks Web Connector Programmer’s Guide 中的link to the QBWC WSDL 仍然返回 404。Intuit 支持板上的This post 表示您可以下载(可能)最新版本的 WSDL here

【讨论】:

    【解决方案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>
    

    【讨论】:

    • 实际上你甚至不需要 file:// 声明。我通过了完整的路径,它工作正常。
    • 没有 file:// 声明对我不起作用。可能是 VirtualBox 的东西,或者可能是我正在使用的 cms (drupal)。
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多