Probleme cu integrare SOAP in PHP

Buna :slight_smile:

Am de integrat Woocommerce cu un serviciu SOAP.
Am facut un call catre serviciu lor dintr-o pagina de Wordpress, toate bune si frumoase, primesc inapoi un raspuns complet de genu:

    <soap-env:body>
        <backgroundcheckresponse>
            <backgroundcheck xsi:type="xsd:string">
                <backgroundreports userid="coloradomobile" password="wgEpJEsFyDVwaV7cNA4Z">
                    <providerreferenceid idowner="I3Logix">
                        <idvalue>2018091110024</idvalue>
                    </providerreferenceid>
                    <backgroundreportpackage type="report">
                        <clientreferenceid>
                            <idvalue>2s3589sddss23ds</idvalue>
                        </clientreferenceid>
                    </backgroundreportpackage>
                    <casedetails>
                        <expirationdate>2018-12-01 23:59:59</expirationdate>
                        <casenumbers>
                            <casenumber>
                                <case>2018091110024</case>
                                <servicecode>UFL</servicecode>
                            </casenumber>
                        </casenumbers>
                    </casedetails>
                    <schedulingurl>https%3A%2F%2Fdemo.i3screen.net%2Forder%2F%3FUserID%3Di3screen%26ProcessID%3D2018091110024%26Token%3Ddbd6fae3e2734a063b6f79951658242e%26Hash%3D28565a81714e5672d2443f3082141e69</schedulingurl>
                </backgroundreports>
            </backgroundcheck>
        </backgroundcheckresponse>
    </soap-env:body>
</soap-env:envelope>

Daca trimit acelasi call catre serviciul lor dintr-o functie care se activeaza la hook-ul woocommerce_payment_complete primesc raspunsul asta fara SchedulingUrl si fara CaseDetails:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <BackgroundCheckResponse>
            <BackgroundCheck xsi:type="xsd:string">
                <BackgroundReports userId="coloradomobile" password="wgEpJEsFyDVwaV7cNA4Z">
                    <ProviderReferenceId idOwner="I3Logix">
                        <IdValue>2018091110019</IdValue>
                    </ProviderReferenceId>
                    <BackgroundReportPackage type="report">
                        <ClientReferenceId>
                            <IdValue>73</IdValue>
                        </ClientReferenceId>
                    </BackgroundReportPackage>
                </BackgroundReports>
            </BackgroundCheck>
        </BackgroundCheckResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Aveti idee de ce apelarea din functia legata la hookul woocommerce_payment_complete primeste un raspuns mai scurt decat fuinctia care apeleaza serviciul dintr-un template de pagina Wordpress?

M-am gandit ca poate sta prea putin sa asculte raspunsul, am incercat sa pun un sleep(5) in ea si tot la fel de scurt ramane raspunsul.

Imi bat capul de cateva ore bune cu asta si nu reusesc sa dau de solutie. Am senzatia ca imi scapa ceva elementar dar nu vad ce :slight_smile:

1 Like

Esti sigur ca Woocommerce nu-ti altereaza in niciun fel request-ul inainte sa-l trimita?

1 Like

Aș zice că hook-ul ala se execută mai devreme decât ai tu nevoie. Dacă știi sigur că ăla e hook-ul corect, pune-i prioritatea 99:

add_filter('woocommerce_payment_complete', 'callback', 99)
2 Likes

Merci pentru sugestie! Da ala e hookul de care am nevoie pentru a trimite informatiile dupa o plata inregistrata cu success.

