0

step 6 of this guide을 따라 php sdk를 사용하여 고객의 정보를 업데이트합니다. 아이디어는 ID로 고객을 검색하고 해당 고객에 대한 업데이트 요청을 발행하는 것입니다. 내 코드 :QBO IPP PHP SDK QuickBooks V3 API - 고객을 업데이트 할 수 없습니다.

$ipp_customer = $data_service->FindById(
    new IPPCustomer(array('Id' => '120'), true) 
); 
$ipp_customer->sparse = 'true'; 
$ipp_customer->DisplayName = 'Carrier Name'; 
$data_service->Update($ipp_customer); 

업데이트에 대한 응답에 오류 (2090 오류)가 표시됩니다. SDK가 업데이트 요청을 생성 할 때 SyncToken에 0을 채우지 않는 것 같습니다. 이로 인해 유효성 검증 오류가 발생했습니다.

그런 다음 PHP SDK (/v3-php-sdk-2.0.1/_Samples/CustomerUpdate.php)에서 제공하는 샘플 코드를 살펴 보았습니다. 샘플 코드는 $dataService->Add을 사용하여 업데이트를 수행합니다. 결과로 Add을 호출하면 SyncToken이 없으므로 샘플 코드가 적용되지 않는 것 같습니다.

SDK를 올바르게 사용하여 고객을 업데이트하는 방법은 무엇입니까?

요청/응답 메시지는 다음과 같습니다 :

REQUEST BODY 
============= 
<?xml version="1.0" encoding="UTF-8"?> 
<ns0:Customer xmlns:ns0="http://schema.intuit.com/finance/v3" sparse="true"> 
    <ns0:Id>120</ns0:Id> 
    <ns0:SyncToken/> 
    <ns0:MetaData> 
    <ns0:CreateTime/> 
    <ns0:LastUpdatedTime/> 
    </ns0:MetaData> 
    <ns0:FullyQualifiedName/> 
    <ns0:DisplayName>Carrier Name</ns0:DisplayName> 
    <ns0:PrintOnCheckName/> 
    <ns0:Active>true</ns0:Active> 
    <ns0:PrimaryPhone> 
    <ns0:FreeFormNumber/> 
    </ns0:PrimaryPhone> 
    <ns0:Fax> 
    <ns0:FreeFormNumber/> 
    </ns0:Fax> 
    <ns0:Taxable>false</ns0:Taxable> 
    <ns0:BillAddr> 
    <ns0:Id>87</ns0:Id> 
    <ns0:Line1/> 
    <ns0:Line2/> 
    <ns0:City/> 
    <ns0:CountrySubDivisionCode/> 
    <ns0:PostalCode/> 
    <ns0:Lat/> 
    <ns0:Long/> 
    </ns0:BillAddr> 
    <ns0:Job>false</ns0:Job> 
    <ns0:BillWithParent>false</ns0:BillWithParent> 
    <ns0:Balance>0</ns0:Balance> 
    <ns0:BalanceWithJobs>0</ns0:BalanceWithJobs> 
    <ns0:PreferredDeliveryMethod/> 
</ns0:Customer> 

RESPONSE BODY 
============= 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-01-21T12:53:53.838-08:00"> 
    <Fault type="ValidationFault"> 
    <Error code="2090" element="SyncToken"> 
    <Message>Invalid Number</Message> 
    <Detail>Invalid Number : </Detail> 
    </Error> 
    </Fault> 
</IntuitResponse> 

감사합니다. 여기에 편집 한

는 findById 메소드 호출의 결과로 응답 기관입니다 :

RESPONSE BODY 
============= 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-01-24T10:21:58.493-08:00"> 
<Customer domain="QBO" sparse="false"> 
    <Id>120</Id> 
    <SyncToken>13</SyncToken> 
    <MetaData> 
    <CreateTime>2014-01-17T14:08:42-08:00</CreateTime> 
    <LastUpdatedTime>2014-01-24T09:27:00-08:00</LastUpdatedTime> 
    </MetaData> 
    <FullyQualifiedName>Carrier Name Modif</FullyQualifiedName> 
    <DisplayName>Carrier Name Modif</DisplayName> 
    <PrintOnCheckName>Carrier Name</PrintOnCheckName> 
    <Active>true</Active> 
    <Taxable>false</Taxable> 
    <BillAddr> 
    <Id>87</Id> 
    </BillAddr> 
    <Job>false</Job> 
    <BillWithParent>false</BillWithParent> 
    <Balance>0</Balance> 
    <BalanceWithJobs>0</BalanceWithJobs> 
    <PreferredDeliveryMethod>Print</PreferredDeliveryMethod> 
