Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

soap:Envelope SOAP-ENV:Envelope PHP

I'm trying to login to an API using built-in soap functions of PHP. I got a result like this.

[LoginResult]=> false,
[ErrorMsg] => Login failed with the reason : The security object is invalid

This is what required by the API provider.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <Login xmlns="http://tempuri.org/Example/Service1">
          <objSecurity>
              <WebProviderLoginId>test</WebProviderLoginId>
              <WebProviderPassword>test</WebProviderPassword>
              <IsAgent>false</IsAgent>
          </objSecurity>
          <OutPut />
          <ErrorMsg />
    </Login>
</soap:Body>
</soap:Envelope>

&, here is what I was able to produce using functions.

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/Example/Service1">
<SOAP-ENV:Body>
    <ns1:Login>
        <objSecurity>
             <WebProviderLoginId>test</WebProviderLoginId>
             <WebProviderPassword>test</WebProviderPassword>
             <IsAgent>false</IsAgent>
        </objSecurity>
        <OutPut/>
        <ErrorMsg/>
    </ns1:Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Here is the code I used to send the request.

<?php
class objSecurity {
function objSecurity($s, $i, $f)   {
    $this->WebProviderLoginId = $s;
    $this->WebProviderPassword = $i;
    $this->IsAgent = $f;
}
}

class nextObject {
function nextObject($objSecurity)   {
    $this->objSecurity=$pobjSecurity;
    $this->OutPut=NULL;
    $this->ErrorMsg=NULL;
}
}

$url    = 'http://example.com/sampleapi/test.asmx?WSDL';
$client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1));
$struct = new objSecurity('test', 'test', false);
$data   = new nextObject($struct);
$soapstruct2 = new SoapVar($data, SOAP_ENC_OBJECT);
print_r(
   $client->__soapCall(
       "Login",
       array(new SoapParam($soapstruct2, "inputStruct"))
   )
);

echo $client->__getLastRequest();

?>

These are the differences I found.

In my request xmlns:xsi is missing.

Requirement starts with <soap:Envelope, But my request starts with <SOAP-ENV:Envelope.

There is an extra xmlns:ns1 in my request.

& The function name tag starts with ns1:.

Please help me to make my request into the required format.

I don't know much about the SOAP and I'm using PHP version 5.3.13 with CakePHP 2.3.0. Sorry, for my bad English.

like image 651
Midhun KM Avatar asked Feb 08 '13 10:02

Midhun KM


People also ask

What is SOAP ENV Envelope?

The SOAP envelope indicates the start and the end of the message so that the receiver knows when an entire message has been received. The SOAP envelope solves the problem of knowing when you are done receiving a message and are ready to process it. The SOAP envelope is therefore basically a packaging mechanism.

What is SoapClient PHP?

Description ¶ This is a low level API function that is used to make a SOAP call. Usually, in WSDL mode, SOAP functions can be called as methods of the SoapClient object. This method is useful in non-WSDL mode when soapaction is unknown, uri differs from the default or when sending and/or receiving SOAP Headers.

What is Soapmessage?

A SOAP message is an XML document that consists of a SOAP envelope, an optional SOAP header, and a SOAP body. The SOAP message header contains information that allows the message to be routed through one or more intermediate nodes before it reaches its final destination.

How do you make a SOAP Envelope?

SOAPEnvelope envelope = soapPart. getEnvelope(); You can now use the getHeader and getBody methods of envelope to retrieve its empty SOAPHeader and SOAPBody objects. SOAPHeader header = envelope.


1 Answers

Here is the solution. :)

<?php
$url    = 'http://example.com/sampleapi/test.asmx?WSDL';
$client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1));

$user_param = array (
  'WebProviderLoginId' => "test",
  'WebProviderPassword' => "test",
  'IsAgent' => false
);

$service_param = array (
  'objSecurity' => $user_param,
  "OutPut" => NULL,
  "ErrorMsg" => NULL
);

print_r(
   $client->__soapCall(
       "Login",
       array($service_param)
   )
);

echo $client->__getLastRequest();

?>

& the request was:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/Example/Service1">
<SOAP-ENV:Body>
   <ns1:Login>
       <ns1:objSecurity>
           <ns1:WebProviderLoginId>test</ns1:WebProviderLoginId>
           <ns1:WebProviderPassword>test</ns1:WebProviderPassword>
           <ns1:IsAgent>false</ns1:IsAgent>
       </ns1:objSecurity>
   </ns1:Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Thanks to this link. PHP SOAP Request not right

like image 105
Midhun KM Avatar answered Oct 02 '22 00:10

Midhun KM