Link to home
Start Free TrialLog in
Avatar of Neil Thompson
Neil ThompsonFlag for United Kingdom of Great Britain and Northern Ireland

asked on

Help required with SOAP call, getting error "ContractFilter mismatch at the EndpointDispatcher"

Hi all, hoping one of you Gurus can assist please.

I have been using a payment system for many years but they have now changed one of their SOAP calls to an external URL. For the life of me I'm unable to connect without the following error:

"cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None). "

these are the binding info from their App.config file if it helps
<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IPortalService">
          <!-- Transport security is only required when the portal service is running under https, for http this should be set to None -->
          <security mode="Transport" />
        </binding>
      </basicHttpBinding>
    </bindings>

Open in new window


I'm using PHP7 and have free run on the server to implement any of your suggestions. Previously I used cURL to simply create the SOAP XML, post if off and grab the response but having no luck here.

I cant post all the login details etc as it's payment and site specific but I'm after being initially able to at least connect to the SOAP URL below, and get a more valid error (for example, invalid user logon) etc.

Ok, here's the details:

https://pay360sc.e-paycapita.com/LivePayments242/PortalService.svc?wsdl

Action required is "Invoke" for which I believe the following should be the right XML to be sent:

<invokeRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <credentials>
    <subject>
      <subjectType>SecureBureauServiceSite</subjectType>
      <identifier>242</identifier>
      <systemCode>APN</systemCode>
    </subject>
    <requestIdentification>
      <uniqueReference>3rdPartyRef48550</uniqueReference>
      <timeStamp>20181204085422</timeStamp>
    </requestIdentification>
    <signature>
      <algorithm>Original</algorithm>
      <hmacKeyID>1</hmacKeyID>
      <digest>6EpZzXc7JD1aq525LXySuybkTi+CdhUJuF023o3C+wM=</digest>
    </signature>
  </credentials>
  <login>
    <loginName>itsme</loginName>
    <password>anypassword</password>
    <consortiumCode>6Q</consortiumCode>
    <siteId>242</siteId>
  </login>
  <requestType>PayOnly</requestType>
  <requestId>036380e1-ed43-4cb0-af91-9d4fc81ced26</requestId>
  <sale>
    <items>
      <item>
        <itemDetails>
          <fundCode>02</fundCode>
          <reference>10948055</reference>
          <amountInMinorUnits>250</amountInMinorUnits>
        </itemDetails>
        <lineId>001</lineId>
      </item>
    </items>
  </sale>
</invokeRequest>

Open in new window


Happy to use SOAPClient or cURL, whatever you guys decide is best.
Avatar of girionis
girionis
Flag of Greece image

The XML you're sending is wrong, this is the correct one:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:pay="http://www.capita-software.co.uk/software/pages/payments.aspx?apnPortal" xmlns:com="https://support.capita-software.co.uk/selfservice/?commonFoundation">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:Invoke>
         <!--Optional:-->
         <tem:request>
            <!--Optional:-->
            <pay:credentials>
               <com:subject>
                  <com:subjectType>SecureBureauServiceSite</com:subjectType>
                  <com:identifier>242</com:identifier>
                  <!--Optional:-->
                  <com:systemCode>APN</com:systemCode>
               </com:subject>
               <com:requestIdentification>
                  <com:uniqueReference>3rdPartyRef48550</com:uniqueReference>
                  <com:timeStamp>20181204085422</com:timeStamp>
               </com:requestIdentification>
               <com:signature>
                  <com:algorithm>Original</com:algorithm>
                  <com:hmacKeyID>1</com:hmacKeyID>
                  <com:digest>6EpZzXc7JD1aq525LXySuybkTi+CdhUJuF023o3C+wM=</com:digest>
               </com:signature>
            </pay:credentials>
            <pay:login>
               <pay:loginName>itsme</pay:loginName>
               <pay:password>anypassword</pay:password>
               <pay:consortiumCode>6Q</pay:consortiumCode>
               <pay:siteId>242</pay:siteId>
            </pay:login>
            <pay:requestType>PayOnly</pay:requestType>
            <pay:requestId>036380e1-ed43-4cb0-af91-9d4fc81ced26</pay:requestId>
            <pay:routing/>
            <pay:sale>
               <pay:items>
                  <pay:item>
                     <pay:itemDetails>
                        <pay:fundCode>02</pay:fundCode>
                        <pay:reference>10948055</pay:reference>
                        <pay:amountInMinorUnits>250</pay:amountInMinorUnits>
                     </pay:itemDetails>
                     <pay:lineId>001</pay:lineId>
                  </pay:item>
               </pay:items>
            </pay:sale>
         </tem:request>
      </tem:Invoke>
   </soapenv:Body>
