Skip to content
This repository has been archived by the owner on Jul 20, 2020. It is now read-only.

added html and unicode email support to advanced example #118

Open
wants to merge 32 commits into
base: master
Choose a base branch
from
Open
Changes from 22 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
34d6515
added html and unicode email support
BigRedBot Jan 6, 2018
fc4ae60
sort the keys for $_POST
BigRedBot Jan 6, 2018
4d06ebb
sort the keys for $_POST
BigRedBot Jan 6, 2018
48a6318
Removed sort
BigRedBot Jan 7, 2018
4238eec
Added option to use verified decoded data
BigRedBot Jan 7, 2018
0b7599c
sort $DATA array
BigRedBot Jan 7, 2018
9db6220
added test text to log file directory
BigRedBot Jan 7, 2018
6136887
send_email_from
BigRedBot Jan 7, 2018
fdc2ee7
edit send_confirmation_email
BigRedBot Jan 7, 2018
da830f0
Update example_usage_advanced.php
BigRedBot Jan 7, 2018
47e4f81
added option to also log raw un-decoded data
BigRedBot Jan 7, 2018
2748f70
Update example_usage_advanced.php
BigRedBot Jan 7, 2018
29f7ed4
Update example_usage_advanced.php
BigRedBot Jan 7, 2018
cd53dc4
looks cleaner
BigRedBot Jan 8, 2018
6dcce7c
Update example_usage_advanced.php
BigRedBot Jan 8, 2018
3bb2b99
Update example_usage_advanced.php
BigRedBot Jan 8, 2018
ffa4a00
Update example_usage_advanced.php
BigRedBot Jan 8, 2018
b2251ae
edit to send_plain_email
BigRedBot Jan 8, 2018
32ca99f
edit send_email
BigRedBot Jan 8, 2018
dad1f8c
Update example_usage_advanced.php
BigRedBot Jan 8, 2018
273c7d5
Update example_usage_advanced.php
BigRedBot Jan 8, 2018
023ba76
Update example_usage_advanced.php
BigRedBot Jan 10, 2018
d8794dd
Update example_usage_advanced.php
BigRedBot Jan 10, 2018
c4ba82a
removed option for raw data logging
BigRedBot Jan 10, 2018
1403635
Update example_usage_advanced.php
BigRedBot Jan 11, 2018
f1e85f9
Update example_usage_advanced.php
BigRedBot Jan 11, 2018
de46530
Update example_usage_advanced.php
BigRedBot Jan 11, 2018
89773ee
Update example_usage_advanced.php
BigRedBot Jan 12, 2018
405b142
Update example_usage_advanced.php
BigRedBot Jan 12, 2018
8e2df88
removed duplicate to field to prevent sending duplicate emails
BigRedBot Oct 14, 2019
3927d01
renamed mail functions to be simpler
BigRedBot Oct 14, 2019
ef042b1
Update example_usage_advanced.php
BigRedBot Oct 14, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 86 additions & 31 deletions php/example_usage_advanced.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,82 +4,135 @@
$enable_sandbox = true;

// Use this to specify all of the email addresses that you have attached to paypal:
$my_email_addresses = array("my_email_address@gmail.com", "my_email_address2@gmail.com", "my_email_address3@gmail.com");
$my_email_addresses = array("seller@paypalsandbox.com", "seller2@paypalsandbox.com", "seller3@paypalsandbox.com");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can emails be @example.com ?

Copy link
Contributor Author

@BigRedBot BigRedBot Jan 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think so.
I have changed it to use: example.com


// Set this to true to send a confirmation email:
$send_confirmation_email = true;
$confirmation_email_address = "My Name <[email protected]>";
$from_email_address = "My Name <[email protected]>";
$confirmation_email_name = "My Name";
$confirmation_email_address = "[email protected]";
$from_email_name = "My Name";
$from_email_address = "[email protected]";

// Set this to true to save a log file:
$save_log_file = true;
$log_file_dir = __DIR__ . "/logs";

