main = AcceptStripePayments::get_instance(); add_action( 'asp_ng_product_mode_keys', array( $this, 'ng_product_mode_keys_handler' ) ); add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ), 0 ); add_filter( 'asp_ng_before_pi_create_update', array( $this, 'pi_update' ) ); add_filter( 'asp_ng_available_currencies', array( $this, 'filter_available_currencies' ) ); add_action( 'asp_ng_before_token_request', array( $this, 'check_token' ), 100 ); add_action( 'asp_ng_before_token_request', array( $this, 'check_rate_limit' ), 101 ); add_action( 'asp_ng_before_token_request', array( $this, 'tax_variations' ) ); add_filter( 'asp_ng_pp_data_ready', array( $this, 'tax_variations_addon' ), 100, 2 ); add_action( 'asp_stripe_payment_completed', array( $this, 'daily_txn_limit' ), 102, 2 ); } public function plugins_loaded() { //WP eMember integration if ( function_exists( 'wp_emember_install' ) ) { add_action( 'asp_stripe_payment_completed', array( $this, 'handle_eMember_signup' ), 10, 2 ); } //WP PDF Stamper integration if ( function_exists( 'pdf_stamper_stamp_internal_file' ) ) { add_action( 'asp_ng_payment_completed', array( $this, 'handle_wp_pdf_stamper' ), 1000, 2 ); } } public function pi_update( $pi_params ) { $product_id = filter_input( INPUT_POST, 'product_id', FILTER_SANITIZE_NUMBER_INT ); $plan_id = get_post_meta( $product_id, 'asp_sub_plan_id', true ); if ( ! empty( $plan_id ) ) { //ignoring option for Subscription product return $pi_params; } $auth_only = get_post_meta( $product_id, 'asp_product_authorize_only', true ); if ( $auth_only ) { $pi_params['capture_method'] = 'manual'; $extended_authorization = get_post_meta( $product_id, 'asp_product_extended_authorization', true ); if ( ! empty( $extended_authorization ) ) { if ( isset( $pi_params['payment_method_options']['card'] ) && is_array( $pi_params['payment_method_options']['card'] ) ) { $pi_params['payment_method_options']['card']['request_extended_authorization'] = 'if_available'; } else if ( isset( $pi_params['payment_method_options'] ) && is_array( $pi_params['payment_method_options'] ) ) { $pi_params['payment_method_options']['card'] = array( 'request_extended_authorization' => 'if_available', ); } else { $pi_params['payment_method_options'] = array( 'card' => array( 'request_extended_authorization' => 'if_available', ), ); } } } return $pi_params; } public function filter_available_currencies( $curr_arr ) { $allowed_curr = $this->main->get_setting( 'allowed_currencies' ); $allowed_curr = empty( $allowed_curr ) ? array() : json_decode( html_entity_decode( $allowed_curr ), true ); if ( empty( $allowed_curr ) || empty( array_diff_key( $curr_arr, $allowed_curr ) ) ) { return $curr_arr; } foreach ( $curr_arr as $key => $value ) { if ( ! isset( $allowed_curr[ $key ] ) ) { unset( $curr_arr[ $key ] ); } } return $curr_arr; } public function ng_product_mode_keys_handler( $product_id ) { if ( empty( $product_id ) ) { return; } $product = get_post( $product_id ); if ( ! $product ) { return; } $prod = new ASP_Product_Item( $product_id ); $type = $prod->get_type(); if ( 'subscription' !== $type ) { $use_other_acc = get_post_meta( $product_id, 'asp_use_other_stripe_acc', true ); if ( ! empty( $use_other_acc ) ) { $this->main->APIPubKeyTest = get_post_meta( $product_id, 'asp_stripe_test_pub_key', true ); $this->main->APIPubKeyLive = get_post_meta( $product_id, 'asp_stripe_live_pub_key', true ); $this->main->APISecKeyTest = get_post_meta( $product_id, 'asp_stripe_test_sec_key', true ); $this->main->APISecKeyLive = get_post_meta( $product_id, 'asp_stripe_live_sec_key', true ); $this->main->APIPubKey = $this->main->APIPubKeyLive; $this->main->APISecKey = $this->main->APISecKeyLive; } } $plan_id = get_post_meta( $product_id, 'asp_sub_plan_id', true ); if ( ! empty( $plan_id ) ) { //check if Subs addon enabled if ( class_exists( 'ASPSUB_main' ) ) { $asp_sub = ASPSUB_main::get_instance(); $plan = $asp_sub->get_plan_data( $plan_id ); if ( ! ( $plan ) || $plan->livemode ) { return; } } } else { //check if force test mode option set for the product $force_test = get_post_meta( $product_id, 'asp_product_force_test_mode', true ); if ( empty( $force_test ) ) { return; } } $this->main->is_live = false; $this->main->APIPubKey = $this->main->APIPubKeyTest; $this->main->APISecKey = $this->main->APISecKeyTest; } public function handle_emember_signup( $data, $charge ) { if ( empty( $data['product_id'] ) ) { return; } //let's check if Membership Level is set for this product $level_id = get_post_meta( $data['product_id'], 'asp_product_emember_level', true ); if ( empty( $level_id ) ) { return; } //let's form data required for eMember_handle_subsc_signup_stand_alone function and call it $first_name = ''; $last_name = ''; if ( ! empty( $data['customer_name'] ) ) { // let's try to create first name and last name from full name $parts = explode( ' ', $data['customer_name'] ); $last_name = array_pop( $parts ); $first_name = implode( ' ', $parts ); } $addr_street = isset( $_POST['stripeBillingAddressLine1'] ) ? sanitize_text_field( $_POST['stripeBillingAddressLine1'] ) : ''; $addr_zip = isset( $_POST['stripeBillingAddressZip'] ) ? sanitize_text_field( $_POST['stripeBillingAddressZip'] ) : ''; $addr_city = isset( $_POST['stripeBillingAddressCity'] ) ? sanitize_text_field( $_POST['stripeBillingAddressCity'] ) : ''; $addr_state = isset( $_POST['stripeBillingAddressState'] ) ? sanitize_text_field( $_POST['stripeBillingAddressState'] ) : ''; $addr_country = isset( $_POST['stripeBillingAddressCountry'] ) ? sanitize_text_field( $_POST['stripeBillingAddressCountry'] ) : ''; if ( empty( $addr_street ) && ! empty( $charge->source->address_line1 ) ) { $addr_street = $charge->source->address_line1; } if ( empty( $addr_zip ) && ! empty( $charge->source->address_zip ) ) { $addr_zip = $charge->source->address_zip; } if ( empty( $addr_city ) && ! empty( $charge->source->address_city ) ) { $addr_city = $charge->source->address_city; } if ( empty( $addr_state ) && ! empty( $charge->source->address_state ) ) { $addr_state = $charge->source->address_state; } if ( empty( $addr_country ) && ! empty( $charge->source->address_country ) ) { $addr_country = $charge->source->address_country; } //get address from new API payment data $ipn = ASP_Process_IPN_NG::get_instance(); if ( isset( $ipn->p_data ) ) { $addr = $ipn->p_data->get_billing_details(); if ( $addr ) { if ( empty( $addr_street ) && ! empty( $addr->line1 ) ) { $addr_street = $addr->line1; } if ( empty( $addr_zip ) && ! empty( $addr->postal_code ) ) { $addr_zip = $addr->postal_code; } if ( empty( $addr_city ) && ! empty( $addr->city ) ) { $addr_city = $addr->city; } if ( empty( $addr_state ) && ! empty( $addr->state ) ) { $addr_state = $addr->state; } if ( empty( $addr_country ) && ! empty( $addr->country ) ) { $addr_country = $addr->country; } } } if ( ! empty( $addr_country ) ) { //convert country code to country name $countries = ASP_Utils::get_countries_untranslated(); if ( isset( $countries[ $addr_country ] ) ) { $addr_country = $countries[ $addr_country ]; } } $ipn_data = array( 'payer_email' => $data['stripeEmail'], 'first_name' => $first_name, 'last_name' => $last_name, 'txn_id' => $data['txn_id'], 'address_street' => $addr_street, 'address_city' => $addr_city, 'address_state' => $addr_state, 'address_zip' => $addr_zip, 'address_country' => $addr_country, ); ASP_Debug_Logger::log( 'Calling eMember_handle_subsc_signup_stand_alone' ); $emember_id = ''; if ( class_exists( 'Emember_Auth' ) ) { //Check if the user is logged in as a member. $emember_auth = Emember_Auth::getInstance(); $emember_id = $emember_auth->getUserInfo( 'member_id' ); } if ( defined( 'WP_EMEMBER_PATH' ) ) { require_once WP_EMEMBER_PATH . 'ipn/eMember_handle_subsc_ipn_stand_alone.php'; eMember_handle_subsc_signup_stand_alone( $ipn_data, $level_id, $data['txn_id'], $emember_id ); } } public function handle_wp_pdf_stamper( $data, $prod_id ) { $pdf_stamper_enabled = get_post_meta( $prod_id, 'asp_product_pdf_stamper_enabled', true ); $item_url = get_post_meta( $prod_id, 'asp_product_upload', true ); if ( $pdf_stamper_enabled && ! empty( $item_url ) && strpos( strtolower( basename( $item_url ) ), '.pdf' ) !== false ) { $ipn = ASP_Process_IPN_NG::get_instance(); $billing_addr = $ipn->p_data->get_billing_details(); $b_addr = $billing_addr->line1 . ', ' . $billing_addr->city . ', ' . ( isset( $billing_addr->state ) ? $billing_addr->state . ', ' : '' ) . $billing_addr->postal_code . ', ' . $billing_addr->country; $additional_params = array( 'product_name' => $data['item_name'], 'transaction_id' => $data['txn_id'], ); $res = pdf_stamper_stamp_internal_file( $item_url, $data['customer_name'], $data['stripeEmail'], '', $b_addr, '', '', '', '', $additional_params ); if ( empty( $res ) ) { return $data; } $res_arr = explode( " \n", $res ); if ( isset( $res_arr[0] ) && 'Success!' === $res_arr[0] ) { $data['item_url'] = $res_arr[1]; } } return $data; } public function check_token( $item ) { $disable_token_check = $this->main->get_setting( 'disable_security_token_check' ); if ( $disable_token_check ) { return; } $button_key = $item->get_button_key(); $token = isset( $_POST['token'] ) ? sanitize_text_field( stripslashes ( $_POST['token'] ) ) : ''; $g_token = ASP_Utils::get_visitor_token( $button_key ); if ( empty( $token ) || $g_token !== $token ) { $out = array(); $out['success'] = false; $out['err'] = __( 'Invalid security token.', 'stripe-payments' ); wp_send_json( $out ); } } public function check_rate_limit() { //disabled for now return; $limit = 5; $tdata = get_transient( 'asp_ng_throttle_data' ); $tdata = empty( $tdata ) ? array() : $tdata; array_push( $tdata, time() ); foreach ( $tdata as $key => $req ) { if ( $req < ( time() + 60 ) ) { unset( $tdata[ $key ] ); } } set_transient( 'asp_ng_throttle_data', $tdata ); if ( count( $tdata ) > $limit ) { $out = array(); $out['success'] = false; $out['err'] = __( 'Rate limit exceeded. Please try again later.', 'stripe-payments' ); wp_send_json( $out ); } } public function tax_variations( $item ) { $tax_variations_arr = $item->get_meta( 'asp_product_tax_variations' ); if ( empty( $tax_variations_arr ) ) { return $item; } $this->tax_variations_arr = $tax_variations_arr; $this->item = $item; add_filter( 'asp_ng_before_customer_create_update', array( $this, 'tax_variations_check_apply' ), 10, 2 ); add_filter( 'asp_ng_sub_confirm_token_customer_opts', array( $this, 'tax_variations_check_apply' ) ); return $this->item; } public function tax_variations_check_apply( $cust_opts ) { ASP_Debug_Logger::log_array_data( $cust_opts ); if ( empty( $cust_opts['address'] ) ) { return $cust_opts; } if ( empty( $this->tax_variations_arr ) ) { return $cust_opts; } $tax_variations_type = $this->item->get_meta('asp_product_tax_variations_type'); if ($tax_variations_type == 's'){ $new_tax = ASP_Utils::get_tax_variations_tax( $this->tax_variations_arr, empty( $cust_opts['shipping']['address']['country'] ) ? '' : $cust_opts['shipping']['address']['country'], empty( $cust_opts['shipping']['address']['state'] ) ? '' : $cust_opts['shipping']['address']['state'], empty( $cust_opts['shipping']['address']['city'] ) ? '' : $cust_opts['shipping']['address']['city'] ); } else { $new_tax = ASP_Utils::get_tax_variations_tax( $this->tax_variations_arr, empty( $cust_opts['address']['country'] ) ? '' : $cust_opts['address']['country'], empty( $cust_opts['address']['state'] ) ? '' : $cust_opts['address']['state'], empty( $cust_opts['address']['city'] ) ? '' : $cust_opts['address']['city'] ); } if ( false !== $new_tax ) { $this->item->set_tax( $new_tax ); } return $cust_opts; } public function tax_variations_addon( $data, $prod_id ) { if ( empty( $data['tax_variations'] ) ) { return $data; } $addon = array( 'name' => 'aspTaxVariations', 'handler' => 'aspTaxVariationsNG', ); $data['addons'][] = $addon; return $data; } public function daily_txn_limit($data,$charge) { $captcha_type = $this->main->get_setting('captcha_type'); $asp_daily_txn_counter_obj = new ASP_Daily_Txn_Counter(); if (empty( $captcha_type ) || $captcha_type == 'none' ) { $asp_daily_txn_counter_obj->asp_increment_daily_txn_counter(); } else if($asp_daily_txn_counter_obj->asp_is_daily_tnx_limit_with_captcha_enabled()){ $asp_daily_txn_counter_obj->asp_increment_daily_txn_counter(); } } } new ASP_Self_Hooks_Handler();