</soapenv:Envelope>

Open in new window


Try first to send a request with SOAP UI.
Avatar of Neil Thompson

ASKER

Many thanks

I've taken that and tried to call it like I've always done but I'm now getting no reply at all for some reason. I've kind of been dumped in the deep end unfortunately. If I could just get some sort of reply that would be a building block.

This is what I'm trying.:

<?php

date_default_timezone_set("UTC");
ini_set("soap.wsdl_cache_enabled", 0); 

// prepare the full SOAP payload
$SOAPPayload = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:pay="http://www.capita-software.co.uk/software/pages/payments.aspx?apnPortal" xmlns:com="https://support.capita-software.co.uk/selfservice/?commonFoundation">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:Invoke>
         <tem:request>
            <pay:credentials>
               <com:subject>
                  <com:subjectType>SecureBureauServiceSite</com:subjectType>
                  <com:identifier>242</com:identifier>
                  <com:systemCode>APN</com:systemCode>
               </com:subject>
               <com:requestIdentification>
                  <com:uniqueReference>15439246051052</com:uniqueReference>
                  <com:timeStamp>20181204115645</com:timeStamp>
               </com:requestIdentification>
               <com:signature>
                  <com:algorithm>Original</com:algorithm>
                  <com:hmacKeyID>1</com:hmacKeyID>
                  <com:digest>AWO5unhlwNTbTxfaus7DX8/cM0l/WDGIjJdNBQZjSEQ=</com:digest>
               </com:signature>
            </pay:credentials>
            <pay:login>
               <pay:loginName>test</pay:loginName>
               <pay:password>testpwd</pay:password>
               <pay:consortiumCode>6Q</pay:consortiumCode>
               <pay:siteId>242</pay:siteId>
            </pay:login>
            <pay:requestType>PayOnly</pay:requestType>
            <pay:requestId>15439246051052</pay:requestId>
            <pay:routing/>
            <pay:sale>
               <pay:items>
                  <pay:item>
                     <pay:itemDetails>
                        <pay:fundCode>02</pay:fundCode>
                        <pay:reference>10948055</pay:reference>
                        <pay:amountInMinorUnits>250</pay:amountInMinorUnits>
                     </pay:itemDetails>
                     <pay:lineId>001</pay:lineId>
                  </pay:item>
               </pay:items>
            </pay:sale>
         </tem:request>
      </tem:Invoke>
   </soapenv:Body>
</soapenv:Envelope>';

$headers = array(
	"Content-type: text/xml;charset=\"utf-8\"",
	"Accept: text/xml",
	"Cache-Control: no-cache",
	"Pragma: no-cache",
	"SOAPAction: http://tempuri.org/IPortalService/Invoke",
	"Content-length: ".strlen($SOAPPayload)
);

// PHP cURL  for https connection with auth
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, _SOAP_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $SOAPPayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FAILONERROR, true);

echo curl_error($ch);

$response = curl_exec($ch);
curl_close($ch);

echo $response;

?>

Open in new window

What happens if you try the same request from SOAP UI? Does it work? I tried it here and I got an error about invalid credentials, so it should work.
Can I use that online or do I need to install it and configure it all please?
You need to download it from here: https://www.soapui.org/
I've got that now but guttingly I think that is way over my head at present to learn in the next few hours how to use it. I only have until tomorrow pm to try to get a response unfortunately :(

The SOAP seems different in your one though to the one the company are giving as a test.

Their request is:
<invokeRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <credentials>
    <subject>
      <subjectType>SecureBureauServiceSite</subjectType>
      <identifier>242</identifier>
      <systemCode>APN</systemCode>
    </subject>
    <requestIdentification>
      <uniqueReference>3rdPartyRef20999</uniqueReference>
      <timeStamp>20181204124842</timeStamp>
    </requestIdentification>
    <signature>
      <algorithm>Original</algorithm>
      <hmacKeyID>1</hmacKeyID>
      <digest>XSEyKHlJ/i/af3K13d9Fl9ff2MMURm8Z8qP3JgAWUGI=</digest>
    </signature>
  </credentials>
  <login>
    <loginName>123</loginName>
    <password>456</password>
    <consortiumCode>6Q</consortiumCode>
    <siteId>242</siteId>
  </login>
  <requestType>PayOnly</requestType>
  <requestId>2b9a3a0f-9c01-4f14-87b2-9112f2e968f9</requestId>
  <sale>
    <items>
      <item>
        <itemDetails>
          <fundCode>02</fundCode>
          <reference>10948055</reference>
          <amountInMinorUnits>250</amountInMinorUnits>
        </itemDetails>
        <lineId>001</lineId>
      </item>
    </items>
  </sale>
