Я использую php SDK 2.0.4 для Quickbooks онлайн API v3 для обработки платежей.
Я использую SDK следующим образом:
$result = $dataService->FindById(
new IPPPayment( array( 'Id' => 12345 ), true)
);
Идентификатор платежа, который я хочу получить, — 12345. Используя обозреватель API с веб-сайта Intuit Partnership Platform (IPP), я могу получить ненулевой результат:
<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, я получаю нулевое значение. С некоторыми неполадками я обнаружил, что исключение выдается, когда xml msg десериализуется в объект php вокруг v3-php-sdk-2.0.4/Dependencies/XSD2PHP/src/com/mikebevz/xsd2php/Bind.php
строка 112
Сообщение об исключении было следующим: «Свойство NameValue не существует. Класс IPPIntuitAnyType ‘. Анализ в этой точке, кажется, обрабатывает <LineEx>
элемент xml, но не может его проанализировать. Может ли это быть отсутствующий класс данных, представляющий LineEx в php SDK? или как лучше исправить эту ситуацию?
Вчера я столкнулся с той же проблемой с этой библиотекой в системе, которая без проблем использует API с марта. Я предполагаю, что Intuit изменил что-то в структуре XML или что-то еще, но никто не обновил код «v3-php-sdk», чтобы он соответствовал. Этот пост на их форуме от июня описывает похожий случай:
Я смог применить предложенный обходной путь, изменив строки 109-113 Bind.php быть следующим:
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 { }
блок на самом деле изменен.
Других решений пока нет …