Я занимаюсь разработкой веб-службы интеграции в php для быстрых книг. Мне уже удалось выяснить все строки добавления и запроса, но я не могу понять, как правильно отправить запрос мода. Я знаю, что в моем запросе что-то не так с моей строкой xml, потому что я не получаю ответ от веб-коннектора. Я пытался следовать экранным ссылкам, но почему-то все равно не получилось.
Вот моя строка ответа на запрос от соединителя:
`<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CustomerQueryRs requestID="183" statusCode="0" statusSeverity="Info" statusMessage="Status OK">
<CustomerRet>
<ListID>80000062-1431710964</ListID>
<TimeCreated>2015-05-15T11:29:24-07:00</TimeCreated>
<TimeModified>2015-05-15T11:29:24-07:00</TimeModified>
<EditSequence>1431710964</EditSequence>
<Name>Test 2 Contractor, Inc.</Name>
<FullName>Test 2 Contractor, Inc.</FullName>
<IsActive>true</IsActive>
<Sublevel>0</Sublevel>
<CompanyName>Test 2 Contractor, Inc.</CompanyName>
<BillAddress>
<Addr1>Test bill 1</Addr1>
<Addr2>Test bill 2</Addr2>
<City>Test City</City>
<State>UT</State>
<PostalCode>84057</PostalCode>
<Country>USA</Country>
</BillAddress>
<BillAddressBlock>
<Addr1>Test bill 1</Addr1>
<Addr2>Test bill 2</Addr2>
<Addr3>Test City, Utah 84057</Addr3>
<Addr4>United States</Addr4>
</BillAddressBlock>
<ShipAddress>
<Addr1>Test ship 1</Addr1>
<Addr2>Test ship 2</Addr2>
<City>Test City</City>
<State>UT</State>
<PostalCode>84057</PostalCode>
<Country>USA</Country>
</ShipAddress>
<ShipAddressBlock>
<Addr1>Test ship 1</Addr1>
<Addr2>Test ship 2</Addr2>
<Addr3>Test City, Utah 84057</Addr3>
<Addr4>United States</Addr4>
</ShipAddressBlock>
<ShipToAddress>
<Name>Ship To 1</Name>
<Addr1>Test ship 1</Addr1>
<Addr2>Test ship 2</Addr2>
<City>Test City</City>
<State>UT</State>
<PostalCode>84057</PostalCode>
<Country>USA</Country>
<DefaultShipTo>true</DefaultShipTo>
</ShipToAddress>
<Phone>555-555-5555</Phone>
<AltPhone>555-555-5554</AltPhone>
<Fax>555-555-5553</Fax>
<Email>[email protected]</Email>
<AdditionalContactRef>
<ContactName>Main Phone</ContactName>
<ContactValue>555-555-5555</ContactValue>
</AdditionalContactRef>
<AdditionalContactRef>
<ContactName>Alt. Phone</ContactName>
<ContactValue>555-555-5554</ContactValue>
</AdditionalContactRef>
<AdditionalContactRef>
<ContactName>Fax</ContactName>
<ContactValue>555-555-5553</ContactValue>
</AdditionalContactRef>
<AdditionalContactRef>
<ContactName>Main Email</ContactName>
<ContactValue>[email protected]</ContactValue>
</AdditionalContactRef>
<Balance>0.00</Balance>
<TotalBalance>0.00</TotalBalance>
<JobStatus>None</JobStatus>
<PreferredDeliveryMethod>None</PreferredDeliveryMethod>
</CustomerRet>
</CustomerQueryRs>
</QBXMLMsgsRs>
</QBXML>`
Вот запрос мода, который я отправил на соединитель:
`<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<CustomerModRq requestID="184">
<CustomerMod>
<ListID>80000062-1431710964</ListID>
<EditSequence>1431710964</EditSequence>
<Name>Test 2 Contractor, Inc.Updated</Name>
<CompanyName>Test 2 Contractor, Inc.</CompanyName>
</CustomerMod>
</CustomerModRq>
</QBXMLMsgsRq>
</QBXML>`
Вот код, который я использовал для генерации XML:
$mod_info = json_decode($queue_set['qb_queue_item']->extra);
$list_id = $mod_info->list_id;
$edit_sequence = $mod_info->edit_sequence;
//Get the contractor to be sent to quickbooks
$contractor = new Contractor();
if(!($contractor = $contractor::find($queue_set['kyco_queue_item']->obj_id)))
return array('status' => $this::STATUS_ERROR, 'data' => "Failed to find contractor in the database");
if(!isset($contractor->contractor))
return array('status' => $this::STATUS_ERROR, 'data' => "Contractor does not have a valid name");
/*$address_billing = Address::Primary(get_class($contractor), $contractor->id, Address::ADDRESS_TYPE_BILLING);
$address_shipping = Address::Primary(get_class($contractor), $contractor->id, Address::ADDRESS_TYPE_SHIPPING);
$phone_primary = PhoneNumber::Primary(get_class($contractor), $contractor->id, PhoneNumber::PHONE_TYPE_STATIC);
$phone_alt = PhoneNumber::Primary(get_class($contractor), $contractor->id, PhoneNumber::PHONE_TYPE_MOBILE);
$phone_fax = PhoneNumber::Primary(get_class($contractor), $contractor->id, PhoneNumber::PHONE_TYPE_FAX);
$email = Email::Primary(get_class($contractor), $contractor->id, Email::EMAIL_TYPE_BUSINESS);*/
// Build the qbXML request from the contractors data
$xml = "";
$xml .= '<?xml version="1.0" encoding="utf-8"?>'. LINE_RETURN;
$xml .= '<?qbxml version="13.0"?>'. LINE_RETURN;
$xml .= '<QBXML>'. LINE_RETURN;
$xml .= LINE_TAB . '<QBXMLMsgsRq onError="stopOnError">'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . '<CustomerModRq requestID="' . $queue_set['qb_queue_item']->quickbooks_queue_id . '">'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . '<CustomerMod>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<ListID>' . $list_id . '</ListID>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<EditSequence>' . $edit_sequence . '</EditSequence>'. LINE_RETURN;
//$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Name>' . $contractor->contractor . "Updated". '</Name>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<CompanyName>' . $contractor->contractor . '</CompanyName>'. LINE_RETURN;
/*if($address_billing)
{
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<BillAddress>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Addr1>' . $address_billing->address_1 . '</Addr1>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Addr2>' . $address_billing->address_2 . '</Addr2>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<City>' . $address_billing->city . '</City>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<State>' . $address_billing->state . '</State>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<PostalCode>' . $address_billing->postal_code . '</PostalCode>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Country>' . $address_billing->country . '</Country>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '</BillAddress>'. LINE_RETURN;
}
if($address_shipping)
{
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<ShipAddress>' . LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Addr1>' . $address_shipping->address_1. '</Addr1>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Addr2>' . $address_shipping->address_2 . '</Addr2>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<City>' . $address_shipping->city . '</City>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<State>' . $address_shipping->state . '</State>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<PostalCode>' . $address_shipping->postal_code . '</PostalCode>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Country>' . $address_shipping->country . '</Country>' . LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '</ShipAddress>' . LINE_RETURN;
}
if($phone_primary)
{
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Phone>' . $phone_primary->number . '</Phone>'. LINE_RETURN;
}
if($phone_alt)
{
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<AltPhone>' . $phone_alt->number . '</AltPhone>'. LINE_RETURN;
}
if($phone_fax)
{
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Fax>' . $phone_fax->number . '</Fax>'. LINE_RETURN;
}
if($email)
{
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . LINE_TAB . '<Email>' . $email->email . '</Email>'. LINE_RETURN;
}*/
$xml .= LINE_TAB . LINE_TAB . LINE_TAB . '</CustomerMod>'. LINE_RETURN;
$xml .= LINE_TAB . LINE_TAB . '</CustomerModRq>'. LINE_RETURN;
$xml .= LINE_TAB . '</QBXMLMsgsRq>'. LINE_RETURN;
$xml .= '</QBXML>'. LINE_RETURN;
//get the relational entry attached to the quickbooks queue id ($qb_queue_id)
$queue_set['kyco_queue_item']->status = KycoQueueItem::STATUS_MOD_SENT;
$queue_set['kyco_queue_item']->save();
return array('status' => $this::STATUS_SUCCESS, 'data' => $xml);
Это возвращается к моей функции запроса мод-клиента.
Вот мой файл журнала веб-коннектора:
https://drive.google.com/file/d/0B5iqqn5sniRDTGpJbkhKZDl6cTA/view?usp=sharing
Мой файл журнала php не имеет ничего, чтобы сообщить. В Apache Log нечего сообщать, и обе из этих xml-строк, которые я опубликовал, являются сообщениями log_message, которые я распечатал в журнале до того, как xml оставил для веб-коннектора.
Единственное, что я могу думать об этом, может быть уместным, это то, что после того, как я завершу запрос для listID и EditSequence, я сохраню их в строке json в дополнительном поле моего нового запроса на мод в очереди, чтобы я мог вернуть их снова, когда я сгенерировать запрос мода. Эта строка остается там при отправке запроса. Может это как-то испортить?
Моя интеграция осуществляется через веб-коннектор quickbooks для подрядчика корпоративных решений quickbooks 15.0
Задача ещё не решена.
Других решений пока нет …