1

I am using Paypal subscription, standard website button. So for this question, the payment_type is subscr_signup, for creating user account for your new user. My HTML button form has values for "notify_url" set to http://domain.com/billing/ipn, "return" set to http://domain.com/billing/thankyou, and "rm" set to 2

With this, when someone completes the payment, s/he will be redirected to our thank you page, along with the IPN data in POST. I got that. But when I verify it with Paypal, I got an INVALID response. Now, here's the strange thing, we should also get the data to our IPN notify_url, right? And we did, but this time, verifying it to Paypal returns VERIFIED.

I notice some differences in the data that is sent.

Data for RETURN thank you page - INVALID (JSON-ified)

{
"txn_type": "subscr_signup",
"subscr_id": "I-HHTJ0ANUHKRU",
"last_name": "Ismail",
"residence_country": "CA",
"mc_currency": "USD",
"item_name": "Individual eStudio Plan",
"business": "business@kengkawan.com",
"amount3": "99.00",
"recurring": "1",
"address_street": "1 Maire-Victorin",
"payer_status": "verified",
"payer_email": "customer@kengkawan.com",
"address_status": "confirmed",
"first_name": "Iszuddin",
"receiver_email": "business@kengkawan.com",
"address_country_code": "CA",
"payer_id": "LYRHTKFEH45M8",
"address_city": "Toronto",
"reattempt": "1",
"item_number": "IND",
"address_state": "Ontario",
"subscr_date": "22:52:19 Oct 29, 2014 PDT",
"address_zip": "M5A 1E1",
"charset": "windows-1252",
"period3": "1 Y",
"address_country": "Canada",
"mc_amount3": "99.00",
"address_name": "Iszuddin Ismail",
"auth": "AUjfQ4uRNLr22YfSNPGR1YLm5w81cYyFjf9PEu7mVGSLTp2cFD67opAIXJ-Dtsnw4KEXlF0Y268Ks9VmrwpDRrg",
"form_charset": "UTF-8"
}

Data for NOTIFY_URL, backend IPN data - VERIFIED (JSON-ified)

{
"txn_type": "subscr_signup",
"subscr_id": "I-HHTJ0ANUHKRU",
"last_name": "Ismail",
"residence_country": "CA",
"mc_currency": "USD",
"item_name": "Individual eStudio Plan",
"business": "business@kengkawan.com",
"amount3": "99.00",
"recurring": "1",
"address_street": "1 Maire-Victorin",
"verify_sign": "Ajiy6YmBz00sV0oT2S-obuaQ3kehAQO0-T8GJFKpiQnaRzRv7.oJ5Eqy",
"payer_status": "verified",
"test_ipn": "1",
"payer_email": "customer@kengkawan.com",
"address_status": "confirmed",
"first_name": "Iszuddin",
"receiver_email": "business@kengkawan.com",
"address_country_code": "CA",
"payer_id": "LYRHTKFEH45M8",
"address_city": "Toronto",
"reattempt": "1",
"item_number": "IND",
"address_state": "Ontario",
"subscr_date": "22:52:19 Oct 29, 2014 PDT",
"address_zip": "M5A 1E1",
"charset": "windows-1252",
"notify_version": "3.8",
"period3": "1 Y",
"address_country": "Canada",
"mc_amount3": "99.00",
"address_name": "Iszuddin Ismail",
"ipn_track_id": "698ae88a36ef9"
}

Since I do get expected response (VERIFIED or INVALID), I believe my verification code for Paypal IPN is correct. But just in case, here is my HTML button code.

            <form action="<?php echo $this->url?>" method="post" name="ppform">
         <input type="hidden" name="cmd" value="_xclick-subscriptions">
         <input type="hidden" name="business" value="<?php echo $this->paypal_email; ?>">
         <input type="hidden" name="item_name" value="<?php echo $selected_plan['name'] ?>"> 
         <input type="hidden" name="item_number" value="<?php echo $selected_plan['code'] ?>"> 
         <input type="hidden" name="a3" value="<?php echo $selected_plan['price']; ?>"> <!-- subscription price -->
         <input type="hidden" name="p3" value="1">  <!-- rebill every x value -->
         <input type="hidden" name="t3" value="<?php echo $selected_plan['recurring_period'] ?>">  <!-- interval M=month/W=week/Y=year -->
         <input type="hidden" name="src" value="1"> <!-- Is this recurring 1=yes/0=no -->
         <input type="hidden" name="currency_code" value="<?php echo $selected_plan['currency'] ?>">
         <!-- <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_subscribeCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"> -->
         <input type="hidden" name="rm" value="2">
         <input type="hidden" name="notify_url" value="<?php echo site_url('billing/ipn') ?>">
         <input type="hidden" name="return" value="<?php echo site_url('billing/thankyou') ?>">

        </form>     
Iszuddin Ismail
  • 801
  • 1
  • 7
  • 8
  • I think the question is incomplete/unclear, you said in a comment below you use PDT now, you should update the question with this info. Please note you can and maybe should implement BOTH IPN and PDT, as described [here](https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNPDTAnAlternativetoIPN/). Please also specify what programming language you are using (PHP maybe?) and add a tag for that as it will increase your chances of getting a response. Are you using Sandbox for testing? – bg17aw Jan 18 '16 at 12:59
  • Please post some code as well. Example code (PHP, .Net, Coldfusion etc) for implementing IPN [here](https://github.com/paypal/ipn-code-samples), example code for implementing PDT [here](https://github.com/paypal/pdt-code-samples) – bg17aw Jan 18 '16 at 13:09

1 Answers1

1

return_url do not recieve any payment/IPN information. Usually it should be just a static page which displays "Thank you, come again".

You should verify IPN messages with notify_url. You need to send recieved payment data exactly the same way it was recieved. If you recieve INVALID error on a good request, you should double check encoding in which you get the request, store in php and send back. You can use PayPal PHP SDK to be sure in the payment code.

Please note IPN sends a bunch of messages on Subscription user registration, payment processing and so on.

  • Thanks for the help. In a forum, I was advised to make use of PDT to handle return traffic. So that's what I did. My system still logs IPN data on the backend, receiving subscr_signup and subscr_payment transaction type. But for handling users after payment has been made, I use PDT data now. It requires a bit of settings update in the Paypal account. And then, based on my the GET tx parameter and my secret PDT token, I can request the full data of the transaction. https://developer.paypal.com/docs/classic/products/payment-data-transfer/ – Iszuddin Ismail Oct 31 '14 at 04:06
  • return_url can receive payment info if using PDT (as it seems to be the case). – bg17aw Jan 18 '16 at 13:01