/** * pfValidIP * * @author Jonathan Smit (PayFast.co.za) * @param $sourceIP String Source IP address */ function pmpro_pfValidIP($sourceIP) { // Variable initialization $validHosts = array('www.payfast.co.za', 'sandbox.payfast.co.za', 'w1w.payfast.co.za', 'w2w.payfast.co.za'); $validIps = array(); foreach ($validHosts as $pfHostname) { $ips = gethostbynamel($pfHostname); if ($ips !== false) { $validIps = array_merge($validIps, $ips); } } // Remove duplicates $validIps = array_unique($validIps); ipnlog("Valid IPs:\n" . print_r($validIps, true)); if (in_array($sourceIP, $validIps)) { return true; } else { return false; } }
function pmpro_ipnSaveOrder($txn_id, $last_order) { global $wpdb; //check that txn_id has not been previously processed $old_txn = $wpdb->get_var("SELECT payment_transaction_id FROM {$wpdb->pmpro_membership_orders} WHERE payment_transaction_id = '" . $txn_id . "' LIMIT 1"); if (empty($old_txn)) { //hook for successful subscription payments do_action("pmpro_subscription_payment_completed"); //save order $morder = new MemberOrder(); $morder->user_id = $last_order->user_id; $morder->membership_id = $last_order->membership_id; $morder->payment_transaction_id = $txn_id; $morder->subscription_transaction_id = $last_order->subscription_transaction_id; $morder->gateway = $last_order->gateway; $morder->gateway_environment = $last_order->gateway_environment; // Payment Status $morder->status = 'success'; // We have confirmed that and thats the reason we are here. // Payment Type. $morder->payment_type = $last_order->payment_type; //set amount based on which PayPal type if ($last_order->gateway == "paypal") { $morder->InitialPayment = $_POST['amount']; //not the initial payment, but the class is expecting that $morder->PaymentAmount = $_POST['amount']; } elseif ($last_order->gateway == "paypalexpress") { $morder->InitialPayment = $_POST['amount']; //not the initial payment, but the class is expecting that $morder->PaymentAmount = $_POST['amount']; } elseif ($last_order->gateway == "paypalstandard") { $morder->InitialPayment = $_POST['mc_gross']; //not the initial payment, but the class is expecting that $morder->PaymentAmount = $_POST['mc_gross']; } $morder->FirstName = $_POST['first_name']; $morder->LastName = $_POST['last_name']; $morder->Email = $_POST['payer_email']; //get address info if appropriate if ($last_order->gateway == "paypal") { $morder->Address1 = get_user_meta($last_order->user_id, "pmpro_baddress1", true); $morder->City = get_user_meta($last_order->user_id, "pmpro_bcity", true); $morder->State = get_user_meta($last_order->user_id, "pmpro_bstate", true); $morder->CountryCode = "US"; $morder->Zip = get_user_meta($last_order->user_id, "pmpro_bzip", true); $morder->PhoneNumber = get_user_meta($last_order->user_id, "pmpro_bphone", true); $morder->billing->name = $_POST['first_name'] . " " . $_POST['last_name']; $morder->billing->street = get_user_meta($last_order->user_id, "pmpro_baddress1", true); $morder->billing->city = get_user_meta($last_order->user_id, "pmpro_bcity", true); $morder->billing->state = get_user_meta($last_order->user_id, "pmpro_bstate", true); $morder->billing->zip = get_user_meta($last_order->user_id, "pmpro_bzip", true); $morder->billing->country = get_user_meta($last_order->user_id, "pmpro_bcountry", true); $morder->billing->phone = get_user_meta($last_order->user_id, "pmpro_bphone", true); //get CC info that is on file $morder->cardtype = get_user_meta($last_order->user_id, "pmpro_CardType", true); $morder->accountnumber = hideCardNumber(get_user_meta($last_order->user_id, "pmpro_AccountNumber", true), false); $morder->expirationmonth = get_user_meta($last_order->user_id, "pmpro_ExpirationMonth", true); $morder->expirationyear = get_user_meta($last_order->user_id, "pmpro_ExpirationYear", true); $morder->ExpirationDate = $morder->expirationmonth . $morder->expirationyear; $morder->ExpirationDate_YdashM = $morder->expirationyear . "-" . $morder->expirationmonth; } //save $morder->saveOrder(); $morder->getMemberOrderByID($morder->id); //email the user their invoice $pmproemail = new PMProEmail(); $pmproemail->sendInvoiceEmail(get_userdata($last_order->user_id), $morder); ipnlog("New order (" . $morder->code . ") created."); return true; } else { ipnlog("Duplicate Transaction ID: " . $txn_id); return false; } }
function pmpro_ipnSaveOrder($txn_id, $last_order) { global $wpdb; //check that txn_id has not been previously processed $old_txn = $wpdb->get_var("SELECT payment_transaction_id FROM {$wpdb->pmpro_membership_orders} WHERE payment_transaction_id = '" . $txn_id . "' LIMIT 1"); if (empty($old_txn)) { //save order $morder = new MemberOrder(); $morder->user_id = $last_order->user_id; $morder->membership_id = $last_order->membership_id; $morder->payment_transaction_id = $txn_id; $morder->subscription_transaction_id = $last_order->subscription_transaction_id; $morder->gateway = $last_order->gateway; $morder->gateway_environment = $last_order->gateway_environment; // Payment Status $morder->status = 'success'; // We have confirmed that and thats the reason we are here. // Payment Type. $morder->payment_type = $last_order->payment_type; //set amount based on which PayPal type if (false !== stripos($last_order->gateway, "paypal")) { if (isset($_POST['amount']) && !empty($_POST['amount'])) { $morder->InitialPayment = $_POST['amount']; //not the initial payment, but the class is expecting that $morder->PaymentAmount = $_POST['amount']; } elseif (isset($_POST['mc_gross']) && !empty($_POST['mc_gross'])) { $morder->InitialPayment = $_POST['mc_gross']; //not the initial payment, but the class is expecting that $morder->PaymentAmount = $_POST['mc_gross']; } elseif (isset($_POST['payment_gross']) && !empty($_POST['payment_gross'])) { $morder->InitialPayment = $_POST['payment_gross']; //not the initial payment, but the class is expecting that $morder->PaymentAmount = $_POST['payment_gross']; } } $morder->FirstName = $_POST['first_name']; $morder->LastName = $_POST['last_name']; $morder->Email = $_POST['payer_email']; //get address info if appropriate if ($last_order->gateway == "paypal") { $morder->Address1 = get_user_meta($last_order->user_id, "pmpro_baddress1", true); $morder->City = get_user_meta($last_order->user_id, "pmpro_bcity", true); $morder->State = get_user_meta($last_order->user_id, "pmpro_bstate", true); $morder->CountryCode = "US"; $morder->Zip = get_user_meta($last_order->user_id, "pmpro_bzip", true); $morder->PhoneNumber = get_user_meta($last_order->user_id, "pmpro_bphone", true); $morder->billing->name = $_POST['first_name'] . " " . $_POST['last_name']; $morder->billing->street = get_user_meta($last_order->user_id, "pmpro_baddress1", true); $morder->billing->city = get_user_meta($last_order->user_id, "pmpro_bcity", true); $morder->billing->state = get_user_meta($last_order->user_id, "pmpro_bstate", true); $morder->billing->zip = get_user_meta($last_order->user_id, "pmpro_bzip", true); $morder->billing->country = get_user_meta($last_order->user_id, "pmpro_bcountry", true); $morder->billing->phone = get_user_meta($last_order->user_id, "pmpro_bphone", true); //get CC info that is on file $morder->cardtype = get_user_meta($last_order->user_id, "pmpro_CardType", true); $morder->accountnumber = hideCardNumber(get_user_meta($last_order->user_id, "pmpro_AccountNumber", true), false); $morder->expirationmonth = get_user_meta($last_order->user_id, "pmpro_ExpirationMonth", true); $morder->expirationyear = get_user_meta($last_order->user_id, "pmpro_ExpirationYear", true); $morder->ExpirationDate = $morder->expirationmonth . $morder->expirationyear; $morder->ExpirationDate_YdashM = $morder->expirationyear . "-" . $morder->expirationmonth; } //figure out timestamp or default to none (today) if (!empty($_POST['payment_date'])) { $morder->timestamp = strtotime($_POST['payment_date']); } // Save the event ID for the last processed user/IPN (in case we want to be able to replay IPN requests) $ipn_id = isset($_POST['ipn_track_id']) ? sanitize_text_field($_POST['ipn_track_id']) : null; // Allow extraction of the IPN Track ID from the order notes (if needed) $morder->notes = "{$morder->notes} [IPN_ID]{$ipn_id}[/IPN_ID]"; /** * Post processing for a specific subscription related IPN event ID * * @param string $ipn_id - The ipn_track_id from the PayPal IPN request * @param MemberOrder $morder - The completed Member Order object for the IPN request */ do_action('pmpro_subscription_ipn_event_processed', $ipn_id, $morder); if (!is_null($ipn_id)) { if (false === update_user_meta($morder->user_id, "pmpro_last_{$morder->gateway}_ipn_id", $ipn_id)) { ipnlog("Unable to save the IPN event ID ({$ipn_id}) to usermeta for {$morder->user_id} "); } } //save $morder->saveOrder(); $morder->getMemberOrderByID($morder->id); //email the user their invoice $pmproemail = new PMProEmail(); $pmproemail->sendInvoiceEmail(get_userdata($last_order->user_id), $morder); //hook for successful subscription payments do_action("pmpro_subscription_payment_completed", $morder); ipnlog("New order (" . $morder->code . ") created."); return true; } else { ipnlog("Duplicate Transaction ID: " . $txn_id); return false; } }