хотите интегрировать рабочий стол quickbooks с php - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь интегрировать настольную версию quickbook, используя следующий репозиторий github:

https://github.com/consolibyte/quickbooks-php

, но когда я создал новый пользовательский файл для создания клиента в Настольное приложение QB с нашего веб-сайта с использованием вашего примера кода, т.е. mydomain.com/qb_desktop/docs/web_connector/customer.php

После добавления этого файла в веб-соединитель и его запуска, оно продолжает работать непрерывно и продолжает создавать новый неограниченный клиент, пока я не добавлю "d ie" в сценарий php, чтобы принудительно остановить это.

Можете ли вы взглянуть на мои следующие коды и сообщить мне, что именно я делаю здесь неправильно ?

Заранее спасибо.

<?php
$primary_key_of_your_customer = 5;
require_once '../../QuickBooks.php';
$user = 'user';
$pass = 'password';
$map = array(QUICKBOOKS_ADD_CUSTOMER => array( '_quickbooks_customer_add_request', '_quickbooks_customer_add_response'));
$errmap = array( 3070 => '_quickbooks_error_stringtoolong');
$hooks = array();
$log_level = QUICKBOOKS_LOG_DEBUG;  
$soapserver = QUICKBOOKS_SOAPSERVER_BUILTIN;
$soap_options = array();
$handler_options = array('deny_concurrent_logins' => false,
            'deny_reallyfast_logins' => false);
$driver_options = array();
$callback_options = array();
$dsn = 'mysqli://root:password@localhost/quickbooks';
$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);
$Queue = new QuickBooks_WebConnector_Queue($dsn);
$Queue->enqueue(QUICKBOOKS_ADD_CUSTOMER, $primary_key_of_your_customer);

function _quickbooks_customer_add_request($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale)
{
    $xml = '<?xml version="1.0" encoding="utf-8"?>
        <?qbxml version="2.0"?>
        <QBXML>
            <QBXMLMsgsRq onError="stopOnError">
                <CustomerAddRq requestID="' . $requestID . '">
                    <CustomerAdd>
                        <Name>ConsoliBYTE, LLC (' . mt_rand() . ')</Name>
                        <CompanyName>ConsoliBYTE, LLC</CompanyName>
                        <FirstName>Keith</FirstName>
                        <LastName>Palmer</LastName>
                        <BillAddress>
                            <Addr1>ConsoliBYTE, LLC</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;
}
function _quickbooks_customer_add_response($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $xml, $idents)
{
    // Great, customer $ID has been added to QuickBooks with a QuickBooks
    //  ListID value of: $idents['ListID']
    //
    // We probably want to store that ListID in our database, so we can use it
    //  later. (You'll need to refer to the customer by either ListID or Name
    //  in other requests, say, to update the customer or to add an invoice for
    //  the customer.
}

1 Ответ

0 голосов
/ 15 января 2020

Веб-коннектор основан на SOAP, поэтому здесь вы фактически настраиваете сервер SOAP, к которому подключается веб-коннектор.

Важно понимать, что Web Connector делает много вызовов на службу SOAP (например, много независимых HTTP-запросов к вашему PHP сценарию) каждый раз это соединяет . По крайней мере, даже если нет фактических данных для обмена, он совершает как минимум 4 вызова:

  • clientVersion
  • serverVersion
  • authenticate
  • closeConnection

Здесь подразумевается, что все, что вы вводите в свой PHP скрипт , запускается как минимум 4 раза каждый раз, когда Web Connector подключается к вашей службе, пытаясь обмениваться данными с QuickBooks. Таким образом, каждый раз, когда подключается Web Connector, этот фрагмент кода запускается как минимум 4 раза :

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

У вас не должно быть этого фрагмента кода в этом файле , Это должно быть в другом месте. Удалите его из этого файла, и ваша проблема исчезнет go.

Вместо этого измените ваше веб-приложение , чтобы при создании нового клиента в вашем веб-приложении вы одновременно ставили в очередь запрос на QuickBooks . Итак, где-то в вашем приложении, когда вы делаете что-то вроде этого:

// Person submitted the form, so save the data they submitted into my database
$my_customer['first_name'] = $_POST['first_name'];
$my_customer['last_name'] = $_POST['last_name'];

$my_customer_id = $MyModelOrDatabase->insert('customer_table', $my_customer);

Вы должны сделать это:

// Person submitted the form, so save the data they submitted into my database
$my_customer['first_name'] = $_POST['first_name'];
$my_customer['last_name'] = $_POST['last_name'];

$my_customer_id = $MyModelOrDatabase->insert('customer_table', $my_customer);

if ($my_customer_id)
{
    $Queue = new QuickBooks_WebConnector_Queue($dsn);
    $Queue->enqueue(QUICKBOOKS_ADD_CUSTOMER, $my_customer_id);
}

Это ставит запись в очередь для QuickBooks. Затем, когда веб-коннектор подключается, он может выбрать это из очереди , которую вы уже создали , и обработать его.

Если вы посмотрите на примеры, есть пример, который иллюстрирует это:

В частности, это Пример:

Что выглядит примерно так:

// Handle the form post
if (isset($_POST['submitted']))
{
    // Save the record
    mysql_query("
        INSERT INTO
            my_customer_table
        (
            name, 
            fname, 
            lname
        ) VALUES (
            '" . mysql_escape_string($_POST['name']) . "', 
            '" . mysql_escape_string($_POST['fname']) . "', 
            '" . mysql_escape_string($_POST['lname']) . "'
        )");

    // Get the primary key of the new record
    $id = mysql_insert_id();

    // Queue up the customer add 
    $Queue = new QuickBooks_WebConnector_Queue($dsn);
    $Queue->enqueue(QUICKBOOKS_ADD_CUSTOMER, $id);

    die('Great, queued up a customer!');
}

И если вы посмотрите на документы, они на самом деле явно предупреждают вас не делать то, что вы сделали до сих пор:

Документы:

    // NOTE: You would normally *never* want to do this in this file! This is 
    //  meant as an initial test ONLY. See example_web_connector_queueing.php for more 
    //  details!
    // 
    // IMPORTANT NOTE: This particular example of queueing something up will 
    //  only ever happen *once* when these scripts are first run/used. After 
    //  this initial test, you MUST do your queueing in another script. DO NOT 
    //  DO YOUR OWN QUEUEING IN THIS FILE! See 
    //  docs/example_web_connector_queueing.php for more details and examples 
    //  of queueing things up.
...