In our e-commerce configuration, we used the trick to make the user's real email (for example, the one that he used to register in our customer database) sent by the IPN responder.
When a user pays with Paypal, the form is sent to Paypal with information about the amount of payment, url bridges, etc. Here is an example:
<form name="autoPayFormSubmit" id="autoPayFormSubmit" method="post" action="https://securepayments.paypal.com/cgi-bin/acquiringweb"> <input type="hidden" name="cmd" value="_hosted-payment" /> <input type="hidden" name="subtotal" value="#SUBTOTAL#" /> <input type="hidden" name="shipping" value="#SHIPCOST#" /> <input type="hidden" name="business" value="#NUMBEROFBUSINESS#" /> <input type="hidden" name="paymentaction" value="sale" /> <input type="hidden" name="custom" value=" ## USE ME TO TRICK THE SYSTEM ##" /> <input type="hidden" name="currency_code" value="EUR" /> <input type="hidden" name="shopping_url" value="http://yourwebsite.domain/##" /> <input type="hidden" name="cbt" value="Go back to the shopping" /> <input type="hidden" name="notify_url" value="http://yourwebsite.domain/##" /> <input type="hidden" name="cancel_return" value="http://yourwebsite.domain/##" /> <input type="hidden" name="return" value="http://yourwebsite.domain/##" /> <input type="submit" value="PAYPAL SAFE PAYMENT" onmouseover="this.style.backgroundColor='#CEE4F2';" onmouseout="this.style.backgroundColor='#EAF2F6';" style="font-weight: bold; font-size: 14px; padding: 10px 5px; border-radius: 10px; background: #EAF2F6 none no-repeat scroll 0 0; box-shadow: 3px 3px 5px #888; cursor:pointer;"> </form>
The “trick” is to send through the “user” input the email of the user registered in the system, as well as other useful data. For example, in our e-commerce, we serialize an array with the user's email, order ID, and other “no compromise” values. After it has been serialized, we encode it with the crypt class we created ourselves (or you can just use the mcrypt extension for PHP).
Once you receive an IPN response, you will also receive
$custom_encrypted_serialized_variables = $_POST['custom'];
So, you can replace your IPN listener code in step 3 as follows:
... ... // STEP 3: Inspect IPN validation result and act accordingly if (strcmp ($res, "VERIFIED") == 0) { // check whether the payment_status is Completed // check that txn_id has not been previously processed // check that receiver_email is your Primary PayPal email // check that payment_amount/payment_currency are correct // process payment // assign posted variables to local variables $item_name = $_POST['item_name']; $item_number = $_POST['item_number']; $payment_status = $_POST['payment_status']; $payment_amount = $_POST['mc_gross']; $payment_currency = $_POST['mc_currency']; $txn_id = $_POST['txn_id']; $receiver_email = $_POST['receiver_email']; $payer_email = $_POST['payer_email']; $custom_encrypted_serialized_variables = $_POST['custom']; ... ... }
Then proceed to decrypting and decrypting the variables using the usual unserialize () and decryption functions.
Along with other useful data that you can send using the “custom” variable in the PayPal payment form, send a client letter, and you're done!
PS: I know that this solution is not optimal and there may be alternative solutions, but I found it fast and efficient. Hints and corrections are welcome!