// Set this to true to also log un-decoded data:
$log_raw_data = false;

// Here is some information on how to configure sendmail:
// http://php.net/manual/en/function.mail.php#118210



require('PaypalIPN.php');
date_default_timezone_set("America/Los_Angeles");
list($year, $month, $day, $hour, $minute, $second, $timezone) = explode(":", date("Y:m:d:H:i:s:T"));
$date = $year . "-" . $month . "-" . $day;
$timestamp = $date . " " . $hour . ":" . $minute . ":" . $second . " " . $timezone;

require("PaypalIPN.php");
use PaypalIPN;
$ipn = new PaypalIPN();
if ($enable_sandbox) {
$ipn->useSandbox();
}
$verified = $ipn->verifyIPN();

if (is_array($verified)) {
$DATA = $verified;
} else {
$DATA = $_POST;
}
ksort($DATA);

$data_text = "";
foreach ($_POST as $key => $value) {
foreach ($DATA as $key => $value) {
$data_text .= $key . " = " . $value . "\r\n";
}

$raw_data_text = "";
if ($log_raw_data) {
$RAW_DATA = array();
foreach (explode("&", file_get_contents("php://input")) as $keyval) {
$keyval = explode("=", $keyval);
if (count($keyval) == 2) {
$RAW_DATA[$keyval[0]] = $keyval[1];
}
}
ksort($RAW_DATA);
foreach ($RAW_DATA as $key => $value) {
$raw_data_text .= "RAW: " . $key . " = " . $value . "\r\n";
}
}

$test_text = "";
if ($_POST["test_ipn"] == 1) {
if ($DATA["test_ipn"] == 1) {
$test_text = "Test ";
}

$dated_log_file_dir = $log_file_dir . "/" . $test_text . $year . "/" . $test_text . $month;

// Check the receiver email to see if it matches your list of paypal email addresses
$receiver_email_found = false;
foreach ($my_email_addresses as $a) {
if (strtolower($_POST["receiver_email"]) == strtolower($a)) {
if (strtolower($DATA["receiver_email"]) == strtolower($a)) {
$receiver_email_found = true;
break;
}
}

date_default_timezone_set("America/Los_Angeles");
list($year, $month, $day, $hour, $minute, $second, $timezone) = explode(":", date("Y:m:d:H:i:s:T"));
$date = $year . "-" . $month . "-" . $day;
$timestamp = $date . " " . $hour . ":" . $minute . ":" . $second . " " . $timezone;
$dated_log_file_dir = $log_file_dir . "/" . $year . "/" . $month;

$process_ipn = false;
$paypal_ipn_status = "VERIFICATION FAILED";
if ($verified) {
$paypal_ipn_status = "RECEIVER EMAIL MISMATCH";
if ($receiver_email_found) {
$process_ipn = true;
$paypal_ipn_status = "Completed Successfully";
}
} elseif ($enable_sandbox) {
if ($DATA["test_ipn"] != 1) {
$paypal_ipn_status = "RECEIVED FROM LIVE WHILE SANDBOXED";
}
} elseif ($DATA["test_ipn"] == 1) {
$paypal_ipn_status = "RECEIVED FROM SANDBOX WHILE LIVE";
}

function send_email($name, $address, $subject, $body, $from_name = null, $from_address = null, $html = true) {
if (is_null($from_name)) { $from_name = $GLOBALS["from_email_name"]; }
if (is_null($from_address)) { $from_address = $GLOBALS["from_email_address"]; }
$send_email_to = "=?UTF-8?B?" . base64_encode($name) . "?= <" . $address . ">";
$send_email_from = "=?UTF-8?B?" . base64_encode($from_name) . "?= <" . $from_address . ">";
$send_email_header = "MIME-Version: 1.0" . "\r\n";
if ($html) {
$body = "<html><head><title>" . $subject . "</title></head><body>" . $body . "</body></html>";
$send_email_header .= "Content-type: text/html; charset=UTF-8" . "\r\n";
} else {
$send_email_header .= "Content-type: text/plain; charset=UTF-8" . "\r\n";
}
$send_email_header .= "To: " . $send_email_to . "\r\n";
$send_email_header .= "From: " . $send_email_from . "\r\n";
return mail($send_email_to, "=?UTF-8?B?" . base64_encode($subject) . "?=", $body, $send_email_header);
}

// Process IPN
// A list of variables are available here:
// https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNandPDTVariables/
function send_plain_email($name, $address, $subject, $body, $from_name = null, $from_address = null) {
return send_email($name, $address, $subject, $body, $from_name, $from_address, false);
}

// This is an example for sending an automated email to the customer when they purchases an item for a specific amount:
if ($_POST["item_name"] == "Example Item" && $_POST["mc_gross"] == 49.99 && $_POST["mc_currency"] == "USD" && $_POST["payment_status"] == "Completed") {
$email_to = $_POST["first_name"] . " " . $_POST["last_name"] . " <" . $_POST["payer_email"] . ">";
$email_subject = $test_text . "Completed order for: " . $_POST["item_name"];
$email_body = "Thank you for purchasing " . $_POST["item_name"] . "." . "\r\n" . "\r\n" . "This is an example email only." . "\r\n" . "\r\n" . "Thank you.";
mail($email_to, $email_subject, $email_body, "From: " . $from_email_address);
}
if ($process_ipn) {

// Process IPN
// A list of variables are available here:
// https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNandPDTVariables/

// This is an example for sending an automated email to the customer when they purchases an item for a specific amount:
if ($DATA["item_name"] == "something" && $DATA["mc_gross"] == 12.34 && $DATA["mc_currency"] == "USD" && $DATA["payment_status"] == "Completed") {
$email_name = $DATA["first_name"] . " " . $DATA["last_name"];
$email_address = $DATA["payer_email"];
$email_subject = $test_text . "Completed order for: " . $DATA["item_name"];
$email_body = "<p>Thank you for purchasing " . $DATA["item_name"] . ".<BR><BR>This is an example email only.<BR><BR>Thank you.</p>";
send_email($email_name, $email_address, $email_subject, $email_body);
}
} elseif ($enable_sandbox) {
if ($_POST["test_ipn"] != 1) {
$paypal_ipn_status = "RECEIVED FROM LIVE WHILE SANDBOXED";
}
} elseif ($_POST["test_ipn"] == 1) {
$paypal_ipn_status = "RECEIVED FROM SANDBOX WHILE LIVE";

}

if ($save_log_file) {
Expand Down Expand Up @@ -108,13 +161,15 @@
}
if ($save_log_file) {
// Save data to text file
file_put_contents($dated_log_file_dir . "/" . $test_text . "paypal_ipn_" . $date . ".txt", "paypal_ipn_status = " . $paypal_ipn_status . "\r\n" . "paypal_ipn_date = " . $timestamp . "\r\n" . $data_text . "\r\n", FILE_APPEND);
file_put_contents($dated_log_file_dir . "/" . $test_text . "paypal_ipn_" . $date . ".txt", $paypal_ipn_status . "\r\n" . $timestamp . "\r\n" . $data_text . $raw_data_text . "\r\n", FILE_APPEND);
}
}

if ($send_confirmation_email) {
// Send confirmation email
mail($confirmation_email_address, $test_text . "PayPal IPN : " . $paypal_ipn_status, "paypal_ipn_status = " . $paypal_ipn_status . "\r\n" . "paypal_ipn_date = " . $timestamp . "\r\n" . $data_text, "From: " . $from_email_address);
$email_subject = $test_text . "PayPal IPN : " . $paypal_ipn_status;
$email_body = $paypal_ipn_status . "\r\n" . $timestamp . "\r\n" . "\r\n" . $data_text . "\r\n" . $raw_data_text;
send_plain_email($confirmation_email_name, $confirmation_email_address, $email_subject, $email_body);
}

// Reply with an empty 200 response to indicate to paypal the IPN was received correctly
Expand Down