Neil Thompson
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
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:
Happy to use SOAPClient or cURL, whatever you guys decide is best.
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>
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>
Happy to use SOAPClient or cURL, whatever you guys decide is best.
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.:
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;
?>
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.
ASKER
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/
ASKER
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:
Which gives a response using their text exe file of:
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>
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>
I think their XML is wrong. For a start the operation is called Invoke
Inside the Invoke request there can be 0 or more elements named "request" of type "invokeRequest"
and the invoekRequest element can have the following elements:
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.
<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>
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>
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>
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.
ASKER
Does the text programme you have connect to the new URL or to the old one?
ASKER
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
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?
ASKER
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
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.
ASKER
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
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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.
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.
Open in new window
Try first to send a request with SOAP UI.