0

目标:我们尝试使用 QuickBooks Web 连接器从 QuickBooks Desktop for Windows 中每小时获取一次所有交易。

状态:QuickBooks Web 连接器使用配置的 qwc 文件成功运行。

问题:QuickBooks Web 连接器返回绿色消息“不需要数据交换”。我期望事务存储在 log.txt 中。下面是我的代码。我怀疑这是一个排队问题?我希望所有排队都在这个文件中,该文件在 QBWC 中每小时运行一次以获取所有事务。您能提供的任何帮助将不胜感激。

//web_connector.php - called every 60 min from QBWC
$map = array(
    '*' => array( '_quickbooks_get_transactions', '_quickbooks_get_transactions_response' ),
);

$log_level = QUICKBOOKS_LOG_DEVELOP;
$soapserver = QUICKBOOKS_SOAPSERVER_BUILTIN;
$handler_options = array(
    'deny_concurrent_logins' => false, 
    'deny_reallyfast_logins' => false, 
);
$dsn = 'mysqli://'.$dbUser.':'.$dbPass.'@localhost/'.$dbName;
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);
}

//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);

function _quickbooks_get_transactions($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale)
{
//I want to get all transactions from this QuickBooks file and then insert into a database table on my cloud server.
    $xml = '<?xml version="1.0" encoding="utf-8"?>
        <?qbxml version="2.0"?>
        <QBXML>
            <QBXMLMsgsRq onError="stopOnError">
                <TransactionQuery requestID="' . $requestID . '">

                </TransactionQuery>
            </QBXMLMsgsRq>
        </QBXML>';

    return $xml;
}

function _quickbooks_get_transactions_response($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $xml, $idents)
{   
    //I want to get all transactions from this QuickBooks file and then insert into a database table on my cloud server.
    //store returned data in text file for testing
    $fp = fopen('log.txt', 'a+');
    fwrite($fp, $xml);
    fclose($fp);
    return;
}
4

1 回答 1

0

该消息的含义正是它所说的:

没有数据可以交换。没什么可做的。

Web 连接器和此框架使用“队列”概念工作。一旦队列为空,就没有其他事情可做,您就会收到该消息。如果您将某些内容添加到队列中,那么它将处理这些项目,直到无事可做,然后您将再次收到“无数据交换...”消息。

您尚未将任何内容添加到队列中。

您可以使用 cron 作业来执行此操作,或者通过注册一个在 Web 连接器连接时运行的函数,并立即将某些内容放入队列中。例如:

// An array of callback hooks
$hooks = array(
    QuickBooks_WebConnector_Handlers::HOOK_LOGINSUCCESS => '_quickbooks_hook_loginsuccess',     // call this whenever a successful login occurs
    );

/**
 * Login success hook - perform an action when a user logs in via the Web Connector
 */
function _quickbooks_hook_loginsuccess($requestID, $user, $hook, &$err, $hook_data, $callback_config)
{
    // For new users, we need to set up a few things
    // Fetch the queue instance
    $Queue = QuickBooks_WebConnector_Queue_Singleton::getInstance();

    $Queue->enqueue(QUICKBOOKS_IMPORT_TRANSACTION);
}

你可以在这里看到一个扩展的例子:

您可能想从示例中删除一些其他内容:

  • 对于较大的数据集,您将无法在一个请求中查询所有事务。您可以使用 GitHub 示例中所示的迭代器一次分页 25 或 100 条记录,以获得更好的性能/可靠性。
  • 使用 QuickBooks 支持的最高 qbXML 版本(您正在使用<?qbxml version="2.0"?>
于 2018-10-21T12:48:36.500 回答