We help IT Professionals succeed at work.

PHP and PayPal's returned $_POST variables - how to match variables to strings?

Dionysus
Dionysus asked
on
Medium Priority
270 Views
Last Modified: 2008-03-17
I am testing a system and I am at the point where I've made the (test) purchase and PayPal has sent me back to my return page with a long string of variables in the following format :

cmd=_notify-validate&payment_date=18%3A20%3A11+Mar+21%2C+2006+PST&txn_type=web_accept&last_name=Buyer&residence_country=CA&item_name=Merchant&payment_gross=&mc_currency=CAD&business=sales%40merchant.com&payment_type=instant&verify_sign=An5ns1Kso7MWUdW4ErQKJJJ4qi4-AhFhwMdtcrBWQYPu7jYen.7IBSuN&payer_status=unverified&test_ipn=1&tax=0.00&payer_email=test%40customer.com&txn_id=7WT019456541558329&quantity=1&receiver_email=someone%40merchant.com&first_name=Dion&payer_id=F34564RFQ5WQ&receiver_id=R4T13RSEJ5NA&item_number=1&payment_status=Completed&payment_fee=&mc_fee=1.79&shipping=0.00&mc_gross=42.75&custom=&charset=windows-1252&notify_version=2.1

Now I've taken this and assigned it to a variable:

$req = 'cmd=_notify-validate';

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


So far so good... now I tried to split the string so I could get 2 key/value pairs isolated. I want the payer_email and the payment_status separated from the rest, so I started with the following:

$postarray = explode("&", $req);


Now the problem is, how do I split it again and do a test for $postarray['payment_status']?

I can try and isolate the pairs using $postarray[14] but I'd like to specify by name in case the order of variables changes at some point in the future...

Can anyone help?

Thanks,
Dion

Comment
Watch Question

Author

Commented:
Woops..I got it backwards... but my end question is the same.

I received a POST from PayPal, and using that code, created that long string.  Now I need to know how to break it down further as I said previously.

Thanks!
Commented:
Not sure I understand you correctly. but here is a try:

$totalstring = "cmd=_notify-validate&payment_date=18%3A20%3A11+Mar+21%2C+2006+PST&txn_type=web_accept"
    ."&last_name=Buyer&residence_country=CA&item_name=Merchant&payment_gross=&mc_currency=CAD"
    ."&business=sales%40merchant.com&payment_type=instant"
    ."&verify_sign=An5ns1Kso7MWUdW4ErQKJJJ4qi4-AhFhwMdtcrBWQYPu7jYen.7IBSuN&payer_status=unverified"
    ."&test_ipn=1&tax=0.00&payer_email=test%40customer.com&txn_id=7WT019456541558329&quantity=1"
    ."&receiver_email=someone%40merchant.com&first_name=Dion&payer_id=F34564RFQ5WQ"
    ."&receiver_id=R4T13RSEJ5NA&item_number=1&payment_status=Completed&payment_fee=&mc_fee=1.79"
    ."&shipping=0.00&mc_gross=42.75&custom=&charset=windows-1252&notify_version=2.1"

$pair_array = explode( "&", $totalstring );
for ( $i=0; $i<count($pair_array; $i++ ) {
    $pair_array[$i] = explode( "=", $pair_array[$i] );
    ${$pair_array[$i][0]} = urldecode( str_replace( '+', ' ', $pair_array[$i][1] ) );   // turn %NN codes to characters and '+' to ' '
}
// now each field in the parameter string can be adressed by it name:
echo ">'$payment_status'<";

regards JakobA

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Author

Commented:
Thanks man.. the only thing is that you had missed a closing bracket.. but apart from that.. you did exactly what I wanted.

Take care!
-Dion
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.