我使用php-sdk 2.0.4 for Quickbooks在线API v3来进行与支付相关的处理。我以以下方式使用sdk:
$result = $dataService->FindById(
new IPPPayment( array( 'Id' => 12345 ), true)
);
我想得到的付款id是12345。使用Intuit Partnership Platform(IPP)网站上的API资源管理器,我能够返回非空结果:
<IntuitResponse>
<Payment domain="QBO" sparse="false">
<Id>12345</Id>
...
<TxnDate>2013-10-15</TxnDate>
<Line>
<Amount>660.00</Amount>
<LinkedTxn>
<TxnId>216</TxnId>
<TxnType>Invoice</TxnType>
</LinkedTxn>
<LineEx>
<NameValue>
<Name>txnId</Name>
<Value>216</Value>
</NameValue>
<NameValue>
<Name>txnOpenBalance</Name>
<Value>790.00</Value>
</NameValue>
<NameValue>
<Name>txnReferenceNumber</Name>
<Value>7030</Value>
</NameValue>
</LineEx>
</Line>
<CustomerRef name="XXXXXXXXX">66</CustomerRef>
<DepositToAccountRef>51</DepositToAccountRef>
<TotalAmt>660.00</TotalAmt>
<UnappliedAmt>0</UnappliedAmt>
<ProcessPayment>false</ProcessPayment>
</Payment>
</IntuitResponse>
使用php-sdk,我得到了一个null值。经过一些故障排除,我发现在v3-php-sdk-2.0.4/Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Bind.php
第112行附近将xml消息反序列化为php对象时引发了异常。
异常消息为:"Property NameValue不存在。类IPIntuitAnyType"。此时的解析似乎正在处理xml的<LineEx>
元素,但未能解析它。这可能是php-sdk中缺少一个表示LineEx的数据类吗?或者如何最好地解决这种情况?
昨天,我在一个自3月份以来一直在使用API的系统中遇到了与此库相同的问题。我认为Intuit更改了XML结构或其他内容,但没有人更新"v3-php-sdk"代码以匹配。6月份在他们的社区论坛上发布的这篇帖子描述了一个类似的案例:
- https://intuitpartnerplatform.lc.intuit.com/questions/939250-why-is-my-php-sdk-unable-to-parse-qbo-s-purchase-responses
我能够通过将Bind.php的第109-113行修改为以下内容来应用建议的解决方法:
try {
$propertyDocs = $refl->getProperty($name)->getDocComment();
} catch (ReflectionException $e) {
if ($name == "NameValue") continue; // QB APIv3 bug!
else throw new RuntimeException($e->getMessage().". Class ".get_class($model));
}
它很难看,但它很有效,我找不到其他方法来解决它。注意,实际上只有catch { }
块中的代码被修改了。