将phpmailer_v5.1 use_gmail与paypal ipn responder结合使用

时间:2022-05-13 18:15:32

I have two scripts and want to combine them in one line. I have marked the line with this comment:'here I need stack-overflow-help'.

我有两个脚本,并希望将它们组合在一行中。我用这个评论标记了这一行:'这里我需要堆栈溢出帮助'。

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

第一个脚本:这是Paypal ipn响应器(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:

这是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 *-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 tested and working and sending emails.But only when I write the destination email address in this line:

我在同一个文件夹中有class.smtp和class.phpmailer.use_gmail.php经过测试,正在运行并发送电子邮件。但是,当我在此行中写入目标电子邮件地址时:

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

I want to send the email to the customer who just made the payment.How can I get the destination e-mail address from Paypal?

我想将电子邮件发送给刚付款的客户。如何从Paypal获取目的地电子邮件地址?

1 个解决方案

#1


1  

In our ecommerce configuration, we used a trick to make the real user email ( e.g. the one that he used to register into our clients database ) be sent by the IPN responder.

在我们的电子商务配置中,我们使用了一个技巧来使真实的用户电子邮件(例如,他用来注册到我们的客户数据库中的电子邮件)由IPN响应者发送。

When a user pays with Paypal, a form is sent to the Paypal system with informations about the amount of the payment, url bridges and so on. Here's an example:

当用户使用Paypal付款时,表单将被发送到Paypal系统,其中包含有关付款金额,网址桥等的信息。这是一个例子:

<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 via the "custom" input the email of the user registered into the system, along with other useful data. In our ecommerce, for example, we serialize an array with the user email, the order id, and other "non-compromising" values. After it has been serialized, we encode it with a crypt class we created on our own ( or you can simply use the mcrypt extension of PHP ).

“技巧”是通过“自定义”输入发送注册到系统中的用户的电子邮件以及其他有用的数据。例如,在我们的电子商务中,我们使用用户电子邮件,订单ID和其他“不妥协”值序列化数组。在序列化之后,我们使用我们自己创建的crypt类对其进行编码(或者您可以简单地使用PHP的mcrypt扩展)。

Once you get the IPN response, you will also get the

一旦你得到IPN回复,你也会得到

$custom_encrypted_serialized_variables = $_POST['custom'];

So, you can replace your IPN listener code at step 3 with the following:

因此,您可以在步骤3中使用以下内容替换您的IPN侦听器代码:

...
...
// 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'];

    ...
    ...
}

And then proceed with variables decrypting and unserializing with common unserialize() and decrypt functions.

然后使用常见的unserialize()和decrypt函数进行变量解密和反序列化。

Along with the other useful data you may send with the "custom" variable in the paypal checkout form, send the client's email and you're done!

您可以使用paypal结账表单中的“自定义”变量发送其他有用数据,发送客户的电子邮件,您就完成了!

P.S: I know this solution is not optimal and maybe there are alternative solutions, but I found this one quick and efficient. Hints and corrections are appreciated!

P.S:我知道这个解决方案不是最优的,也许有其他解决方案,但我发现这个解决方案快速有效。提示和更正表示赞赏!

#1


1  

In our ecommerce configuration, we used a trick to make the real user email ( e.g. the one that he used to register into our clients database ) be sent by the IPN responder.

在我们的电子商务配置中,我们使用了一个技巧来使真实的用户电子邮件(例如,他用来注册到我们的客户数据库中的电子邮件)由IPN响应者发送。

When a user pays with Paypal, a form is sent to the Paypal system with informations about the amount of the payment, url bridges and so on. Here's an example:

当用户使用Paypal付款时,表单将被发送到Paypal系统,其中包含有关付款金额,网址桥等的信息。这是一个例子:

<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 via the "custom" input the email of the user registered into the system, along with other useful data. In our ecommerce, for example, we serialize an array with the user email, the order id, and other "non-compromising" values. After it has been serialized, we encode it with a crypt class we created on our own ( or you can simply use the mcrypt extension of PHP ).

“技巧”是通过“自定义”输入发送注册到系统中的用户的电子邮件以及其他有用的数据。例如,在我们的电子商务中,我们使用用户电子邮件,订单ID和其他“不妥协”值序列化数组。在序列化之后,我们使用我们自己创建的crypt类对其进行编码(或者您可以简单地使用PHP的mcrypt扩展)。

Once you get the IPN response, you will also get the

一旦你得到IPN回复,你也会得到

$custom_encrypted_serialized_variables = $_POST['custom'];

So, you can replace your IPN listener code at step 3 with the following:

因此,您可以在步骤3中使用以下内容替换您的IPN侦听器代码:

...
...
// 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'];

    ...
    ...
}

And then proceed with variables decrypting and unserializing with common unserialize() and decrypt functions.

然后使用常见的unserialize()和decrypt函数进行变量解密和反序列化。

Along with the other useful data you may send with the "custom" variable in the paypal checkout form, send the client's email and you're done!

您可以使用paypal结账表单中的“自定义”变量发送其他有用数据,发送客户的电子邮件,您就完成了!

P.S: I know this solution is not optimal and maybe there are alternative solutions, but I found this one quick and efficient. Hints and corrections are appreciated!

P.S:我知道这个解决方案不是最优的,也许有其他解决方案,但我发现这个解决方案快速有效。提示和更正表示赞赏!