/** * Validates the configuration of the current form. * * Free Registration Forms do NOT require API Credentials. * * @package s2Member\PayPal * @since 1.5 * * @param array $attr An array of Pro-Form Attributes. * @return null|array Null if there are no errors, else a response array. */ public static function paypal_form_attr_validation_errors($attr = FALSE) { if (!($response = c_ws_plugin__s2member_pro_paypal_responses::paypal_form_api_validation_errors($attr)) || !empty($attr["register"])) { if ($attr["cancel"]) { if (!is_user_logged_in()) { $response = array("response" => sprintf(_x('You must <a href="%s" rel="nofollow">log in</a> to cancel your account.', "s2member-front", "s2member"), esc_attr(wp_login_url($_SERVER["REQUEST_URI"]))), "error" => true); } else { if (!is_object($user = wp_get_current_user()) || !($user_id = $user->ID) || !($subscr_id = get_user_option("s2member_subscr_id", $user_id))) { $response = array("response" => _x('Nothing to cancel. You\'re NOT a paid Member.', "s2member-front", "s2member"), "error" => true); } else { if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"]) { if (!($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($subscr_id))) { $response = array("response" => _x('Nothing to cancel. You have NO recurring fees.', "s2member-front", "s2member"), "error" => true); } else { if (!empty($paypal["STATUS"]) && preg_match("/^(Pending|PendingProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('<strong>Unable to cancel at this time.</strong> Your account is pending other changes. Please try again in 15 minutes.', "s2member-front", "s2member"), "error" => true); } else { if (empty($paypal["STATUS"]) || !preg_match("/^(Active|ActiveProfile|Suspended|SuspendedProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('Nothing to cancel. You have NO recurring fees.', "s2member-front", "s2member"), "error" => true); } } } } else { if (is_array($paypal = array("PROFILEID" => $subscr_id, "METHOD" => "GetRecurringPaymentsProfileDetails"))) { if (!($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal)) || !empty($paypal["__error"])) { if ($paypal && !empty($paypal["__error"]) && !empty($paypal["L_ERRORCODE0"]) && $paypal["L_ERRORCODE0"] === "11592") { $response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to cancel your Subscription.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/cgi-bin/webscr?cmd=_subscr-find&alias=" . urlencode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"]))), "error" => true); } else { $response = array("response" => _x('Nothing to cancel. You have NO recurring fees.', "s2member-front", "s2member"), "error" => true); } } else { if (!empty($paypal["STATUS"]) && preg_match("/^(Pending|PendingProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('<strong>Unable to cancel at this time.</strong> Your account is pending other changes. Please try again in 15 minutes.', "s2member-front", "s2member"), "error" => true); } else { if (empty($paypal["STATUS"]) || !preg_match("/^(Active|ActiveProfile|Suspended|SuspendedProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('Nothing to cancel. You have NO recurring fees.', "s2member-front", "s2member"), "error" => true); } } } } } } } } else { if ($attr["update"]) { if (!is_user_logged_in()) { $response = array("response" => sprintf(_x('You must <a href="%s" rel="nofollow">log in</a> to update your billing information.', "s2member-front", "s2member"), esc_attr(wp_login_url($_SERVER["REQUEST_URI"]))), "error" => true); } else { if (!is_object($user = wp_get_current_user()) || !($user_id = $user->ID) || !($subscr_id = get_user_option("s2member_subscr_id", $user_id))) { $response = array("response" => _x('Nothing to update. You\'re NOT a paid Member.', "s2member-front", "s2member"), "error" => true); } else { if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"]) { if (!($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($subscr_id))) { $response = array("response" => _x('Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance.', "s2member-front", "s2member"), "error" => true); } else { if (!empty($paypal["TENDER"]) && strtoupper($paypal["TENDER"]) === "P") { $response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to update your billing information.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/")), "error" => true); } else { if (!empty($paypal["STATUS"]) && preg_match("/^(Pending|PendingProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('<strong>Unable to update at this time.</strong> Your account is pending other changes. Please try again in 15 minutes.', "s2member-front", "s2member"), "error" => true); } else { if (empty($paypal["STATUS"]) || !preg_match("/^(Active|ActiveProfile|Suspended|SuspendedProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance.', "s2member-front", "s2member"), "error" => true); } } } } } else { if (is_array($paypal = array("PROFILEID" => $subscr_id, "METHOD" => "GetRecurringPaymentsProfileDetails"))) { if (!($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal)) || !empty($paypal["__error"]) || empty($paypal["ACCT"]) || strlen($paypal["ACCT"]) !== 4) { if ($paypal && empty($paypal["__error"]) && (empty($paypal["ACCT"]) || strlen($paypal["ACCT"]) !== 4)) { $response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to update your billing information.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/")), "error" => true); } else { if ($paypal && !empty($paypal["__error"]) && !empty($paypal["L_ERRORCODE0"]) && $paypal["L_ERRORCODE0"] === "11592") { $response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to update your billing information.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/")), "error" => true); } else { $response = array("response" => _x('Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance.', "s2member-front", "s2member"), "error" => true); } } } else { if (!empty($paypal["STATUS"]) && preg_match("/^(Pending|PendingProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('<strong>Unable to update at this time.</strong> Your account is pending other changes. Please try again in 15 minutes.', "s2member-front", "s2member"), "error" => true); } else { if (empty($paypal["STATUS"]) || !preg_match("/^(Active|ActiveProfile|Suspended|SuspendedProfile)\$/i", $paypal["STATUS"])) { $response = array("response" => _x('Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance.', "s2member-front", "s2member"), "error" => true); } } } } } } } } else { if ($attr["register"]) { if (!is_string($attr["level"]) || !is_numeric($attr["level"])) { $response = array("response" => sprintf(_x('Invalid form configuration. Missing "level" attribute. Membership Level. Must be numeric [0-%s].', "s2member-admin", "s2member"), esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"])), "error" => true); } else { if ($attr["level"] < 0 || $attr["level"] > $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]) { $response = array("response" => sprintf(_x('Invalid form configuration. Invalid "level" attribute. Membership Level. Must be numeric [0-%s].', "s2member-admin", "s2member"), esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"])), "error" => true); } else { if ($attr["ccaps"] && (!is_string($attr["ccaps"]) || preg_replace("/^-all[\r\n\t\\s;,]*/", "", str_replace("+", "", $attr["ccaps"])) && !preg_match("/^([a-z_0-9,]+)\$/", preg_replace("/^-all[\r\n\t\\s;,]*/", "", str_replace("+", "", $attr["ccaps"]))))) { $response = array("response" => _x('Invalid form configuration. Invalid "ccaps" attribute. Custom Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && (!is_string($attr["tp"]) || !is_numeric($attr["tp"]))) { $response = array("response" => _x('Invalid form configuration. Invalid "tp" attribute. The Trial Period. When provided, must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && $attr["tp"] < 1) { $response = array("response" => _x('Invalid form configuration. Invalid "tp" attribute. The Trial Period. When provided, must be >= 1.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && (!$attr["tt"] || !is_string($attr["tt"]))) { $response = array("response" => _x('Invalid form configuration. Missing "tt" attribute. The Trial Term. When "tp" is provided, "tt" (Trial Term) must be one of D,W,M,Y.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && !preg_match("/[DWMY]/", $attr["tt"])) { $response = array("response" => _x('Invalid form configuration. Invalid "tt" attribute. The Trial Term. When "tp" is provided, "tt" (Trial Term) must be one of D,W,M,Y.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["custom"] && (!is_string($attr["custom"]) || !preg_match("/^" . preg_quote(preg_replace("/\\:([0-9]+)\$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $attr["custom"]))) { $response = array("response" => _x('Invalid form configuration. Invalid "custom" attribute. When provided, must start with your domain name.', "s2member-admin", "s2member-admin"), "error" => true); } } } } } } } } } else { if ($attr["sp"]) { if (!$attr["ids"] || !is_string($attr["ids"])) { $response = array("response" => _x('Invalid form configuration. Missing "ids" attribute. Must contain comma-delimited Post/Page IDs.', "s2member-admin", "s2member"), "error" => true); } else { if (!preg_match("/^([0-9,]+)\$/", $attr["ids"])) { $response = array("response" => _x('Invalid form configuration. Invalid "ids" attribute. Must contain comma-delimited Post/Page IDs. Must contain [0-9,] only.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["exp"] || !is_string($attr["exp"])) { $response = array("response" => _x('Invalid form configuration. Missing "exp" attribute. Specific Post/Page Expiration (in hours). Must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if (!is_numeric($attr["exp"])) { $response = array("response" => _x('Invalid form configuration. Invalid "exp" attribute. Specific Post/Page Expiration (in hours). Must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["exp"] < 1) { $response = array("response" => _x('Invalid form configuration. Invalid "exp" attribute. Specific Post/Page Expiration (in hours). Must be >= 1.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["exp"] > 438291) { $response = array("response" => _x('Invalid form configuration. Invalid "exp" attribute. Specific Post/Page Expiration (in hours). Must be <= 438291.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["sp_ids_exp"] || !is_string($attr["sp_ids_exp"])) { $response = array("response" => _x('Invalid form configuration. Missing "sp_ids_exp" internal attribute. Please check Shortcode Attributes.', "s2member-admin", "s2member"), "error" => true); } else { if (!preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $attr["sp_ids_exp"])) { $response = array("response" => _x('Invalid form configuration. Invalid "sp_ids_exp" internal attribute. Please check Shortcode Attributes.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["desc"] || !is_string($attr["desc"])) { $response = array("response" => _x('Invalid form configuration. Missing "desc" attribute. Please provide a Description for this form.', "s2member-admin", "s2member"), "error" => true); } else { if (strlen($attr["desc"]) > 100) { $response = array("response" => _x('Invalid form configuration. Your "desc" (Description) attribute must be <= 100 characters long.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["custom"] || !is_string($attr["custom"])) { $response = array("response" => _x('Invalid form configuration. Missing "custom" attribute. Must start with your domain name.', "s2member-admin", "s2member"), "error" => true); } else { if (!preg_match("/^" . preg_quote(preg_replace("/\\:([0-9]+)\$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $attr["custom"])) { $response = array("response" => _x('Invalid form configuration. Invalid "custom" attribute. Must start with your domain name.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["cc"] || !is_string($attr["cc"])) { $response = array("response" => _x('Invalid form configuration. Missing "cc" attribute. Must be a 3 character Currency Code.', "s2member-admin", "s2member"), "error" => true); } else { if (strlen($attr["cc"]) !== 3) { $response = array("response" => _x('Invalid form configuration. Invalid "cc" attribute. Must be a 3 character Currency Code.', "s2member-admin", "s2member"), "error" => true); } else { if (!strlen($attr["dg"]) || !is_string($attr["dg"])) { $response = array("response" => _x('Invalid form configuration. Missing "dg" attribute. Digital indicator. Must be numeric [0-1].', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["dg"] < 0 || $attr["dg"] > 1) { $response = array("response" => _x('Invalid form configuration. Invalid "dg" attribute. Digital indicator. Must be numeric [0-1].', "s2member-admin", "s2member"), "error" => true); } else { if (!strlen($attr["ns"]) || !is_string($attr["ns"])) { $response = array("response" => _x('Invalid form configuration. Missing "ns" attribute. Shipping configuration. Must be numeric [0-2].', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ns"] < 0 || $attr["ns"] > 2) { $response = array("response" => _x('Invalid form configuration. Invalid "ns" attribute. Shipping configuration. Must be numeric [0-2].', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["dg"] && $attr["ns"] !== "1") { $response = array("response" => _x('Invalid form configuration. Invalid "ns" attribute. Shipping configuration. Must be 1 with "dg" (digital) items.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["lc"] && strlen($attr["lc"]) !== 2) { $response = array("response" => _x('Invalid form configuration. Invalid "lc" attribute. Locale Code. When provided, must be a 2 character country code.', "s2member-admin", "s2member"), "error" => true); } else { if (!strlen($attr["ra"]) || !is_string($attr["ra"])) { $response = array("response" => _x('Invalid form configuration. Missing "ra" attribute. The Regular Amount. Must be >= 0.00.', "s2member-admin", "s2member"), "error" => true); } else { if (!is_numeric($attr["ra"])) { $response = array("response" => _x('Invalid form configuration. Invalid "ra" attribute. The Regular Amount. Must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ra"] < 0.0) { $response = array("response" => _x('Invalid form configuration. Invalid "ra" attribute. The Regular Amount. Must be >= 0.00.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ra"] > 10000.0 && strtoupper($attr["cc"]) === "USD") { $response = array("response" => _x('Invalid form configuration. Invalid "ra" attribute. The Regular Amount. Must be <= 10000.00.', "s2member-admin", "s2member"), "error" => true); } } } } } } } } } } } } } } } } } } } } } } } } } else { if ($attr["modify"] && !is_user_logged_in()) { $response = array("response" => sprintf(_x('You must <a href="%s" rel="nofollow">login</a> to update your billing plan.', "s2member-front", "s2member"), esc_attr(wp_login_url($_SERVER["REQUEST_URI"]))), "error" => true); } else { if ($attr["level"] === "*" && !is_user_logged_in()) { $response = array("response" => sprintf(_x('You must <a href="%s" rel="nofollow">login</a> before making this purchase.', "s2member-front", "s2member"), esc_attr(wp_login_url($_SERVER["REQUEST_URI"]))), "error" => true); } else { if ((!$attr["level"] || !is_string($attr["level"]) || !is_numeric($attr["level"])) && $attr["level"] !== "*") { $response = array("response" => sprintf(_x('Invalid form configuration. Missing "level" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*).', "s2member-admin", "s2member"), esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"])), "error" => true); } else { if (($attr["level"] < 1 || $attr["level"] > $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]) && $attr["level"] !== "*") { $response = array("response" => sprintf(_x('Invalid form configuration. Invalid "level" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*).', "s2member-admin", "s2member"), esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"])), "error" => true); } else { if ($attr["ccaps"] && (!is_string($attr["ccaps"]) || preg_replace("/^-all[\r\n\t\\s;,]*/", "", str_replace("+", "", $attr["ccaps"])) && !preg_match("/^([a-z_0-9,]+)\$/", preg_replace("/^-all[\r\n\t\\s;,]*/", "", str_replace("+", "", $attr["ccaps"]))))) { $response = array("response" => _x('Invalid form configuration. Invalid "ccaps" attribute. Custom Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["level"] === "*" && (!is_string($attr["ccaps"]) || !preg_replace("/^-all[\r\n\t\\s;,]*/", "", str_replace("+", "", $attr["ccaps"])) || !preg_match("/^([a-z_0-9,]+)\$/", preg_replace("/^-all[\r\n\t\\s;,]*/", "", str_replace("+", "", $attr["ccaps"]))))) { $response = array("response" => _x('Invalid form configuration. Missing or invalid "ccaps" attribute. When "level" is "*" for (Independent Custom Capabilities), "ccaps" is required. All lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["desc"] || !is_string($attr["desc"])) { $response = array("response" => _x('Invalid form configuration. Missing "desc" attribute. Please provide a Description for this form.', "s2member-admin", "s2member"), "error" => true); } else { if (strlen($attr["desc"]) > 100) { $response = array("response" => _x('Invalid form configuration. Your "desc" (Description) attribute must be <= 100 characters long.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["custom"] || !is_string($attr["custom"])) { $response = array("response" => _x('Invalid form configuration. Missing "custom" attribute. Must start with your domain name.', "s2member-admin", "s2member"), "error" => true); } else { if (!preg_match("/^" . preg_quote(preg_replace("/\\:([0-9]+)\$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $attr["custom"])) { $response = array("response" => _x('Invalid form configuration. Invalid "custom" attribute. Must start with matching domain.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["cc"] || !is_string($attr["cc"])) { $response = array("response" => _x('Invalid form configuration. Missing "cc" attribute. Must be a 3 character Currency Code.', "s2member-admin", "s2member"), "error" => true); } else { if (strlen($attr["cc"]) !== 3) { $response = array("response" => _x('Invalid form configuration. Invalid "cc" attribute. Must be a 3 character Currency Code.', "s2member-admin", "s2member"), "error" => true); } else { if (!strlen($attr["dg"]) || !is_string($attr["dg"])) { $response = array("response" => _x('Invalid form configuration. Missing "dg" attribute. Digital indicator. Must be numeric [0-1].', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["dg"] < 0 || $attr["dg"] > 1) { $response = array("response" => _x('Invalid form configuration. Invalid "dg" attribute. Digital indicator. Must be numeric [0-1].', "s2member-admin", "s2member"), "error" => true); } else { if (!strlen($attr["ns"]) || !is_string($attr["ns"])) { $response = array("response" => _x('Invalid form configuration. Missing "ns" attribute. Shipping configuration. Must be numeric [0-2].', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ns"] < 0 || $attr["ns"] > 2) { $response = array("response" => _x('Invalid form configuration. Invalid "ns" attribute. Shipping configuration. Must be numeric [0-2].', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["dg"] && $attr["ns"] !== "1") { $response = array("response" => _x('Invalid form configuration. Invalid "ns" attribute. Shipping configuration. Must be 1 with "dg" (digital) items.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["lc"] && strlen($attr["lc"]) !== 2) { $response = array("response" => _x('Invalid form configuration. Invalid "lc" attribute. Locale Code. When provided, must be a 2 character country code.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && (!is_string($attr["tp"]) || !is_numeric($attr["tp"]))) { $response = array("response" => _x('Invalid form configuration. Invalid "tp" attribute. The Trial Period. When provided, must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && $attr["tp"] < 1) { $response = array("response" => _x('Invalid form configuration. Invalid "tp" attribute. The Trial Period. When provided, must be >= 1.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && (!$attr["tt"] || !is_string($attr["tt"]))) { $response = array("response" => _x('Invalid form configuration. Missing "tt" attribute. The Trial Term. When "tp" is provided, "tt" (Trial Term) must be one of D,W,M,Y.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && !preg_match("/[DWMY]/", $attr["tt"])) { $response = array("response" => _x('Invalid form configuration. Invalid "tt" attribute. The Trial Term. When "tp" is provided, "tt" (Trial Term) must be one of D,W,M,Y.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && $attr["ta"] && !is_numeric($attr["ta"])) { $response = array("response" => _x('Invalid form configuration. Invalid "ta" attribute. The Trial Amount. When provided, must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && $attr["ta"] && $attr["ta"] < 0.0) { $response = array("response" => _x('Invalid form configuration. Invalid "ta" attribute. The Trial Amount. When provided, must be >= 0.00.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["tp"] && $attr["ta"] && $attr["ta"] > 10000.0 && strtoupper($attr["cc"]) === "USD") { $response = array("response" => _x('Invalid form configuration. Invalid "ta" attribute. The Trial Amount. When provided, must be <= 10000.00.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["rp"] || !is_string($attr["rp"])) { $response = array("response" => _x('Invalid form configuration. Missing "rp" attribute. The Regular Period. Must be >= 1.', "s2member-admin", "s2member"), "error" => true); } else { if (!is_numeric($attr["rp"])) { $response = array("response" => _x('Invalid form configuration. Invalid "rp" attribute. The Regular Period. Must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rp"] < 1) { $response = array("response" => _x('Invalid form configuration. Invalid "rp" attribute. The Regular Period. Must be >= 1.', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["rt"] || !is_string($attr["rt"])) { $response = array("response" => _x('Invalid form configuration. Missing "rt" attribute. The Regular Term. Must be one of D,W,M,Y,L.', "s2member-admin", "s2member"), "error" => true); } else { if (!preg_match("/[DWMYL]/", $attr["rt"])) { $response = array("response" => _x('Invalid form configuration. Invalid "rt" attribute. The Regular Term. Must be one of D,W,M,Y,L.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "D" && $attr["rp"] > 365 && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "rt, rp, rr" attributes. The "rt" (Regular Term) attribute is "D", "rp" (Regular Period) > 365, and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "W" && $attr["rp"] > 52 && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "rt, rp, rr" attributes. The "rt" (Regular Term) attribute is "W", "rp" (Regular Period) > 52, and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "M" && $attr["rp"] > 12 && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "rt, rp, rr" attributes. The "rt" (Regular Term) attribute is "M", "rp" (Regular Period) > 12, and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rr"] !== "BN" && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"] && !in_array($attr["rp"] . "-" . $attr["rt"], array("1-D", "1-W", "2-W", "1-M", "3-M", "6-M", "1-Y"), TRUE)) { // We allow daily here in case Payflow begins to support this in the future. $response = array("response" => _x('Invalid Payflow form configuration. Invalid "rt, rp, rr" attributes. Payflow supports a specific set of recurring intervals. Pro-Forms can be configured to charge: weekly, bi-weekly, monthly, quarterly, semi-yearly or yearly. Any other combination results in this error. This is a Payflow limitation.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "Y" && $attr["rp"] > 5 && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "rt, rp, rr" attributes. The "rt" (Regular Term) attribute is "Y", "rp" (Regular Period) > 5, and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "Y" && $attr["rp"] > 1 && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "rt, rp, rr" attributes. The "rt" (Regular Term) attribute is "Y", "rp" (Regular Period) > 1, and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "L" && $attr["rp"] > 1) { $response = array("response" => _x('Invalid form configuration. Invalid "rp, rt" attributes. The "rt" (Regular Term) attribute is "L" (Lifetime), and "rp" (Regular Period) > 1.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rt"] === "L" && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "rt, rr" attributes. The "rt" (Regular Term) attribute is "L" (Lifetime), and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if (!$attr["level_ccaps_eotper"] || !is_string($attr["level_ccaps_eotper"])) { $response = array("response" => _x('Invalid form configuration. Missing "level_ccaps_eotper" attribute. Please check Shortcode Attributes.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["level"] !== "*" && !preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $attr["level_ccaps_eotper"])) { $response = array("response" => _x('Invalid form configuration. Invalid "level_ccaps_eotper" attribute. Please check Shortcode Attributes.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["level"] === "*" && !preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_wo_level_regex"], $attr["level_ccaps_eotper"])) { $response = array("response" => _x('Invalid form configuration. Invalid "level_ccaps_eotper" attribute. Please check Shortcode Attributes.', "s2member-admin", "s2member"), "error" => true); } else { if (!strlen($attr["ra"]) || !is_string($attr["ra"])) { $response = array("response" => _x('Invalid form configuration. Missing "ra" attribute. The Regular Amount. Must be >= 0.00.', "s2member-admin", "s2member"), "error" => true); } else { if (!is_numeric($attr["ra"])) { $response = array("response" => _x('Invalid form configuration. Invalid "ra" attribute. The Regular Amount. Must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ra"] < 0.0) { $response = array("response" => _x('Invalid form configuration. Invalid "ra" attribute. The Regular Amount. Must be >= 0.00.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ra"] > 10000.0 && strtoupper($attr["cc"]) === "USD") { $response = array("response" => _x('Invalid form configuration. Invalid "ra" attribute. The Regular Amount. Must be <= 10000.00.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rr"] && (!is_string($attr["rr"]) || !preg_match("/^([0-1]|BN)\$/", $attr["rr"]))) { $response = array("response" => _x('Invalid form configuration. Invalid "rr" attribute. Regular Recurring. When provided, must be 0, 1, or BN.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rr"] === "BN" && $attr["tp"]) { $response = array("response" => _x('Invalid form configuration. Invalid "rr, tp" attributes. The "rr" (Regular Recurring) attribute is "BN" (Buy Now), and "tp" (Trial Period) is not "0".', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["level"] === "*" && $attr["rr"] !== "BN") { $response = array("response" => _x('Invalid form configuration. Invalid "level, rr" attributes. The "level" (Level) attribute is "*" for (Independent Custom Capabilities), and "rr" is not "BN" (Buy Now).', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["ra"] && $attr["ta"] === $attr["ra"] && $attr["tp"] === $attr["rp"] && $attr["tt"] === $attr["rt"]) { $response = array("response" => _x('Invalid form configuration. Invalid "ta, tp, tt" attributes. Trial Period. When provided, these cannot be exactly the same as your "ra, rp, rt" attributes.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rrt"] && (!is_string($attr["rrt"]) || !is_numeric($attr["rrt"]))) { $response = array("response" => _x('Invalid form configuration. Invalid "rrt" attribute. Recurring Times (fixed). When provided, must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rrt"] && $attr["rrt"] < 1) { $response = array("response" => _x('Invalid form configuration. Invalid "rrt" attribute. Recurring Times (fixed). When provided, must be >= 1.', "s2member-admin", "s2member"), "error" => true); } else { if ($attr["rrt"] && $attr["rr"] !== "1") { $response = array("response" => _x('Invalid form configuration. Invalid "rr, rrt" attributes. When "rrt" (Recurring Times) is provided, "rr" (Regular Recurring) must be 1.', "s2member-admin", "s2member"), "error" => true); } else { if (($attr["rr"] === "0" || $attr["rr"] === "1") && (!is_string($attr["rra"]) || !is_numeric($attr["rra"]))) { $response = array("response" => _x('Invalid form configuration. Invalid "rr, rra" attributes. When "rr" (Regular Recurring) is 0 or 1, "rra" (Recurring Retry Attempts) must be numeric.', "s2member-admin", "s2member"), "error" => true); } else { if (($attr["rr"] === "0" || $attr["rr"] === "1") && $attr["rra"] < 0) { $response = array("response" => _x('Invalid form configuration. Invalid "rr, rra" attributes. When "rr" (Regular Recurring) is 0 or 1, "rra" (Recurring Retry Attempts) must be >= 0.', "s2member-admin", "s2member"), "error" => true); } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } return empty($response) ? null : $response; }
/** * Handles processing of Pro-Form cancellations. * * @package s2Member\PayPal * @since 1.5 * * @attaches-to ``add_action('init');`` * * @return null Or exits script execution after a custom URL redirection. */ public static function paypal_cancellation() { if (!empty($_POST['s2member_pro_paypal_cancellation']['nonce']) && ($nonce = $_POST['s2member_pro_paypal_cancellation']['nonce']) && wp_verify_nonce($nonce, 's2member-pro-paypal-cancellation')) { $GLOBALS['ws_plugin__s2member_pro_paypal_cancellation_response'] = array(); // This holds the global response details. $global_response =& $GLOBALS['ws_plugin__s2member_pro_paypal_cancellation_response']; $post_vars = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST['s2member_pro_paypal_cancellation'])); $post_vars['attr'] = !empty($post_vars['attr']) ? (array) unserialize(c_ws_plugin__s2member_utils_encryption::decrypt($post_vars['attr'])) : array(); $post_vars['attr'] = apply_filters('ws_plugin__s2member_pro_paypal_cancellation_post_attr', $post_vars['attr'], get_defined_vars()); $post_vars = c_ws_plugin__s2member_utils_captchas::recaptcha_post_vars($post_vars); // Collect reCAPTCHA™ post vars. if (!c_ws_plugin__s2member_pro_paypal_responses::paypal_form_attr_validation_errors($post_vars['attr'])) { if (!($error = c_ws_plugin__s2member_pro_paypal_responses::paypal_form_submission_validation_errors('cancellation', $post_vars))) { if (is_user_logged_in() && is_object($user = wp_get_current_user()) && ($user_id = $user->ID)) { if ($cur__subscr_id = get_user_option('s2member_subscr_id')) { if (($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($cur__subscr_id)) && @$paypal['TENDER'] !== 'P') { if (preg_match('/^(Active|ActiveProfile)$/i', $paypal['STATUS'])) { if (!($ipn = array())) { $ipn['txn_type'] = 'subscr_cancel'; $ipn['subscr_id'] = $paypal['PROFILEID']; $ipn['custom'] = get_user_option('s2member_custom'); $ipn['period1'] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1($paypal); $ipn['period3'] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period3($paypal); $ipn['payer_email'] = $paypal['EMAIL']; $ipn['first_name'] = $paypal['NAME']; $ipn['last_name'] = $paypal['LASTNAME']; $ipn['option_name1'] = 'Referencing Customer ID'; $ipn['option_selection1'] = $paypal['PROFILEID']; $ipn['option_name2'] = 'Customer IP Address'; // IP Address. $ipn['option_selection2'] = get_user_option('s2member_registration_ip'); $ipn['item_name'] = !empty($paypal['DESC']) ? $paypal['DESC'] : $paypal['PROFILENAME']; $ipn['item_number'] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number($paypal); $ipn['s2member_paypal_proxy'] = 'paypal'; $ipn['s2member_paypal_proxy_use'] = 'pro-emails'; $ipn['s2member_paypal_proxy_verification'] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(home_url('/?s2member_paypal_notify=1'), $ipn, array('timeout' => 20)); } c_ws_plugin__s2member_pro_paypal_utilities::payflow_cancel_profile($paypal['PROFILEID'], !empty($paypal['BAID']) ? $paypal['BAID'] : ''); $global_response = array('response' => _x('<strong>Billing termination confirmed.</strong> Your account has been cancelled.', 's2member-front', 's2member')); if ($post_vars['attr']['success'] && ($custom_success_url = str_ireplace(array('%%s_response%%', '%%response%%'), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response['response'])), urlencode($global_response['response'])), $post_vars['attr']['success'])) && ($custom_success_url = trim(preg_replace('/%%(.+?)%%/i', '', $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, 's2p-v')) . exit; } } else { $global_response = array('response' => _x('<strong>Billing terminated.</strong> Your account has been cancelled.', 's2member-front', 's2member')); if ($post_vars['attr']['success'] && ($custom_success_url = str_ireplace(array('%%s_response%%', '%%response%%'), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response['response'])), urlencode($global_response['response'])), $post_vars['attr']['success'])) && ($custom_success_url = trim(preg_replace('/%%(.+?)%%/i', '', $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, 's2p-v')) . exit; } } } else { if ($paypal && $paypal['TENDER'] === 'P') { $global_response = array('response' => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to cancel your Subscription.', 's2member-front', 's2member'), esc_attr('https://' . ($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_sandbox'] ? 'www.sandbox.paypal.com' : 'www.paypal.com') . '/cgi-bin/webscr?cmd=_subscr-find&alias=' . urlencode($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_merchant_id']))), 'error' => TRUE); } else { $global_response = array('response' => _x('<strong>Billing terminated.</strong> Your account has been cancelled.', 's2member-front', 's2member')); if ($post_vars['attr']['success'] && ($custom_success_url = str_ireplace(array('%%s_response%%', '%%response%%'), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response['response'])), urlencode($global_response['response'])), $post_vars['attr']['success'])) && ($custom_success_url = trim(preg_replace('/%%(.+?)%%/i', '', $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, 's2p-v')) . exit; } } } } else { $global_response = array('response' => _x('<strong>Billing terminated.</strong> Your account has been cancelled.', 's2member-front', 's2member')); if ($post_vars['attr']['success'] && ($custom_success_url = str_ireplace(array('%%s_response%%', '%%response%%'), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response['response'])), urlencode($global_response['response'])), $post_vars['attr']['success'])) && ($custom_success_url = trim(preg_replace('/%%(.+?)%%/i', '', $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, 's2p-v')) . exit; } } if ($post_vars['attr']['unsub']) { c_ws_plugin__s2member_list_servers::process_list_server_removals_against_current_user(TRUE); } } else { $global_response = array('response' => _x('You\'re <strong>NOT</strong> logged in.', 's2member-front', 's2member'), 'error' => TRUE); } } else { $global_response = $error; } } } }
/** * Handles processing of Pro Form cancellations. * * @package s2Member\PayPal * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after a custom URL redirection. */ public static function paypal_cancellation() { if (!empty($_POST["s2member_pro_paypal_cancellation"]["nonce"]) && ($nonce = $_POST["s2member_pro_paypal_cancellation"]["nonce"]) && wp_verify_nonce($nonce, "s2member-pro-paypal-cancellation")) { $GLOBALS["ws_plugin__s2member_pro_paypal_cancellation_response"] = array(); // This holds the global response details. $global_response =& $GLOBALS["ws_plugin__s2member_pro_paypal_cancellation_response"]; // This is a shorter reference. $post_vars = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST["s2member_pro_paypal_cancellation"])); $post_vars["attr"] = unserialize(c_ws_plugin__s2member_utils_encryption::decrypt($post_vars["attr"])); // And run a Filter. $post_vars["attr"] = apply_filters("ws_plugin__s2member_pro_paypal_cancellation_post_attr", $post_vars["attr"], get_defined_vars()); $post_vars["recaptcha_challenge_field"] = !$post_vars["recaptcha_challenge_field"] ? trim(stripslashes($_POST["recaptcha_challenge_field"])) : $post_vars["recaptcha_challenge_field"]; $post_vars["recaptcha_response_field"] = !$post_vars["recaptcha_response_field"] ? trim(stripslashes($_POST["recaptcha_response_field"])) : $post_vars["recaptcha_response_field"]; if (!c_ws_plugin__s2member_pro_paypal_responses::paypal_form_attr_validation_errors($post_vars["attr"])) { if (!($error = c_ws_plugin__s2member_pro_paypal_responses::paypal_form_submission_validation_errors("cancellation", $post_vars))) { if (is_user_logged_in() && is_object($user = wp_get_current_user()) && ($user_id = $user->ID)) { if ($cur__subscr_id = get_user_option("s2member_subscr_id")) { if (($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($cur__subscr_id)) && $paypal["TENDER"] !== "P") { if (preg_match("/^(Active|ActiveProfile)\$/i", $paypal["STATUS"])) { if (!($ipn = array())) { $ipn["txn_type"] = "subscr_cancel"; $ipn["subscr_id"] = $paypal["PROFILEID"]; $ipn["custom"] = get_user_option("s2member_custom"); $ipn["period1"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1($paypal); $ipn["period3"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period3($paypal); $ipn["payer_email"] = $paypal["EMAIL"]; $ipn["first_name"] = $paypal["FIRSTNAME"]; $ipn["last_name"] = $paypal["LASTNAME"]; $ipn["option_name1"] = "Referencing Customer ID"; $ipn["option_selection1"] = $paypal["PROFILEID"]; $ipn["option_name2"] = "Customer IP Address"; // IP Address. $ipn["option_selection2"] = get_user_option("s2member_registration_ip"); $ipn["item_name"] = $paypal["DESC"] ? $paypal["DESC"] : $paypal["PROFILENAME"]; $ipn["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number($paypal); $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); } c_ws_plugin__s2member_pro_paypal_utilities::payflow_cancel_profile($paypal["PROFILEID"], $paypal["BAID"]); $global_response = array("response" => _x('<strong>Billing termination confirmed.</strong> Your account has been cancelled.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $post_vars["attr"]["success"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { $global_response = array("response" => _x('<strong>Billing terminated.</strong> Your account has been cancelled.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $post_vars["attr"]["success"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } } else { if ($paypal && $paypal["TENDER"] === "P") { $global_response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to cancel your Subscription.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/cgi-bin/webscr?cmd=_subscr-find&alias=" . urlencode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]))), "error" => true); } else { $global_response = array("response" => _x('<strong>Billing terminated.</strong> Your account has been cancelled.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $post_vars["attr"]["success"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } } } else { $global_response = array("response" => _x('<strong>Billing terminated.</strong> Your account has been cancelled.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $post_vars["attr"]["success"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } } else { $global_response = array("response" => _x('You\'re <strong>NOT</strong> logged in.', "s2member-front", "s2member"), "error" => true); } } else { $global_response = $error; } } } }
function s2member_pro_payflow_rbp_for_user($user_id = FALSE) { $user_id = (int) $user_id; $user_id = $user_id ? $user_id : get_current_user_id(); if (!$user_id) { return array(); } $user_subscr_id = get_user_option('s2member_subscr_id', $user_id); if (!$user_subscr_id) { return array(); } if (!class_exists('c_ws_plugin__s2member_pro_paypal_utilities')) { return array(); } if (is_array($payflow = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($user_subscr_id))) { return $payflow; } return array(); }
/** * Handles processing of Pro-Form checkouts. * * @package s2Member\PayPal * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after a custom URL redirection; or upon Express Checkout redirection. */ public static function paypal_checkout() { if (!empty($_POST["s2member_pro_paypal_checkout"]["nonce"]) && ($nonce = $_POST["s2member_pro_paypal_checkout"]["nonce"]) && wp_verify_nonce($nonce, "s2member-pro-paypal-checkout") || !empty($_GET["s2member_paypal_xco"]) && $_GET["s2member_paypal_xco"] === "s2member_pro_paypal_checkout_return" && !empty($_GET["token"]) && ($_GET["token"] = esc_html($_GET["token"])) && (empty($_GET["PayerID"]) || ($_GET["PayerID"] = esc_html($_GET["PayerID"]))) && ($xco_post_vars = get_transient("s2m_" . md5("s2member_transient_express_checkout_" . $_GET["token"])))) { $GLOBALS["ws_plugin__s2member_pro_paypal_checkout_response"] = array(); // This holds the global response details. $global_response =& $GLOBALS["ws_plugin__s2member_pro_paypal_checkout_response"]; // This is a shorter reference. if (!empty($xco_post_vars)) { // A customer is returning from Express Checkout @ PayPal? $_POST = $xco_post_vars; } // POST vars from submission prior to Express Checkout. $post_vars = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST["s2member_pro_paypal_checkout"])); $post_vars["attr"] = !empty($post_vars["attr"]) ? (array) unserialize(c_ws_plugin__s2member_utils_encryption::decrypt($post_vars["attr"])) : array(); $post_vars["attr"] = apply_filters("ws_plugin__s2member_pro_paypal_checkout_post_attr", $post_vars["attr"], get_defined_vars()); if (!empty($xco_post_vars)) { $post_vars["attr"]["captcha"] = "0"; } // No need to revalidate captcha in this case. $post_vars["name"] = trim($post_vars["first_name"] . " " . $post_vars["last_name"]); $post_vars["email"] = apply_filters("user_registration_email", sanitize_email(@$post_vars["email"]), get_defined_vars()); $post_vars["username"] = is_multisite() ? strtolower(@$post_vars["username"]) : @$post_vars["username"]; // Force lowercase. $post_vars["username"] = preg_replace("/\\s+/", "", sanitize_user($post_vars["_o_username"] = $post_vars["username"], is_multisite())); if (empty($post_vars["card_expiration"]) && isset($post_vars["card_expiration_month"], $post_vars["card_expiration_year"])) { $post_vars["card_expiration"] = $post_vars["card_expiration_month"] . "/" . $post_vars["card_expiration_year"]; } $post_vars["recaptcha_challenge_field"] = isset($_POST["recaptcha_challenge_field"]) ? trim(stripslashes($_POST["recaptcha_challenge_field"])) : ""; $post_vars["recaptcha_response_field"] = isset($_POST["recaptcha_response_field"]) ? trim(stripslashes($_POST["recaptcha_response_field"])) : ""; !empty($_GET["token"]) ? delete_transient("s2m_" . md5("s2member_transient_express_checkout_" . $_GET["token"])) : null; if (!c_ws_plugin__s2member_pro_paypal_responses::paypal_form_attr_validation_errors($post_vars["attr"])) { if (!($error = c_ws_plugin__s2member_pro_paypal_responses::paypal_form_submission_validation_errors("checkout", $post_vars))) { $cp_attr = c_ws_plugin__s2member_pro_paypal_utilities::paypal_apply_coupon($post_vars["attr"], $post_vars["coupon"], "attr", array("affiliates-silent-post")); $cp_2gbp_attr = c_ws_plugin__s2member_pro_paypal_utilities::paypal_maestro_solo_2gbp($cp_attr, $post_vars["card_type"]); $cost_calculations = c_ws_plugin__s2member_pro_paypal_utilities::paypal_cost($cp_2gbp_attr["ta"], $cp_2gbp_attr["ra"], $post_vars["state"], $post_vars["country"], $post_vars["zip"], $cp_2gbp_attr["cc"], $cp_2gbp_attr["desc"]); if ($cost_calculations["total"] <= 0 && $post_vars["attr"]["tp"] && $cost_calculations["trial_total"] > 0) { $post_vars["attr"]["tp"] = "0"; // Ditch the trial period completely. $cost_calculations["sub_total"] = $cost_calculations["trial_sub_total"]; // Use as regular sub-total (ditch trial sub-total). $cost_calculations["tax"] = $cost_calculations["trial_tax"]; // Use as regular tax (ditch trial tax). $cost_calculations["tax_per"] = $cost_calculations["trial_tax_per"]; // Use as regular tax (ditch trial tax). $cost_calculations["total"] = $cost_calculations["trial_total"]; // Use as regular total (ditch trial). $cost_calculations["trial_sub_total"] = "0.00"; // Ditch the initial total (using as grand total). $cost_calculations["trial_tax"] = "0.00"; // Ditch this calculation now also. $cost_calculations["trial_tax_per"] = ""; // Ditch this calculation now also. $cost_calculations["trial_total"] = "0.00"; // Ditch this calculation now also. } $use_recurring_profile = $post_vars["attr"]["rr"] === "BN" || !$post_vars["attr"]["tp"] && !$post_vars["attr"]["rr"] ? false : true; $is_independent_ccaps_sale = $post_vars["attr"]["level"] === "*" ? true : false; // Selling Independent Custom Capabilities? if ($use_recurring_profile && $cost_calculations["trial_total"] <= 0 && $cost_calculations["total"] <= 0) { if (!$post_vars["attr"]["rr"] && $post_vars["attr"]["rt"] !== "L") { if (substr_count($post_vars["attr"]["level_ccaps_eotper"], ":") === 1) { $post_vars["attr"]["level_ccaps_eotper"] .= ":" . $post_vars["attr"]["rp"] . " " . $post_vars["attr"]["rt"]; } else { if (substr_count($post_vars["attr"]["level_ccaps_eotper"], ":") === 0) { $post_vars["attr"]["level_ccaps_eotper"] .= "::" . $post_vars["attr"]["rp"] . " " . $post_vars["attr"]["rt"]; } } } else { if ($post_vars["attr"]["rr"] && $post_vars["attr"]["rrt"] && $post_vars["attr"]["rt"] !== "L") { if (substr_count($post_vars["attr"]["level_ccaps_eotper"], ":") === 1) { $post_vars["attr"]["level_ccaps_eotper"] .= ":" . $post_vars["attr"]["rp"] * $post_vars["attr"]["rrt"] . " " . $post_vars["attr"]["rt"]; } else { if (substr_count($post_vars["attr"]["level_ccaps_eotper"], ":") === 0) { $post_vars["attr"]["level_ccaps_eotper"] .= "::" . $post_vars["attr"]["rp"] * $post_vars["attr"]["rrt"] . " " . $post_vars["attr"]["rt"]; } } } } } if (empty($_GET["s2member_paypal_xco"]) && $post_vars["card_type"] === "PayPal" && ($cost_calculations["trial_total"] > 0 || $cost_calculations["total"] > 0)) { $return_url = $cancel_url = is_ssl() ? "https://" : "http://"; $return_url = $cancel_url = ($return_url = $cancel_url) . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; $return_url = $cancel_url = remove_query_arg(array("token", "PayerID", "s2p-option"), $return_url = $cancel_url); $return_url = add_query_arg("s2p-option", urlencode((string) @$_REQUEST["s2p-option"]), $return_url); $return_url = add_query_arg("s2member_paypal_xco", urlencode("s2member_pro_paypal_checkout_return"), $return_url); $cancel_url = add_query_arg("s2p-option", urlencode((string) @$_REQUEST["s2p-option"]), $cancel_url); $cancel_url = add_query_arg("s2member_paypal_xco", urlencode("s2member_pro_paypal_checkout_cancel"), $cancel_url); $user = is_user_logged_in() && is_object($user = wp_get_current_user()) && ($user_id = $user->ID) ? $user : false; $period1 = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1($post_vars["attr"]["tp"] . " " . $post_vars["attr"]["tt"]); $period3 = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period3($post_vars["attr"]["rp"] . " " . $post_vars["attr"]["rt"]); $start_time = $post_vars["attr"]["tp"] ? c_ws_plugin__s2member_pro_paypal_utilities::paypal_start_time($period1) : c_ws_plugin__s2member_pro_paypal_utilities::paypal_start_time($period3); // Or next billing cycle. $reference = $start_time . ":" . $period1 . ":" . $period3 . "~" . $_SERVER["HTTP_HOST"] . "~" . $post_vars["attr"]["level_ccaps_eotper"]; if (!($paypal_set_xco = array())) { if ($use_recurring_profile) { $paypal_set_xco["TRXTYPE"] = "A"; $paypal_set_xco["ACTION"] = "S"; $paypal_set_xco["TENDER"] = "P"; $paypal_set_xco["RETURNURL"] = $return_url; $paypal_set_xco["CANCELURL"] = $cancel_url; $paypal_set_xco["PAGESTYLE"] = $post_vars["attr"]["ps"]; $paypal_set_xco["LOCALECODE"] = $post_vars["attr"]["lc"]; $paypal_set_xco["NOSHIPPING"] = $post_vars["attr"]["ns"]; $paypal_set_xco["ALLOWNOTE"] = "0"; $paypal_set_xco["AMT"] = "0.00"; $paypal_set_xco["CURRENCY"] = $cost_calculations["cur"]; $paypal_set_xco["PAYMENTTYPE"] = "any"; $paypal_set_xco["INVNUM"] = $reference; $paypal_set_xco["BILLINGTYPE"] = "RecurringBilling"; // When this is present an amount of 0.00 is not allowed for whatever reason. // $paypal_set_xco["L_BILLINGTYPE0"] = "RecurringBilling"; $paypal_set_xco["ORDERDESC"] = $cost_calculations["desc"]; $paypal_set_xco["BA_DESC"] = $cost_calculations["desc"]; // This is required to get the description to show up during checkout; and in `mb_desc` via IPNs. $paypal_set_xco["L_BILLINGAGREEMENTDESCRIPTION0"] = $cost_calculations["desc"]; $paypal_set_xco["CUSTOM"] = $_SERVER["HTTP_HOST"]; $paypal_set_xco["BA_CUSTOM"] = $_SERVER["HTTP_HOST"]; $paypal_set_xco["L_BILLINGAGREEMENTCUSTOM0"] = $_SERVER["HTTP_HOST"]; $paypal_set_xco["ADDROVERRIDE"] = "1"; $paypal_set_xco["SHIPTONAME"] = $post_vars["name"]; $paypal_set_xco["SHIPTOSTREET"] = $post_vars["street"]; $paypal_set_xco["SHIPTOCITY"] = $post_vars["city"]; $paypal_set_xco["SHIPTOSTATE"] = $post_vars["state"]; $paypal_set_xco["SHIPTOCOUNTRY"] = $post_vars["country"]; $paypal_set_xco["SHIPTOZIP"] = $post_vars["zip"]; $paypal_set_xco["EMAIL"] = $user ? $user->user_email : $post_vars["email"]; if (($paypal_set_xco = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal_set_xco)) && empty($paypal_set_xco["__error"])) { set_transient("s2m_" . md5("s2member_transient_express_checkout_" . $paypal_set_xco["TOKEN"]), $_POST, 10800); $endpoint = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com"; wp_redirect(add_query_arg("token", urlencode($paypal_set_xco["TOKEN"]), "https://" . $endpoint . "/cgi-bin/webscr?cmd=_express-checkout")); exit; } else { $global_response = array("response" => $paypal_set_xco["__error"], "error" => true); } } else { $paypal_set_xco["METHOD"] = "SetExpressCheckout"; $paypal_set_xco["RETURNURL"] = $return_url; $paypal_set_xco["CANCELURL"] = $cancel_url; $paypal_set_xco["PAGESTYLE"] = $post_vars["attr"]["ps"]; $paypal_set_xco["LOCALECODE"] = $post_vars["attr"]["lc"]; $paypal_set_xco["NOSHIPPING"] = $post_vars["attr"]["ns"]; $paypal_set_xco["ALLOWNOTE"] = "0"; // No notes. $paypal_set_xco["PAYMENTREQUEST_0_PAYMENTACTION"] = "Sale"; $paypal_set_xco["MAXAMT"] = $cost_calculations["total"]; $paypal_set_xco["PAYMENTREQUEST_0_DESC"] = $cost_calculations["desc"]; $paypal_set_xco["PAYMENTREQUEST_0_CUSTOM"] = $post_vars["attr"]["custom"]; $paypal_set_xco["PAYMENTREQUEST_0_CURRENCYCODE"] = $cost_calculations["cur"]; $paypal_set_xco["PAYMENTREQUEST_0_ITEMAMT"] = $cost_calculations["sub_total"]; $paypal_set_xco["PAYMENTREQUEST_0_TAXAMT"] = $cost_calculations["tax"]; $paypal_set_xco["PAYMENTREQUEST_0_AMT"] = $cost_calculations["total"]; $paypal_set_xco["L_PAYMENTREQUEST_0_QTY0"] = "1"; // Always (1). $paypal_set_xco["L_PAYMENTREQUEST_0_NAME0"] = $cost_calculations["desc"]; $paypal_set_xco["L_PAYMENTREQUEST_0_NUMBER0"] = $post_vars["attr"]["level_ccaps_eotper"]; $paypal_set_xco["L_PAYMENTREQUEST_0_AMT0"] = $cost_calculations["sub_total"]; $paypal_set_xco["PAYMENTREQUEST_0_SHIPTONAME"] = $post_vars["name"]; $paypal_set_xco["PAYMENTREQUEST_0_SHIPTOSTREET"] = $post_vars["street"]; $paypal_set_xco["PAYMENTREQUEST_0_SHIPTOCITY"] = $post_vars["city"]; $paypal_set_xco["PAYMENTREQUEST_0_SHIPTOSTATE"] = $post_vars["state"]; $paypal_set_xco["PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE"] = $post_vars["country"]; $paypal_set_xco["PAYMENTREQUEST_0_SHIPTOZIP"] = $post_vars["zip"]; $paypal_set_xco["EMAIL"] = $user ? $user->user_email : $post_vars["email"]; if (($paypal_set_xco = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal_set_xco)) && empty($paypal_set_xco["__error"])) { set_transient("s2m_" . md5("s2member_transient_express_checkout_" . $paypal_set_xco["TOKEN"]), $_POST, 10800); $endpoint = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com"; wp_redirect(add_query_arg("token", urlencode($paypal_set_xco["TOKEN"]), "https://" . $endpoint . "/cgi-bin/webscr?cmd=_express-checkout")); exit; } else { $global_response = array("response" => $paypal_set_xco["__error"], "error" => true); } } } } else { if ($use_recurring_profile && is_user_logged_in() && is_object($user = wp_get_current_user()) && ($user_id = $user->ID)) { if ($old__subscr_id = get_user_option("s2member_subscr_id")) { $paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($old__subscr_id); } $old__baid = !empty($paypal) && !empty($paypal["BAID"]) ? $paypal["BAID"] : ""; $old__subscr_or_wp_id = c_ws_plugin__s2member_utils_users::get_user_subscr_or_wp_id(); $period1 = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1($post_vars["attr"]["tp"] . " " . $post_vars["attr"]["tt"]); $period3 = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period3($post_vars["attr"]["rp"] . " " . $post_vars["attr"]["rt"]); $start_time = $post_vars["attr"]["tp"] ? c_ws_plugin__s2member_pro_paypal_utilities::paypal_start_time($period1) : c_ws_plugin__s2member_pro_paypal_utilities::paypal_start_time($period3); // Or next billing cycle. $reference = $start_time . ":" . $period1 . ":" . $period3 . "~" . $_SERVER["HTTP_HOST"] . "~" . $post_vars["attr"]["level_ccaps_eotper"]; update_user_meta($user_id, "first_name", $post_vars["first_name"]) . update_user_meta($user_id, "last_name", $post_vars["last_name"]); if (!($paypal = array())) { $paypal["TRXTYPE"] = "R"; $paypal["ACTION"] = "A"; $paypal["EMAIL"] = $user->user_email; $paypal["FIRSTNAME"] = $post_vars["first_name"]; $paypal["LASTNAME"] = $post_vars["last_name"]; $paypal["CLIENTIP"] = $_SERVER["REMOTE_ADDR"]; $paypal["PROFILENAME"] = $reference; $paypal["DESC"] = $cost_calculations["desc"]; if (!$post_vars["attr"]["tp"] || $post_vars["attr"]["tp"] && $cost_calculations["trial_total"] > 0) { $paypal["OPTIONALTRX"] = "S"; $paypal["OPTIONALTRXAMT"] = $post_vars["attr"]["tp"] ? $cost_calculations["trial_total"] : $cost_calculations["total"]; $paypal["FAILEDOPTIONALTRXACTION"] = "CancelOnFailure"; $paypal["FAILEDINITAMTACTION"] = "CancelOnFailure"; } $paypal["CURRENCY"] = $cost_calculations["cur"]; $paypal["AMT"] = $cost_calculations["sub_total"]; $paypal["TAXAMT"] = $cost_calculations["tax"]; $paypal["MAXFAILPAYMENTS"] = $post_vars["attr"]["rra"]; $paypal["AUTOBILLOUTSTANDINGAMT"] = apply_filters("ws_plugin__s2member_pro_paypal_auto_bill_op", "AddToNextBilling", get_defined_vars()); $paypal["START"] = date("mdY", $start_time); $paypal["PAYPERIOD"] = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_term($post_vars["attr"]["rt"], $post_vars["attr"]["rp"]); $paypal["TERM"] = $post_vars["attr"]["rr"] ? $post_vars["attr"]["rrt"] ? $post_vars["attr"]["rrt"] : "0" : "1"; if (!empty($_GET["s2member_paypal_xco"]) && $_GET["s2member_paypal_xco"] === "s2member_pro_paypal_checkout_return" && !empty($_GET["token"]) && ($paypal_xco_details = array("TRXTYPE" => "A", "ACTION" => "G", "TENDER" => "P", "TOKEN" => $_GET["token"])) && ($paypal_xco_details = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal_xco_details)) && empty($paypal_xco_details["__error"]) && ($paypal_xco_bagree = array("TRXTYPE" => "A", "ACTION" => "X", "TENDER" => "P", "TOKEN" => $paypal_xco_details["TOKEN"])) && ($paypal_xco_bagree = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal_xco_bagree)) && empty($paypal_xco_bagree["__error"])) { $paypal["TENDER"] = "P"; $paypal["PAYERID"] = $paypal_xco_details["PAYERID"]; $paypal["BAID"] = $paypal_xco_bagree["BAID"]; } else { if ($_GET["s2member_paypal_xco"] !== "s2member_pro_paypal_checkout_return") { $paypal["TENDER"] = "C"; $paypal["ACCT"] = preg_replace("/[^0-9]/", "", $post_vars["card_number"]); if (preg_match("/^(?P<month>[0-9]{2})\\/[0-9]{2}(?P<year_suffix>[0-9]{2})\$/", $post_vars["card_expiration"], $_m)) { $paypal["EXPDATE"] = $_m["month"] . $_m["year_suffix"]; } $paypal["CVV2"] = $post_vars["card_verification"]; if (in_array($post_vars["card_type"], array("Maestro", "Solo"))) { if (preg_match("/^(?P<month>[0-9]{2})\\/[0-9]{2}(?P<year>[0-9]{2})\$/", $post_vars["card_start_date_issue_number"], $_m)) { $paypal["CARDSTART"] = $_m["month"] . $_m["year"]; } else { $paypal["CARDISSUE"] = $post_vars["card_start_date_issue_number"]; } unset($_m); } $paypal["STREET"] = $post_vars["street"]; $paypal["CITY"] = $post_vars["city"]; $paypal["STATE"] = $post_vars["state"]; $paypal["COUNTRY"] = $post_vars["country"]; $paypal["ZIP"] = $post_vars["zip"]; } } } if ($cost_calculations["trial_total"] <= 0 && $cost_calculations["total"] <= 0 || ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal)) && empty($paypal["__error"])) { if ($cost_calculations["trial_total"] <= 0 && $cost_calculations["total"] <= 0) { $new__subscr_id = strtoupper('free-' . uniqid()); } else { $new__subscr_id = $paypal["PROFILEID"]; } if (!($ipn = array())) { $ipn["txn_type"] = "subscr_signup"; $ipn["subscr_id"] = $new__subscr_id; if (!empty($paypal_xco_bagree["BAID"])) { $ipn["subscr_baid"] = $paypal_xco_bagree["BAID"]; } $ipn["custom"] = $post_vars["attr"]["custom"]; $ipn["txn_id"] = $new__subscr_id; $ipn["period1"] = $period1; $ipn["period3"] = $period3; $ipn["mc_amount1"] = $cost_calculations["trial_total"]; $ipn["mc_amount3"] = $cost_calculations["total"]; $ipn["mc_gross"] = preg_match("/^[1-9]/", $ipn["period1"]) ? $ipn["mc_amount1"] : $ipn["mc_amount3"]; $ipn["mc_currency"] = $cost_calculations["cur"]; $ipn["tax"] = $cost_calculations["tax"]; $ipn["recurring"] = $post_vars["attr"]["rr"] ? "1" : ""; $ipn["payer_email"] = $user->user_email; $ipn["first_name"] = $post_vars["first_name"]; $ipn["last_name"] = $post_vars["last_name"]; $ipn["option_name1"] = "Referencing Customer ID"; $ipn["option_selection1"] = $old__subscr_or_wp_id; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $_SERVER["REMOTE_ADDR"]; $ipn["item_name"] = $cost_calculations["desc"]; $ipn["item_number"] = $post_vars["attr"]["level_ccaps_eotper"]; $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_use"] .= $ipn["mc_gross"] > 0 ? ",subscr-signup-as-subscr-payment" : ""; $ipn["s2member_paypal_proxy_coupon"] = array("coupon_code" => $cp_attr["_coupon_code"], "full_coupon_code" => $cp_attr["_full_coupon_code"], "affiliate_id" => $cp_attr["_coupon_affiliate_id"]); $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); $ipn["s2member_paypal_proxy_return_url"] = $post_vars["attr"]["success"]; $ipn["s2member_paypal_proxy_return_url"] = trim(c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20))); } if ($old__subscr_id && apply_filters("s2member_pro_cancels_old_rp_before_new_rp", TRUE, get_defined_vars())) { c_ws_plugin__s2member_pro_paypal_utilities::payflow_cancel_profile($old__subscr_id, $old__baid); } c_ws_plugin__s2member_list_servers::process_list_servers_against_current_user((bool) @$post_vars["custom_fields"]["opt_in"], TRUE, TRUE); setcookie("s2member_tracking", $s2member_tracking = c_ws_plugin__s2member_utils_encryption::encrypt($new__subscr_id), time() + 31556926, COOKIEPATH, COOKIE_DOMAIN) . setcookie("s2member_tracking", $s2member_tracking, time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN) . ($_COOKIE["s2member_tracking"] = $s2member_tracking); $global_response = array("response" => sprintf(_x('<strong>Thank you.</strong> Your account has been updated.<br />— Please <a href="%s" rel="nofollow">log back in</a> now.', "s2member-front", "s2member"), esc_attr(wp_login_url()))); if ($post_vars["attr"]["success"] && substr($ipn["s2member_paypal_proxy_return_url"], 0, 2) === substr($post_vars["attr"]["success"], 0, 2) && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $ipn["s2member_paypal_proxy_return_url"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { $global_response = array("response" => $paypal["__error"], "error" => true); } } else { if ($use_recurring_profile && !is_user_logged_in()) { $period1 = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1($post_vars["attr"]["tp"] . " " . $post_vars["attr"]["tt"]); $period3 = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period3($post_vars["attr"]["rp"] . " " . $post_vars["attr"]["rt"]); $start_time = $post_vars["attr"]["tp"] ? c_ws_plugin__s2member_pro_paypal_utilities::paypal_start_time($period1) : c_ws_plugin__s2member_pro_paypal_utilities::paypal_start_time($period3); // Or next billing cycle. $reference = $start_time . ":" . $period1 . ":" . $period3 . "~" . $_SERVER["HTTP_HOST"] . "~" . $post_vars["attr"]["level_ccaps_eotper"]; if (!($paypal = array())) { $paypal["TRXTYPE"] = "R"; $paypal["ACTION"] = "A"; $paypal["EMAIL"] = $post_vars["email"]; $paypal["FIRSTNAME"] = $post_vars["first_name"]; $paypal["LASTNAME"] = $post_vars["last_name"]; $paypal["CLIENTIP"] = $_SERVER["REMOTE_ADDR"]; $paypal["PROFILENAME"] = $reference; $paypal["DESC"] = $cost_calculations["desc"]; if (!$post_vars["attr"]["tp"] || $post_vars["attr"]["tp"] && $cost_calculations["trial_total"] > 0) { $paypal["OPTIONALTRX"] = "S"; $paypal["OPTIONALTRXAMT"] = $post_vars["attr"]["tp"] ? $cost_calculations["trial_total"] : $cost_calculations["total"]; $paypal["FAILEDOPTIONALTRXACTION"] = "CancelOnFailure"; $paypal["FAILEDINITAMTACTION"] = "CancelOnFailure"; } $paypal["CURRENCY"] = $cost_calculations["cur"]; $paypal["AMT"] = $cost_calculations["sub_total"]; $paypal["TAXAMT"] = $cost_calculations["tax"]; $paypal["MAXFAILPAYMENTS"] = $post_vars["attr"]["rra"]; $paypal["AUTOBILLOUTSTANDINGAMT"] = apply_filters("ws_plugin__s2member_pro_paypal_auto_bill_op", "AddToNextBilling", get_defined_vars()); $paypal["START"] = date("mdY", $start_time); $paypal["PAYPERIOD"] = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_term($post_vars["attr"]["rt"], $post_vars["attr"]["rp"]); $paypal["TERM"] = $post_vars["attr"]["rr"] ? $post_vars["attr"]["rrt"] ? $post_vars["attr"]["rrt"] : "0" : "1"; if (!empty($_GET["s2member_paypal_xco"]) && $_GET["s2member_paypal_xco"] === "s2member_pro_paypal_checkout_return" && !empty($_GET["token"]) && ($paypal_xco_details = array("TRXTYPE" => "A", "ACTION" => "G", "TENDER" => "P", "TOKEN" => $_GET["token"])) && ($paypal_xco_details = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal_xco_details)) && empty($paypal_xco_details["__error"]) && ($paypal_xco_bagree = array("TRXTYPE" => "A", "ACTION" => "X", "TENDER" => "P", "TOKEN" => $paypal_xco_details["TOKEN"])) && ($paypal_xco_bagree = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal_xco_bagree)) && empty($paypal_xco_bagree["__error"])) { $paypal["TENDER"] = "P"; $paypal["PAYERID"] = $paypal_xco_details["PAYERID"]; $paypal["BAID"] = $paypal_xco_bagree["BAID"]; } else { if (empty($_GET["s2member_paypal_xco"]) || $_GET["s2member_paypal_xco"] !== "s2member_pro_paypal_checkout_return") { $paypal["TENDER"] = "C"; $paypal["ACCT"] = preg_replace("/[^0-9]/", "", $post_vars["card_number"]); if (preg_match("/^(?P<month>[0-9]{2})\\/[0-9]{2}(?P<year_suffix>[0-9]{2})\$/", $post_vars["card_expiration"], $_m)) { $paypal["EXPDATE"] = $_m["month"] . $_m["year_suffix"]; } $paypal["CVV2"] = $post_vars["card_verification"]; if (in_array($post_vars["card_type"], array("Maestro", "Solo"))) { if (preg_match("/^(?P<month>[0-9]{2})\\/[0-9]{2}(?P<year>[0-9]{2})\$/", $post_vars["card_start_date_issue_number"], $_m)) { $paypal["CARDSTART"] = $_m["month"] . $_m["year"]; } else { $paypal["CARDISSUE"] = $post_vars["card_start_date_issue_number"]; } unset($_m); } $paypal["STREET"] = $post_vars["street"]; $paypal["CITY"] = $post_vars["city"]; $paypal["STATE"] = $post_vars["state"]; $paypal["COUNTRY"] = $post_vars["country"]; $paypal["ZIP"] = $post_vars["zip"]; } } } if ($cost_calculations["trial_total"] <= 0 && $cost_calculations["total"] <= 0 || ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal)) && empty($paypal["__error"])) { if ($cost_calculations["trial_total"] <= 0 && $cost_calculations["total"] <= 0) { $new__subscr_id = strtoupper('free-' . uniqid()); } else { $new__subscr_id = $paypal["PROFILEID"]; } if (!($ipn = array())) { $ipn["txn_type"] = "subscr_signup"; $ipn["subscr_id"] = $new__subscr_id; if (!empty($paypal_xco_bagree["BAID"])) { $ipn["subscr_baid"] = $paypal_xco_bagree["BAID"]; } $ipn["custom"] = $post_vars["attr"]["custom"]; $ipn["txn_id"] = $new__subscr_id; $ipn["period1"] = $period1; $ipn["period3"] = $period3; $ipn["mc_amount1"] = $cost_calculations["trial_total"]; $ipn["mc_amount3"] = $cost_calculations["total"]; $ipn["mc_gross"] = preg_match("/^[1-9]/", $ipn["period1"]) ? $ipn["mc_amount1"] : $ipn["mc_amount3"]; $ipn["mc_currency"] = $cost_calculations["cur"]; $ipn["tax"] = $cost_calculations["tax"]; $ipn["recurring"] = $post_vars["attr"]["rr"] ? "1" : ""; $ipn["payer_email"] = $post_vars["email"]; $ipn["first_name"] = $post_vars["first_name"]; $ipn["last_name"] = $post_vars["last_name"]; $ipn["option_name1"] = "Originating Domain"; $ipn["option_selection1"] = $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $_SERVER["REMOTE_ADDR"]; $ipn["item_name"] = $cost_calculations["desc"]; $ipn["item_number"] = $post_vars["attr"]["level_ccaps_eotper"]; $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_use"] .= $ipn["mc_gross"] > 0 ? ",subscr-signup-as-subscr-payment" : ""; $ipn["s2member_paypal_proxy_coupon"] = array("coupon_code" => $cp_attr["_coupon_code"], "full_coupon_code" => $cp_attr["_full_coupon_code"], "affiliate_id" => $cp_attr["_coupon_affiliate_id"]); $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); $ipn["s2member_paypal_proxy_return_url"] = $post_vars["attr"]["success"]; } if (!($create_user = array())) { $_POST["ws_plugin__s2member_custom_reg_field_user_pass1"] = $post_vars["password1"]; // Fake this for registration configuration. $_POST["ws_plugin__s2member_custom_reg_field_first_name"] = $post_vars["first_name"]; // Fake this for registration configuration. $_POST["ws_plugin__s2member_custom_reg_field_last_name"] = $post_vars["last_name"]; // Fake this for registration configuration. $_POST["ws_plugin__s2member_custom_reg_field_opt_in"] = @$post_vars["custom_fields"]["opt_in"]; // Fake this too. if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) { foreach (json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field) { $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"])); $field_id_class = preg_replace("/_/", "-", $field_var); if (isset($post_vars["custom_fields"][$field_var])) { $_POST["ws_plugin__s2member_custom_reg_field_" . $field_var] = $post_vars["custom_fields"][$field_var]; } } } if (!empty($paypal_xco_bagree["BAID"])) { // For registration configuration. $GLOBALS["ws_plugin__s2member_registration_vars"]["ws_plugin__s2member_custom_reg_field_s2member_subscr_baid"] = $paypal_xco_bagree["BAID"]; } $_COOKIE["s2member_subscr_gateway"] = c_ws_plugin__s2member_utils_encryption::encrypt("paypal"); // Fake this for registration configuration. $_COOKIE["s2member_subscr_id"] = c_ws_plugin__s2member_utils_encryption::encrypt($new__subscr_id); // Fake this for registration configuration. $_COOKIE["s2member_custom"] = c_ws_plugin__s2member_utils_encryption::encrypt($post_vars["attr"]["custom"]); // Fake this for registration configuration. $_COOKIE["s2member_item_number"] = c_ws_plugin__s2member_utils_encryption::encrypt($post_vars["attr"]["level_ccaps_eotper"]); // Fake this too. $create_user["user_login"] = $post_vars["username"]; // Copy this into a separate array for `wp_create_user()`. $create_user["user_pass"] = wp_generate_password(); // Which may fire `c_ws_plugin__s2member_registrations::generate_password()`. $create_user["user_email"] = $post_vars["email"]; // Copy this into a separate array for `wp_create_user()`. } if ($post_vars["password1"] && $post_vars["password1"] === $create_user["user_pass"]) { if ((is_multisite() && ($new__user_id = c_ws_plugin__s2member_registrations::ms_create_existing_user($create_user["user_login"], $create_user["user_email"], $create_user["user_pass"])) || ($new__user_id = wp_create_user($create_user["user_login"], $create_user["user_pass"], $create_user["user_email"]))) && !is_wp_error($new__user_id)) { wp_new_user_notification($new__user_id, $create_user["user_pass"]); $ipn["s2member_paypal_proxy_return_url"] = trim(c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20))); $global_response = array("response" => sprintf(_x('<strong>Thank you.</strong> Your account has been approved.<br />— Please <a href="%s" rel="nofollow">login</a>.', "s2member-front", "s2member"), esc_attr(wp_login_url()))); if ($post_vars["attr"]["success"] && substr($ipn["s2member_paypal_proxy_return_url"], 0, 2) === substr($post_vars["attr"]["success"], 0, 2) && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $ipn["s2member_paypal_proxy_return_url"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); $global_response = array("response" => _x('<strong>Oops.</strong> A slight problem. Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } else { if ((is_multisite() && ($new__user_id = c_ws_plugin__s2member_registrations::ms_create_existing_user($create_user["user_login"], $create_user["user_email"], $create_user["user_pass"])) || ($new__user_id = wp_create_user($create_user["user_login"], $create_user["user_pass"], $create_user["user_email"]))) && !is_wp_error($new__user_id)) { update_user_option($new__user_id, "default_password_nag", true, true); // Password nag. wp_new_user_notification($new__user_id, $create_user["user_pass"]); $ipn["s2member_paypal_proxy_return_url"] = trim(c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20))); $global_response = array("response" => _x('<strong>Thank you.</strong> Your account has been approved.<br />— You\'ll receive an email momentarily.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && substr($ipn["s2member_paypal_proxy_return_url"], 0, 2) === substr($post_vars["attr"]["success"], 0, 2) && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $ipn["s2member_paypal_proxy_return_url"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); $global_response = array("response" => _x('<strong>Oops.</strong> A slight problem. Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } } else { $global_response = array("response" => $paypal["__error"], "error" => true); } } else { if (!$use_recurring_profile && is_user_logged_in() && is_object($user = wp_get_current_user()) && ($user_id = $user->ID)) { if ($old__subscr_id = get_user_option("s2member_subscr_id")) { $paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($old__subscr_id); } $old__baid = !empty($paypal) && !empty($paypal["BAID"]) ? $paypal["BAID"] : ""; $old__subscr_or_wp_id = c_ws_plugin__s2member_utils_users::get_user_subscr_or_wp_id(); update_user_meta($user_id, "first_name", $post_vars["first_name"]) . update_user_meta($user_id, "last_name", $post_vars["last_name"]); if (!($paypal = array())) { if (!empty($_GET["s2member_paypal_xco"]) && $_GET["s2member_paypal_xco"] === "s2member_pro_paypal_checkout_return" && !empty($_GET["token"]) && ($paypal_xco_details = array("METHOD" => "GetExpressCheckoutDetails", "TOKEN" => $_GET["token"])) && ($paypal_xco_details = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal_xco_details)) && empty($paypal_xco_details["__error"])) { $paypal["METHOD"] = "DoExpressCheckoutPayment"; $paypal["TOKEN"] = $paypal_xco_details["TOKEN"]; $paypal["PAYERID"] = $paypal_xco_details["PAYERID"]; $paypal["PAYMENTREQUEST_0_PAYMENTACTION"] = "Sale"; $paypal["PAYMENTREQUEST_0_DESC"] = $cost_calculations["desc"]; $paypal["PAYMENTREQUEST_0_CUSTOM"] = $post_vars["attr"]["custom"]; $paypal["PAYMENTREQUEST_0_CURRENCYCODE"] = $cost_calculations["cur"]; $paypal["PAYMENTREQUEST_0_ITEMAMT"] = $cost_calculations["sub_total"]; $paypal["PAYMENTREQUEST_0_TAXAMT"] = $cost_calculations["tax"]; $paypal["PAYMENTREQUEST_0_AMT"] = $cost_calculations["total"]; $paypal["L_PAYMENTREQUEST_0_QTY0"] = "1"; // Always (1). $paypal["L_PAYMENTREQUEST_0_NAME0"] = $cost_calculations["desc"]; $paypal["L_PAYMENTREQUEST_0_NUMBER0"] = $post_vars["attr"]["level_ccaps_eotper"]; $paypal["L_PAYMENTREQUEST_0_AMT0"] = $cost_calculations["sub_total"]; } else { $paypal["METHOD"] = "DoDirectPayment"; $paypal["PAYMENTACTION"] = "Sale"; $paypal["EMAIL"] = $user->user_email; $paypal["FIRSTNAME"] = $post_vars["first_name"]; $paypal["LASTNAME"] = $post_vars["last_name"]; $paypal["IPADDRESS"] = $_SERVER["REMOTE_ADDR"]; $paypal["DESC"] = $cost_calculations["desc"]; $paypal["CUSTOM"] = $post_vars["attr"]["custom"]; $paypal["CURRENCYCODE"] = $cost_calculations["cur"]; $paypal["ITEMAMT"] = $cost_calculations["sub_total"]; $paypal["TAXAMT"] = $cost_calculations["tax"]; $paypal["AMT"] = $cost_calculations["total"]; $paypal["L_QTY0"] = "1"; // Always (1). $paypal["L_NAME0"] = $cost_calculations["desc"]; $paypal["L_NUMBER0"] = $post_vars["attr"]["level_ccaps_eotper"]; $paypal["L_AMT0"] = $cost_calculations["sub_total"]; $paypal["CREDITCARDTYPE"] = $post_vars["card_type"]; $paypal["ACCT"] = preg_replace("/[^0-9]/", "", $post_vars["card_number"]); $paypal["EXPDATE"] = preg_replace("/[^0-9]/", "", $post_vars["card_expiration"]); $paypal["CVV2"] = $post_vars["card_verification"]; if (in_array($post_vars["card_type"], array("Maestro", "Solo"))) { if (preg_match("/^[0-9]{2}\\/[0-9]{4}\$/", $post_vars["card_start_date_issue_number"])) { $paypal["STARTDATE"] = preg_replace("/[^0-9]/", "", $post_vars["card_start_date_issue_number"]); } else { // Otherwise, we assume they provided an Issue Number instead. $paypal["ISSUENUMBER"] = $post_vars["card_start_date_issue_number"]; } } $paypal["STREET"] = $post_vars["street"]; $paypal["CITY"] = $post_vars["city"]; $paypal["STATE"] = $post_vars["state"]; $paypal["COUNTRYCODE"] = $post_vars["country"]; $paypal["ZIP"] = $post_vars["zip"]; } } if ($cost_calculations["total"] <= 0 || ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal)) && empty($paypal["__error"])) { if ($cost_calculations["total"] <= 0) { $new__subscr_id = $new__txn_id = strtoupper('free-' . uniqid()); } else { $new__subscr_id = $new__txn_id = !empty($paypal["PAYMENTINFO_0_TRANSACTIONID"]) ? $paypal["PAYMENTINFO_0_TRANSACTIONID"] : false; $new__subscr_id = $new__txn_id = !$new__subscr_id && !empty($paypal["TRANSACTIONID"]) ? $paypal["TRANSACTIONID"] : $new__subscr_id; } if (!($ipn = array())) { $ipn["txn_type"] = "web_accept"; $ipn["txn_id"] = $new__subscr_id; $ipn["custom"] = $post_vars["attr"]["custom"]; $ipn["mc_gross"] = $cost_calculations["total"]; $ipn["mc_currency"] = $cost_calculations["cur"]; $ipn["tax"] = $cost_calculations["tax"]; $ipn["payer_email"] = $user->user_email; $ipn["first_name"] = $post_vars["first_name"]; $ipn["last_name"] = $post_vars["last_name"]; $ipn["option_name1"] = "Referencing Customer ID"; $ipn["option_selection1"] = $old__subscr_or_wp_id; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $_SERVER["REMOTE_ADDR"]; $ipn["item_name"] = $cost_calculations["desc"]; $ipn["item_number"] = $post_vars["attr"]["level_ccaps_eotper"]; $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_coupon"] = array("coupon_code" => $cp_attr["_coupon_code"], "full_coupon_code" => $cp_attr["_full_coupon_code"], "affiliate_id" => $cp_attr["_coupon_affiliate_id"]); $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); $ipn["s2member_paypal_proxy_return_url"] = $post_vars["attr"]["success"]; $ipn["s2member_paypal_proxy_return_url"] = trim(c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20))); } if (!$is_independent_ccaps_sale && $old__subscr_id && apply_filters("s2member_pro_cancels_old_rp_before_new_rp", TRUE, get_defined_vars())) { c_ws_plugin__s2member_pro_paypal_utilities::payflow_cancel_profile($old__subscr_id, $old__baid); } c_ws_plugin__s2member_list_servers::process_list_servers_against_current_user((bool) @$post_vars["custom_fields"]["opt_in"], TRUE, TRUE); setcookie("s2member_tracking", $s2member_tracking = c_ws_plugin__s2member_utils_encryption::encrypt($new__subscr_id), time() + 31556926, COOKIEPATH, COOKIE_DOMAIN) . setcookie("s2member_tracking", $s2member_tracking, time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN) . ($_COOKIE["s2member_tracking"] = $s2member_tracking); $global_response = array("response" => sprintf(_x('<strong>Thank you.</strong> Your account has been updated.<br />— Please <a href="%s" rel="nofollow">log back in</a> now.', "s2member-front", "s2member"), esc_attr(wp_login_url()))); if ($post_vars["attr"]["success"] && substr($ipn["s2member_paypal_proxy_return_url"], 0, 2) === substr($post_vars["attr"]["success"], 0, 2) && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $ipn["s2member_paypal_proxy_return_url"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { $global_response = array("response" => $paypal["__error"], "error" => true); } } else { if (!$use_recurring_profile && !is_user_logged_in()) { if (!($paypal = array())) { if (!empty($_GET["s2member_paypal_xco"]) && $_GET["s2member_paypal_xco"] === "s2member_pro_paypal_checkout_return" && !empty($_GET["token"]) && ($paypal_xco_details = array("METHOD" => "GetExpressCheckoutDetails", "TOKEN" => $_GET["token"])) && ($paypal_xco_details = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal_xco_details)) && empty($paypal_xco_details["__error"])) { $paypal["METHOD"] = "DoExpressCheckoutPayment"; $paypal["TOKEN"] = $paypal_xco_details["TOKEN"]; $paypal["PAYERID"] = $paypal_xco_details["PAYERID"]; $paypal["PAYMENTREQUEST_0_PAYMENTACTION"] = "Sale"; $paypal["PAYMENTREQUEST_0_DESC"] = $cost_calculations["desc"]; $paypal["PAYMENTREQUEST_0_CUSTOM"] = $post_vars["attr"]["custom"]; $paypal["PAYMENTREQUEST_0_CURRENCYCODE"] = $cost_calculations["cur"]; $paypal["PAYMENTREQUEST_0_ITEMAMT"] = $cost_calculations["sub_total"]; $paypal["PAYMENTREQUEST_0_TAXAMT"] = $cost_calculations["tax"]; $paypal["PAYMENTREQUEST_0_AMT"] = $cost_calculations["total"]; $paypal["L_PAYMENTREQUEST_0_QTY0"] = "1"; // Always (1). $paypal["L_PAYMENTREQUEST_0_NAME0"] = $cost_calculations["desc"]; $paypal["L_PAYMENTREQUEST_0_NUMBER0"] = $post_vars["attr"]["level_ccaps_eotper"]; $paypal["L_PAYMENTREQUEST_0_AMT0"] = $cost_calculations["sub_total"]; } else { $paypal["METHOD"] = "DoDirectPayment"; $paypal["PAYMENTACTION"] = "Sale"; $paypal["EMAIL"] = $post_vars["email"]; $paypal["FIRSTNAME"] = $post_vars["first_name"]; $paypal["LASTNAME"] = $post_vars["last_name"]; $paypal["IPADDRESS"] = $_SERVER["REMOTE_ADDR"]; $paypal["DESC"] = $cost_calculations["desc"]; $paypal["CUSTOM"] = $post_vars["attr"]["custom"]; $paypal["CURRENCYCODE"] = $cost_calculations["cur"]; $paypal["ITEMAMT"] = $cost_calculations["sub_total"]; $paypal["TAXAMT"] = $cost_calculations["tax"]; $paypal["AMT"] = $cost_calculations["total"]; $paypal["L_QTY0"] = "1"; // Always (1). $paypal["L_NAME0"] = $cost_calculations["desc"]; $paypal["L_NUMBER0"] = $post_vars["attr"]["level_ccaps_eotper"]; $paypal["L_AMT0"] = $cost_calculations["sub_total"]; $paypal["CREDITCARDTYPE"] = $post_vars["card_type"]; $paypal["ACCT"] = preg_replace("/[^0-9]/", "", $post_vars["card_number"]); $paypal["EXPDATE"] = preg_replace("/[^0-9]/", "", $post_vars["card_expiration"]); $paypal["CVV2"] = $post_vars["card_verification"]; if (in_array($post_vars["card_type"], array("Maestro", "Solo"))) { if (preg_match("/^[0-9]{2}\\/[0-9]{4}\$/", $post_vars["card_start_date_issue_number"])) { $paypal["STARTDATE"] = preg_replace("/[^0-9]/", "", $post_vars["card_start_date_issue_number"]); } else { // Otherwise, we assume they provided an Issue Number instead. $paypal["ISSUENUMBER"] = $post_vars["card_start_date_issue_number"]; } } $paypal["STREET"] = $post_vars["street"]; $paypal["CITY"] = $post_vars["city"]; $paypal["STATE"] = $post_vars["state"]; $paypal["COUNTRYCODE"] = $post_vars["country"]; $paypal["ZIP"] = $post_vars["zip"]; } } if ($cost_calculations["total"] <= 0 || ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($paypal)) && empty($paypal["__error"])) { if ($cost_calculations["total"] <= 0) { $new__subscr_id = $new__txn_id = strtoupper('free-' . uniqid()); } else { $new__subscr_id = $new__txn_id = !empty($paypal["PAYMENTINFO_0_TRANSACTIONID"]) ? $paypal["PAYMENTINFO_0_TRANSACTIONID"] : false; $new__subscr_id = $new__txn_id = !$new__subscr_id && !empty($paypal["TRANSACTIONID"]) ? $paypal["TRANSACTIONID"] : $new__subscr_id; } if (!($ipn = array())) { $ipn["txn_type"] = "web_accept"; $ipn["txn_id"] = $new__subscr_id; $ipn["custom"] = $post_vars["attr"]["custom"]; $ipn["mc_gross"] = $cost_calculations["total"]; $ipn["mc_currency"] = $cost_calculations["cur"]; $ipn["tax"] = $cost_calculations["tax"]; $ipn["payer_email"] = $post_vars["email"]; $ipn["first_name"] = $post_vars["first_name"]; $ipn["last_name"] = $post_vars["last_name"]; $ipn["option_name1"] = "Originating Domain"; $ipn["option_selection1"] = $_SERVER["HTTP_HOST"]; $ipn["option_name2"] = "Customer IP Address"; $ipn["option_selection2"] = $_SERVER["REMOTE_ADDR"]; $ipn["item_name"] = $cost_calculations["desc"]; $ipn["item_number"] = $post_vars["attr"]["level_ccaps_eotper"]; $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_coupon"] = array("coupon_code" => $cp_attr["_coupon_code"], "full_coupon_code" => $cp_attr["_full_coupon_code"], "affiliate_id" => $cp_attr["_coupon_affiliate_id"]); $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); $ipn["s2member_paypal_proxy_return_url"] = $post_vars["attr"]["success"]; } if (!($create_user = array())) { $_POST["ws_plugin__s2member_custom_reg_field_user_pass1"] = $post_vars["password1"]; // Fake this for registration configuration. $_POST["ws_plugin__s2member_custom_reg_field_first_name"] = $post_vars["first_name"]; // Fake this for registration configuration. $_POST["ws_plugin__s2member_custom_reg_field_last_name"] = $post_vars["last_name"]; // Fake this for registration configuration. $_POST["ws_plugin__s2member_custom_reg_field_opt_in"] = @$post_vars["custom_fields"]["opt_in"]; // Fake this too. if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) { foreach (json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field) { $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"])); $field_id_class = preg_replace("/_/", "-", $field_var); if (isset($post_vars["custom_fields"][$field_var])) { $_POST["ws_plugin__s2member_custom_reg_field_" . $field_var] = $post_vars["custom_fields"][$field_var]; } } } $_COOKIE["s2member_subscr_gateway"] = c_ws_plugin__s2member_utils_encryption::encrypt("paypal"); // Fake this for registration configuration. $_COOKIE["s2member_subscr_id"] = c_ws_plugin__s2member_utils_encryption::encrypt($new__subscr_id); // Fake this for registration configuration. $_COOKIE["s2member_custom"] = c_ws_plugin__s2member_utils_encryption::encrypt($post_vars["attr"]["custom"]); // Fake this for registration configuration. $_COOKIE["s2member_item_number"] = c_ws_plugin__s2member_utils_encryption::encrypt($post_vars["attr"]["level_ccaps_eotper"]); // Fake this too. $create_user["user_login"] = $post_vars["username"]; // Copy this into a separate array for `wp_create_user()`. $create_user["user_pass"] = wp_generate_password(); // Which may fire `c_ws_plugin__s2member_registrations::generate_password()`. $create_user["user_email"] = $post_vars["email"]; // Copy this into a separate array for `wp_create_user()`. } if ($post_vars["password1"] && $post_vars["password1"] === $create_user["user_pass"]) { if ((is_multisite() && ($new__user_id = c_ws_plugin__s2member_registrations::ms_create_existing_user($create_user["user_login"], $create_user["user_email"], $create_user["user_pass"])) || ($new__user_id = wp_create_user($create_user["user_login"], $create_user["user_pass"], $create_user["user_email"]))) && !is_wp_error($new__user_id)) { wp_new_user_notification($new__user_id, $create_user["user_pass"]); $ipn["s2member_paypal_proxy_return_url"] = trim(c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20))); $global_response = array("response" => sprintf(_x('<strong>Thank you.</strong> Your account has been approved.<br />— Please <a href="%s" rel="nofollow">login</a>.', "s2member-front", "s2member"), esc_attr(wp_login_url()))); if ($post_vars["attr"]["success"] && substr($ipn["s2member_paypal_proxy_return_url"], 0, 2) === substr($post_vars["attr"]["success"], 0, 2) && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $ipn["s2member_paypal_proxy_return_url"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); $global_response = array("response" => _x('<strong>Oops.</strong> A slight problem. Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } else { if ((is_multisite() && ($new__user_id = c_ws_plugin__s2member_registrations::ms_create_existing_user($create_user["user_login"], $create_user["user_email"], $create_user["user_pass"])) || ($new__user_id = wp_create_user($create_user["user_login"], $create_user["user_pass"], $create_user["user_email"]))) && !is_wp_error($new__user_id)) { update_user_option($new__user_id, "default_password_nag", true, true); // Password nag. wp_new_user_notification($new__user_id, $create_user["user_pass"]); $ipn["s2member_paypal_proxy_return_url"] = trim(c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20))); $global_response = array("response" => _x('<strong>Thank you.</strong> Your account has been approved.<br />— You\'ll receive an email momentarily.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && substr($ipn["s2member_paypal_proxy_return_url"], 0, 2) === substr($post_vars["attr"]["success"], 0, 2) && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $ipn["s2member_paypal_proxy_return_url"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { c_ws_plugin__s2member_utils_urls::remote(home_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); $global_response = array("response" => _x('<strong>Oops.</strong> A slight problem. Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } } else { $global_response = array("response" => $paypal["__error"], "error" => true); } } else { $global_response = array("response" => _x('<strong>Unknown error.</strong> Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } } } } } else { $global_response = $error; } } } }
/** * Auto EOT time, else NPR (next payment time). * * @package s2Member\Utilities * @since 150713 * * @param int|string $user_id Optional. Defaults to the current User's ID. * @param bool $check_gateway Defaults to a true value. If this is false, it is only possible to return a fixed EOT time. * In other words, if this is false and there is no EOT time, empty values will be returned. Be careful with this, because not checking * the payment gateway can result in an inaccurate return value. Only set to false if you want to limit the check to a fixed hard-coded EOT time. * @param string $favor Defaults to a value of `fixed`; i.e., if a fixed EOT time is available, that is returned in favor of a next payment time. * You can set this to `next` if you'd like to favor a next payment time (when applicable) instead of returning a fixed EOT time. * * @return array An associative array of EOT details; with the following elements. * * - `type` One of `fixed` (a fixed EOT time), `next` (next payment time; i.e., an ongoing recurring subscription); or an empty string if there is no EOT for the user. * - `time` The timestamp (UTC time) that represents the EOT (End Of Term); else `0` if there is no EOT time. * - `tense` If time is now (or earlier) this will be `past`. If time is in the future, this will be `future`. If there is no time, this is an empty string. * - `debug` A string of details that explain to a developer what was returned. For debugging only. */ public static function get_user_eot($user_id = 0, $check_gateway = TRUE, $favor = 'fixed') { if (!($user_id = (int) $user_id)) { // Empty user ID in this call? $user_id = get_current_user_id(); } // Assume current user. if (!$favor || !in_array($favor, array('fixed', 'next'), TRUE)) { $favor = 'fixed'; } // Default behavior. $now = time(); // Current timestamp. $grace_time = (int) $GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_grace_time']; $grace_time = (int) apply_filters('ws_plugin__s2member_eot_grace_time', $grace_time); $demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role('subscriber'); $empty_response = array('type' => '', 'time' => 0, 'tense' => '', 'debug' => ''); if (!$user_id || !($user = new WP_User($user_id)) || !$user->ID) { return array_merge($empty_response, array('debug' => 'Invalid user ID.')); } $ipn_signup_vars = self::get_user_ipn_signup_vars($user->ID); $subscr_gateway = (string) get_user_option('s2member_subscr_gateway', $user->ID); $subscr_id = (string) get_user_option('s2member_subscr_id', $user->ID); $subscr_cid = (string) get_user_option('s2member_subscr_cid', $user->ID); $last_auto_eot_time = (int) get_user_option('s2member_last_auto_eot_time', $user->ID); $auto_eot_time = (int) get_user_option('s2member_auto_eot_time', $user->ID); if ($auto_eot_time) { // They have a hard-coded EOT time at present? return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is a fixed EOT time recorded by s2Member. It can be altered in the WordPress Dashboard for this user.'); } if (!$subscr_gateway && !$subscr_id && !$subscr_cid && $last_auto_eot_time && (!user_can($user->ID, 'access_s2member_level1') || c_ws_plugin__s2member_user_access::user_access_role($user) === $demotion_role) && !c_ws_plugin__s2member_user_access::user_access_ccaps($user)) { return array('type' => 'fixed', 'time' => $last_auto_eot_time, 'tense' => $last_auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is an archived/fixed EOT time recorded by s2Member; i.e., the date this customer\'s access expired.'); } if (!$subscr_gateway || !$subscr_id || !is_array($ipn_signup_vars) || !$ipn_signup_vars) { return array_merge($empty_response, array('debug' => 'This user has no subscription; i.e., missing `subscr_id`, `subscr_gateway` or `ipn_signup_vars`.')); } if (empty($ipn_signup_vars['txn_type']) || $ipn_signup_vars['txn_type'] !== 'subscr_signup') { return array_merge($empty_response, array('debug' => 'This user has no subscription; i.e., `txn_type` != `subscr_signup`.')); } $auto_eot_time = c_ws_plugin__s2member_utils_time::auto_eot_time($user->ID, $ipn_signup_vars['period1'], $ipn_signup_vars['period3']); if ($check_gateway) { switch ($subscr_gateway) { case 'paypal': // PayPal (PayPal Pro only). if (!c_ws_plugin__s2member_utils_conds::pro_is_installed() || !class_exists('c_ws_plugin__s2member_pro_paypal_utilities') || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_username'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_password'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_api_signature']) { return array_merge($empty_response, array('debug' => 'PayPal Pro API credentials missing in your s2Member configuration.')); } if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_payflow_api_username']) { if (!($api_response = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($subscr_id)) || !empty($api_response['__error'])) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says there is no subscription for this user.')); } if (preg_match('/^(?:Pending|PendingProfile)$/i', $api_response['STATUS'])) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says the subscription for this user is currently pending changes. Unable to determine at this moment. Please try again in 15 minutes.')); } if (!preg_match('/^(?:Active|ActiveProfile)$/i', $api_response['STATUS'])) { return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription is no longer active, and thus, access should be terminated at this time.'); } if ($api_response['TERM'] > 0 && $api_response['PAYMENTSLEFT'] <= 0) { return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription has reached its last payment, and thus, access should be terminated at this time.'); } if ($api_response['TERM'] <= 0 || $api_response['PAYMENTSLEFT'] > 0) { if ($api_response['NEXTPAYMENT'] && strlen($api_response['NEXTPAYMENT']) === 8) { // MMDDYYYY format is not `strtotime()` compatible. if (($time = strtotime(substr($api_response['NEXTPAYMENT'], -4) . '-' . substr($api_response['NEXTPAYMENT'], 0, 2) . '-' . substr($api_response['NEXTPAYMENT'], 2, 2))) > $now) { return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The PayPal Pro API says this is the next payment time.'); } } } } else { $api_args = array('METHOD' => 'GetRecurringPaymentsProfileDetails', 'PROFILEID' => $subscr_id); if (!($api_response = c_ws_plugin__s2member_paypal_utilities::paypal_api_response($api_args)) || !empty($api_response['__error'])) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says there is no subscription for this user.')); } if (preg_match('/^(?:Pending|PendingProfile)$/i', $api_response['STATUS'])) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the PayPal Pro API says the subscription for this user is currently pending changes. Unable to determine at this moment. Please try again in 15 minutes.')); } if (!preg_match('/^(?:Active|ActiveProfile)$/i', $api_response['STATUS'])) { return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription is no longer active, and thus, access should be terminated at this time.'); } if ($api_response['TOTALBILLINGCYCLES'] > 0 && $api_response['NUMCYCLESREMAINING'] <= 0) { return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is the estimated EOT time. The PayPal Pro API says this subscription has reached its last payment, and thus, access should be terminated at this time.'); } if ($api_response['TOTALBILLINGCYCLES'] <= 0 || $api_response['NUMCYCLESREMAINING'] > 0) { if ($api_response['NEXTBILLINGDATE'] && ($time = strtotime($api_response['NEXTBILLINGDATE'])) > $now) { return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The PayPal Pro API says this is the next payment time.'); } } } return array_merge($empty_response, array('debug' => 'No fixed EOT, and there are no more payments needed from this user.')); break; // Break switch. // Break switch. case 'authnet': // Authorize.Net (EOT only; w/ limited functionality). if (!c_ws_plugin__s2member_utils_conds::pro_is_installed() || !class_exists('c_ws_plugin__s2member_pro_authnet_utilities') || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_authnet_api_login_id'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_authnet_api_trans_key']) { return array_merge($empty_response, array('debug' => 'Authorize.Net API credentials missing in your s2Member configuration.')); } $api_args = array('x_method' => 'status', 'x_subscription_id' => $subscr_id); if (!($api_response = c_ws_plugin__s2member_pro_authnet_utilities::authnet_arb_response($api_args)) || !empty($api_response['__error'])) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the Authorize.Net API says there is no subscription for this user.')); } if (!preg_match('/^(?:active)$/i', $api_response['subscription_status'])) { return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is the estimated EOT time. The Authorize.Net API says this subscription is no longer active, and thus, access should be terminated at this time.'); } // Next payment time not possible with Authorize.Net at this time. // Fixed recurring intervals not possible to query with Authorize.Net at this time. return array_merge($empty_response, array('debug' => 'Partially-supported payment gateway; unable to determine.')); break; // Break switch. // Break switch. case 'stripe': // Stripe payment gateway (best). if (!c_ws_plugin__s2member_utils_conds::pro_is_installed() || !class_exists('c_ws_plugin__s2member_pro_stripe_utilities') || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_stripe_api_publishable_key'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_stripe_api_secret_key']) { return array_merge($empty_response, array('debug' => 'Stripe API credentials missing in your s2Member configuration.')); } if (!$subscr_cid) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and no `subscr_cid` on file. Unable to determine.')); } if (!is_object($stripe_subscription = c_ws_plugin__s2member_pro_stripe_utilities::get_customer_subscription($subscr_cid, $subscr_id)) || empty($stripe_subscription->id)) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the Stripe API says there is no subscription for this user.')); } if ((int) $stripe_subscription->ended_at > 0) { $time = $stripe_subscription->ended_at + $grace_time; return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this subscription reached an expiration on this date + grace time.'); } if (in_array($stripe_subscription->status, array('canceled', 'unpaid'), TRUE) || $stripe_subscription->cancel_at_period_end) { $time = $stripe_subscription->current_period_end + $grace_time; return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this subscription was cancelled, and thus, should EOT on this date + grace time.'); } if (isset($stripe_subscription->plan->metadata->recurring, $stripe_subscription->plan->metadata->recurring_times) && !$stripe_subscription->plan->metadata->recurring) { $time = (int) $stripe_subscription->start; $time += $stripe_subscription->plan->trial_period_days * DAY_IN_SECONDS; switch ($stripe_subscription->plan->interval) { case 'day': // Every X days in this case. $time += DAY_IN_SECONDS * $stripe_subscription->plan->interval_count * 1; break; // Break switch now. // Break switch now. case 'week': // Every X weeks in this case. $time += WEEK_IN_SECONDS * $stripe_subscription->plan->interval_count * 1; break; // Break switch now. // Break switch now. case 'month': // Every X months in this case. $time += WEEK_IN_SECONDS * 4 * $stripe_subscription->plan->interval_count * 1; break; // Break switch now. // Break switch now. case 'year': // Every X years in this case. $time += YEAR_IN_SECONDS * $stripe_subscription->plan->interval_count * 1; break; // Break switch now. } if ($favor === 'next' && $stripe_subscription->current_period_end + 1 < $time) { if ($stripe_subscription->current_period_end + 1 > $now) { $time = $stripe_subscription->current_period_end + 1; return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this is the next payment time.'); } return array_merge($empty_response, array('debug' => 'Stripe says no more payments needed from this user.')); } $time += $grace_time; // Now add grace to the final EOT time. return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this subscription will be completely over on this date + grace time.'); } if (isset($stripe_subscription->plan->metadata->recurring, $stripe_subscription->plan->metadata->recurring_times) && $stripe_subscription->plan->metadata->recurring && $stripe_subscription->plan->metadata->recurring_times <= 0) { if ($stripe_subscription->current_period_end + 1 > $now) { $time = $stripe_subscription->current_period_end + 1; return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this is the next payment time.'); } return array_merge($empty_response, array('debug' => 'Stripe says no more payments needed from this user.')); } if (isset($stripe_subscription->plan->metadata->recurring, $stripe_subscription->plan->metadata->recurring_times) && $stripe_subscription->plan->metadata->recurring && $stripe_subscription->plan->metadata->recurring_times > 0) { $time = (int) $stripe_subscription->start; $time += $stripe_subscription->plan->trial_period_days * DAY_IN_SECONDS; switch ($stripe_subscription->plan->interval) { case 'day': // Every X days in this case. $time += DAY_IN_SECONDS * $stripe_subscription->plan->interval_count * $stripe_subscription->plan->metadata->recurring_times; break; // Break switch now. // Break switch now. case 'week': // Every X weeks in this case. $time += WEEK_IN_SECONDS * $stripe_subscription->plan->interval_count * $stripe_subscription->plan->metadata->recurring_times; break; // Break switch now. // Break switch now. case 'month': // Every X months in this case. $time += WEEK_IN_SECONDS * 4 * $stripe_subscription->plan->interval_count * $stripe_subscription->plan->metadata->recurring_times; break; // Break switch now. // Break switch now. case 'year': // Every X years in this case. $time += YEAR_IN_SECONDS * $stripe_subscription->plan->interval_count * $stripe_subscription->plan->metadata->recurring_times; break; // Break switch now. } if ($favor === 'next' && $stripe_subscription->current_period_end + 1 < $time) { if ($stripe_subscription->current_period_end + 1 > $now) { $time = $stripe_subscription->current_period_end + 1; return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this is the next payment time.'); } return array_merge($empty_response, array('debug' => 'Stripe says no more payments needed from this user.')); } $time += $grace_time; // Now add grace to the final EOT time. return array('type' => 'fixed', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this subscription will be completely over on this date + grace time.'); } if ($stripe_subscription->current_period_end + 1 > $now) { $time = $stripe_subscription->current_period_end + 1; return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The Stripe API says this is the next payment time.'); } return array_merge($empty_response, array('debug' => 'No fixed EOT, and Stripe says there are no more payments needed from this user.')); break; // Break switch. // Break switch. case 'clickbank': // ClickBank (limited functionality). if (!c_ws_plugin__s2member_utils_conds::pro_is_installed() || !class_exists('c_ws_plugin__s2member_pro_clickbank_utilities') || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_username'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_clerk_key'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_developer_key'] || !$GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_clickbank_secret_key']) { return array_merge($empty_response, array('debug' => 'ClickBank API credentials missing in your s2Member configuration.')); } if (empty($ipn_signup_vars['txn_id'])) { // ClickBank receipt number. return array_merge($empty_response, array('debug' => 'No fixed EOT, and no `txn_id` on file. Unable to determine.')); } if (!($api_response = c_ws_plugin__s2member_pro_clickbank_utilities::clickbank_api_order($ipn_signup_vars['txn_id']))) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the ClickBank API says there is no subscription for this user.')); } if (!preg_match('/^(?:TEST_)?SALE$/i', $api_response['txnType']) || !$api_response['recurring']) { return array_merge($empty_response, array('debug' => 'No fixed EOT, and the ClickBank API says there is no recurring subscription for this user.')); } if (strcasecmp($api_response['status'], 'active') !== 0 || $api_response['futurePayments'] <= 0) { return array('type' => 'fixed', 'time' => $auto_eot_time, 'tense' => $auto_eot_time <= $now ? 'past' : 'future', 'debug' => 'This is the estimated EOT time. The ClickBank API says this subscription no longer active, or it has reached its last payment, and thus, access should be terminated at this time.'); } if ($api_response['nextPaymentDate'] && ($time = strtotime($api_response['nextPaymentDate'])) > $now) { return array('type' => 'next', 'time' => $time, 'tense' => $time <= $now ? 'past' : 'future', 'debug' => 'The ClickBank API says this is the next payment time.'); } return array_merge($empty_response, array('debug' => 'No fixed EOT, and there are no more payments needed from this user.')); break; // Break switch. // Break switch. default: // Default case handler. return array_merge($empty_response, array('debug' => 'Partially-supported payment gateway; unable to determine.')); } } return array_merge($empty_response, array('debug' => 'Payment gateway check disabled; unable to determine.')); }
/** * Connect to and process cancellations/refunds/chargebacks/etc via Payflow. * * s2Member's Auto EOT System must be enabled for this to work properly. * * If you have a HUGE userbase, increase the max IPNs per process. * But NOTE, this runs ``$per_process`` *(per Blog)* on a Multisite Network. * To increase, use: ``add_filter ("ws_plugin__s2member_pro_payflow_ipns_per_process");``. * * @package s2Member\PayPal * @since 120514 * * @attaches-to ``add_action("ws_plugin__s2member_after_auto_eot_system");`` * * @param array $vars Expects an array of defined variables to be passed in by the Action Hook. * @return null */ public static function payflow_service($vars = FALSE) { global $wpdb; // Need global DB obj. global $current_site, $current_blog; if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_payflow_api_username"]) { $scan_time = apply_filters("ws_plugin__s2member_pro_payflow_status_scan_time", strtotime("-1 day"), get_defined_vars()); $per_process = apply_filters("ws_plugin__s2member_pro_payflow_ipns_per_process", $vars["per_process"], get_defined_vars()); if (is_array($objs = $wpdb->get_results("SELECT `user_id` AS `ID` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_subscr_gateway' AND `meta_value` = 'paypal' AND `user_id` NOT IN(SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_last_status_scan' AND `meta_value` > '" . esc_sql($scan_time) . "')"))) { foreach ($objs as $obj) { if (($user_id = $obj->ID) && ($counter = (int) $counter + 1)) { unset($paypal, $subscr_id, $ipn_sv, $processing, $processed, $ipn, $log4, $_log4, $log2, $logs_dir); if (($subscr_id = get_user_option("s2member_subscr_id", $user_id)) && !get_user_option("s2member_auto_eot_time", $user_id)) { if (is_array($ipn_sv = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_vars(false, $subscr_id)) && ($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($subscr_id)) && is_array($paypal["ipn_signup_vars"] = $ipn_sv)) { if (preg_match("/expired/i", $paypal["STATUS"])) { $paypal["s2member_log"][] = "Payflow IPN via polling, processed on: " . date("D M j, Y g:i:s a T"); $paypal["s2member_log"][] = "Payflow transaction identified as ( `SUBSCRIPTION EXPIRATION` )."; $paypal["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal processor as `txn_type` ( `subscr_eot` )."; $paypal["s2member_log"][] = "Please check PayPal IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["txn_type"] = "subscr_eot"; $ipn["subscr_id"] = $paypal["ipn_signup_vars"]["subscr_id"]; $ipn["custom"] = $paypal["ipn_signup_vars"]["custom"]; $ipn["period1"] = $paypal["ipn_signup_vars"]["period1"]; $ipn["period3"] = $paypal["ipn_signup_vars"]["period3"]; $ipn["payer_email"] = $paypal["ipn_signup_vars"]["payer_email"]; $ipn["first_name"] = $paypal["ipn_signup_vars"]["first_name"]; $ipn["last_name"] = $paypal["ipn_signup_vars"]["last_name"]; $ipn["option_name1"] = $paypal["ipn_signup_vars"]["option_name1"]; $ipn["option_selection1"] = $paypal["ipn_signup_vars"]["option_selection1"]; $ipn["option_name2"] = $paypal["ipn_signup_vars"]["option_name2"]; $ipn["option_selection2"] = $paypal["ipn_signup_vars"]["option_selection2"]; $ipn["item_number"] = $paypal["ipn_signup_vars"]["item_number"]; $ipn["item_name"] = $paypal["ipn_signup_vars"]["item_name"]; $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (preg_match("/(suspended|canceled|terminated|deactivated)/i", $paypal["STATUS"])) { $paypal["s2member_log"][] = "Payflow IPN via polling, processed on: " . date("D M j, Y g:i:s a T"); $paypal["s2member_log"][] = "Payflow transaction identified as ( `SUBSCRIPTION " . strtoupper($paypal["STATUS"]) . "` )."; $paypal["s2member_log"][] = "IPN reformulated. Piping through s2Member's core/standard PayPal processor as `txn_type` ( `subscr_cancel` )."; $paypal["s2member_log"][] = "Please check PayPal IPN logs for further processing details."; $processing = $processed = true; $ipn = array(); // Reset. $ipn["txn_type"] = "subscr_cancel"; $ipn["subscr_id"] = $paypal["ipn_signup_vars"]["subscr_id"]; $ipn["custom"] = $paypal["ipn_signup_vars"]["custom"]; $ipn["period1"] = $paypal["ipn_signup_vars"]["period1"]; $ipn["period3"] = $paypal["ipn_signup_vars"]["period3"]; $ipn["payer_email"] = $paypal["ipn_signup_vars"]["payer_email"]; $ipn["first_name"] = $paypal["ipn_signup_vars"]["first_name"]; $ipn["last_name"] = $paypal["ipn_signup_vars"]["last_name"]; $ipn["option_name1"] = $paypal["ipn_signup_vars"]["option_name1"]; $ipn["option_selection1"] = $paypal["ipn_signup_vars"]["option_selection1"]; $ipn["option_name2"] = $paypal["ipn_signup_vars"]["option_name2"]; $ipn["option_selection2"] = $paypal["ipn_signup_vars"]["option_selection2"]; $ipn["item_number"] = $paypal["ipn_signup_vars"]["item_number"]; $ipn["item_name"] = $paypal["ipn_signup_vars"]["item_name"]; $ipn["s2member_paypal_proxy"] = "paypal"; $ipn["s2member_paypal_proxy_use"] = "pro-emails"; $ipn["s2member_paypal_proxy_verification"] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(site_url("/?s2member_paypal_notify=1"), $ipn, array("timeout" => 20)); } else { if (!$processed) { // If nothing was processed, here we add a message to the logs indicating the status; which is being ignored. $paypal["s2member_log"][] = "Ignoring this status ( `" . $paypal["STATUS"] . "` ). It does NOT require any action on the part of s2Member."; } } } $logt = c_ws_plugin__s2member_utilities::time_details(); $logv = c_ws_plugin__s2member_utilities::ver_details(); $logm = c_ws_plugin__s2member_utilities::mem_details(); $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"]; $log4 = is_multisite() && !is_main_site() ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4; $log2 = is_multisite() && !is_main_site() ? "paypal-payflow-ipn-4-" . trim(preg_replace("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "paypal-payflow-ipn.log"; if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"]) { if (is_dir($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])) { if (is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files()) { file_put_contents($logs_dir . "/" . $log2, "LOG ENTRY: " . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . c_ws_plugin__s2member_utils_logs::conceal_private_info(var_export($paypal, true)) . "\n\n", FILE_APPEND); } } } } } update_user_option($user_id, "s2member_last_status_scan", time()); if ($counter >= $per_process) { // Only this many. break; } // Break the loop now. } } } } return; }
/** * Handles processing of Pro-Form billing updates. * * @package s2Member\PayPal * @since 1.5 * * @attaches-to ``add_action("init");`` * * @return null Or exits script execution after a custom URL redirection. */ public static function paypal_update() { if (!empty($_POST["s2member_pro_paypal_update"]["nonce"]) && ($nonce = $_POST["s2member_pro_paypal_update"]["nonce"]) && wp_verify_nonce($nonce, "s2member-pro-paypal-update")) { $GLOBALS["ws_plugin__s2member_pro_paypal_update_response"] = array(); // This holds the global response details. $global_response =& $GLOBALS["ws_plugin__s2member_pro_paypal_update_response"]; // This is a shorter reference. $post_vars = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST["s2member_pro_paypal_update"])); $post_vars["attr"] = !empty($post_vars["attr"]) ? (array) unserialize(c_ws_plugin__s2member_utils_encryption::decrypt($post_vars["attr"])) : array(); $post_vars["attr"] = apply_filters("ws_plugin__s2member_pro_paypal_update_post_attr", $post_vars["attr"], get_defined_vars()); $post_vars = c_ws_plugin__s2member_utils_captchas::recaptcha_post_vars($post_vars); // Collect reCAPTCHA™ post vars. if (empty($post_vars["card_expiration"]) && isset($post_vars["card_expiration_month"], $post_vars["card_expiration_year"])) { $post_vars["card_expiration"] = $post_vars["card_expiration_month"] . "/" . $post_vars["card_expiration_year"]; } if (!c_ws_plugin__s2member_pro_paypal_responses::paypal_form_attr_validation_errors($post_vars["attr"])) { if (!($error = c_ws_plugin__s2member_pro_paypal_responses::paypal_form_submission_validation_errors("update", $post_vars))) { if ($post_vars["card_type"] === "PayPal") { $global_response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to update your billing information.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/")), "error" => true); } else { if (is_user_logged_in() && ($user = wp_get_current_user()) && ($user_id = $user->ID)) { if ($cur__subscr_id = get_user_option("s2member_subscr_id")) { if (($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($cur__subscr_id)) && $paypal["TENDER"] !== "P" && preg_match("/^(Active|ActiveProfile)\$/i", $paypal["STATUS"])) { $paypal = array(); // Reset the PayPal array. $paypal["TRXTYPE"] = "R"; $paypal["ACTION"] = "M"; $paypal["ORIGPROFILEID"] = $cur__subscr_id; $paypal["EMAIL"] = $user->user_email; $paypal["FIRSTNAME"] = $user->first_name; $paypal["LASTNAME"] = $user->last_name; $paypal["TENDER"] = "C"; $paypal["ACCT"] = preg_replace("/[^0-9]/", "", $post_vars["card_number"]); if (preg_match("/^(?P<month>[0-9]{2})\\/[0-9]{2}(?P<year_suffix>[0-9]{2})\$/", $post_vars["card_expiration"], $_m)) { $paypal["EXPDATE"] = $_m["month"] . $_m["year_suffix"]; } $paypal["CVV2"] = $post_vars["card_verification"]; if (in_array($post_vars["card_type"], array("Maestro", "Solo"))) { if (preg_match("/^(?P<month>[0-9]{2})\\/[0-9]{2}(?P<year>[0-9]{2})\$/", $post_vars["card_start_date_issue_number"], $_m)) { $paypal["CARDSTART"] = $_m["month"] . $_m["year"]; } else { $paypal["CARDISSUE"] = $post_vars["card_start_date_issue_number"]; } unset($_m); } $paypal["STREET"] = $post_vars["street"]; $paypal["CITY"] = $post_vars["city"]; $paypal["STATE"] = $post_vars["state"]; $paypal["COUNTRY"] = $post_vars["country"]; $paypal["ZIP"] = $post_vars["zip"]; if (($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_payflow_api_response($paypal)) && empty($paypal["__error"])) { $global_response = array("response" => _x('<strong>Confirmed.</strong> Your billing information has been updated.', "s2member-front", "s2member")); if ($post_vars["attr"]["success"] && ($custom_success_url = str_ireplace(array("%%s_response%%", "%%response%%"), array(urlencode(c_ws_plugin__s2member_utils_encryption::encrypt($global_response["response"])), urlencode($global_response["response"])), $post_vars["attr"]["success"])) && ($custom_success_url = trim(preg_replace("/%%(.+?)%%/i", "", $custom_success_url)))) { wp_redirect(c_ws_plugin__s2member_utils_urls::add_s2member_sig($custom_success_url, "s2p-v")) . exit; } } else { $global_response = array("response" => $paypal["__error"], "error" => true); } } else { if ($paypal && $paypal["TENDER"] !== "P" && !preg_match("/^(Active|ActiveProfile)\$/i", $paypal["STATUS"])) { $global_response = array("response" => _x('<strong>Unable to update.</strong> You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance.', "s2member-front", "s2member"), "error" => true); } else { if ($paypal && $paypal["TENDER"] === "P") { $global_response = array("response" => sprintf(_x('Please <a href="%s" rel="nofollow">log in at PayPal</a> to update your billing information.', "s2member-front", "s2member"), esc_attr("https://" . ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"] ? "www.sandbox.paypal.com" : "www.paypal.com") . "/")), "error" => true); } else { $global_response = array("response" => _x('<strong>Unknown error.</strong> Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } } } else { $global_response = array("response" => _x('<strong>No Subscr. ID.</strong> Please contact Support for assistance.', "s2member-front", "s2member"), "error" => true); } } else { $global_response = array("response" => _x('You\'re <strong>NOT</strong> logged in.', "s2member-front", "s2member"), "error" => true); } } } else { $global_response = $error; } } } }
/** * Connect to and process cancellations/refunds/chargebacks/etc via Payflow. * * s2Member's Auto EOT System must be enabled for this to work properly. * * If you have a HUGE userbase, increase the max IPNs per process. * But NOTE, this runs ``$per_process`` *(per Blog)* on a Multisite Network. * To increase, use: ``add_filter ('ws_plugin__s2member_pro_payflow_ipns_per_process');``. * * @package s2Member\PayPal * @since 120514 * * @attaches-to ``add_action('ws_plugin__s2member_after_auto_eot_system');`` * * @param array $vars Expects an array of defined variables to be passed in by the Action Hook. */ public static function payflow_service($vars) { global $wpdb; /** @var $wpdb \wpdb */ global $current_site, $current_blog; $counter = 0; // Initialize counter at zero. if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['paypal_payflow_api_username']) { $scan_time = apply_filters('ws_plugin__s2member_pro_payflow_status_scan_time', strtotime('-1 day'), get_defined_vars()); $per_process = apply_filters('ws_plugin__s2member_pro_payflow_ipns_per_process', $vars['per_process'], get_defined_vars()); if (is_array($objs = $wpdb->get_results("SELECT `user_id` AS `ID` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_subscr_gateway' AND `meta_value` = 'paypal' AND `user_id` NOT IN(SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_last_status_scan' AND `meta_value` > '" . esc_sql($scan_time) . "')"))) { foreach ($objs as $obj) { if (($user_id = $obj->ID) && ($counter = (int) $counter + 1)) { $processed = FALSE; // Initialize and/or reset all of these variables. unset($paypal, $subscr_id, $processing, $ipn, $log4, $_log4, $log2, $logs_dir); if (($subscr_id = get_user_option('s2member_subscr_id', $user_id)) && !get_user_option('s2member_auto_eot_time', $user_id)) { if ($paypal = c_ws_plugin__s2member_pro_paypal_utilities::payflow_get_profile($subscr_id)) { $paypal['ipn_signup_vars'] = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_vars(FALSE, $subscr_id); if ($paypal['ipn_signup_vars'] && preg_match('/expired|too many failures/i', $paypal['STATUS'])) { $paypal['s2member_log'][] = 'Payflow IPN via polling, processed on: ' . date('D M j, Y g:i:s a T'); $paypal['s2member_log'][] = 'Payflow transaction identified as ( `SUBSCRIPTION EXPIRATION` ).'; $paypal['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` ( `subscr_eot` ).'; $paypal['s2member_log'][] = 'Please check PayPal IPN logs for further processing details.'; $processing = $processed = TRUE; $ipn = array(); // Reset. $ipn['txn_type'] = 'subscr_eot'; $ipn['subscr_id'] = $paypal['ipn_signup_vars']['subscr_id']; $ipn['custom'] = $paypal['ipn_signup_vars']['custom']; $ipn['period1'] = $paypal['ipn_signup_vars']['period1']; $ipn['period3'] = $paypal['ipn_signup_vars']['period3']; $ipn['payer_email'] = $paypal['ipn_signup_vars']['payer_email']; $ipn['first_name'] = $paypal['ipn_signup_vars']['first_name']; $ipn['last_name'] = $paypal['ipn_signup_vars']['last_name']; $ipn['option_name1'] = $paypal['ipn_signup_vars']['option_name1']; $ipn['option_selection1'] = $paypal['ipn_signup_vars']['option_selection1']; $ipn['option_name2'] = $paypal['ipn_signup_vars']['option_name2']; $ipn['option_selection2'] = $paypal['ipn_signup_vars']['option_selection2']; $ipn['item_number'] = $paypal['ipn_signup_vars']['item_number']; $ipn['item_name'] = $paypal['ipn_signup_vars']['item_name']; $ipn['s2member_paypal_proxy'] = 'paypal'; $ipn['s2member_paypal_proxy_use'] = 'pro-emails'; $ipn['s2member_paypal_proxy_verification'] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(home_url('/?s2member_paypal_notify=1'), $ipn, array('timeout' => 20)); } else { if ($paypal['ipn_signup_vars'] && preg_match('/(suspended|canceled|terminated|deactivated)/i', $paypal['STATUS'])) { $paypal['s2member_log'][] = 'Payflow IPN via polling, processed on: ' . date('D M j, Y g:i:s a T'); $paypal['s2member_log'][] = 'Payflow transaction identified as ( `SUBSCRIPTION ' . strtoupper($paypal['STATUS']) . '` ).'; $paypal['s2member_log'][] = 'IPN reformulated. Piping through s2Member\'s core/standard PayPal processor as `txn_type` ( `subscr_cancel` ).'; $paypal['s2member_log'][] = 'Please check PayPal IPN logs for further processing details.'; $processing = $processed = TRUE; $ipn = array(); // Reset. $ipn['txn_type'] = 'subscr_cancel'; $ipn['subscr_id'] = $paypal['ipn_signup_vars']['subscr_id']; $ipn['custom'] = $paypal['ipn_signup_vars']['custom']; $ipn['period1'] = $paypal['ipn_signup_vars']['period1']; $ipn['period3'] = $paypal['ipn_signup_vars']['period3']; $ipn['payer_email'] = $paypal['ipn_signup_vars']['payer_email']; $ipn['first_name'] = $paypal['ipn_signup_vars']['first_name']; $ipn['last_name'] = $paypal['ipn_signup_vars']['last_name']; $ipn['option_name1'] = $paypal['ipn_signup_vars']['option_name1']; $ipn['option_selection1'] = $paypal['ipn_signup_vars']['option_selection1']; $ipn['option_name2'] = $paypal['ipn_signup_vars']['option_name2']; $ipn['option_selection2'] = $paypal['ipn_signup_vars']['option_selection2']; $ipn['item_number'] = $paypal['ipn_signup_vars']['item_number']; $ipn['item_name'] = $paypal['ipn_signup_vars']['item_name']; $ipn['s2member_paypal_proxy'] = 'paypal'; $ipn['s2member_paypal_proxy_use'] = 'pro-emails'; $ipn['s2member_paypal_proxy_verification'] = c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen(); c_ws_plugin__s2member_utils_urls::remote(home_url('/?s2member_paypal_notify=1'), $ipn, array('timeout' => 20)); } else { if (!$processed && !$paypal['ipn_signup_vars']) { $paypal['s2member_log'][] = 'Ignoring status (`' . $paypal['STATUS'] . '`).' . ' The user has no IPN Signup Vars recorded on-site by s2Member.'; } else { if (!$processed) { $paypal['s2member_log'][] = 'Ignoring status (`' . $paypal['STATUS'] . '`).' . ' It does NOT require any action on the part of s2Member.'; } } } } $logt = c_ws_plugin__s2member_utilities::time_details(); $logv = c_ws_plugin__s2member_utilities::ver_details(); $logm = c_ws_plugin__s2member_utilities::mem_details(); $log4 = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n" . 'User-Agent: ' . $_SERVER['HTTP_USER_AGENT']; $log4 = is_multisite() && !is_main_site() ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4; $log2 = is_multisite() && !is_main_site() ? 'paypal-payflow-ipn-4-' . trim(preg_replace('/[^a-z0-9]/i', '-', !empty($_log4) ? $_log4 : ''), '-') . '.log' : 'paypal-payflow-ipn.log'; if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['gateway_debug_logs']) { if (is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'])) { if (is_writable($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files()) { file_put_contents($logs_dir . '/' . $log2, 'LOG ENTRY: ' . $logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" . c_ws_plugin__s2member_utils_logs::conceal_private_info(var_export($paypal, TRUE)) . "\n\n", FILE_APPEND); } } } } } update_user_option($user_id, 's2member_last_status_scan', time()); if ($counter >= $per_process) { // Only this many. break; } // Break the loop now. } } } } }