From 98eb8754e0f556679df2669d655b80fd88f57f8c Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 11 Nov 2013 23:53:55 +0000 Subject: [PATCH] Initial code for donation meter --- .gitignore | 1 + Donations.php | 36 +++ css/style.css | 21 ++ donate/config.php.template | 10 + donate/connect.php | 11 + donate/connect_rw.php | 11 + donate/ipn.php | 27 ++ donate/ipn_log.txt | 19 ++ .../paypal_integration_class/paypal.class.php | 257 ++++++++++++++++++ donate/thankyou.php | 17 ++ 10 files changed, 410 insertions(+) create mode 100644 donate/config.php.template create mode 100644 donate/connect.php create mode 100644 donate/connect_rw.php create mode 100644 donate/ipn.php create mode 100644 donate/ipn_log.txt create mode 100644 donate/paypal_integration_class/paypal.class.php create mode 100755 donate/thankyou.php diff --git a/.gitignore b/.gitignore index a53027f..e5ef120 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ News_/ News.chyrp.old/ +donate/config.php paste/repo/* diff --git a/Donations.php b/Donations.php index 6f1e899..628a740 100755 --- a/Donations.php +++ b/Donations.php @@ -4,6 +4,9 @@ $PAGE_TYPE = "DONATIONS"; $PAGE_SOURCE_1 = ARRAY("/Donations"); $PAGE_SOURCE_2 = ARRAY("Donations"); include_once("includes/header.php"); + +require "donate/config.php"; +require "donate/connect.php"; ?>

@@ -19,6 +22,32 @@ include_once("includes/header.php");

+ 100.0) { + $cur_percent = 100.0; +} +?> + +
+ This month donations: of 300.0 € target
+
+


+
+ + +
@@ -31,6 +60,10 @@ include_once("includes/header.php");
+ + + +
@@ -50,6 +83,9 @@ include_once("includes/header.php");
+ + + diff --git a/css/style.css b/css/style.css index 34f0d0e..91887e6 100644 --- a/css/style.css +++ b/css/style.css @@ -432,6 +432,27 @@ fieldset table { background:none repeat scroll 0 0 transparent; } +#donations_container { + padding-left: 10px; + padding-right: 10px; + text-align: center; +} + +#donations_bar { + background-color: #1B1B1B; + border: solid 1px #222222; + border-radius: 4px; + padding: 0px; +} + +#donations_bar > div { + background-color: #2C2C2C; + border: solid 1px #4A4A4A; + width: 0%; /* Adjust with JavaScript */ + height: 20px; + border-radius: 4px; +} + .box-description { background: #0A0A0A; border: solid 1px #171717; diff --git a/donate/config.php.template b/donate/config.php.template new file mode 100644 index 0000000..89392a3 --- /dev/null +++ b/donate/config.php.template @@ -0,0 +1,10 @@ + diff --git a/donate/connect.php b/donate/connect.php new file mode 100644 index 0000000..9ff309d --- /dev/null +++ b/donate/connect.php @@ -0,0 +1,11 @@ + diff --git a/donate/connect_rw.php b/donate/connect_rw.php new file mode 100644 index 0000000..5535887 --- /dev/null +++ b/donate/connect_rw.php @@ -0,0 +1,11 @@ + diff --git a/donate/ipn.php b/donate/ipn.php new file mode 100644 index 0000000..65ca3d2 --- /dev/null +++ b/donate/ipn.php @@ -0,0 +1,27 @@ +validate_ipn()) { + if($p->ipn_data["payment_status"] == "Completed") { + $amount = $p->ipn_data['mc_gross'] - $p->ipn_data['mc_fee']; + + mysql_query("INSERT INTO donations (transaction_id,donor_email,amount,original_request) + VALUES ( + '".esc($p->ipn_data['txn_id'])."', + '".esc($p->ipn_data['payer_email'])."', + ".(float)$amount.", + '".esc(http_build_query($_POST))."' + )"); + } +} +?> diff --git a/donate/ipn_log.txt b/donate/ipn_log.txt new file mode 100644 index 0000000..8be6745 --- /dev/null +++ b/donate/ipn_log.txt @@ -0,0 +1,19 @@ +[11/11/2013 11:33 PM] - FAIL: IPN Validation Failed. +IPN POST Vars from Paypal: + +IPN Response from Paypal Server: + HTTP/1.1 200 OK +Server: Apache +X-Frame-Options: SAMEORIGIN +Content-Type: text/html; charset=UTF-8 +Date: Mon, 11 Nov 2013 23:33:04 GMT +Content-Length: 7 +Connection: close +Set-Cookie: cwrClyrK4LoCV1fydGbAxiNL6iG=Q8WVsKKdqyLQFBqoXGpzmTkQvzH7I4LPgcoIDqp85WIzOTAj390kKKuxW7BwLKR9p--9HP4LbyckM7OLWGX8tS7NwW0DW2pgEUkRVZlb5xqEf5zwge4extt3KoX-1uJcyrDjRgx0z8syxoJpfDaevlKT7QC_DWpmkrmsJVUF01Yj5NEoEJBNW04j-fHmvkvPZLMyaBA4p13cbJEL1OnzX_hY3tHXfOc7iDLvvdRSHC5pFBgVITKuLeYcf4hmQe1S32_75TPQco8aiH1t-ErXGerlFJdJvHabwPCnRzgaxKDBNCgXNmjnTh_te8ciXhCyIZzJZ7628D_0aMF_vwuVUW5GDdtzo1ion4tImrZqGgDNovZ3W83qpP8l8f9A5lB2NDGvQg-FttpakTHspAMXDCL9z10opFBOCnp-tY8lbLIOW-7KifdjHFJpzVy; domain=.paypal.com; path=/; HttpOnly +Set-Cookie: cookie_check=yes; expires=Thu, 09-Nov-2023 23:33:04 GMT; domain=.paypal.com; path=/; HttpOnly +Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/; HttpOnly +Set-Cookie: navlns=0.0; expires=Wed, 11-Nov-2015 23:33:04 GMT; domain=.paypal.com; path=/; HttpOnly +Set-Cookie: aksession=1384213084~id=cookieBi6wcHKeiJnzmVBU/ULHt1Byvz2r7r9avUleYsqNlkaY0un+AXfnbwTfA6RYjLfwwFhSMQAsFQQ82fzugGKEkcktrOJQ0PQBLgQA/lRLemQod+i2y6Vnv+5UeRwxjKyP; expires=Mon, 11-Nov-2013 23:38:04 GMT; path=/; domain=.paypal.com + +INVALID + diff --git a/donate/paypal_integration_class/paypal.class.php b/donate/paypal_integration_class/paypal.class.php new file mode 100644 index 0000000..609d766 --- /dev/null +++ b/donate/paypal_integration_class/paypal.class.php @@ -0,0 +1,257 @@ +add_field('business', 'somebody@domain.com'); + * $p->add_field('first_name', $_POST['first_name']); + * ... (add all your fields in the same manor) + * $p->submit_paypal_post(); + * + * To process an IPN, have your IPN processing file contain: + * + * $p = new paypal_class; + * if ($p->validate_ipn()) { + * ... (IPN is verified. Details are in the ipn_data() array) + * } + * + * + * In case you are new to paypal, here is some information to help you: + * + * 1. Download and read the Merchant User Manual and Integration Guide from + * http://www.paypal.com/en_US/pdf/integration_guide.pdf. This gives + * you all the information you need including the fields you can pass to + * paypal (using add_field() with this class) aswell as all the fields + * that are returned in an IPN post (stored in the ipn_data() array in + * this class). It also diagrams the entire transaction process. + * + * 2. Create a "sandbox" account for a buyer and a seller. This is just + * a test account(s) that allow you to test your site from both the + * seller and buyer perspective. The instructions for this is available + * at https://developer.paypal.com/ as well as a great forum where you + * can ask all your paypal integration questions. Make sure you follow + * all the directions in setting up a sandbox test environment, including + * the addition of fake bank accounts and credit cards. + * + ******************************************************************************* +*/ + +class paypal_class { + + var $last_error; // holds the last error encountered + + var $ipn_log; // bool: log IPN results to text file? + var $ipn_log_file; // filename of the IPN log + var $ipn_response; // holds the IPN response from paypal + var $ipn_data = array(); // array contains the POST values for IPN + + var $fields = array(); // array holds the fields to submit to paypal + + + function paypal_class() { + + // initialization constructor. Called when class is created. + + $this->paypal_url = 'https://www.paypal.com/cgi-bin/webscr'; + + $this->last_error = ''; + + $this->ipn_log_file = 'ipn_log.txt'; + $this->ipn_log = true; + $this->ipn_response = ''; + + // populate $fields array with a few default values. See the paypal + // documentation for a list of fields and their data types. These defaul + // values can be overwritten by the calling script. + + $this->add_field('rm','2'); // Return method = POST + $this->add_field('cmd','_xclick'); + + } + + function add_field($field, $value) { + + // adds a key=>value pair to the fields array, which is what will be + // sent to paypal as POST variables. If the value is already in the + // array, it will be overwritten. + + $this->fields["$field"] = $value; + } + + function submit_paypal_post() { + + // this function actually generates an entire HTML page consisting of + // a form with hidden elements which is submitted to paypal via the + // BODY element's onLoad attribute. We do this so that you can validate + // any POST vars from you custom form before submitting to paypal. So + // basically, you'll have your own form which is submitted to your script + // to validate the data, which in turn calls this function to create + // another hidden form and submit to paypal. + + // The user will briefly see a message on the screen that reads: + // "Please wait, your order is being processed..." and then immediately + // is redirected to paypal. + + echo "\n"; + echo "Processing Payment...\n"; + echo "\n"; + echo "

Please wait, your order is being processed...

\n"; + echo "
paypal_url."\">\n"; + + foreach ($this->fields as $name => $value) { + echo ""; + } + + echo "
\n"; + echo "\n"; + + } + + function validate_ipn() { + + // parse the paypal URL + $url_parsed=parse_url($this->paypal_url); + + // generate the post string from the _POST vars aswell as load the + // _POST vars into an arry so we can play with them from the calling + // script. + $post_string = ''; + foreach ($_POST as $field=>$value) { + $this->ipn_data["$field"] = $value; + $post_string .= $field.'='.urlencode($value).'&'; + } + $post_string.="cmd=_notify-validate"; // append ipn command + + // open the connection to paypal + $fp = fsockopen($url_parsed["host"],"80",$err_num,$err_str,30); + if(!$fp) { + + // could not open the connection. If loggin is on, the error message + // will be in the log. + $this->last_error = "fsockopen error no. $errnum: $errstr"; + $this->log_ipn_results(false); + return false; + + } else { + + // Post the data back to paypal + fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n"); + fputs($fp, "Host: $url_parsed[host]\r\n"); + fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); + fputs($fp, "Content-length: ".strlen($post_string)."\r\n"); + fputs($fp, "Connection: close\r\n\r\n"); + fputs($fp, $post_string . "\r\n\r\n"); + + // loop through the response from the server and append to variable + while(!feof($fp)) { + $this->ipn_response .= fgets($fp, 1024); + } + + fclose($fp); // close connection + + } + + if (eregi("VERIFIED",$this->ipn_response)) { + + // Valid IPN transaction. + $this->log_ipn_results(true); + return true; + + } else { + + // Invalid IPN transaction. Check the log for details. + $this->last_error = 'IPN Validation Failed.'; + $this->log_ipn_results(false); + return false; + + } + + } + + function log_ipn_results($success) { + + if (!$this->ipn_log) return; // is logging turned off? + + // Timestamp + date_default_timezone_set("UTC"); + $text = '['.date('m/d/Y g:i A').'] - '; + + // Success or failure being logged? + if ($success) $text .= "SUCCESS!\n"; + else $text .= 'FAIL: '.$this->last_error."\n"; + + // Log the POST variables + $text .= "IPN POST Vars from Paypal:\n"; + foreach ($this->ipn_data as $key=>$value) { + $text .= "$key=$value, "; + } + + // Log the response from the paypal server + $text .= "\nIPN Response from Paypal Server:\n ".$this->ipn_response; + + // Write to log + $fp=fopen($this->ipn_log_file,'a'); + fwrite($fp, $text . "\n\n"); + + fclose($fp); // close file + } + + function dump_fields() { + + // Used for debugging, this function will output all the field/value pairs + // that are currently defined in the instance of the class using the + // add_field() function. + + echo "

paypal_class->dump_fields() Output:

"; + echo " + + + + "; + + ksort($this->fields); + foreach ($this->fields as $key => $value) { + echo ""; + } + + echo "
Field NameValue
$key".urldecode($value)." 

"; + } +} + + diff --git a/donate/thankyou.php b/donate/thankyou.php new file mode 100755 index 0000000..aab82fd --- /dev/null +++ b/donate/thankyou.php @@ -0,0 +1,17 @@ + + +

+ Thank you very much for your donation!
+

+ +


+ +