static function save_txn_record($ipn_data, $items = array()) { global $wpdb; $current_date = date("Y-m-d"); $custom_var = SwpmTransactions::parse_custom_var($ipn_data['custom']); $txn_data = array(); $txn_data['email'] = $ipn_data['payer_email']; $txn_data['first_name'] = $ipn_data['first_name']; $txn_data['last_name'] = $ipn_data['last_name']; $txn_data['last_name'] = $ipn_data['last_name']; $txn_data['ip_address'] = $ipn_data['ip']; $txn_data['member_id'] = $ipn_data['swpm_id']; $txn_data['membership_level'] = $custom_var['subsc_ref']; $txn_data['txn_date'] = $current_date; $txn_data['txn_id'] = $ipn_data['txn_id']; $txn_data['subscr_id'] = $ipn_data['subscr_id']; $txn_data['reference'] = $custom_var['reference']; $txn_data['payment_amount'] = $ipn_data['mc_gross']; $txn_data['gateway'] = $ipn_data['gateway']; $txn_data['status'] = $ipn_data['status']; $wpdb->insert($wpdb->prefix . "swpm_payments_tbl", $txn_data); }
public function handle_stripe_ipn() { SwpmLog::log_simple_debug("Stripe Buy Now IPN received. Processing request...", true); //SwpmLog::log_simple_debug(print_r($_REQUEST, true), true);//Useful for debugging purpose //Include the Stripe library. include SIMPLE_WP_MEMBERSHIP_PATH . 'lib/stripe-gateway/init.php'; //Read and sanitize the request parameters. $button_id = sanitize_text_field($_REQUEST['item_number']); $button_id = absint($button_id); $button_title = sanitize_text_field($_REQUEST['item_name']); $payment_amount = sanitize_text_field($_REQUEST['item_price']); $price_in_cents = $payment_amount * 100; //The amount (in cents). This value is used in Stripe API. $currency_code = sanitize_text_field($_REQUEST['currency_code']); $stripe_token = sanitize_text_field($_POST['stripeToken']); $stripe_token_type = sanitize_text_field($_POST['stripeTokenType']); $stripe_email = sanitize_email($_POST['stripeEmail']); //Retrieve the CPT for this button $button_cpt = get_post($button_id); if (!$button_cpt) { //Fatal error. Could not find this payment button post object. SwpmLog::log_simple_debug("Fatal Error! Failed to retrieve the payment button post object for the given button ID: " . $button_id, false); wp_die("Fatal Error! Payment button (ID: " . $button_id . ") does not exist. This request will fail."); } $membership_level_id = get_post_meta($button_id, 'membership_level_id', true); //Validate and verify some of the main values. $true_payment_amount = get_post_meta($button_id, 'payment_amount', true); if ($payment_amount != $true_payment_amount) { //Fatal error. Payment amount may have been tampered with. $error_msg = 'Fatal Error! Received payment amount (' . $payment_amount . ') does not match with the original amount (' . $true_payment_amount . ')'; SwpmLog::log_simple_debug($error_msg, false); wp_die($error_msg); } $true_currency_code = get_post_meta($button_id, 'payment_currency', true); if ($currency_code != $true_currency_code) { //Fatal error. Currency code may have been tampered with. $error_msg = 'Fatal Error! Received currency code (' . $currency_code . ') does not match with the original code (' . $true_currency_code . ')'; SwpmLog::log_simple_debug($error_msg, false); wp_die($error_msg); } //Validation passed. Go ahead with the charge. //Sandbox and other settings $settings = SwpmSettings::get_instance(); $sandbox_enabled = $settings->get_value('enable-sandbox-testing'); if ($sandbox_enabled) { SwpmLog::log_simple_debug("Sandbox payment mode is enabled. Using test API key details.", true); $secret_key = get_post_meta($button_id, 'stripe_test_secret_key', true); //Use sandbox API key } else { $secret_key = get_post_meta($button_id, 'stripe_live_secret_key', true); //Use live API key } //Set secret API key in the Stripe library \Stripe\Stripe::setApiKey($secret_key); // Get the credit card details submitted by the form $token = $stripe_token; // Create the charge on Stripe's servers - this will charge the user's card try { $charge = \Stripe\Charge::create(array("amount" => $price_in_cents, "currency" => strtolower($currency_code), "source" => $token, "description" => $button_title)); } catch (\Stripe\Error\Card $e) { // The card has been declined SwpmLog::log_simple_debug("Stripe Charge Error! The card has been declined. " . $e->getMessage(), false); $body = $e->getJsonBody(); $error = $body['error']; $error_string = print_r($error, true); SwpmLog::log_simple_debug("Error details: " . $error_string, false); wp_die("Stripe Charge Error! Card charge has been declined. " . $e->getMessage() . $error_string); } //Everything went ahead smoothly with the charge. SwpmLog::log_simple_debug("Stripe Buy Now charge successful.", true); //Grab the charge ID and set it as the transaction ID. $txn_id = $charge->id; //$charge->balance_transaction; //The charge ID can be used to retrieve the transaction details using hte following call. //\Stripe\Charge::retrieve($charge->id); $custom = sanitize_text_field($_REQUEST['custom']); $custom_var = SwpmTransactions::parse_custom_var($custom); $swpm_id = isset($custom_var['swpm_id']) ? $custom_var['swpm_id'] : ''; //Create the $ipn_data array. $ipn_data = array(); $ipn_data['mc_gross'] = $payment_amount; $ipn_data['first_name'] = ''; $ipn_data['last_name'] = ''; $ipn_data['payer_email'] = $stripe_email; $ipn_data['membership_level'] = $membership_level_id; $ipn_data['txn_id'] = $txn_id; $ipn_data['subscr_id'] = $txn_id; $ipn_data['swpm_id'] = $swpm_id; $ipn_data['ip'] = $custom_var['user_ip']; $ipn_data['custom'] = $custom; $ipn_data['gateway'] = 'stripe'; $ipn_data['status'] = 'completed'; $ipn_data['address_street'] = ''; $ipn_data['address_city'] = ''; $ipn_data['address_state'] = ''; $ipn_data['address_zipcode'] = ''; $ipn_data['country'] = ''; //Handle the membership signup related tasks. swpm_handle_subsc_signup_stand_alone($ipn_data, $membership_level_id, $txn_id, $swpm_id); //Save the transaction record SwpmTransactions::save_txn_record($ipn_data); SwpmLog::log_simple_debug('Transaction data saved.', true); //Trigger the stripe IPN processed action hook (so other plugins can can listen for this event). do_action('swpm_stripe_ipn_processed', $ipn_data); do_action('swpm_payment_ipn_processed', $ipn_data); //Redirect the user to the return URL (or to the homepage if a return URL is not specified for this payment button). $return_url = get_post_meta($button_id, 'return_url', true); if (empty($return_url)) { $return_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL; } SwpmLog::log_simple_debug("Redirecting customer to: " . $return_url, true); SwpmLog::log_simple_debug("End of Stripe Buy Now IPN processing.", true, true); SwpmMiscUtils::redirect_to_url($return_url); }