Intuit QuickBooks web连接器迭代器ID无效错误

Intuit QuickBooks web连接器迭代器ID无效错误,quickbooks,vtiger,Quickbooks,Vtiger,我一直在尝试将基于PHP的解决方案与QuickBooks Enterprise edition集成。我使用QuickBooks PHP开发工具包()连接应用程序以双向同步多个模块 具有多条记录的第一个模块(从QuickBooks到VtigerCRM)正在完全同步。当我尝试下一个模块时,只有少数记录得到同步,并抛出一个错误IteratorID无效。然后,我尝试用XML发送带有新迭代器ID的参数,但没有成功 20180821.05:13:03 UTC : QBWebConnector.SOAP

我一直在尝试将基于PHP的解决方案与QuickBooks Enterprise edition集成。我使用QuickBooks PHP开发工具包()连接应用程序以双向同步多个模块

具有多条记录的第一个模块(从QuickBooks到VtigerCRM)正在完全同步。当我尝试下一个模块时,只有少数记录得到同步,并抛出一个错误IteratorID无效。然后,我尝试用XML发送带有新迭代器ID的参数,但没有成功

20180821.05:13:03 UTC    : QBWebConnector.SOAPWebService.do_receiveResponseXML() : hresult=""
20180821.05:13:03 UTC    : QBWebConnector.SOAPWebService.do_receiveResponseXML() : message=""
20180821.05:13:03 UTC    : QBWebConnector.SOAPWebService.do_receiveResponseXML() : Received from receiveResponseXML() following parameters:
20180821.05:13:03 UTC    : QBWebConnector.SOAPWebService.do_receiveResponseXML() : more="-1">
20180821.05:13:03 UTC    : QBWebConnector.SOAPWebService.do_getLastError() : * Calling getLastError() with following parameter:
20180821.05:13:03 UTC    : QBWebConnector.SOAPWebService.do_getLastError() : wcTicket="403c7856-d600-c664-5187-3d9e2036c0cc"
20180821.05:13:04 UTC    : QBWebConnector.SOAPWebService.do_getLastError() : Received from getLastError() following parameter:
20180821.05:13:04 UTC    : QBWebConnector.SOAPWebService.do_getLastError() : errorMsg="3391: The iteratorID "{80c35df0-ae92-43a3-af49-946da1c306fb}" is not valid."
20180821.05:13:04 UTC    : QBWebConnector.SOAPWebService.do_getLastError() : Received error from application: 3391: The iteratorID "{80c35df0-ae92-43a3-af49-946da1c306fb}" is not valid.
20180821.05:13:04 UTC    : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -
<?xml version="1.0"?><?qbxml version="13.0"?><QBXML><QBXMLMsgsRq onError="stopOnError"><CompanyQueryRq requestID="1"><OwnerID>{90A44FB7-33D9-4815-AC85-AC86A7E7D1EB}</OwnerID></CompanyQueryRq></QBXMLMsgsRq></QBXML>
20180821.05:13:03 UTC:QBWebConnector.SOAPWebService.do_ReceiverResponseXML():hresult=“”
20180821.05:13:03 UTC:QBWebConnector.SOAPWebService.do_ReceiverResponseXML():message=“”
20180821.05:13:03 UTC:QBWebConnector.SOAPWebService.do_receiveResponseXML():从receiveResponseXML()接收以下参数:
20180821.05:13:03 UTC:QBWebConnector.SOAPWebService.do_ReceiverResponseXML():more=“-1”>
20180821.05:13:03 UTC:QBWebConnector.SOAPWebService.do_getLastError():*使用以下参数调用getLastError():
20180821.05:13:03 UTC:QBWebConnector.SOAPWebService.do_getLastError():wcTicket=“403c7856-d600-c664-5187-3d9e2036c0cc”
20180821.05:13:04 UTC:QBWebConnector.SOAPWebService.do_getLastError():从getLastError()接收以下参数:
20180821.05:13:04 UTC:QBWebConnector.SOAPWebService.do_getLastError():errorMsg=“3391:迭代器“{80c35df0-ae92-43a3-af49-946da1c306fb}”无效。”
20180821.05:13:04 UTC:QBWebConnector.SOAPWebService.do_getLastError():从应用程序接收到错误:3391:迭代器ID“{80c35df0-ae92-43a3-af49-946da1c306fb}”无效。
20180821.05:13:04 UTC:QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML():XML转储如下:-
{90A44FB7-33D9-4815-AC85-AC86A7E7D1EB}
我已经添加了Helper.php的代码