</invokeRequest>

Open in new window


Which gives a response using their text exe file of:

<invokeResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ExtensionData />
  <requestId>2b9a3a0f-9c01-4f14-87b2-9112f2e968f9</requestId>
  <apnReference>ff4e2558-c813-437e-af76-6565e7171695</apnReference>
  <transactionState>InProgress</transactionState>
  <invokeResult>
    <ExtensionData />
    <status>Success</status>
    <errorDetails>
      <ExtensionData />
      <errorId />
      <errorMessage />
    </errorDetails>
    <redirectUrl>https://pay360sc.e-paycapita.com/LivePayments242/PortalLogin.aspx</redirectUrl>
  </invokeResult>
</invokeResponse>

Open in new window

I think their XML is wrong. For a start the operation is called Invoke

<wsdl:operation name="Invoke">
	<soap:operation
		soapAction="http://tempuri.org/IPortalService/Invoke" style="document" />
	<wsdl:input>
		<soap:body use="literal" />
	</wsdl:input>
	<wsdl:output>
		<soap:body use="literal" />
	</wsdl:output>
</wsdl:operation>

Open in new window


Inside the Invoke request there can be 0 or more elements named "request" of type "invokeRequest"

<xs:element name="Invoke">
	<xs:complexType>
		<xs:sequence>
			<xs:element minOccurs="0" name="request" nillable="true"
				type="q3:invokeRequest" />
		</xs:sequence>
	</xs:complexType>
</xs:element>

Open in new window


and the invoekRequest element can have the following elements:

<xs:complexType name="invokeRequest">
	<xs:sequence>
		<xs:element minOccurs="0" name="credentials"
			nillable="true" type="q4:credentials" />
		<xs:element name="login" nillable="true"
			type="tns:loginDetails" />
		<xs:element name="requestType" type="q5:RequestType" />
		<xs:element name="requestId" nillable="true"
			type="xs:string" />
		<xs:element name="routing" nillable="true"
			type="tns:routing" />
		<xs:element minOccurs="0" name="billing" nillable="true"
			type="tns:billingDetails" />
		<xs:element name="sale" nillable="true" type="tns:sale" />
	</xs:sequence>
</xs:complexType>

Open in new window


So the correct XML is the one I posted, which was produced by SOAP UI. By the way SOAP UI is very simple and easy to use, it won't take you more than 5' to set up a soap project and send a request.

Anyway, I think they have sent you a wrong sample XML request. YOu better get in touch with them and send them my request and ask them if it is correct.
Thanks, I'll continue to look at SoapUI. Rather annoying when it all doesn't seem to work unfortunately though.

Strangely, this is their XML actually working in their text program I have on my pc

User generated image
Does the text programme you have connect to the new URL or to the old one?
This is what I get when I run it from SOAP UI. As you see I get a response back that I use wrong credentials:

https://prnt.sc/lql9bm
it connects to https://pay360sc.e-paycapita.com/LivePayments242/PortalService.svc

Are you sure? How do you know it? Do you pass it as parameter?

As a side note, if I send your request with SOAP UI I get an empty response with the following error:

HTTP/1.1 400 Bad Request
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
Date: Tue, 04 Dec 2018 14:21:23 GMT
Content-Length: 0

I think it is the same behaviour you get with PHP. Can you try to print the response headers as well?
I'm literally getting nothing at all back in the headers.

As for the URL, the config file has that in there, whether it's ignored and it actually goes somewhere else I'm not overly sure now as nothing seems to be tying up
Can you try something else? Can you delete the URL from the config file and try again? By doing so we'll make sure that it reads it from there.
Thanks Girionis. I've tried that and it wouldn't work at all so at least I now know it's definitely going to that url, what I guess I don't know is how much "tweaking" is goin on under the hood before it's passed out.

Tried using Fiddler to try and catch the test .exe file output but it says it doesn't trust the certificates which is a shame
ASKER CERTIFIED SOLUTION
Avatar of girionis
girionis
Flag of Greece image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks Gironis

Using SoapUI I managed to eventually find out they had changed part of the digest creation to be completely different to all the other digest creations they use. Unfortunately for us they didn't check all the samples I was sending them as they would have spotted it instantly.

Great help, much appreciated.
Ah... I see. I told you SOAP UI is a great tool. Glad I was of help.