MrD MrD - 4 months ago 28
PHP Question

PayPal IPN returns invalid in sandbox

I'm creating a payment gateway using PayPal IPN. After submitting the payment, I retrieve PayPal's response. Here is what I receive (PHP var_dump):

array(45) {
["mc_gross"] => string(4) "1.00"
["protection_eligibility"] => string(10) "Ineligible"
["address_status"] => string(9) "confirmed"
["item_number1"] => string(1) "1"
["payer_id"] => string(13) "KUN39T5E6UA3W"
["tax"] => string(4) "0.00"
["address_street"] => string(14) "1 Main Terrace"
["payment_date"] => string(25) "14:01:20 Oct 24, 2015 PDT"
["payment_status"] => string(7) "Pending"
["charset"] => string(12) "Windows-1252"
["mc_tax1"] => string(4) "0.00"
["address_zip"] => string(7) "W12 4LQ"
["mc_shipping"] => string(4) "0.00"
["mc_handling"] => string(4) "0.00"
["first_name"] => string(4) "test"
["address_country_code"] => string(2) "GB"
["address_name"] => string(10) "test buyer"
["notify_version"] => string(3) "3.8"
["custom"] => string(13) "562bf19083b11"
["payer_status"] => string(8) "verified"
["address_country"] => string(14) "United Kingdom"
["num_cart_items"] => string(1) "1"
["mc_handling1"] => string(4) "0.00"
["address_city"] => string(13) "Wolverhampton"
["payer_email"] => string(44) "[myemail]"
["verify_sign"] => string(56) "AiPC9BjkCyDFQXbSkoZcgqH3hpacAymQrx4nOnSeR2hKuwHDAUFmNy.-"
["mc_shipping1"] => string(4) "0.00"
["tax1"] => string(4) "0.00"
["txn_id"] => string(17) "9UV91932BX9643323"
["payment_type"] => string(7) "instant"
["last_name"] => string(5) "buyer"
["item_name1"] => string(5) "test1"
["address_state"] => string(13) "West Midlands"
["receiver_email"] => string(38) "[myemail]"
["quantity1"] => string(1) "1"
["pending_reason"] => string(10) "unilateral"
["txn_type"] => string(4) "cart"
["mc_gross_1"] => string(4) "1.00"
["mc_currency"] => string(3) "GBP"
["residence_country"] => string(2) "GB"
["test_ipn"] => string(1) "1"
["transaction_subject"] => string(13) "562bf19083b11"
["payment_gross"] => string(0) ""
["merchant_return_link"] => string(10) "click here"
["auth"] => string(87) "AkxCT8gKLRplBETrTgj4KrgsPA.1rCwR.lM1EpzTQoW9QR-M0l3-kiwjq0hgNoZUQuJaGRdDHsGnjZ9NsbsRamg"
}


I then execute the following:

$responseURL = "https://sandbox.paypal.com/cgi-bin/webscr?";
$params = "cmd=_notify-validate&" .http_build_query($_REQUEST);

var_dump(file_get_contents($responseURL.$params));


Which returns: INVALID

Any advice? Is testing perhaps not working in Sandbox?

Answer

You need to post the data; here is working code that I use:

$req = 'cmd=_notify-validate';

foreach($_POST as $key => $value) {
    $value = urlencode($value);
    $req .= "&{$key}={$value}";
}

$res = '';
$ch = curl_init('https://www.sandbox.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'));   
$res = curl_exec($ch);
curl_close($ch);

if(strcmp($res, "VERIFIED") == 0) 
{
    //VALID
}