真的
0
';
返回$xml;
}
/** 
*处理来自QuickBooks的响应
*/
函数\u quickbooks\u purchaseorder\u import\u response($requestID、$user、$action、$ID、$extra、$err、$last\u action\u time、$last\u ActionIdentit\u time、$xml、$Identits)
{	
如果(!empty($idents['iteratorRemainingCount']))
{
//排队等候另一个请求
$Queue=QuickBooks\u WebConnector\u Queue\u Singleton::getInstance();
$Queue->enqueue(QUICKBOOKS\u IMPORT\u PURCHASEORDER,null,QB\u PRIORITY\u PURCHASEORDER,数组('iteratorID'=>$idents['iteratorID']),$user);
}否则{
返回true;
}
//来自QuickBooks的这段响应现在存储在$xml中
//可以以任何方式处理$xml格式的qbXML响应。将其保存到
//一个文件,把它塞进数据库,解析它,把记录塞进数据库
//数据库等。
//	
//下面的示例演示如何使用内置的XML解析器进行解析
//响应并将其填充到数据库中。
//导入所有记录
$errnum=0;
$errmsg='';
$Parser=新的QuickBooks\u XML\u解析器($XML);
if($Doc=$Parser->parse($errnum,$errmsg))
{
$Root=$Doc->getRoot();
$List=$Root->getChildAt('QBXML/QBXMLMsgsRs/PurchaseOrderQueryRs');
//待办事项
}
返回true;
}
/**
*处理QuickBooks中的500未找到错误
* 
*而不是为找不到的查询返回空结果集
*记录时,QuickBooks返回错误消息。这将处理这些错误
*并通过将缺少的项添加到QuickBooks来处理这些消息。
*/
函数_quickbooks_error_e500_notfound($requestID、$user、$action、$ID、$extra、$err、$xml、$errnum、$errmsg)
{
$Queue=QuickBooks\u WebConnector\u Queue\u Singleton::getInstance();
如果($action==QUICKBOOKS\u IMPORT\u INVOICE)
{
返回true;
}
else if($action==QUICKBOOKS\u IMPORT\u CUSTOMER)
{
返回true;
}
else if($action==QUICKBOOKS\u IMPORT\u SALESORDER)
{
返回true;
}
else if($action==QUICKBOOKS\u IMPORT\u项目)
{
返回true;
}
else if($action==QUICKBOOKS\u IMPORT\u PURCHASEORDER)
{
返回true;
}
返回false;
}
函数\u quickbooks\u error\u catchall($requestID、$user、$action、$ID、$extra、&$err、$xml、$errnum、$errmsg)
{
$message='';
$message.=“请求ID:”。$requestID。“\r\n”;
$message.='User:'.$User.\r\n;
$message.=“操作:”.$Action.“\r\n”;
$message.='ID:'.$ID.\r\n;
$message.='Extra:'。打印($Extra,true)。“\r\n”;
//$message.='Error:'.$err.\r\n;
$message.='错误号:'.$errnum.\r\n;
$message.='错误消息:'.$errmsg.\r\n;
邮件(QB_QUICKBOOKS_MAILTO,
“发生QuickBooks错误!”,
$message);

}
所以我至少看到了一些潜在问题,并提出了一些问题。首先,一些背景--

QuickBooks中的迭代器就像数据库游标一样工作。这部分意味着不能同时打开两个迭代器——在启动和/或继续另一个迭代器之前,必须使用一个迭代器完成。因此,如果您这样做,您将看到错误:

  • 启动迭代器#1
  • 从迭代器#1中获取一些数据
  • 启动迭代器#2
  • 再次尝试从迭代器#1获取一些数据
  • 这将失败,因为启动第二个迭代器已关闭/终止第一个迭代器。这可能就是发生在你身上的事情

    这是什么

    $extra['iteratorID']=$saved\u iterator\u id;//从表中

    在我看来,这就像一个未定义的变量。你检查过你的PHP错误日志了吗


    为什么要将此保存到表中,以及要保存到哪个表中?你在代码里的什么地方把它从表中拉出来?我没有看到任何从表中得到它的代码

    发布你的代码。“我们不能不看你在做什么就帮你。”基思·帕默尔。谢谢你的帮助!我在帖子中编辑并添加了代码。我尝试在第二个模块同步中使用相同的迭代ID,但问题仍然存在。助手文件-这是100%不去工作。迭代器与特定的请求相关联。你需要去看电影