Am incercat sa-l pun mai la capat si nu s-a schimbat nimic din pacate :(.

Am comparat request headerele si requestul trimis de SoapClient() intre cele doua calluri(din hook si din pagina) si nu pareau sa fie diferite. Cum mi-ai recomada sa verific requesturile? Eu am facut-o cu ajutorul functiei

$soap->__getLastRequest()

dupa care am stocat rezultatul intr-un fisier diferit pentru fiecare request(un fisier pentru functia din hook si unu pentru functia din pagina)

LE: $soap e variabila care stocheaza SoapClient()

Incearca http://php.net/manual/en/soapclient.getlastrequestheaders.php. Atentie la trace.

Ai acelasi client pentru ambele cazuri (cu hook, respectiv fara hook), sau se creeaza diferit?

1 Like

Merci mult pentru sugestii!

Cu asta am incercat si am comparat headerurile si sunt identice. M- o lasat si pe mine perplex toata treaba…

Sunt doi clienti diferiti, unul e creat in functia legata de hook si celalat se creeaza in pagina de test :slight_smile:

Ar fi posibil ca functia legat de hook sa ruleze mai putin si sa nu primeasca tot raspunsul? Daca da, am alte alternative la o face sa asculte dupa raspuns mai mult?

Multumesc tuturor pentru ajutor si sugestii :slight_smile:

Să ruleze mai puțin nu. Ar trebui ori să ai timeout (cu eroare fatală) ori, dacă ai avea vreun flush pe undeva, să ai conținut incomplet (e.g. fără </soap-env:envelope>).

Ordinea în care pui hooks nu este importantă decât dacă lași al treilea parametru gol. Dacă specifici prioritatea, atunci ordinea e neimportantă: cu cât e mai mic numărul, cu atât va rula mai devreme acel hook, recte va rata filtrele ulterioare.


Darrrr… serviciul SOAP nu are legătură cu woo (în sensul că sunt două entități complet separate). Iar cum problema este ceea ce primești, s-ar putea ca problema să fie la datele trimise spre acel serviciu.

1 Like

Eu mizez ca-s diferente intre configurarile clientilor sau, cum zice @iamntz, intre datele din request-uri.
Poti extrage din cod cum creezi clientii si cum faci call-urile?

1 Like

Da, sigur, ii pun aici:

Cod pentru Client legat de hook:

$soap_options = array(
		'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
		'use'=>SOAP_ENCODED,
		'soap_version'=>SOAP_1_1,
		'cache_wsdl'=>WSDL_CACHE_NONE,
        'connection_timeout'=>120,
		'trace'=>true,
		'encoding'=>'UTF-8',
		'exceptions'=>true,
	);
    try {
        $soap = new SoapClient($wsdl, $soap_options);
        $i3_data = $soap->BackgroundCheck('user', 'parola', $xml_order);
        file_put_contents('function_request.txt', $soap->__getLastRequest().'\r');
        file_put_contents('function_request_headers.txt', $soap->__getLastRequestHeaders().'\r');
        file_put_contents('function_response_headers.txt', $soap->__getLastResponseHeaders().'\r');
    }
    catch(SoapFault $e){
        file_put_contents('soap_fault.txt', $e->getMessage().'\r');
    }
    catch(Exception $e) {
        file_put_contents('soap_error.txt', $e->getMessage().'\r');
    }

$xml_order pentru Client legat de hook:

$xml_order='<BackgroundCheck account="acct_number" password="parola" userId="user">
<BackgroundSearchPackage>
<Organization>
    <OrganizationName/>
    <AdditionalItems qualifier="recruiterId" type="Informational">
    <Text>Test Customer</Text>
    </AdditionalItems>
</Organization>
<ReferenceId>
    <IdValue>'. $params['order_id'] .'</IdValue>
</ReferenceId>
<PersonalData>
    <PersonName>
    <GivenName>'. $params['first_name'] .'</GivenName>
    <FamilyName>'. $params['last_name'] .'</FamilyName>
    </PersonName>
    <Telephone>
    <FormattedNumber>'. $params['phone'] .'</FormattedNumber>
    </Telephone>
    <PostalAddress validTo="9999">
    <CountryCode>US</CountryCode>
    <PostalCode>'. $params['postcode'] .'</PostalCode>
    <Region>'. $params['state'] .'</Region>
    <Municipality>'. $params['city'] .'</Municipality>
    <DeliveryAddress>
        <AddressLine>'. $params['address_1'] .'</AddressLine>
    </DeliveryAddress>
    </PostalAddress>
    <DemographicDetail>
    <GovernmentId countryCode="US" issuingAuthority="SSN">999887777</GovernmentId>
    </DemographicDetail>
    <ContactMethod>
    <InternetEmailAddress>'. $params['email'] .'</InternetEmailAddress>
    </ContactMethod>
</PersonalData>
<Screenings>
    <ReferenceId idOwner="ColoradoMobile">
    <IdValue name="LocationCode">112487</IdValue>
    </ReferenceId>
    <Screening qualifier="x:I3Logix" type="drug">
    <ReferenceId idOwner="I3Logix">
        <IdValue name="doNotMatchResults"/>
    </ReferenceId>
    <SearchDrugs>
        <ReasonForTest>PRE-EMPLOYMENT</ReasonForTest>
        <TestType packageCode="5PUNON"/>
        <CollectionDate dateDescription="expirationDate">
        <AnyDate>2018-12-01T23:59:59</AnyDate>
        </CollectionDate>
        <OtherApplicantInformation>
v2.7 &#x2013; i3screen | Proprietary and Confidential P a g e | 29
<IdValue name="dotAgency">Not Applicable</IdValue> <IdValue name="observedCollectionRequired">0</IdValue> </OtherApplicantInformation>
    </SearchDrugs>
    </Screening>
</Screenings>
</BackgroundSearchPackage>
</BackgroundCheck>';

$params e un array cu date luate din WooCommerce Order Form care e okay si fara erori. Am verificat valorile trimise si sunt in parametri din cate mi-am dat seama.

Cod pentru Client din pagina:

$soap_options = array(
	'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
	'style'=>SOAP_RPC,
	'use'=>SOAP_ENCODED,
	'soap_version'=>SOAP_1_1,
	'cache_wsdl'=>WSDL_CACHE_NONE,
	'connection_timeout'=>120,
	'trace'=>true,
	'encoding'=>'UTF-8',
	'exceptions'=>true,
);
 try {
	$soap = new SoapClient($wsdl, $soap_options);
	$data = $soap->BackgroundCheck('user', 'parola', $xml_order);
	file_put_contents('template_request.txt', $soap->__getLastRequest().'\r');
}
catch(Exception $e) {
	echo('Error!');
	die($e->getMessage());
}

$xml_order pentru Client din pagina:

$xml_order='<BackgroundCheck account="acct_number" password="parola" userId="user">
<BackgroundSearchPackage>
<Organization>
		<OrganizationName/>
		<AdditionalItems qualifier="recruiterId" type="Informational">
		<Text>Test Customer</Text>
		</AdditionalItems>
</Organization>
<ReferenceId>
		<IdValue>2s3589sdd3ss23ds</IdValue>
</ReferenceId>
<PersonalData>
		<PersonName>
		<GivenName>Alex</GivenName>
		<FamilyName>Paul</FamilyName>
		</PersonName>
		<Telephone>
		<FormattedNumber>1234567894</FormattedNumber>
		</Telephone>
		<PostalAddress validTo="9999">
		<CountryCode>US</CountryCode>
		<PostalCode>80022</PostalCode>
		<Region>CO</Region>
		<Municipality>town</Municipality>
		<DeliveryAddress>
				<AddressLine>street address</AddressLine>
		</DeliveryAddress>
		</PostalAddress>
		<DemographicDetail>
		<GovernmentId countryCode="US" issuingAuthority="SSN">999887777</GovernmentId>
		</DemographicDetail>
		<ContactMethod>
		<InternetEmailAddress>[email protected]</InternetEmailAddress>
		</ContactMethod>
</PersonalData>
<Screenings>
		<ReferenceId idOwner="ColoradoMobile">
		<IdValue name="LocationCode">112487</IdValue>
		</ReferenceId>
		<Screening qualifier="x:I3Logix" type="drug">
		<ReferenceId idOwner="I3Logix">
				<IdValue name="doNotMatchResults"/>
		</ReferenceId>
		<SearchDrugs>
				<ReasonForTest>PRE-EMPLOYMENT</ReasonForTest>
				<TestType packageCode="5PUNON"/>
				<CollectionDate dateDescription="expirationDate">
				<AnyDate>2018-12-01T23:59:59</AnyDate>
				</CollectionDate>
				<OtherApplicantInformation>
v2.7 &#x2013; i3screen | Proprietary and Confidential P a g e | 29
<IdValue name="dotAgency">Not Applicable</IdValue> <IdValue name="observedCollectionRequired">0</IdValue> </OtherApplicantInformation>
		</SearchDrugs>
		</Screening>
</Screenings>
</BackgroundSearchPackage>
</BackgroundCheck>';

Trebe sa mentionez ca nu or fost create nici soap_fault.txt nici soap_error.txt .

ReferenceId poate fi orice numar atata timp cat e diferit pentru fiecare call catre Service.

O diferenta e in options, la style SOAP_RPC.

Apoi, ideal sa vezi $xml_order generat, nu cel cu variabile. Genereaza-ti un input care functioneaza, apoi paseaza-l ambilor clienti. Asta daca input-ul nu cumva se genereaza deja din aceeasi sursa.

1 Like

Got it, mi-o scapat chestia asta legata de stil. Am adaugat style=SOAP_RPC si la cel din hook.

Am incercat cu un $xml_order care merge pe pagina, l-am pus identic in SOAP call-ul din hook si tot la fel primesc raspunsul. Mai scurt si fara SchedulingUrl si CaseDetails. :confused:

Uite si Request headurile trimise de Callul din Hook:

POST /web_services/Service.php HTTP/1.1
Host: demo.i3screen.net
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.6.36-1+ubuntu16.04.1+deb.sury.org+1
Content-Type: text/xml; charset=utf-8
SOAPAction: "https://demo.i3screen.net/#BackgroundCheckMethod"
Content-Length: 3227

Si Request headerurile trimise de Callul din Pagina:

POST /web_services/Service.php HTTP/1.1
Host: demo.i3screen.net
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.6.36-1+ubuntu16.04.1+deb.sury.org+1
Content-Type: text/xml; charset=utf-8
SOAPAction: "https://demo.i3screen.net/#BackgroundCheckMethod"
Content-Length: 3227

Response Header primite de Callul din Hook

HTTP/1.1 200 OK
Date: Tue, 11 Sep 2018 11:26:32 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.1.18
X-Powered-By: PHP/7.1.18
Set-Cookie: PHPSESSID=566c58f544549eeecd1a91693e5c0998; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
X-SOAP-Server: NuSOAP/0.9.5 (1.56)
Content-Length: 1826
X-Content-Type-Options: nosniff
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/xml; charset=UTF-8

Response Header primite de Callul din pagina

HTTP/1.1 200 OK
Date: Tue, 11 Sep 2018 11:32:53 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.1.18
X-Powered-By: PHP/7.1.18
Set-Cookie: PHPSESSID=be9382b1e7530b1755b21eef9b691c9c; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
X-SOAP-Server: NuSOAP/0.9.5 (1.56)
Content-Length: 2562
X-Content-Type-Options: nosniff
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/xml; charset=UTF-8

In primul post, primul response pare neparsat, iar al doilea pare a fi parsat (probabil ai dat copy paste din browser). Te-ai uitat in ambele situatii la response-ul neparsat, raw string, sa nu fie vreo situatie de sintaxa?

1 Like

Yep, am copiat aici ce era mai la indemana cand am dat replyul dar am capturat ambele raspunsuri neparsate si din cel primit pentru functia din Hook lipsesc cele doua elemente SchedulingUrl si CaseDetails. Acum sunt in discutii si cu tipii care au Service-ul asta sa vad daca ma pot lamuri ei cu ceva.

Multumesc mult pentru tot ajutorul, chiar o fost de folos sa mai am doua perechi de ochi care sa se uite peste cod!

O sa va anunt daca ajung odata la un raspuns :slight_smile:

@msd @iamntz
Guess what? Totul era okay, mai putin faptul ca serviciul lor genereaza linkul respectiv doar o singura data/request cu acelasi Reference ID. Si mai Guess what? Eu apelam de doua ori functia din cauza ca am uitat sa sterg apelarea din codul de test… Noroc cu cei de la supportul serviciului care mi-or zis ca primesc doua requesturi extrem de apropiate pentru informatii :sunny:

The biggest dumbass ever -> Alex :smiley:

Va multumesc pentru raspunsurile bune si pentru rabdare. Cand ne vedem data viitoare va fac cel putin o bere cinste!

Poate fi inchis topicul asta, merci mult!

4 Likes