</Customer> 
</IntuitResponse> 

내가 샘플 스크립트 (CustomerUpdate.php)를 사용하여 내 응용 프로그램을 사용하여 SDK를 통해 디버깅이 편집 코드 (cakephp webapp). 인 print_r를 사용 findById 메소드에 샘플 스크립트의 호출은 SyncToken 출력을 가진 IPPCustomer 제작 :

[SyncToken] => 46 

findById 메소드 내 응용 프로그램 코드의 호출은 제작 :

[SyncToken] => String Object 
    (
    [value] => 46 
) 

이 결과는 XML - 투 - 객체를 믿고 저를 주도 파싱은 문맥상의 차이 때문에 다르게 처리됩니다. cakephp에는 String 클래스가 정의되어 있으며 응용 프로그램 코드에서 사용할 수 있습니다. v3-php-sdk-2.0.1/종속성/XDS2PHP/src/com/mikebevz/xsd2php/Bind.php에서 bindXml 함수는 class_exists (138 행)을 호출합니다. CakePHP의 (내 응용 프로그램 코드)를 사용할 때

if (!class_exists($class_name)) { 
    // assign $model->{$name} to child node's value 
} else { 
    // assign $model->{$name) to newly created object $class_name, which wraps child nodes' value 
} 

class_exists('string')이 true로 평가 : 다음은 발췌 한 것입니다. class_exists('string')은 cakephp (샘플 스크립트)를 사용하지 않을 때 false로 평가됩니다. 나는 이것이 왜이 라이브러리를 사용할 때 xml-to-object 구문 분석이 다르게 동작하는지 믿습니다. 따라서, 내가 대신 CakePHP를 갖는 정의 String 클래스 보인다 예상

<ns0:SyncToken>46</ns0:SyncToken> 

<ns0:SyncToken/> 

를 얻을 IPP PHP SDK와의 충돌 상황으로 실행됩니다.

require_once('cake/libs/string.php'); // assuming cakephp 1.3's string class 

내가 문제가 더욱 분명하다 생각, 어떤 제안 솔루션을이 충돌하는 상황은 샘플 CustomerUpdate.php 스크립트에 다음 행을 추가하여 다시 만들 수 있습니다?

+1

FindByID 호출에서 synctoken을 가져오고 있습니까? –

+0

예, FindById 호출에서 synctoken을 얻고 있습니다 (편집 1 참조) – EricC

답변

0

내 답변이 늦으면 죄송합니다. 나는 Eric과 똑같은 문제에 부딪혔다. /Dependencies/XDS2PHP/src/com/mikebevz/xsd2php/Bind.php 파일의 방향으로 나를 가리켜 주셔서 감사합니다. 함께

if (!class_exists($class_name)) { 

:

나는이 구현 한 해결 방법은 내가이 교체 끝내 컨트롤러 객체의 존재 (CakePHP의 환경에 존재)

을 테스트하는 것이었다

if (!class_exists($className) || (($className == 'string') && class_exists('Controller'))) { 

이제 dataService-> Update 호출이 예상대로 작동합니다.

+0

네, 그 말이 맞는 것입니다. 문자열 외에 Controller 클래스가 있는지 테스트하면 cakephp 컨텍스트를 더 잘 알 수 있습니다. – EricC

2

Add를 사용하여 코드 작업을 할 수 있습니다.

$ipp_customer = $dataService->FindById(
    new IPPCustomer(array('Id' => '6'), true) 
); 

$ipp_customer->DisplayName = 'Name Name Something'; 
$dataService->Add($ipp_customer); 

이렇게하면 QuickBooks 설정에서 ID가 6 인 사용자의 표시 이름이 성공적으로 업데이트되었습니다. 그것은 당신을 위해서도 잘 작동 할 것입니다.

+0

당신의 요점을 말합니다. 독립 실행 형 스크립트로 샘플 코드를 실행하면 작동합니다. 내 Edit2는 내가 직면하고있는 문제에 대한 세부 정보 및 컨텍스트를 추가합니다. 감사. – EricC

+0

당신은 생명을 구하는 분이 십니다. 누가 당신을 추측 했었습니까? 업데이트 할 때 '추가'하시겠습니까? –