The 503 response I was getting was "service unavailable" - not exactly the same as this one. The payment status was 'completed'
I phoned PayPal about it and they said it was a problem at their end which they were trying to resolve. They suggested I retry the call.
Here is what I did and it seems to be working.
//$req = set of key/value pairs sent by paypal
// Step 2: POST IPN data back to PayPal to validate
$ir = 0;
while($ir<3&&($ir==0||strpos($res,'Service Unavailable')>0)) {
if($ir!=0) { //wait and try again after 1st try
//log the problem somehow
$sam = 1;
sleep(2);
unset($res);
}
//setup the call
$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
if( !($res = curl_exec($ch)) ) {
//log the problem somehow
curl_close($ch);
exit;
}
curl_close($ch);
$ir += 1;
}