QuickBooks для рабочего стола и Laravel - тип контента xml;charset = UTF-8, но ожидаемый текст / xml - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь получить один из примеров работы consolibyte quickbooks-php в Laravel (5.1).У меня проблемы с тем, чтобы заставить его работать с помощью контроллера.В журнале Web Connector указывается тип содержимого ответа клиента: «xml;charset = UTF-8 ', но ожидаемый' text / xml '.

Код, который я использую, является слегка измененной версией quickbooks-php demo .Мне не удалось найти пример quickbooks-php desktop и laravel, и я не уверен в том, что я делаю неправильно.

Примечание- Требуется require_once ('../ QuickBooks.php') в приложении./config/app.php.

Контроллер

public function sync(RequestInterface $request, InvoiceSyncService $obj){
    $this->logger->info('############################### Start QB sync (laravel) ######################################');

    $user = 'user';
    $pass = 'password';

    // Map QuickBooks actions to handler functions
    $map = array(
        QUICKBOOKS_ADD_CUSTOMER => array( array( $obj, 'addCustomerRequest' ), array( $obj, 'addCustomerResponse' ) ),
    );

    // This is entirely optional, use it to trigger actions when an error is returned by QuickBooks
    $errmap = array(
        500 => array( $obj, 'handleError500' ),
    );

    // An array of callback hooks
    $hooks = array(
    );

    // Logging level
    $log_level = QUICKBOOKS_LOG_DEVELOP;        // Use this level until you're sure everything works!!!

    // What SOAP server you're using
    $soapserver = QUICKBOOKS_SOAPSERVER_BUILTIN;        // A pure-PHP SOAP server (no PHP ext/soap extension required, also makes debugging easier)

    $soap_options = array(      // See http://www.php.net/soap
    );

    $handler_options = array(
    );      // See the comments in the QuickBooks/Server/Handlers.php file

    $driver_options = array(
    );

    $callback_options = array(
    );

    $dsn = 'mysqli://username:password@localhost/database';

    if (!QuickBooks_Utilities::initialized($dsn))
    {
        // Initialize creates the neccessary database schema for queueing up requests and logging
        QuickBooks_Utilities::initialize($dsn);

        // This creates a username and password which is used by the Web Connector to authenticate
        QuickBooks_Utilities::createUser($dsn, $user, $pass);

        $primary_key_of_your_customer = 5;

        $Queue = new QuickBooks_WebConnector_Queue($dsn);
        $Queue->enqueue(QUICKBOOKS_ADD_CUSTOMER, $primary_key_of_your_customer);
    }

    // Set the DSN string because some of our callbacks will use it
    $obj->setDSN($dsn);

    // Create a new server and tell it to handle the requests
    $Server = new QuickBooks_WebConnector_Server($dsn, $map, $errmap, $hooks, $log_level, $soapserver, QUICKBOOKS_WSDL, $soap_options, $handler_options, $driver_options, $callback_options);
    $response = $Server->handle(true, true);

    return response()->view('invoicing/sync', ['response' => $response])->header('Content-type', 'xml');
}

InvoiceSyncService

protected $_dsn;

private $logger;

public function __construct(LoggerFactory $loggerFactory)
{
    $this->logger = $loggerFactory->createLogger('invoice-sync');
}


public function setDSN($dsn)
{
    $this->_dsn = $dsn;
}

public function addCustomerRequest($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale)
{
    $this->logger->info('A request occurred');

    $xml = '<?xml version="1.0" encoding="utf-8"?>
        <?qbxml version="2.0"?>
        <QBXML>
            <QBXMLMsgsRq onError="stopOnError">
                <CustomerAddRq>
                    <CustomerAdd>
                        <Name>ConsoliBYTE Solutions (' . mt_rand() . ')</Name>
                        <CompanyName>ConsoliBYTE Solutions</CompanyName>
                        <FirstName>Keith</FirstName>
                        <LastName>Palmer</LastName>
                        <BillAddress>
                            <Addr1>ConsoliBYTE Solutions</Addr1>
                            <Addr2>134 Stonemill Road</Addr2>
                            <City>Mansfield</City>
                            <State>CT</State>
                            <PostalCode>06268</PostalCode>
                            <Country>United States</Country>
                        </BillAddress>
                        <Phone>860-634-1602</Phone>
                        <AltPhone>860-429-0021</AltPhone>
                        <Fax>860-429-5183</Fax>
                        <Email>Keith@ConsoliBYTE.com</Email>
                        <Contact>Keith Palmer</Contact>
                    </CustomerAdd>
                </CustomerAddRq>
            </QBXMLMsgsRq>
        </QBXML>';

    return $xml;
}


public function addCustomerResponse($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $xml, $idents)
{

    $this->logger->info('A response occured');
}

public function handleError500($requestID, $user, $action, $ID, $extra, &$err, $xml, $errnum, $errmsg)
{


    // return true;         // If you return TRUE, it will continue to process requests
    return false;           // If you return FALSE, it will stop processing requests
}

public function hookLoginSuccess($requestID, $user, $hook, &$err, $hook_data, $callback_config)
{
    if ($this->_dsn)
    {
        return true;
    }

    return false;
}

