PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 111206
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v111206
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 releases
s2member / includes / classes / paypal-notify-in.inc.php

paypal-notify-in.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 111206, at includes/classes/paypal-notify-in.inc.php

206 lines 12.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * s2Member's PayPal® IPN handler ( inner processing routines ).
4 *
5 * Copyright: © 2009-2011
6 * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7 * ( coded in the USA )
8 *
9 * Released under the terms of the GNU General Public License.
10 * You should have received a copy of the GNU General Public License,
11 * along with this software. In the main directory, see: /licensing/
12 * If not, see: {@link http://www.gnu.org/licenses/}.
13 *
14 * @package s2Member\PayPal
15 * @since 3.5
16 */
17 if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18 exit ("Do not access this file directly.");
19 /**/
20 if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
21 {
22 /**
23 * s2Member's PayPal® IPN handler ( inner processing routines ).
24 *
25 * @package s2Member\PayPal
26 * @since 3.5
27 */
28 class c_ws_plugin__s2member_paypal_notify_in
29 {
30 /**
31 * Handles PayPal® IPN processing.
32 *
33 * These same routines also handle s2Member Pro/PayPal® Pro operations;
34 * giving you the ability *( as needed )* to Hook into these routines using
35 * WordPress® Hooks/Filters; as seen in the source code below.
36 *
37 * Please do NOT modify the source code directly.
38 * Instead, use WordPress® Hooks/Filters.
39 *
40 * For example, if you'd like to add your own custom conditionals, use:
41 * ``add_filter ("ws_plugin__s2member_during_paypal_notify_conditionals", "your_function");``
42 *
43 * @package s2Member\PayPal
44 * @since 3.5
45 *
46 * @attaches-to ``add_action("init");``
47 *
48 * @return null Or exits script execution after handling IPN procesing.
49 */
50 public static function paypal_notify ()
51 {
52 global $current_site, $current_blog; /* For Multisite support. */
53 /**/
54 do_action ("ws_plugin__s2member_before_paypal_notify", get_defined_vars ());
55 /**/
56 if (!empty ($_GET["s2member_paypal_notify"]) && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"] || !empty ($_GET["s2member_paypal_proxy"])))
57 {
58 @ignore_user_abort (true); /* Important. Continue processing even if/when the connection is broken by the sending party. */
59 /**/
60 include_once ABSPATH . "wp-admin/includes/admin.php"; /* Get administrative functions. Needed for `wp_delete_user()`. */
61 /**/
62 $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status (); /* Filters on? */
63 c_ws_plugin__s2member_email_configs::email_config_release (); /* Release s2Member Filters. */
64 /**/
65 if (is_array ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_postvars ()) && ($_paypal = $paypal) && ($_paypal_s = serialize ($_paypal)))
66 {
67 $paypal["s2member_log"][] = "IPN received on: " . date ("D M j, Y g:i:s a T");
68 $paypal["s2member_log"][] = "s2Member POST vars verified " . ((!empty ($paypal["proxy_verified"])) ? "with a Proxy Key" : "through a POST back to PayPal®.");
69 /**/
70 $payment_status_issues = "/^(failed|denied|expired|refunded|partially_refunded|reversed|reversal|canceled_reversal|voided)$/i";
71 /**/
72 $paypal["subscr_gateway"] = (!empty ($_GET["s2member_paypal_proxy"])) ? esc_html (trim (stripslashes ($_GET["s2member_paypal_proxy"]))) : "paypal";
73 /**/
74 if (empty ($paypal["custom"]) && !empty ($paypal["recurring_payment_id"])) /* Lookup on Recurring Profiles? */
75 $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with ($paypal["recurring_payment_id"]);
76 /**/
77 if (!empty ($paypal["custom"]) && preg_match ("/^" . preg_quote (preg_replace ("/\:([0-9]+)$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"]))
78 {
79 $paypal["s2member_log"][] = "s2Member originating domain ( `\$_SERVER[\"HTTP_HOST\"]` ) validated.";
80 /**/
81 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
82 if (!apply_filters ("ws_plugin__s2member_during_paypal_notify_conditionals", false, get_defined_vars ()))
83 {
84 unset ($__refs, $__v); /* Unset defined __refs, __v. */
85 /**/
86 if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_virtual_terminal::cp (get_defined_vars ())))
87 $paypal = $_paypal_cp;
88 /**/
89 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_express_checkout::cp (get_defined_vars ())))
90 $paypal = $_paypal_cp;
91 /**/
92 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_cart::cp (get_defined_vars ())))
93 $paypal = $_paypal_cp;
94 /**/
95 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_send_money::cp (get_defined_vars ())))
96 $paypal = $_paypal_cp;
97 /**/
98 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_web_accept_sp::cp (get_defined_vars ())))
99 $paypal = $_paypal_cp;
100 /**/
101 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level::cp (get_defined_vars ())))
102 $paypal = $_paypal_cp;
103 /**/
104 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level::cp (get_defined_vars ())))
105 $paypal = $_paypal_cp;
106 /**/
107 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_rec_profile_creation_w_level::cp (get_defined_vars ())))
108 $paypal = $_paypal_cp;
109 /**/
110 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level::cp (get_defined_vars ())))
111 $paypal = $_paypal_cp;
112 /**/
113 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level::cp (get_defined_vars ())))
114 $paypal = $_paypal_cp;
115 /**/
116 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_failed_w_level::cp (get_defined_vars ())))
117 $paypal = $_paypal_cp;
118 /**/
119 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancellation_w_level::cp (get_defined_vars ())))
120 $paypal = $_paypal_cp;
121 /**/
122 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level::cp (get_defined_vars ())))
123 $paypal = $_paypal_cp;
124 /**/
125 else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal::cp (get_defined_vars ())))
126 $paypal = $_paypal_cp;
127 /**/
128 else /* Ignoring this IPN request. The txn_type/status does NOT require any action. */
129 $paypal["s2member_log"][] = "Ignoring this IPN request. The `txn_type/status` does NOT require any action on the part of s2Member.";
130 }
131 else /* Else a custom conditional has been applied by Filters. */
132 unset ($__refs, $__v); /* Unset defined __refs, __v. */
133 }
134 /**/
135 else if (!empty ($paypal["txn_type"]) && preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]))
136 {
137 $paypal["s2member_log"][] = "Transaction type ( `recurring_payment_profile_cancel` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible.";
138 $paypal["s2member_log"][] = "It's likely this account was just upgraded/downgraded by s2Member Pro; so the Subscr. ID has probably been updated on-site; nothing to worry about here.";
139 }
140 /**/
141 else if (!empty ($paypal["txn_type"]) && preg_match ("/^recurring_/i", $paypal["txn_type"])) /* Otherwise, is this a ^recurring_ txn_type? */
142 $paypal["s2member_log"][] = "Transaction type ( `^recurring_?` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible.";
143 /**/
144 else /* Else, use the default ``$_SERVER["HTTP_HOST"]`` error. */
145 $paypal["s2member_log"][] = "Unable to verify `\$_SERVER[\"HTTP_HOST\"]`. Please check the `custom` value in your Button Code. It MUST start with your domain name.";
146 }
147 /**/
148 else /* Extensive log reporting here. This is an area where many site owners find trouble. Depending on server configuration; remote HTTPS connections may fail. */
149 {
150 $paypal["s2member_log"][] = "Unable to verify \$_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.";
151 $paypal["s2member_log"][] = "If you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure \$_POST variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.";
152 $paypal["s2member_log"][] = "s2Member uses the `WP_Http` class for remote connections; which will try to use `cURL` first, and then fall back on the `FOPEN` method when `cURL` is not available. On a Windows® server, you may have to disable your `cURL` extension; and instead, set `allow_url_fopen = yes` in your php.ini file. The `cURL` extension (usually) does NOT support SSL connections on a Windows® server.";
153 $paypal["s2member_log"][] = "Please see this thread: `http://www.primothemes.com/forums/viewtopic.php?f=36&t=2636` for details regarding the ideal server configuration for s2Member.";
154 $paypal["s2member_log"][] = var_export ($_REQUEST, true); /* Recording _POST + _GET vars for analysis and debugging. */
155 }
156 /**/
157 if ($email_configs_were_on) /* Back on? */
158 c_ws_plugin__s2member_email_configs::email_config ();
159 /*
160 Add IPN proxy ( when available ) to the ``$paypal`` array.
161 */
162 if (!empty ($_GET["s2member_paypal_proxy"]))
163 $paypal["s2member_paypal_proxy"] = $_GET["s2member_paypal_proxy"];
164 /*
165 Add IPN proxy use vars ( when available ) to the ``$paypal`` array.
166 */
167 if (!empty ($_GET["s2member_paypal_proxy_use"]))
168 $paypal["s2member_paypal_proxy_use"] = $_GET["s2member_paypal_proxy_use"];
169 /*
170 Also add IPN proxy self-verification ( when available ) to the ``$paypal`` array.
171 */
172 if (!empty ($_GET["s2member_paypal_proxy_verification"]))
173 $paypal["s2member_paypal_proxy_verification"] = $_GET["s2member_paypal_proxy_verification"];
174 /*
175 If debugging/logging is enabled; we need to append ``$paypal`` to the log file.
176 Logging now supports Multisite Networking as well.
177 */
178 $logv = c_ws_plugin__s2member_utilities::ver_details ();
179 $logm = c_ws_plugin__s2member_utilities::mem_details ();
180 $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"];
181 $log4 = (is_multisite () && !is_main_site ()) ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4;
182 $log2 = (is_multisite () && !is_main_site ()) ? "paypal-ipn-4-" . trim (preg_replace ("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "paypal-ipn.log";
183 /**/
184 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"])
185 if (is_dir ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
186 if (is_writable ($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files ())
187 file_put_contents ($logs_dir . "/" . $log2, $logv . "\n" . $logm . "\n" . $log4 . "\n" . var_export ($paypal, true) . "\n\n", FILE_APPEND);
188 /**/
189 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
190 do_action ("ws_plugin__s2member_during_paypal_notify", get_defined_vars ());
191 unset ($__refs, $__v); /* Unset defined __refs, __v. */
192 /**/
193 status_header (200); /* Send a 200 OK status header. */
194 header ("Content-Type: text/plain; charset=utf-8"); /* Content-Type text/plain with UTF-8. */
195 eval ('while (@ob_end_clean ());'); /* End/clean all output buffers that may or may not exist. */
196 /**/
197 exit (((!empty ($paypal["s2member_paypal_proxy_return_url"])) ? $paypal["s2member_paypal_proxy_return_url"] : ""));
198 }
199 /**/
200 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
201 do_action ("ws_plugin__s2member_after_paypal_notify", get_defined_vars ());
202 unset ($__refs, $__v); /* Unset defined __refs, __v. */
203 }
204 }
205 }
206 ?>