quickbooks magento 2.3 QBWC1012
quickbooks magento 2.3 QBWC1012
我正在将商店从 magento 1 迁移到 magento 2,他们已将其与 MQC 远程桌面上的 Quickbooks Desktop 集成。
我在 m1 和 m2 上都使用了 consolibyte。它也在 m2 上工作。然后我不得不搁置这个任务并将magento更新为2.3.0.
现在,当我尝试在远程桌面的 Web 连接器中更新我的 magneto 2 应用程序时,出现以下错误:
"Version:
Not provided by service
Message:
Authentication failed
Description:
QBWC1012: Authentication failed due to following error message.
The request failed with an empty response. See QWCLog for more details. Remember to turn logging on."
日志如下所示:
"20190213.06:57:36 UTC : QBWebConnector.WebServiceManager.DoUpdateSelected() : updateWS() for application = 'Sansha 2 France 1.0' has STARTED
20190213.06:57:36 UTC : QBWebConnector.RegistryManager.getUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock = FALSE
20190213.06:57:36 UTC : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock has been set to True
20190213.06:57:36 UTC : QBWebConnector.RegistryManager.setUpdateLock() : ********************* Update session locked *********************
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : Initiated connection to the following application.
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppName: Sansha 2 France 1.0
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppUniqueName (if available): Sansha 2 France 1.0
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppURL: https://eurostore.magento2.sansha.com/quickbooks/api
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : *** Calling serverVersion().
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : Actual error received from web service for serverVersion call: <The request failed with an empty response.>. For backward compatibility of all webservers, QBWC will catch all errors under app-not-supporting-serverVersion.
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : This application does not contain support for serverVersion. Allowing update operation for backward compatibility.
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_clientVersion() : *** Calling clientVersion() with following parameter:<productVersion="2.2.0.71">
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.updateWS() : Actual error received from web service for clientVersion call: <The request failed with an empty response.>. For backward compatibility of all webservers, QBWC will catch all errors under app-not-supporting-clientVersion.
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_clientVersion() : This application does not contain support for clientVersion. Allowing update operation for backward compatibility.
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_authenticate() : Authenticating to application 'Sansha 2 France 1.0', username = 'sansha'
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_authenticate() : *** Calling authenticate() with following parameters:<userName="sansha"><password=<MaskedForSecurity>
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_authenticate() : QBWC1012: Authentication failed due to following error message.
The request failed with an empty response.
More info:
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
20190213.06:57:37 UTC : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock has been set to False
20190213.06:57:37 UTC : QBWebConnector.RegistryManager.setUpdateLock() : ********************* Update session unlocked *********************
20190213.06:57:37 UTC : QBWebConnector.WebServiceManager.DoUpdateSelected() : Update completed with errors. See log (QWClog.txt) for details.
"
我试图找到解决方案,但仍然没有成功。
SOAP 服务器似乎正常工作:
"QuickBooks PHP DevKit Server v3.0 at /quickbooks/api/
(c) "Keith Palmer" <keith@consolibyte.com>
Visit us at: http://www.ConsoliBYTE.com/
Use the QuickBooks Web Connector to access this SOAP server.
QuickBooks_WebConnector_Server::handle() parameters:
- $return = 1
- $debug = 1
Misc. information:
- Logging: 1
- Timezone: Europe/Paris (Auto-set: )
- Current Date/Time: 2019-02-14 08:09:29
- Error Reporting: 32767
SOAP adapter:
- QuickBooks_Adapter_Server_Builtin
Registered handler functions:
Array
(
[0] => __construct
[1] => authenticate
[2] => sendRequestXML
[3] => receiveResponseXML
[4] => connectionError
[5] => getLastError
[6] => closeConnection
[7] => serverVersion
[8] => clientVersion
)
Detected input:
Timestamp:
- 2019-02-14 08:09:29 -- process 0.27981"
它是这样启动的:
if(!\QuickBooks_Utilities::initialized($dsn)) {
\QuickBooks_Utilities::initialize($dsn);
\QuickBooks_Utilities::createUser($dsn, $qb_username, $qb_password);
}
$server = new \QuickBooks_WebConnector_Server($dsn, $this->_map, $this->_errmap, $this->_hooks);
$response = $server->handle(true, true);
有人遇到过这个问题吗?有大佬知道怎么解决吗
此致
终于找到问题了
重点是更新到 magento 2.3 会中断 HTTP POST 请求,或者至少会中断更新前的工作方式,请参阅 https://magento.stackexchange.com/questions/253414/magento-2-3-upgrade-breaks-http-post-requests-to-custom-module-endpoint。
我使用 https://github.com/consolibyte/quickbooks-php/blob/master/dev/dev_qbwc_tester.php 来测试请求,但表单密钥无效。要解决此问题,您的控制器必须实施 CsrfAwareActionInterface。
并且为了防止 magento 在您的 QBWC 服务器初始化后尝试设置 cookie 和重写 headers,您必须在 SOAP 服务器初始化后立即阻止您的代码。我在后面放了一个 die() ,不确定是不是最好的解决方案,但身份验证有效(这是我的主要问题)。
控制器中的最终代码如下所示:
<?php
namespace Sansha\Quickbooks\Controller\Api;
use Magento\Framework\App\CsrfAwareActionInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\Request\InvalidRequestException;
class Index extends \Magento\Framework\App\Action\Action implements CsrfAwareActionInterface
{
protected $resultPageFactory;
protected $_map = array();
protected $_hooks = array();
protected $_errmap = array();
protected $_helper_config;
protected $_helper_data;
protected $_helper_api;
protected $_logger;
/**
* Constructor
*
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory,
\Sansha\Quickbooks\Helper\QbConfig $helperConfig,
\Sansha\Quickbooks\Helper\QbData $helperData,
\Sansha\Quickbooks\Helper\QbApi $helperApi,
\Sansha\Quickbooks\Logger\Logger $logger
) {
$this->resultPageFactory = $resultPageFactory;
$this->_helper_config = $helperConfig;
$this->_helper_data = $helperData;
$this->_helper_api = $helperApi;
$this->_logger = $logger;
parent::__construct($context);
}
/**
* Execute view action
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
if (function_exists('date_default_timezone_set'))
{
date_default_timezone_set('Europe/Paris');
}
$store_id = $this->_helper_data->getStoreId();
$dsn = $this->_helper_config->getDsn($store_id);
$qb_username = $this->_helper_config->getQbLogin($store_id)['username'];
$qb_password = $this->_helper_config->getQbLogin($store_id)['password'];
if(!\QuickBooks_Utilities::initialized($dsn)) {
\QuickBooks_Utilities::initialize($dsn);
\QuickBooks_Utilities::createUser($dsn, $qb_username, $qb_password);
}
$server = new \QuickBooks_WebConnector_Server($dsn, $this->_map, $this->_errmap, $this->_hooks);
$response = $server->handle(true, true);
die(); // stop code exectuon after server initialization
}
// below 2 functions will avoid breaking HTTP POST request
public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException
{
return null;
}
public function validateForCsrf(RequestInterface $request): ?bool
{
return true;
}
我正在将商店从 magento 1 迁移到 magento 2,他们已将其与 MQC 远程桌面上的 Quickbooks Desktop 集成。
我在 m1 和 m2 上都使用了 consolibyte。它也在 m2 上工作。然后我不得不搁置这个任务并将magento更新为2.3.0.
现在,当我尝试在远程桌面的 Web 连接器中更新我的 magneto 2 应用程序时,出现以下错误:
"Version:
Not provided by service
Message:
Authentication failed
Description:
QBWC1012: Authentication failed due to following error message.
The request failed with an empty response. See QWCLog for more details. Remember to turn logging on."
日志如下所示:
"20190213.06:57:36 UTC : QBWebConnector.WebServiceManager.DoUpdateSelected() : updateWS() for application = 'Sansha 2 France 1.0' has STARTED
20190213.06:57:36 UTC : QBWebConnector.RegistryManager.getUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock = FALSE
20190213.06:57:36 UTC : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock has been set to True
20190213.06:57:36 UTC : QBWebConnector.RegistryManager.setUpdateLock() : ********************* Update session locked *********************
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : Initiated connection to the following application.
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppName: Sansha 2 France 1.0
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppUniqueName (if available): Sansha 2 France 1.0
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.instantiateWebService() : AppURL: https://eurostore.magento2.sansha.com/quickbooks/api
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : *** Calling serverVersion().
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : Actual error received from web service for serverVersion call: <The request failed with an empty response.>. For backward compatibility of all webservers, QBWC will catch all errors under app-not-supporting-serverVersion.
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_serverVersion() : This application does not contain support for serverVersion. Allowing update operation for backward compatibility.
20190213.06:57:36 UTC : QBWebConnector.SOAPWebService.do_clientVersion() : *** Calling clientVersion() with following parameter:<productVersion="2.2.0.71">
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.updateWS() : Actual error received from web service for clientVersion call: <The request failed with an empty response.>. For backward compatibility of all webservers, QBWC will catch all errors under app-not-supporting-clientVersion.
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_clientVersion() : This application does not contain support for clientVersion. Allowing update operation for backward compatibility.
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_authenticate() : Authenticating to application 'Sansha 2 France 1.0', username = 'sansha'
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_authenticate() : *** Calling authenticate() with following parameters:<userName="sansha"><password=<MaskedForSecurity>
20190213.06:57:37 UTC : QBWebConnector.SOAPWebService.do_authenticate() : QBWC1012: Authentication failed due to following error message.
The request failed with an empty response.
More info:
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
20190213.06:57:37 UTC : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock has been set to False
20190213.06:57:37 UTC : QBWebConnector.RegistryManager.setUpdateLock() : ********************* Update session unlocked *********************
20190213.06:57:37 UTC : QBWebConnector.WebServiceManager.DoUpdateSelected() : Update completed with errors. See log (QWClog.txt) for details.
"
我试图找到解决方案,但仍然没有成功。
SOAP 服务器似乎正常工作:
"QuickBooks PHP DevKit Server v3.0 at /quickbooks/api/
(c) "Keith Palmer" <keith@consolibyte.com>
Visit us at: http://www.ConsoliBYTE.com/
Use the QuickBooks Web Connector to access this SOAP server.
QuickBooks_WebConnector_Server::handle() parameters:
- $return = 1
- $debug = 1
Misc. information:
- Logging: 1
- Timezone: Europe/Paris (Auto-set: )
- Current Date/Time: 2019-02-14 08:09:29
- Error Reporting: 32767
SOAP adapter:
- QuickBooks_Adapter_Server_Builtin
Registered handler functions:
Array
(
[0] => __construct
[1] => authenticate
[2] => sendRequestXML
[3] => receiveResponseXML
[4] => connectionError
[5] => getLastError
[6] => closeConnection
[7] => serverVersion
[8] => clientVersion
)
Detected input:
Timestamp:
- 2019-02-14 08:09:29 -- process 0.27981"
它是这样启动的:
if(!\QuickBooks_Utilities::initialized($dsn)) {
\QuickBooks_Utilities::initialize($dsn);
\QuickBooks_Utilities::createUser($dsn, $qb_username, $qb_password);
}
$server = new \QuickBooks_WebConnector_Server($dsn, $this->_map, $this->_errmap, $this->_hooks);
$response = $server->handle(true, true);
有人遇到过这个问题吗?有大佬知道怎么解决吗
此致
终于找到问题了
重点是更新到 magento 2.3 会中断 HTTP POST 请求,或者至少会中断更新前的工作方式,请参阅 https://magento.stackexchange.com/questions/253414/magento-2-3-upgrade-breaks-http-post-requests-to-custom-module-endpoint。
我使用 https://github.com/consolibyte/quickbooks-php/blob/master/dev/dev_qbwc_tester.php 来测试请求,但表单密钥无效。要解决此问题,您的控制器必须实施 CsrfAwareActionInterface。
并且为了防止 magento 在您的 QBWC 服务器初始化后尝试设置 cookie 和重写 headers,您必须在 SOAP 服务器初始化后立即阻止您的代码。我在后面放了一个 die() ,不确定是不是最好的解决方案,但身份验证有效(这是我的主要问题)。
控制器中的最终代码如下所示:
<?php
namespace Sansha\Quickbooks\Controller\Api;
use Magento\Framework\App\CsrfAwareActionInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\Request\InvalidRequestException;
class Index extends \Magento\Framework\App\Action\Action implements CsrfAwareActionInterface
{
protected $resultPageFactory;
protected $_map = array();
protected $_hooks = array();
protected $_errmap = array();
protected $_helper_config;
protected $_helper_data;
protected $_helper_api;
protected $_logger;
/**
* Constructor
*
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory,
\Sansha\Quickbooks\Helper\QbConfig $helperConfig,
\Sansha\Quickbooks\Helper\QbData $helperData,
\Sansha\Quickbooks\Helper\QbApi $helperApi,
\Sansha\Quickbooks\Logger\Logger $logger
) {
$this->resultPageFactory = $resultPageFactory;
$this->_helper_config = $helperConfig;
$this->_helper_data = $helperData;
$this->_helper_api = $helperApi;
$this->_logger = $logger;
parent::__construct($context);
}
/**
* Execute view action
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
if (function_exists('date_default_timezone_set'))
{
date_default_timezone_set('Europe/Paris');
}
$store_id = $this->_helper_data->getStoreId();
$dsn = $this->_helper_config->getDsn($store_id);
$qb_username = $this->_helper_config->getQbLogin($store_id)['username'];
$qb_password = $this->_helper_config->getQbLogin($store_id)['password'];
if(!\QuickBooks_Utilities::initialized($dsn)) {
\QuickBooks_Utilities::initialize($dsn);
\QuickBooks_Utilities::createUser($dsn, $qb_username, $qb_password);
}
$server = new \QuickBooks_WebConnector_Server($dsn, $this->_map, $this->_errmap, $this->_hooks);
$response = $server->handle(true, true);
die(); // stop code exectuon after server initialization
}
// below 2 functions will avoid breaking HTTP POST request
public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException
{
return null;
}
public function validateForCsrf(RequestInterface $request): ?bool
{
return true;
}