Reputation: 1439
I am using the php sdk 2.0.4 for Quickbooks online API v3 to do Payment related processing. I use the sdk in the following way:
$result = $dataService->FindById(
new IPPPayment( array( 'Id' => 12345 ), true)
);
The id of the payment I want to get is 12345. Using the API explorer from the Intuit Partnership Platform (IPP) website, I am able to get back a non-null result:
<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>
Using the php sdk, I get a null value instead. With some troubleshooting, I found that an exception was thrown when the xml msg was being deserialized into php object around v3-php-sdk-2.0.4/Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Bind.php
line 112.
The exception message was: 'Property NameValue does not exist. Class IPPIntuitAnyType'. The parsing at that point appears to be processing the <LineEx>
element of the xml, but fails to parse it. Could this be a missing data class representing LineEx in the php sdk? or how to best fix this situation?
Upvotes: 2
Views: 492
Reputation: 56
Yesterday, I ran into the same problem with this library in a system which has been using the API without issue since March. I assume that Intuit changed something about the XML structure or something, but nobody has updated the "v3-php-sdk" code to match. This post on their community forum from June describes a similar case:
I was able to apply the suggested workaround by modifying lines 109-113 of Bind.php to be the following:
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));
}
It's ugly, but it works, and I couldn't find any other way around it. Note that only the code inside the catch { }
block is actually modified.
Upvotes: 3