Редактировать

Это журнал Web Connector для не очень хорошосформированный xml.

20190201.22: 01: 32 UTC: QBWebConnector.WebServiceManager.DoUpdateSelected (): updateWS () для приложения = «Laravel» НАЧАЛОСЬ 20190201.22: 01: 32 UTC: QBWebConnector.RegistryDanager.anget.(): HKEY_CURRENT_USER \ Software \ Intuit \ QBWebConnector \ UpdateLock = FALSE 20190201.22: 01: 32 UTC: QBWebConnector.RegistryManager.setUpdateLock (): HKEY_CURRENT_USER \ Software \ Intuit \ QBWock2012: установлено в 201: для True ULB = 201: 201 установлено: в выпуске от 0 до 201: для UBB2.0: 201 установлено: 0: 0: установлено в True: для QBWeb22: 201 установлено значение: 0: 201BLB = 201: для ULB = 0: 201BLB = 210: для версии \ у 0: установлено: True = 0QBWebConnector.RegistryManager.setUpdateLock (): ********************* Обновление сеанса заблокировано ********************* 20190201.22: 01: 32 UTC: QBWebConnector.SOAPWebService.instantiateWebService (): инициировано подключение к следующему приложению.20190201.22: 01: 32 UTC: QBWebConnector.SOAPWebService.instantiateWebService (): AppName: Laravel 20190201.22: 01: 32 UTC: QBWebConnector.SOAPWebService.instantiateWebService (): AppUniqueName (если доступно): 201WWSW.WNS: W 201: UW: WWSW: 01: 201WWSW: 01: 201WWSW.WNW: 01: 201WWS: 01: 201WWSW.WNR: WLS: 201: 201: если у вас есть:.instantiateWebService (): AppURL: http://localhostvisuals/invoicing/sync 20190201.22: 01: 32 UTC: QBWebConnector.SOAPWebService.do_serverVersion (): * Вызов serverVersion ().20190201.22: 01: 33 UTC: QBWebConnector.SOAPWebService.do_serverVersion (): Фактическая ошибка, полученная от веб-службы для вызова serverVersion:.Для обратной совместимости всех веб-серверов QBWC будет перехватывать все ошибки в приложении-not-support-serverVersion.20190201.22: 01: 33 UTC: QBWebConnector.SOAPWebService.do_serverVersion (): это приложение не содержит поддержку serverVersion.Разрешение операции обновления для обратной совместимости.20190201.22: 01: 33 UTC: QBWebConnector.SOAPWebService.do_clientVersion (): * Вызов clientVersion () со следующим параметром: 20190201.22: 01: 34 UTC: QBWebConnector.SOAPWebService.updateWS (): из веб-службы получена фактическая ошибка для клиента клиентавызов: .Для обратной совместимости всех веб-серверов QBWC будет перехватывать все ошибки в app-not-support-clientVersion.20190201.22: 01: 34 UTC: QBWebConnector.SOAPWebService.do_clientVersion (): это приложение не содержит поддержку clientVersion.Разрешение операции обновления для обратной совместимости.20190201.22: 01: 34 UTC: QBWebConnector.SOAPWebService.do_authenticate (): Аутентификация в приложении 'Laravel', username = 'user' 20190201.22: 01: 34 UTC: QBWebConnector.SOAPWebService.do_authenticate (): *** Вызов аутентификации () сследующие параметры: 20190201.22: 01: 34 UTC: QBWebConnector.SOAPWebService.do_authenticate (): QBWC1012: Ошибка аутентификации из-за следующего сообщения об ошибке.Ответ не является правильно сформированным XML.Более подробная информация: StackTrace = at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (параметры String methodName, Object []) в QBWebConnector.localhost.WCWebServiceDoc.authenticate (String strUserName, String strPasswordConW.WareWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateCateWateWateWateWateWateCateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWateWW) )WBBString strUserName, String strPassword) в QBWebConnector.SOAPWebService.authenticate (String UserName, String Password) в QBWebConnector.WebService.do_authenticate (String & ticket, String & companyFileName) Source = System.Web.Services 20190201.22: 01: 34 UTC: QBWebConnector.RegistryManager.setUpdateLock (): HKEY_CURRENT_USER \ Software \ Intuit \ QBWebConnector \ UpdateLock имеет значение False 20190201.22: 01: 34 UTC: QBWebConnector.RegistryManager.ock ()*************** Обновление сеанса разблокировано ********************* 20190201.22: 01: 34 UTC: QBWebConnector.WebServiceManager.DoUpdateSelected (): обновление завершено с ошибками.Подробности смотрите в журнале (QWClog.txt).

1 Ответ

0 голосов
/ 01 февраля 2019

Тип содержимого, который вы хотите, - text/xml, а не просто xml.

например изменить это:

return response()->view('invoicing/sync', ['response' => $response])->header('Content-type', 'xml'); }

На это:

return response()->view('invoicing/sync', ['response' => $response])->header('Content-type', 'text/xml'); }

Просто xml не являетсядопустимый тип контента.

...