使用Consolibyte QuickBooks PHP SDK(Web Connector)认证失败求助
解决Consolibyte PHP SDK对接QuickBooks Desktop的认证失败问题
我在用Consolibyte的PHP开发工具包对接QuickBooks Desktop时碰到了认证失败的问题,相关报错和配置信息如下:
核心报错信息
20200319.12:39:20 UTC : QBWebConnector.SOAPWebService.do_authenticate() : QBWC1012: 认证失败,错误信息:请求失败,HTTP状态码403: Forbidden。
QWC配置文件内容
<?xml version="1.0"?> <QBWCXML> <AppName>Local Netexem</AppName> <AppID></AppID> <AppURL>https://bitsclan-solutions.com/quickbooks/qbwc</AppURL> <AppDescription>Netexem Quickbooks</AppDescription> <AppSupport>https://bitsclan-solutions.com/quickbooks/qbwc</AppSupport> <UserName>username</UserName> <OwnerID>{b7177e65-2f70-a214-214c-aed509cd911e}</OwnerID> <FileID>{ba656061-e8a4-0a24-95fa-aa6c74b5f6b9}</FileID> <QBType>QBFS</QBType> <Notify>false</Notify> <Scheduler> <RunEveryNMinutes>1</RunEveryNMinutes> </Scheduler> <IsReadOnly>false</IsReadOnly> </QBWCXML>
QBWebConnector日志详情
20200322.23:31:33 UTC : QBWebConnector.WebServiceManager.DoUpdateSelected() : updateWS() for application = 'Local Netexem' 已启动 20200322.23:31:33 UTC : QBWebConnector.RegistryManager.getUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock = FALSE 20200322.23:31:33 UTC : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock 已设置为True 20200322.23:31:33 UTC : QBWebConnector.RegistryManager.setUpdateLock() : ********************* 更新会话已锁定 ********************* 20200322.23:31:33 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : 已启动与以下应用的连接。 20200322.23:31:33 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppName: Local Netexem 20200322.23:31:33 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppUniqueName(若可用): Local Netexem 20200322.23:31:33 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppURL: https://bitsclan-solutions.com/quickbooks/qbwc 20200322.23:31:33 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : *** 调用serverVersion()。 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : 从Web服务获取的serverVersion调用实际错误:<Client found response content type of 'text/xml;charset=UTF-8', but expected 'text/xml'. The request failed with an empty response.>。为兼容所有Web服务器,QBWC将捕获所有app-not-supporting-serverVersion下的错误。 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : 此应用不支持serverVersion。为向后兼容,允许执行更新操作。 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.do_clientVersion() : *** 使用以下参数调用clientVersion():<productVersion="2.3.0.36"> 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.updateWS() : 从Web服务获取的clientVersion调用实际错误:<Client found response content type of 'text/xml;charset=UTF-8', but expected 'text/xml'. The request failed with an empty response.>。为兼容所有Web服务器,QBWC将捕获所有app-not-supporting-clientVersion下的错误。 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.do_clientVersion() : 此应用不支持clientVersion。为向后兼容,允许执行更新操作。 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.do_authenticate() : 正在认证到应用'Local Netexem',用户名='username' 20200322.23:31:34 UTC : QBWebConnector.SOAPWebService.do_authenticate() : *** 使用以下参数调用authenticate():<userName="username"><password=<MaskedForSecurity> 20200322.23:31:35 UTC : QBWebConnector.SOAPWebService.do_authenticate() : QBWC1012: 认证失败,错误信息:客户端发现响应内容类型为'text/xml;charset=UTF-8',但预期为'text/xml'。请求失败,响应为空。更多信息:StackTrace = at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) at QBWebConnector.localhost.WCWebServiceDoc.authenticate(String strUserName, String strPassword) at QBWebConnector.localhost.WCWebService.authenticate(String strUserName, String strPassword) at QBWebConnector.SOAPWebService.authenticate(String UserName, String Password) at QBWebConnector.WebService.do_authenticate(String& ticket, String& companyFileName) Source = System.Web.Services 20200322.23:31:35 UTC : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock 已设置为False 20200322.23:31:35 UTC : QBWebConnector.RegistryManager.setUpdateLock() : ********************* 更新会话已解锁 ********************* 20200322.23:31:35 UTC : QBWebConnector.WebServiceManager.DoUpdateSelected() : 更新已完成,但存在错误。详情请查看日志(QWClog.txt)。
问题分析
从日志和报错里能抓出两个核心问题:
- 403 Forbidden:服务器直接拒绝了QBWebConnector的请求,大概率是防火墙、权限限制或者SSL配置出了问题
- Content-Type不匹配:QBWC严格要求响应的Content-Type是
text/xml,但你的服务返回了带charset后缀的text/xml;charset=UTF-8,导致它无法正确解析响应,最终触发认证失败
另外响应为空的情况,说明你的PHP服务在处理SOAP请求时根本没正常输出数据,可能脚本执行中途就出错终止了。
分步解决方案
1. 修复Content-Type响应头问题
QBWebConnector对这个响应头的要求非常严格,必须是纯text/xml,不能带任何后缀。你需要在处理SOAP请求的PHP文件开头手动设置:
// 一定要在输出任何内容之前设置这个头 header('Content-Type: text/xml'); // 禁用PHP默认的字符集设置,避免自动添加charset ini_set('default_charset', '');
如果用了Laravel、Symfony这类框架,要找到框架的响应头配置项,强制覆盖成text/xml,去掉charset部分。
2. 排查403 Forbidden的根源
- 检查防火墙/安全组:确认QBWebConnector所在的电脑IP被允许访问你的
https://bitsclan-solutions.com/quickbooks/qbwc地址,云服务器默认会拦截很多外部请求,需要手动放行。 - 检查.htaccess配置:如果目标目录下有
.htaccess,看看有没有IP限制、Basic Auth或者Rewrite规则导致请求被拒,可以临时重命名.htaccess测试是否恢复正常。 - 验证SSL证书:QBWC不接受自签名证书,建议用Let's Encrypt这类正规CA颁发的免费证书,同时检查证书是否过期、域名是否匹配。
- 查看服务器访问日志:去服务器日志目录(比如Apache的
/var/log/apache2/access.log,Nginx的/var/log/nginx/access.log)找对应请求的记录,里面会有具体的拒绝原因,能帮你快速定位问题。
3. 确保Consolibyte SDK服务正常响应
- 直接测试服务地址:用浏览器或者curl访问
https://bitsclan-solutions.com/quickbooks/qbwc,看是否返回SOAP相关的XML内容(比如WSDL定义或者错误响应),如果是空白页或者500错误,说明脚本执行有问题。 - 检查authenticate方法实现:确保你正确实现了SDK的
authenticate方法,返回符合QBWC要求的结构:// 认证成功的返回格式 return array($ticket, $companyFileName); // 认证失败的返回格式 return array('', 'Invalid username or password'); - 开启PHP错误日志:在PHP配置里开启
error_log,查看脚本执行时有没有语法错误、SOAP扩展未开启或者数据库连接失败等问题,这些都会导致脚本终止,返回空响应。
4. 验证QWC文件配置
你的QWC文件基本没问题,但还是要确认几个细节:
AppURL是否准确,确保在QBWebConnector所在的电脑上能正常访问(可以用浏览器测试)UserName和你SDK中配置的认证用户名完全一致OwnerID和FileID是唯一的GUID,不要和其他QBWC应用重复(这个一般不会导致认证失败,但能避免潜在冲突)
内容的提问来源于stack exchange,提问作者Junaid Raza
相关产品推荐
相关产品推荐

