Combining phpmailer_v5.1 use_gmail with paypal ipn responder

I have two scripts and you want to combine them in one line. I noted a line with this comment: "I need stack overflow help."

First script: This is the ipp Paypal responder ( https://www.x.com/developers/PayPal/documentation-tools/code-sample/216623 ):

<?php // STEP 1: Read POST data // reading posted data from directly from $_POST causes serialization // issues with array data in POST // reading raw POST data from input stream instead. $raw_post_data = file_get_contents('php://input'); $raw_post_array = explode('&', $raw_post_data); $myPost = array(); foreach ($raw_post_array as $keyval) { $keyval = explode ('=', $keyval); if (count($keyval) == 2) $myPost[$keyval[0]] = urldecode($keyval[1]); } // read the post from PayPal system and add 'cmd' $req = 'cmd=_notify-validate'; if(function_exists('get_magic_quotes_gpc')) { $get_magic_quotes_exists = true; } foreach ($myPost as $key => $value) { if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { $value = urlencode(stripslashes($value)); } else { $value = urlencode($value); } $req .= "&$key=$value"; } // STEP 2: Post IPN data back to paypal to validate $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')); // In wamp like environments that do not come bundled with root authority certificates, // please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path // of the certificate as shown below. // curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); if( !($res = curl_exec($ch)) ) { // error_log("Got " . curl_error($ch) . " when processing IPN data"); curl_close($ch); exit; } curl_close($ch); // 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']; } else if (strcmp ($res, "INVALID") == 0) { // log for manual investigation } ?> 

Second script:

This is phpmailer_v5.1 use_gmail.php:

 <?php // example on using PHPMailer with GMAIL include("class.phpmailer.php"); include("class.smtp.php"); // note, this is optional - gets called from main class if not already loaded $mail = new PHPMailer(); $body = 'this is the body of the email'; $mail->IsSMTP(); $mail->SMTPAuth = true; // enable SMTP authentication $mail->SMTPSecure = "ssl"; // sets the prefix to the servier $mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server $mail->Port = 465; // set the SMTP port $mail->Username = " yourname@gmail.com "; // GMAIL username $mail->Password = "password"; // GMAIL password $mail->From = " replyto@yourdomain.com "; $mail->FromName = "Webmaster"; $mail->Subject = "This is the subject"; $mail->AltBody = "This is the body when user views in plain text format"; //Text Body $mail->WordWrap = 50; // set word wrap $mail->MsgHTML($body); $mail->AddReplyTo(" replyto@yourdomain.com ","Webmaster"); $mail->AddAttachment("/path/to/file.zip"); // attachment $mail->AddAttachment("/path/to/image.jpg", "new.jpg"); // attachment $mail->AddAddress(" username@domain.com ","First Last"); //here I need stackoverflow-help $mail->IsHTML(true); // send as HTML if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent"; } ?> 

I have class.smtp and class.phpmailer in the same folder .use_gmail.php is checked and works and sends emails. But only when I write the recipient's email address in this line:

 $mail->AddAddress(" username@domain.com ","First Last"); 

I want to send an email to the customer who just made the payment. How can I get the recipient's email address from Paypal?

+4
source share
1 answer

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!

+1
source

All Articles