PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/s2member/includes/classes/paypal-notify-in-subscr-or-rp-payment-w-level.inc.php

https://gitlab.com/Gashler/dp
PHP | 225 lines | 189 code | 3 blank | 33 comment | 22 complexity | ddbca5cae0c29dbb42ea33dd04f40d07 MD5 | raw file
  1. <?php
  2. /**
  3. * s2Member's PayPal® IPN handler (inner processing routine).
  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 110720
  16. */
  17. if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
  18. exit ("Do not access this file directly.");
  19. if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level"))
  20. {
  21. /**
  22. * s2Member's PayPal® IPN handler (inner processing routine).
  23. *
  24. * @package s2Member\PayPal
  25. * @since 110720
  26. */
  27. class c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level
  28. {
  29. /**
  30. * s2Member's PayPal® IPN handler (inner processing routine).
  31. *
  32. * @package s2Member\PayPal
  33. * @since 110720
  34. *
  35. * @param array $vars Required. An array of defined variables passed by {@link s2Member\PayPal\c_ws_plugin__s2member_paypal_notify_in::paypal_notify()}.
  36. * @return array|bool The original ``$paypal`` array passed in (extracted) from ``$vars``, or false when conditions do NOT apply.
  37. *
  38. * @todo Optimize with ``empty()`` and ``isset()``.
  39. */
  40. public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
  41. {
  42. extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
  43. if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_payment|recurring_payment)$/i", $paypal["txn_type"]))
  44. && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
  45. && (!empty ($paypal["subscr_id"]) || ($paypal["subscr_id"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_subscr_id ($paypal)))
  46. && (empty ($paypal["payment_status"]) || empty ($payment_status_issues) || !preg_match ($payment_status_issues, $paypal["payment_status"]))
  47. && (!empty ($paypal["item_name"]) || ($paypal["item_name"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_name ($paypal)))
  48. && (!empty ($paypal["payer_email"]) || ($paypal["payer_email"] = c_ws_plugin__s2member_utils_users::get_user_email_with ($paypal["subscr_id"])))
  49. && (!empty ($paypal["txn_id"])) && (!empty ($paypal["mc_gross"])))
  50. {
  51. foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
  52. do_action ("ws_plugin__s2member_during_paypal_notify_before_subscr_payment", get_defined_vars ());
  53. unset /* Unset defined __refs, __v. */ ($__refs, $__v);
  54. if (!get_transient ($transient_ipn = "s2m_ipn_" . md5 ("s2member_transient_" . $_paypal_s)) && set_transient ($transient_ipn, time (), 31556926 * 10))
  55. {
  56. $paypal["s2member_log"][] = "s2Member `txn_type` identified as " . ($identified_as = "( `subscr_payment|recurring_payment` )") . ".";
  57. $paypal["s2member_log"][] = "Sleeping for 5 seconds. Waiting for a possible ( `subscr_signup|subscr_modify|recurring_payment_profile_created` ).";
  58. sleep (5); // Sleep here for a moment. PayPal® sometimes sends a subscr_payment before the subscr_signup, subscr_modify.
  59. // It is NOT a big deal if they do. However, s2Member goes to sleep here, just to help keep the log files in a logical order.
  60. $paypal["s2member_log"][] = "Awake. It's " . date ("D M j, Y g:i:s a T") . ". s2Member `txn_type` identified as " . $identified_as . ".";
  61. list ($paypal["level"], $paypal["ccaps"]) = preg_split ("/\:/", $paypal["item_number"], 3);
  62. $paypal["ip"] = (preg_match ("/ip address/i", $paypal["option_name2"]) && $paypal["option_selection2"]) ? $paypal["option_selection2"] : "";
  63. $paypal["ip"] = (!$paypal["ip"] && preg_match ("/^[a-z0-9]+~[0-9\.]+$/i", $paypal["invoice"])) ? preg_replace ("/^[a-z0-9]+~/i", "", $paypal["invoice"]) : $paypal["ip"];
  64. if (($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with ($paypal["subscr_id"])) && is_object ($user = new WP_User ($user_id)) && $user->ID)
  65. {
  66. $processing = $during = true; // Yes, we ARE processing this.
  67. $pr_times = get_user_option ("s2member_paid_registration_times", $user_id);
  68. $pr_times["level"] = (!$pr_times["level"]) ? time () : $pr_times["level"]; // Preserves existing.
  69. $pr_times["level" . $paypal["level"]] = (!$pr_times["level" . $paypal["level"]]) ? time () : $pr_times["level" . $paypal["level"]];
  70. update_user_option ($user_id, "s2member_paid_registration_times", $pr_times); // Update now.
  71. if (!get_user_option ("s2member_first_payment_txn_id", $user_id)) // 1st payment?
  72. update_user_option ($user_id, "s2member_first_payment_txn_id", $paypal["txn_id"]);
  73. update_user_option ($user_id, "s2member_last_payment_time", time ()); // Also update last payment time.
  74. $paypal["s2member_log"][] = "Updated Payment Times for this Member."; // Flag this action in the log.
  75. $fields = get_user_option ("s2member_custom_fields", $user_id); // These will be needed in the routines below.
  76. $user_reg_ip = get_user_option ("s2member_registration_ip", $user_id); // Original IP during Registration.
  77. $user_reg_ip = $paypal["ip"] = ($user_reg_ip) ? $user_reg_ip : $paypal["ip"]; // Now merge conditionally.
  78. if ($processing && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["payment_notification_urls"] && is_array ($cv = preg_split ("/\|/", $paypal["custom"])))
  79. {
  80. foreach (preg_split ("/[\r\n\t]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["payment_notification_urls"]) as $url)
  81. if (($url = preg_replace ("/%%cv([0-9]+)%%/ei", 'urlencode(trim($cv[$1]))', $url)) && ($url = preg_replace ("/%%subscr_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["subscr_id"])), $url)))
  82. if (($url = preg_replace ("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["mc_gross"])), $url)) && ($url = preg_replace ("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["txn_id"])), $url)))
  83. if (($url = preg_replace ("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["item_number"])), $url)) && ($url = preg_replace ("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["item_name"])), $url)))
  84. if (($url = preg_replace ("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["first_name"])), $url)) && ($url = preg_replace ("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["last_name"])), $url)))
  85. if (($url = preg_replace ("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode (trim ($paypal["first_name"] . " " . $paypal["last_name"]))), $url)))
  86. if (($url = preg_replace ("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($paypal["payer_email"])), $url)))
  87. {
  88. if (($url = preg_replace ("/%%user_first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->first_name)), $url)) && ($url = preg_replace ("/%%user_last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->last_name)), $url)))
  89. if (($url = preg_replace ("/%%user_full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode (trim ($user->first_name . " " . $user->last_name))), $url)))
  90. if (($url = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->user_email)), $url)))
  91. if (($url = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user->user_login)), $url)))
  92. if (($url = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user_reg_ip)), $url)))
  93. if (($url = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode ($user_id)), $url)))
  94. {
  95. if (is_array ($fields) && !empty ($fields))
  96. foreach /* Custom Registration/Profile Fields. */ ($fields as $var => $val)
  97. if (!($url = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (urlencode (maybe_serialize ($val))), $url)))
  98. break;
  99. if (($url = trim (preg_replace ("/%%(.+?)%%/i", "", $url))))
  100. c_ws_plugin__s2member_utils_urls::remote ($url);
  101. }
  102. }
  103. $paypal["s2member_log"][] = "Payment Notification URLs have been processed.";
  104. }
  105. if ($processing && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["payment_notification_recipients"] && is_array ($cv = preg_split ("/\|/", $paypal["custom"])))
  106. {
  107. $msg = $sbj = "(s2Member / API Notification Email) - Payment";
  108. $msg .= "\n\n"; // Spacing in the message body.
  109. $msg .= "subscr_id: %%subscr_id%%\n";
  110. $msg .= "amount: %%amount%%\n";
  111. $msg .= "txn_id: %%txn_id%%\n";
  112. $msg .= "item_number: %%item_number%%\n";
  113. $msg .= "item_name: %%item_name%%\n";
  114. $msg .= "first_name: %%first_name%%\n";
  115. $msg .= "last_name: %%last_name%%\n";
  116. $msg .= "full_name: %%full_name%%\n";
  117. $msg .= "payer_email: %%payer_email%%\n";
  118. $msg .= "user_first_name: %%user_first_name%%\n";
  119. $msg .= "user_last_name: %%user_last_name%%\n";
  120. $msg .= "user_full_name: %%user_full_name%%\n";
  121. $msg .= "user_email: %%user_email%%\n";
  122. $msg .= "user_login: %%user_login%%\n";
  123. $msg .= "user_ip: %%user_ip%%\n";
  124. $msg .= "user_id: %%user_id%%\n";
  125. if (is_array ($fields) && !empty ($fields))
  126. foreach ($fields as $var => $val)
  127. $msg .= $var . ": %%" . $var . "%%\n";
  128. $msg .= "cv0: %%cv0%%\n";
  129. $msg .= "cv1: %%cv1%%\n";
  130. $msg .= "cv2: %%cv2%%\n";
  131. $msg .= "cv3: %%cv3%%\n";
  132. $msg .= "cv4: %%cv4%%\n";
  133. $msg .= "cv5: %%cv5%%\n";
  134. $msg .= "cv6: %%cv6%%\n";
  135. $msg .= "cv7: %%cv7%%\n";
  136. $msg .= "cv8: %%cv8%%\n";
  137. $msg .= "cv9: %%cv9%%";
  138. if (($msg = preg_replace ("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $msg)) && ($msg = preg_replace ("/%%subscr_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["subscr_id"]), $msg)))
  139. if (($msg = preg_replace ("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["mc_gross"]), $msg)) && ($msg = preg_replace ("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["txn_id"]), $msg)))
  140. if (($msg = preg_replace ("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["item_number"]), $msg)) && ($msg = preg_replace ("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["item_name"]), $msg)))
  141. if (($msg = preg_replace ("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["first_name"]), $msg)) && ($msg = preg_replace ("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["last_name"]), $msg)))
  142. if (($msg = preg_replace ("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (trim ($paypal["first_name"] . " " . $paypal["last_name"])), $msg)))
  143. if (($msg = preg_replace ("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($paypal["payer_email"]), $msg)))
  144. {
  145. if (($msg = preg_replace ("/%%user_first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->first_name), $msg)) && ($msg = preg_replace ("/%%user_last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->last_name), $msg)))
  146. if (($msg = preg_replace ("/%%user_full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (trim ($user->first_name . " " . $user->last_name)), $msg)))
  147. if (($msg = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->user_email), $msg)))
  148. if (($msg = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user->user_login), $msg)))
  149. if (($msg = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user_reg_ip), $msg)))
  150. if (($msg = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds ($user_id), $msg)))
  151. {
  152. if (is_array ($fields) && !empty ($fields))
  153. foreach /* Custom Registration/Profile Fields. */ ($fields as $var => $val)
  154. if (!($msg = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_ds (maybe_serialize ($val)), $msg)))
  155. break;
  156. if ($sbj && ($msg = trim (preg_replace ("/%%(.+?)%%/i", "", $msg)))) // Still have a ``$sbj`` and a ``$msg``?
  157. foreach (c_ws_plugin__s2member_utils_strings::parse_emails ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["payment_notification_recipients"]) as $recipient)
  158. wp_mail ($recipient, apply_filters ("ws_plugin__s2member_payment_notification_email_sbj", $sbj, get_defined_vars ()), apply_filters ("ws_plugin__s2member_payment_notification_email_msg", $msg, get_defined_vars ()), "Content-Type: text/plain; charset=UTF-8");
  159. }
  160. }
  161. $paypal["s2member_log"][] = "Payment Notification Emails have been processed.";
  162. }
  163. foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
  164. do_action ("ws_plugin__s2member_during_paypal_notify_during_subscr_payment", get_defined_vars ());
  165. unset /* Unset defined __refs, __v. */ ($__refs, $__v);
  166. }
  167. else // Otherwise, we need to re-generate/store this IPN into a Transient Queue. Then re-process it on registration.
  168. {
  169. $paypal["s2member_log"][] = "Skipping this IPN response, for now. The Subscr. ID is not associated with a registered Member.";
  170. $ipn = array ("txn_type" => "subscr_payment"); // Create a simulated IPN response for txn_type=subscr_payment.
  171. foreach ($paypal as $var => $val)
  172. if (in_array ($var, array ("subscr_gateway", "subscr_id", "txn_id", "custom", "invoice", "mc_gross", "mc_currency", "tax", "payer_email", "first_name", "last_name", "item_name", "item_number", "option_name1", "option_selection1", "option_name2", "option_selection2")))
  173. $ipn[$var] = $val;
  174. $paypal["s2member_log"][] = "Re-generating. This IPN will go into a Transient Queue; and be re-processed during registration.";
  175. set_transient ("s2m_" . md5 ("s2member_transient_ipn_subscr_payment_" . $paypal["subscr_id"]), $ipn, 43200);
  176. }
  177. }
  178. else // Else, this is a duplicate IPN. Must stop here.
  179. {
  180. $paypal["s2member_log"][] = "Not processing. Duplicate IPN.";
  181. $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `subscr_payment|recurring_payment` ).";
  182. $paypal["s2member_log"][] = "Duplicate IPN. Already processed. This IPN will be ignored.";
  183. }
  184. foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
  185. do_action ("ws_plugin__s2member_during_paypal_notify_after_subscr_payment", get_defined_vars ());
  186. unset /* Unset defined __refs, __v. */ ($__refs, $__v);
  187. return apply_filters ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level", $paypal, get_defined_vars ());
  188. }
  189. else
  190. return apply_filters ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level", false, get_defined_vars ());
  191. }
  192. }
  193. }
  194. ?>