39347-vm/wp-content/plugins/stripe-payments/includes/class-asp-self-hooks-handler.php
2026-03-27 15:53:29 +00:00

413 lines
13 KiB
PHP

<?php
class ASP_Self_Hooks_Handler {
private $main;
public function __construct() {
$this->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();