I am having problems consuming a WCF web service (PaySimple's v3.00 API) using php curl. I am trying to post an xml payload to the service and I keep getting a 400 - Bad Request error. When I using Firefox's Poster add-on, I can post the very same payload and I get the expected response - 200 OK with an XML response containing the required response. Here's a snippet of my code:
$ch = curl_init();
$payload = $createPayload();
$length = strlen($payload);
$headers = array("Expect:");
if($isPost)
{
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$headers[] = "Content-length: $length";
}
else {
curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
}
if($requestType == 'xml')
{
$headers[] = 'Content-Type: text/xml; charset: utf-8';
$headers[] = 'Accept: application/xml';
}
else {
$headers[] = 'Content-Type: application/json; charset: utf-8';
$headers[] = 'Accept: application/json';
}
$headers[] = "Connection: close";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
//debugging
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
$fh = fopen('curl_debug.txt', 'w');
curl_setopt($ch, CURLOPT_STDERR, $fh);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch);
curl_close($ch);
$payload contains the following value:
<AddCustomer xmlns="http://api.paysimple.com"><userkey>APIUser1989</userkey><apikey>pxTbp4F6y7JuaMu36qazEw51JiqUA7lGme0j62r3UeQyNojvEfpNo7tn4pLq0yEULHz5KykHWV6AjNQJEyskCw0tXSKZ0vcP5mCynh1IgfQEH4NdXRkXeMNAGEdx6Ee0</apikey><customer xmlns="http://api.paysimple.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ApiConsumerData/><PsReferenceId>0</PsReferenceId><AltEmail>testemail@paysimpledev.com</AltEmail><AltPhone/><BillingAddress1>TestBillingAddress1</BillingAddress1><BillingAddress2/><BillingCity>TestBillingCity</BillingCity><BillingCountryCode/><BillingPostalCode>80202</BillingPostalCode><BillingState>6</BillingState><CompanyName>TestCompany</CompanyName><CreatedOn>0001-01-01T00:00:00</CreatedOn><Email>testemail@paysimpledev.com</Email><Fax/><FirstName>TestFirstName</FirstName><LastModified>0001-01-01T00:00:00</LastModified><LastName>TestLastName</LastName><MiddleName/><Notes/><Phone>5551234567</Phone><ShippingAddress1/><ShippingAddress2/><ShippingCity/><ShippingCountryCode/><ShippingPostalCode/><ShippingSameAsBilling>true</ShippingSameAsBilling><ShippingState>0</ShippingState><WebSite/></customer></AddCustomer>
Here's what shows up in curl_debug.txt:
POST /3.00/paysimpleapi.svc/xml/listcustomers HTTP/1.1
Host: sandbox-api.paysimple.com
Content-length: 1153
Content-Type: text/xml; charset: utf-8
Accept: application/xml
Connection: close
HTTP/1.1 400 Bad Request
Connection: close
Date: Fri, 27 Aug 2010 11:07:21 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=oxpese454u4rr3552evybjue; path=/; HttpOnly
Cache-Control: private
Content-Length: 0
Closing connection #0
F1! F1!
The problem is probably in one of these:
Content-Type: text/xml; charset: utf-8
Accept: application/xml
Try text/xml or application/xml for both, try uppercase UTF-8. Try to send the same headers as Firefox.
Your POST's Content-Type should probably be application/x-www-form-urlencoded or multipart/form-data, and not application/xml
Tash
Post to https://sandbox-api.paysimple.com/3.00/PaysimpleApi.svc/xml/addcustomer http/1.1
use header: Content-length: 1262 Content-type: application/xml; charset=utf-8 Accept: application/xml Method: invokeMethod UserAgent: PaySimple Host: sandbox-api.paysimple.com
Try request SandboxMelody qUWzSPxkcxDR6RJiR2ypzbznV4m6jva5N8kaosnNqQJYqNTGcVouWhKbN5NPGiZxJdmx2QnapYNcwq1bjtfmGwLhBcdMT6x3z7IdPVYA3H7HDBUqwW6eJDyaf8dhKqr0 0 1122 Boogie Woogie Avenue#6City 801116CompanyName99999 0001-01-01T00:00:00w@w.comTestUser0001-01-01T00:00:00 LastNameThis is a new customer...from Fiddler3035551212 1122 Boogie Woogie Avenue#5City 80111true6
USE ADDCUSTOMER in both post url and request body