Search code examples
phpweb-servicessoapwsdlworkday-api

PHP call to Workday SOAP Webservice through WSDL URL


I am trying to call SOAP webservice for which WSDL file is already given. I am able to test these SOAP Request and Response through SOAP UI or Chrome Boomerang. I am able to get response properly.

Client has shared WSDL URL, Username, and Password. How can I use PHP code to call services. My concern is that I have request and response in XML format.

Can I send XML directly in the request. How could I make a SOAP Request with these given XML-Request information. Do I need to parse into objects or arrays. Thanks in advance.

XML Request that sends me response on SOAP UI is -

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <env:Header>
        <xsd:sample_Common_Header>
            <xsd:Include_Reference_Descriptors_In_Response>false</xsd:Include_Reference_Descriptors_In_Response>
        </xsd:sample_Common_Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:UsernameToken>
                <wsse:Username>Assessment@tenant</wsse:Username>
                <wsse:Password>Test@1234</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </env:Header>
    <env:Body>
        <wd:Get_Assess_Candidate_Request
            xmlns:wd="urn:com.sample/bsvc"
            wd:version="v29.0">
              <wd:Request_Criteria>
<wd:Candidate_Criteria_Data>
<wd:Candidate_Reference>
<wd:ID wd:type="Candidate_ID">C0000417</wd:ID>
</wd:Candidate_Reference>
</wd:Candidate_Criteria_Data>
 </wd:Request_Criteria>
 <wd:Response_Filter>
                <wd:As_Of_Effective_Date>2018-01-16</wd:As_Of_Effective_Date>
                <wd:As_Of_Entry_DateTime>2018-01-16T11:17:34</wd:As_Of_Entry_DateTime>
                <wd:Page>1</wd:Page>
                <wd:Count>100</wd:Count>
            </wd:Response_Filter>
        </wd:Get_Assess_Candidate_Request>
    </env:Body>
</env:Envelope>

Solution

  • function AddWSSUsernameToken($client, $username, $password)
    {
        $wssNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
    
        $username = new SoapVar($username, 
                                XSD_STRING, 
                                null, null, 
                                'Username', 
                                $wssNamespace);
    
        $password = new SoapVar($password, 
                                XSD_STRING, 
                                null, null, 
                                'Password', 
                                $wssNamespace);
    
        $usernameToken = new SoapVar(array($username, $password), 
                                        SOAP_ENC_OBJECT, 
                                        null, null, 'UsernameToken', 
                                        $wssNamespace);
    
        $usernameToken = new SoapVar(array($usernameToken), 
                                SOAP_ENC_OBJECT, 
                                null, null, null, 
                                $wssNamespace);
    
        $wssUsernameTokenHeader = new SoapHeader($wssNamespace, 'Security', $usernameToken);
    
        $client->__setSoapHeaders($wssUsernameTokenHeader);
    }
    
    function get_soap_client(){
    
    
        $username = 'Assessment@tenant';
        $password = 'Test@1234';
        $wsdl = 'https://wd5-impl-
        services1.workday.com/ccx/service/tenant/Recruiting/v29.1?wsdl';
    
        $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'=>15,
                'trace'=>true,
                'encoding'=>'UTF-8',
                'exceptions'=>true,
        );
    
    
        $client = new SoapClient($wsdl, $options);
        AddWSSUsernameToken($client, $username, $password);
    
        return $client;    
    
    }
    
    
    try
        {
    
            $params = array(); //define your parameters here
            $client = get_soap_client();
            $response = $client->__soapCall('method-name',$params);
    
        }
        catch(Exception $e){ 
            echo $e->getCode(). '<br />'. $e->getMessage();
    
        }