query_vars, get_the_permalink() . '?better_payment_paypal_status=success&better_payment_widget_id=' . $widget_id ); $cancel_url = add_query_arg( $wp->query_vars, get_the_permalink() . '?better_payment_error_status=error&better_payment_widget_id=' . $widget_id ); ob_start(); $error_info = [ 'business_email' => !empty($settings['better_payment_paypal_business_email']) ]; ?> bp_allowed_tags() ); } /** * Paystack button * * @since 0.0.1 */ public static function paystack_button( $widget_id = '' , $settings = [], $args = [] ) { $args['extra_classes'] = ! empty( $args['extra_classes'] ) ? $args['extra_classes'] : ''; $args['extra_classes'] = is_array($args['extra_classes']) ? implode(' ', $args['extra_classes']) : $args['extra_classes']; $args['button_text_default'] = ! empty( $args['button_text_default'] ) ? sanitize_text_field( $args['button_text_default'] ) : 'Proceed to Payment'; $paystack_button_text = ! empty( $settings["better_payment_form_form_buttons_paystack_button_text"] ) ? sanitize_text_field( $settings["better_payment_form_form_buttons_paystack_button_text"] ) : __( $args['button_text_default'], 'better-payment' ); ob_start(); ?> bp_allowed_tags() ); } public static function hide_show_payment_button_class( $settings, $type = 'paypal' ){ $button_hidden_class = 'is-hidden'; $types = ['paypal', 'stripe', 'paystack']; if( ! in_array($type, $types) ){ return $button_hidden_class; } $is_type_enable = ! empty( $settings[ "better_payment_form_{$type}_enable" ] ) && 'yes' === $settings[ "better_payment_form_{$type}_enable" ]; if( ! $is_type_enable ){ return $button_hidden_class; } $is_paypal_enable = ! empty( $settings[ "better_payment_form_paypal_enable" ] ) && 'yes' === $settings[ "better_payment_form_paypal_enable" ]; $is_stripe_enable = ! empty( $settings[ "better_payment_form_stripe_enable" ] ) && 'yes' === $settings[ "better_payment_form_stripe_enable" ]; $is_paystack_enable = ! empty( $settings[ "better_payment_form_paystack_enable" ] ) && 'yes' === $settings[ "better_payment_form_paystack_enable" ]; switch( $type ){ case 'paypal': $button_hidden_class = ''; break; case 'stripe': if( ( ! $is_paypal_enable ) ){ $button_hidden_class = ''; } break; case 'paystack': if( ( ! $is_paypal_enable ) && ( ! $is_stripe_enable ) ){ $button_hidden_class = ''; } break; default: break; } return $button_hidden_class; } /** * Payment create in db * * @since 0.0.1 */ public static function payment_create( $data ) { global $wpdb; $table = "{$wpdb->prefix}better_payment"; $wpdb->insert( $table, $data ); if ( $wpdb->insert_id ) { return $wpdb->insert_id; } else { return false; } } /** * Mamage response * * @since 0.0.1 */ public static function manage_response( $settings = [], $widget_id = '' ) { $status = false; //if widget id is different then return false if ( !empty( $_REQUEST[ 'better_payment_widget_id' ] ) && $_REQUEST[ 'better_payment_widget_id' ] !== $widget_id ) { return $status; } if ( !empty( $_REQUEST[ 'better_payment_error_status' ] ) ) { // Determine order_id based on payment method $order_id = ''; if ( !empty( $_REQUEST['better_payment_stripe_id'] ) ) { $order_id = sanitize_text_field( $_REQUEST['better_payment_stripe_id'] ); } elseif ( !empty( $_REQUEST['better_payment_paystack_id'] ) ) { $order_id = sanitize_text_field( $_REQUEST['better_payment_paystack_id'] ); } elseif ( !empty( $_REQUEST['better_payment_paypal_id'] ) ) { $order_id = sanitize_text_field( $_REQUEST['better_payment_paypal_id'] ); } // Fetch transaction data from database $transaction_data = self::get_failed_transaction_data( $order_id ); self::failed_message_template( $settings, $transaction_data ); $redirection_url_error = ! empty( $settings['better_payment_form_error_page_url']['url'] ) ? esc_url( $settings['better_payment_form_error_page_url']['url'] ) : ''; if( $redirection_url_error ){ ?>

prefix}better_payment"; $row = $wpdb->get_row( $wpdb->prepare( "SELECT transaction_id, status, email, amount, currency FROM $table WHERE order_id = %s LIMIT 1", $item_number ) ); // No matching order — reject (prevents fake success display with forged item_number). if ( empty( $row ) ) { return false; } // IPN confirmed — return verified DB data. if ( $row->status === 'Completed' ) { return [ 'amount' => floatval( $row->amount ), 'email' => sanitize_email( $row->email ), 'transaction_id' => sanitize_text_field( $row->transaction_id ), 'currency' => sanitize_text_field( $row->currency ), 'method' => 'paypal', ]; } // Order exists but IPN hasn't arrived yet — signal pending so JS can poll. return [ 'pending' => true, 'order_id' => $item_number ]; } /** * AJAX: check whether a PayPal order has been confirmed by IPN. * * Called by the frontend polling loop after the user lands on the return URL * before the IPN fires. Returns {status:'pending'} or {status:'completed'}. * * Lives on Handler (not Actions) so it can be registered unconditionally — * PayPal payments flow through the block/campaign path without Elementor. */ public static function check_paypal_status() { check_ajax_referer( 'better-payment', 'security' ); $order_id = ! empty( $_POST['order_id'] ) ? sanitize_text_field( $_POST['order_id'] ) : ''; if ( empty( $order_id ) ) { wp_send_json_error( [ 'message' => 'Missing order_id' ] ); } global $wpdb; $table = "{$wpdb->prefix}better_payment"; $row = $wpdb->get_row( $wpdb->prepare( "SELECT status FROM $table WHERE order_id = %s LIMIT 1", $order_id ) ); if ( empty( $row ) ) { wp_send_json_error( [ 'message' => 'Order not found' ] ); } if ( $row->status === 'Completed' ) { wp_send_json_success( [ 'status' => 'completed' ] ); } wp_send_json_success( [ 'status' => 'pending' ] ); } /** * PayPal IPN listener. * * PayPal POSTs the raw IPN body here server-to-server. We echo it back with * cmd=_notify-validate; only a VERIFIED response from PayPal's servers triggers * the DB write. The browser return URL (paypal_payment_success) never writes. * * @since 2.1.3 */ public static function handle_paypal_ipn() { $raw_post = file_get_contents( 'php://input' ); if ( empty( $raw_post ) ) { status_header( 400 ); exit; } $data = []; wp_parse_str( $raw_post, $data ); // PayPal includes test_ipn=1 for sandbox notifications. $verify_url = ! empty( $data['test_ipn'] ) ? 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr' : 'https://ipnpb.paypal.com/cgi-bin/webscr'; $response = wp_remote_post( $verify_url, [ 'body' => 'cmd=_notify-validate&' . $raw_post, 'timeout' => 30, 'sslverify' => true, 'headers' => [ 'Content-Type' => 'application/x-www-form-urlencoded' ], ] ); // Always respond 200 to PayPal to prevent retries, but only act on VERIFIED. if ( is_wp_error( $response ) || wp_remote_retrieve_body( $response ) !== 'VERIFIED' ) { status_header( 200 ); exit; } $data = array_map( 'sanitize_text_field', $data ); if ( empty( $data['payment_status'] ) || empty( $data['item_number'] ) || $data['payment_status'] !== 'Completed' ) { status_header( 200 ); exit; } global $wpdb; $table = "{$wpdb->prefix}better_payment"; $results = $wpdb->get_row( $wpdb->prepare( "SELECT id, amount, currency, form_fields_info, referer FROM $table WHERE order_id = %s AND status IS NULL LIMIT 1", $data['item_number'] ) ); if ( empty( $results->id ) ) { status_header( 200 ); exit; } // Validate receiver_email matches the merchant's configured PayPal email. $form_info = maybe_unserialize( $results->form_fields_info ); $expected_email = ! empty( $form_info['paypal_business_email'] ) ? strtolower( $form_info['paypal_business_email'] ) : ''; $receiver = ! empty( $data['receiver_email'] ) ? strtolower( $data['receiver_email'] ) : ( ! empty( $data['business'] ) ? strtolower( $data['business'] ) : '' ); if ( $expected_email && $receiver && $expected_email !== $receiver ) { status_header( 200 ); exit; } // Validate the paid amount is not less than the expected order amount. $paid_amount = ! empty( $data['mc_gross'] ) ? floatval( $data['mc_gross'] ) : 0; if ( $paid_amount < floatval( $results->amount ) ) { status_header( 200 ); exit; } // Validate currency matches. $paid_currency = ! empty( $data['mc_currency'] ) ? strtoupper( $data['mc_currency'] ) : ''; if ( $paid_currency && $results->currency && strtoupper( $results->currency ) !== $paid_currency ) { status_header( 200 ); exit; } $txn_id = ! empty( $data['txn_id'] ) ? $data['txn_id'] : ''; // Prevent txn_id replay: reject if this transaction ID was already recorded. if ( $txn_id ) { $existing = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table WHERE transaction_id = %s LIMIT 1", $txn_id ) ); if ( $existing ) { status_header( 200 ); exit; } } $payer_email = ! empty( $data['payer_email'] ) ? sanitize_email( $data['payer_email'] ) : ''; $updated = $wpdb->update( $table, [ 'transaction_id' => $txn_id, 'status' => $data['payment_status'], 'email' => $payer_email, 'customer_info' => maybe_serialize( $data ), ], [ 'ID' => $results->id ] ); if ( false !== $updated ) { $is_elementor_form = ! empty( $results->referer ) && $results->referer === 'elementor-form' ? 1 : 0; // Rebuild the e-mail settings persisted at payment-create time. IPN runs // server-to-server with no live widget context, so without this the body // would collapse to the bare transaction id (every section flag defaults // to 0). Legacy / pending rows created before this fix fall back to []. $email_settings = ! empty( $form_info['email_settings'] ) && is_array( $form_info['email_settings'] ) ? $form_info['email_settings'] : []; // Mirror the Stripe / Paystack gate: honour the form's "Send Email" toggle, // and always e-mail for Elementor Pro Form submissions. if ( ( isset( $email_settings['better_payment_form_email_enable'] ) && 'yes' === $email_settings['better_payment_form_email_enable'] ) || $is_elementor_form ) { self::better_email_notification( $txn_id, $payer_email, $email_settings, 'PayPal', $results->form_fields_info, $is_elementor_form ); } } status_header( 200 ); exit; } /** * Stripe payment success * * @since 0.0.1 */ public static function stripe_payment_success( $settings = [] ) { $data = $_REQUEST; if ( !empty( $data[ 'better_payment_stripe_id' ] ) ) { global $wpdb; $table = "{$wpdb->prefix}better_payment"; $results = $wpdb->get_row( $wpdb->prepare( "SELECT id, obj_id, amount, transaction_id, currency, form_fields_info, referer FROM $table WHERE order_id=%s and status = 'unpaid' limit 1", sanitize_text_field( $data[ 'better_payment_stripe_id' ] ) ) ); if ( !empty( $results->obj_id ) && !empty( $settings[ 'better_payment_stripe_secret_key' ] ) ) { $header = array( 'Authorization' => 'Basic ' . base64_encode( sanitize_text_field( $settings[ 'better_payment_stripe_secret_key' ] ) . ':' ), 'Stripe-Version' => '2019-05-16', ); $request = [ 'expand' => [ 'subscription.latest_invoice.payment_intent', 'payment_intent' ] ]; $form_fields_info = maybe_unserialize($results->form_fields_info); $is_payment_recurring = ! empty( $form_fields_info['mode'] ) && 'subscription' === $form_fields_info['mode']; $is_payment_split_payment = ( $is_payment_recurring ) && ( ! empty( $form_fields_info['is_payment_split_payment'] ) && 1 === intval( $form_fields_info['is_payment_split_payment'] ) ); $action_data = [ 'form_fields_info' => $form_fields_info, 'is_payment_recurring' => $is_payment_recurring, 'is_payment_split_payment' => $is_payment_split_payment, 'checkout_session_id' => $results->obj_id, ]; $response = wp_safe_remote_post( 'https://api.stripe.com/v1/checkout/sessions/' . $results->obj_id, array( 'method' => 'GET', 'headers' => $header, 'timeout' => 70, 'body' => $request ) ); if ( is_wp_error( $response ) || empty( $response[ 'body' ] ) ) { return new \WP_Error( 'stripe_error', __( 'There was a problem connecting to the Stripe API endpoint.', 'better-payment' ) ); } $response = json_decode( $response[ 'body' ] ); $transaction_id = ! empty( $results->transaction_id ) ? sanitize_text_field( $results->transaction_id ) : ''; if ( $is_payment_recurring && ! empty( $response->subscription->id ) ) { $transaction_id = sanitize_text_field( $response->subscription->id ); $subscription_obj = $response->subscription; $form_fields_info['subscription_id'] = sanitize_text_field( $transaction_id ); $form_fields_info['subscription_customer_id'] = ! empty( $response->customer ) ? sanitize_text_field( $response->customer ) : ''; $form_fields_info['subscription_plan_id'] = ! empty( $subscription_obj->items->data[0]->plan->id ) ? sanitize_text_field( $subscription_obj->items->data[0]->plan->id ) : ''; $form_fields_info['subscription_interval'] = ! empty( $subscription_obj->items->data[0]->plan->interval_count ) ? intval( $subscription_obj->items->data[0]->plan->interval_count ) : ''; $form_fields_info['subscription_interval'] .= ! empty( $subscription_obj->items->data[0]->plan->interval ) ? ' ' . sanitize_text_field( $subscription_obj->items->data[0]->plan->interval ) : $form_fields_info['subscription_interval']; $form_fields_info['subscription_current_period_start'] = ! empty( $subscription_obj->current_period_start ) ? intval( $subscription_obj->current_period_start ) : 0; $form_fields_info['subscription_current_period_end'] = ! empty( $subscription_obj->current_period_end ) ? intval( $subscription_obj->current_period_end ) : 0; $form_fields_info['subscription_status'] = sanitize_text_field( $response->status ); $form_fields_info['subscription_created_date'] = sanitize_text_field( $subscription_obj->created ); } if ( isset( $response->error->message ) ) { return new \WP_Error( 'stripe_error', __( 'There was a problem connecting to the Stripe API endpoint.', 'better-payment' ) ); } $customer_email = $is_payment_recurring && ( ! empty( $response->customer_email ) ) ? sanitize_email( $response->customer_email ) : ''; $customer_email_optional = ''; if ( isset( $response->payment_intent ) && isset( $response->payment_intent->charges ) && isset( $response->payment_intent->charges->data ) && ! empty( $response->payment_intent->charges->data ) ) { $charge = current( $response->payment_intent->charges->data ); if ( isset( $charge->billing_details ) && isset( $charge->billing_details->email ) && ! empty( $charge->billing_details->email ) ) { $customer_email_optional = sanitize_email( $charge->billing_details->email ); } } $form_fields_info['is_coupon_applied'] = 0; $exact_paid_amount = ! empty( $response->amount_total ) ? floatval( $response->amount_total ) : $results->amount * 100; $exact_paid_amount = $exact_paid_amount / 100; $form_fields_info['exact_paid_amount'] = $exact_paid_amount; if( (int)$exact_paid_amount != (int)$results->amount ) { $form_fields_info['paid_amount_diff'] = $results->amount - $exact_paid_amount; $form_fields_info['is_coupon_applied'] = 1; } $updated = $wpdb->update( $table, array( 'amount' => $exact_paid_amount, 'status' => sanitize_text_field( $response->payment_status ), 'email' => $is_payment_recurring ? $customer_email : $customer_email_optional, 'customer_info' => maybe_serialize( $response ), 'form_fields_info' => maybe_serialize( $form_fields_info ), 'transaction_id' => $transaction_id, ), array( 'ID' => $results->id ) ); do_action('better_payment/stripe_payment/success', $action_data); do_action( 'better_payment/payment_confirmed', (int) $results->id ); $frontend_data = [ 'amount' => $exact_paid_amount, 'email' => $is_payment_recurring ? $customer_email : $customer_email_optional, 'transaction_id' => $transaction_id, 'currency' => ! empty( $results->currency ) ? $results->currency : __( 'USD', 'better-payment' ), 'method' => 'stripe', 'is_payment_recurring' => $is_payment_recurring, 'is_payment_split_payment' => $is_payment_split_payment, 'is_payment_mixed' => ! empty( $form_fields_info['is_payment_mixed'] ) ? intval( $form_fields_info['is_payment_mixed'] ) : 0, 'mixed_payment_selected_type' => ! empty( $form_fields_info['mixed_payment_selected_type'] ) ? sanitize_text_field( $form_fields_info['mixed_payment_selected_type'] ) : '', ]; if ( $is_payment_split_payment ) { $total_amount = ! empty( $form_fields_info['split_payment_total_amount'] ) ? sanitize_text_field( $form_fields_info['split_payment_total_amount'] ) : 0; $total_installment = ! empty( $form_fields_info['split_payment_installment_iteration'] ) ? sanitize_text_field( $form_fields_info['split_payment_installment_iteration'] ) : 1; // $frontend_data['amount'] = floatval( $total_amount / $total_installment ); $frontend_data['total_amount'] = $total_amount; } if ( false !== $updated ) { //Send email notification $better_customer_email = $is_payment_recurring ? $customer_email : $customer_email_optional; if ( (isset($settings[ 'better_payment_form_email_enable' ]) && $settings[ 'better_payment_form_email_enable' ] == 'yes' ) || ( $results->referer === 'elementor-form' ) ) { $is_elementor_form = ! empty( $results->referer ) && $results->referer === 'elementor-form' ? 1 : 0; self::better_email_notification($transaction_id, $better_customer_email, $settings, 'Stripe', $results->form_fields_info, $is_elementor_form); } return $frontend_data; } } } return false; } /** * Paystack payment success * * @since 0.0.1 */ public static function paystack_payment_success( $settings = [] ) { $data = $_REQUEST; if ( ! empty( $data[ 'better_payment_paystack_id' ] ) ) { global $wpdb; $table = "{$wpdb->prefix}better_payment"; $results = $wpdb->get_row( $wpdb->prepare( "SELECT id,obj_id,transaction_id,form_fields_info,referer FROM $table WHERE order_id=%s and status = 'unpaid' limit 1", sanitize_text_field( $data[ 'better_payment_paystack_id' ] ) ) ); $header_info = array( 'Authorization' => 'Bearer ' . sanitize_text_field( $settings[ 'better_payment_paystack_secret_key' ] ), "Cache-Control: no-cache", ); $response = wp_safe_remote_get( 'https://api.paystack.co/transaction/verify/'. sanitize_text_field( $data[ 'reference' ] ), array( 'headers' => $header_info, 'timeout' => 70, ) ); $response = json_decode(wp_remote_retrieve_body($response)); if ( ! empty( $response->status ) ) { $updated = $wpdb->update( $table, array( 'status' => ! empty( $response->data->status ) ? sanitize_text_field( $response->data->status ) : '', 'amount' => ! empty( $response->data->amount ) ? floatval( ( $response->data->amount ) / 100 ) : 0, 'obj_id' => ! empty( $response->data->id ) ? sanitize_text_field( $response->data->id ) : '', 'transaction_id' => ! empty( $response->data->reference ) ? sanitize_text_field( $response->data->reference ) : '', 'customer_info' => ! empty( $response->data->customer ) ? maybe_serialize( $response->data->customer ) : '', 'email' => ! empty( $response->data->customer->email ) ? sanitize_email( $response->data->customer->email ) : '', ), array( 'ID' => $results->id ) ); do_action( 'better_payment/payment_confirmed', (int) $results->id ); } $better_customer_email = ! empty( $response->data->customer->email ) ? maybe_serialize( $response->data->customer->email ) : ''; $transaction_id = ! empty( $response->data->reference ) ? sanitize_text_field( $response->data->reference ) : ''; $frontend_data = [ 'amount' => ! empty( $response->data->amount ) ? floatval( ( $response->data->amount ) / 100 ) : 0, 'email' => ! empty( $better_customer_email ) ? $better_customer_email : '', 'transaction_id' => $transaction_id, 'currency' => ! empty( $response->data->currency ) ? sanitize_text_field( $response->data->currency ) : __( 'USD', 'better-payment' ), 'method' => 'paystack', ]; if ( ! empty( $updated ) && $better_customer_email ) { //Send email notification if ( (isset($settings[ 'better_payment_form_email_enable' ]) && $settings[ 'better_payment_form_email_enable' ] == 'yes' ) || ( $results->referer === 'elementor-form' ) ) { $is_elementor_form = ! empty( $results->referer ) && $results->referer === 'elementor-form' ? 1 : 0; self::better_email_notification($transaction_id, $better_customer_email, $settings, 'Paystack', $results->form_fields_info, $is_elementor_form); } do_action( 'better_payment/payment/success', sanitize_text_field( $data['better_payment_paystack_id'] ?? '' ), (int) $results->id, 'paystack' ); return $frontend_data; } } return false; } /** * Success message template * * @since 0.0.1 */ public static function success_message_template( $settings = [], $tr_id = '' ) { if ( empty( $tr_id ) || is_wp_error($tr_id)) { return false; } wp_enqueue_script('better-payment-admin-script'); $image_url = BETTER_PAYMENT_ASSETS . '/img/success.svg'; $show_icon = 0; $default_icon = 1; $helper_obj = new Helper(); $store_name = ( isset( $settings['better_payment_form_payment_source'] ) && $settings['better_payment_form_payment_source'] === 'manual' && !empty( $settings['better_payment_form_title'] ) ) ? esc_html($settings['better_payment_form_title']) : esc_html( get_bloginfo('name') ); $payment_desc_text = !empty( $settings['better_payment_form_success_message_heading'] ) ? esc_html($settings['better_payment_form_success_message_heading']) : esc_html( __('You paid', 'better-payment') . ' [currency_symbol][amount] ' . __('to', 'better-payment') . ' [store_name]'); $bp__currency_symbol = esc_html( ! empty( $tr_id['currency'] ) ? $helper_obj->get_currency_symbol( $tr_id['currency'] ) : '' ); $payment_desc_text = str_replace( '[currency_symbol]', '' . $bp__currency_symbol . '', $payment_desc_text ); $payment_desc_text = str_replace( '[amount]', '' . esc_html( ! empty( $tr_id['amount'] ) ? $tr_id['amount'] : 0 ) . '', $payment_desc_text ); $payment_desc_text = str_replace( '[store_name]', '' . esc_html( $store_name ) . '', $payment_desc_text ); $payment_mail_text = !empty( $settings['better_payment_form_success_message_sub_heading'] ) ? esc_html($settings['better_payment_form_success_message_sub_heading']) : esc_html( __('Payment Confirmation email will be sent to ', 'better-payment') . '[customer_email]'); $payment_mail_text = str_replace( '[customer_email]', '' . esc_html( ! empty( $tr_id['email'] ) ? $tr_id['email'] : '' ) . '', $payment_mail_text ); if ( !empty( $settings[ 'better_payment_form_success_message_icon' ][ 'library' ] ) ) { if ( $settings[ 'better_payment_form_success_message_icon' ][ 'library' ] == 'svg' ) { $image_url = $settings[ 'better_payment_form_success_message_icon' ][ 'value' ][ 'url' ]; $default_icon = 0; } else { $show_icon = 1; $image_url = $settings[ 'better_payment_form_success_message_icon' ][ 'value' ]; $default_icon = 0; } } $allowed_payment_methods = [ 'paypal' => BETTER_PAYMENT_ASSETS . '/img/paypal-2.svg', 'stripe' => BETTER_PAYMENT_ASSETS . '/img/stripe-2.svg', 'paystack' => BETTER_PAYMENT_ASSETS . '/img/paystack-2.svg', ]; $payment_method_logo = isset( $tr_id['method'] ) && isset( $allowed_payment_methods[ $tr_id['method'] ] ) ? $allowed_payment_methods[ $tr_id['method'] ] : ''; $better_payment_form_success_message_thanks = !empty( $settings['better_payment_form_success_message_thanks'] ) ? esc_html( $settings['better_payment_form_success_message_thanks'] ) : esc_html__('Thank You!', 'better-payment'); $better_payment_form_success_message_transaction = !empty( $settings['better_payment_form_success_message_transaction'] ) ? esc_html__( $settings['better_payment_form_success_message_transaction'], 'better-payment' ) : esc_html__('Transaction ID', 'better-payment'); $better_payment_form_success_message_amount_text = !empty( $settings['better_payment_form_success_message_amount_text'] ) ? esc_html( $settings['better_payment_form_success_message_amount_text'] ) : esc_html__( 'Amount', 'better-payment' ); $better_payment_form_success_message_currency_text = !empty( $settings['better_payment_form_success_message_currency_text'] ) ? esc_html( $settings['better_payment_form_success_message_currency_text'] ) : esc_html__( 'Currency', 'better-payment' ); $better_payment_form_success_message_pay_method_text = !empty( $settings['better_payment_form_success_message_pay_method_text'] ) ? esc_html( $settings['better_payment_form_success_message_pay_method_text'] ) : esc_html__( 'Payment Method', 'better-payment' ); $better_payment_form_success_message_pay_type_text = !empty( $settings['better_payment_form_success_message_pay_type_text'] ) ? esc_html( $settings['better_payment_form_success_message_pay_type_text'] ) : esc_html__( 'Payment Type', 'better-payment' ); $better_payment_form_payment_type = !empty( $settings['better_payment_form_payment_type'] ) ? esc_html( $settings['better_payment_form_payment_type'] ) : ''; if ( ! empty( $better_payment_form_payment_type ) ) { if ( 'one-time' === $better_payment_form_payment_type ) { $better_payment_form_payment_type_value = esc_html__( 'One Time Payment', 'better-payment' ); } elseif ( 'recurring' === $better_payment_form_payment_type ) { $better_payment_form_payment_type_value = esc_html__( 'Recurring Payment', 'better-payment' ); } elseif ( 'mixed' === $better_payment_form_payment_type ) { $mixed_payment_selected_type = ! empty( $tr_id['mixed_payment_selected_type'] ) ? sanitize_text_field( $tr_id['mixed_payment_selected_type'] ) : ''; $is_mixed_recurring = 'recurring' === $mixed_payment_selected_type; if ( empty( $mixed_payment_selected_type ) ) { $is_mixed_recurring = ! empty( $tr_id['is_payment_recurring'] ) && empty( $tr_id['is_payment_split_payment'] ); } $better_payment_form_payment_type_value = $is_mixed_recurring ? esc_html__( 'Recurring Payment', 'better-payment' ) : esc_html__( 'One Time Payment', 'better-payment' ); } else { $better_payment_form_payment_type_value = esc_html__( 'Split Payment', 'better-payment' ); } } $better_payment_form_success_message_merchant_details_text = !empty( $settings['better_payment_form_success_message_merchant_details_text'] ) ? esc_html( $settings['better_payment_form_success_message_merchant_details_text'] ) : esc_html__( 'Merchant Details', 'better-payment' ); $better_payment_form_success_message_merchant_details_value = isset( $settings['better_payment_form_payment_source'] ) && $settings['better_payment_form_payment_source'] === 'manual' && ! empty( $settings['better_payment_form_title'] ) ? esc_html($settings['better_payment_form_title']) : esc_html( get_bloginfo( 'name' ) ); $better_payment_form_success_message_paid_amount_text = !empty( $settings['better_payment_form_success_message_paid_amount_text'] ) ? esc_html( $settings['better_payment_form_success_message_paid_amount_text'] ) : esc_html__( 'Paid Amount', 'better-payment' ); $better_payment_form_success_message_purchase_details_text = !empty( $settings['better_payment_form_success_message_purchase_details_text'] ) ? esc_html( $settings['better_payment_form_success_message_purchase_details_text'] ) : esc_html__( 'Purchase Details', 'better-payment' ); $better_payment_form_success_message_print_text = !empty( $settings['better_payment_form_success_message_print_text'] ) ? esc_html( $settings['better_payment_form_success_message_print_text'] ) : esc_html__( 'Print', 'better-payment' ); $better_payment_form_success_message_view_details_btn_text = !empty( $settings['better_payment_form_success_message_view_details_btn_text'] ) ? esc_html( $settings['better_payment_form_success_message_view_details_btn_text'] ) : esc_html__( 'View Details', 'better-payment' ); $better_payment_form_success_page_view_details_url = !empty( $settings['better_payment_form_success_page_view_details_url']['url'] ) ? esc_url( $settings['better_payment_form_success_page_view_details_url']['url'] ) : 'javascript:void(0)'; ?>

🎉

Better Payment wallet :

  • out of
  • find($settings['better_payment_form_fluentcart_product_id']); if ($fluentcart_product) { $product_names[] = sanitize_text_field( $fluentcart_product->post_title ); } } catch ( \Exception $e ) { // } endif; if( !empty( $settings['better_payment_form_fluentcart_product_ids'] ) && function_exists('fluentCart') && class_exists( '\FluentCart\App\Models\Product' ) ): $product_ids = $settings['better_payment_form_fluentcart_product_ids']; foreach( $product_ids as $product_id ): try { $fluentcart_product = \FluentCart\App\Models\Product::query()->find($product_id); if ($fluentcart_product) { $product_names[] = sanitize_text_field( $fluentcart_product->post_title ); } } catch ( \Exception $e ) { // } endforeach; endif; if( !empty($product_names) ): echo '' . implode( ', ', $product_names ) . ''; endif; ?>

Payment of to failed.

:

prefix}better_payment"; $result = $wpdb->get_row( $wpdb->prepare( "SELECT amount, currency, transaction_id, order_id, source FROM $table WHERE order_id=%s LIMIT 1", $order_id ) ); if ( !empty( $result ) ) { $helper_obj = new Helper(); return [ 'amount' => floatval( $result->amount ), 'currency' => sanitize_text_field( $result->currency ), 'currency_symbol' => $helper_obj->get_currency_symbol( $result->currency ), 'transaction_id' => !empty( $result->transaction_id ) ? sanitize_text_field( $result->transaction_id ) : 'N/A', 'method' => sanitize_text_field( $result->source ), ]; } return false; } /** * Whitelist the e-mail related settings that better_email_notification() reads. * * PayPal confirms payments asynchronously through the IPN listener * (handle_paypal_ipn), where the live Elementor widget / block settings are NOT * available. Stripe and Paystack build their e-mail synchronously on the return * page, so they still have the full settings array in hand. To reach parity we * persist this subset into the transaction's form_fields_info at payment-create * time, and the IPN handler rebuilds the same $settings to produce an identical * e-mail body (heading, From / To / Transaction Summary / footer sections, * subjects, headers) and to honour the "Send Email" on/off toggle. * * @param mixed $settings Full widget / block / form settings (guarded: non-array input returns []). * * @return array Whitelisted e-mail settings (safe to serialize into form_fields_info). * @since 2.2.2 */ public static function extract_email_settings( $settings = [] ) { $email_settings = []; if ( ! is_array( $settings ) ) { return $email_settings; } foreach ( $settings as $key => $value ) { if ( 0 === strpos( $key, 'better_payment_email_' ) || 0 === strpos( $key, 'better_payment_form_email_' ) || 'better_payment_form_title' === $key ) { $email_settings[ $key ] = $value; } } return $email_settings; } /** * Email template * * @since 0.0.1 */ public static function better_email_notification($transaction_id, $customer_email, $settings, $referrer='Stripe', $form_fields_info='', $is_elementor_form = 0){ //Send Email: customer and admin $better_txn_id = sanitize_text_field( $transaction_id ); $better_cus_email = sanitize_email( $customer_email ); $default_subject = sprintf(__('Better Payment transaction on %s', 'better-payment'), esc_html(get_option('blogname'))); $better_payment_global_settings = DB::get_settings(); $better_payment_email_to = !empty($better_payment_global_settings['better_payment_settings_general_email_to']) ? $better_payment_global_settings['better_payment_settings_general_email_to'] : get_option( 'admin_email' ); $better_payment_email_subject = !empty($better_payment_global_settings['better_payment_settings_general_email_subject']) ? $better_payment_global_settings['better_payment_settings_general_email_subject'] : $default_subject; $better_payment_email_content = !empty($better_payment_global_settings['better_payment_settings_general_email_message_admin']) ? $better_payment_global_settings['better_payment_settings_general_email_message_admin'] : 'Email Content'; $better_payment_email_from = !empty($better_payment_global_settings['better_payment_settings_general_email_from_email']) ? $better_payment_global_settings['better_payment_settings_general_email_from_email'] : ''; $better_payment_email_from_name = !empty($better_payment_global_settings['better_payment_settings_general_email_from_name']) ? $better_payment_global_settings['better_payment_settings_general_email_from_name'] : ''; $better_payment_email_reply_to = !empty($better_payment_global_settings['better_payment_settings_general_email_reply_to']) ? $better_payment_global_settings['better_payment_settings_general_email_reply_to'] : ''; $better_payment_email_cc = !empty($better_payment_global_settings['better_payment_settings_general_email_cc']) ? $better_payment_global_settings['better_payment_settings_general_email_cc'] : ''; $better_payment_email_bcc = !empty($better_payment_global_settings['better_payment_settings_general_email_bcc']) ? $better_payment_global_settings['better_payment_settings_general_email_bcc'] : ''; $better_payment_email_content_type = !empty($better_payment_global_settings['better_payment_settings_general_email_send_as']) ? $better_payment_global_settings['better_payment_settings_general_email_send_as'] : 'html'; $better_payment_email_subject_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_subject_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_subject_customer'] : $default_subject; $better_payment_email_content_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_message_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_message_customer'] : 'Email Content'; $better_payment_email_from_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_from_email_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_from_email_customer'] : ''; $better_payment_email_from_name_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_from_name_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_from_name_customer'] : ''; $better_payment_email_reply_to_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_reply_to_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_reply_to_customer'] : ''; $better_payment_email_cc_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_cc_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_cc_customer'] : ''; $better_payment_email_bcc_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_bcc_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_bcc_customer'] : ''; $better_payment_email_content_type_customer = !empty($better_payment_global_settings['better_payment_settings_general_email_send_as_customer']) ? $better_payment_global_settings['better_payment_settings_general_email_send_as_customer'] : 'html'; $args = []; $args['email_form_name'] = ! empty( $settings['better_payment_form_title'] ) ? sanitize_text_field( $settings['better_payment_form_title'] ) : 'N/A'; $args['email_content_heading_show'] = ! empty( $settings['better_payment_email_content_heading'] ) && 'yes' === $settings['better_payment_email_content_heading'] ? 1 : 0; $args['email_content_from_section_show'] = ! empty( $settings['better_payment_email_content_from_section'] ) && 'yes' === $settings['better_payment_email_content_from_section'] ? 1 : 0; $args['email_content_to_section_show'] = ! empty( $settings['better_payment_email_content_to_section'] ) && 'yes' === $settings['better_payment_email_content_to_section'] ? 1 : 0; $args['email_content_transaction_summary_show'] = ! empty( $settings['better_payment_email_content_transaction_summary'] ) && 'yes' === $settings['better_payment_email_content_transaction_summary'] ? 1 : 0; $args['email_content_footer_text_show'] = ! empty( $settings['better_payment_email_content_footer_text'] ) && 'yes' === $settings['better_payment_email_content_footer_text'] ? 1 : 0; $args['email_content_customer'] = ! empty( $settings['better_payment_email_content_customer'] ) ? $settings['better_payment_email_content_customer'] : ''; $args['email_content_admin'] = ! empty( $settings['better_payment_email_content'] ) ? $settings['better_payment_email_content'] : ''; $args['is_elementor_form'] = $is_elementor_form; if ( ! empty( $settings['better_payment_email_content_greeting'] ) ) { $args['email_content_greeting'] = $settings['better_payment_email_content_greeting']; } if ( ! empty( $settings['better_payment_form_email_logo']['url'] ) ) { $args['email_logo_url'] = $settings['better_payment_form_email_logo']['url']; } if ( ! empty( $settings['better_payment_form_email_attachment']['id'] ) ) { $args['email_attachment_id'] = intval( $settings['better_payment_form_email_attachment']['id'] ); $args['email_attachment_path'] = get_attached_file( $args['email_attachment_id'] ); } if ( ! empty( $settings['better_payment_form_email_attachment_pdf_show'] ) && ! empty( $settings['better_payment_form_email_attachment_pdf']['id'] ) ) { $args['email_attachment_id'] = intval( $settings['better_payment_form_email_attachment_pdf']['id'] ); $args['email_attachment_path'] = get_attached_file( $args['email_attachment_id'] ); } if(isset($settings['better_payment_email_to'])){ $better_payment_email_to = sanitize_email($settings['better_payment_email_to']); } if(isset($settings['better_payment_email_subject'])){ $better_payment_email_subject = sanitize_text_field($settings['better_payment_email_subject']); } if(isset($settings['better_payment_email_subject_customer'])){ $better_payment_email_subject_customer = sanitize_text_field($settings['better_payment_email_subject_customer']); } if(isset($settings['better_payment_email_content_type'])){ $better_payment_email_content_type = sanitize_text_field($settings['better_payment_email_content_type']); } if(isset($settings['better_payment_email_content_type_customer'])){ $better_payment_email_content_type_customer = sanitize_text_field($settings['better_payment_email_content_type_customer']); } $args['email_content_type'] = $better_payment_email_content_type; $args['email_content_type_customer'] = $better_payment_email_content_type_customer; $line_break = $better_payment_email_content_type == 'html' ? '
' : "\n"; $line_break_customer = $better_payment_email_content_type_customer == 'html' ? '
' : "\n"; global $wpdb; $table = "{$wpdb->prefix}better_payment"; $transaction_obj = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE transaction_id=%s limit 1", sanitize_text_field( $transaction_id ) ) ); if(isset($settings['better_payment_email_content'])){ $better_payment_email_content = sanitize_text_field($settings['better_payment_email_content']); $better_payment_email_content = self::better_render_email_body( $better_payment_email_content, $form_fields_info, $line_break, 'admin', $transaction_obj, $args ); } else if ( !empty($better_payment_email_content) ){ $better_payment_email_content = self::better_render_email_body( $better_payment_email_content, $form_fields_info, $line_break, 'admin', $transaction_obj, $args ); } if(isset($settings['better_payment_email_content_customer'])){ $better_payment_email_content_customer = sanitize_text_field($settings['better_payment_email_content_customer']); $better_payment_email_content_customer = self::better_render_email_body( $better_payment_email_content_customer, $form_fields_info, $line_break_customer, 'customer', $transaction_obj, $args ); } else if ( !empty($better_payment_email_content_customer) ){ $better_payment_email_content_customer = self::better_render_email_body( $better_payment_email_content_customer, $form_fields_info, $line_break, 'customer', $transaction_obj, $args ); //$line_break_customer not used : need to check type on parent method and add headers accordingly. } if(isset($settings['better_payment_email_from'])){ $better_payment_email_from = sanitize_email($settings['better_payment_email_from']); } if(isset($settings['better_payment_email_from_name'])){ $better_payment_email_from_name = sanitize_text_field($settings['better_payment_email_from_name']); } if(isset($settings['better_payment_email_reply_to'])){ $better_payment_email_reply_to = sanitize_email($settings['better_payment_email_reply_to']); } if(isset($settings['better_payment_email_cc'])){ $better_payment_email_cc = sanitize_email($settings['better_payment_email_cc']); } if(isset($settings['better_payment_email_bcc'])){ $better_payment_email_bcc = sanitize_email($settings['better_payment_email_bcc']); } //Customer Email if(isset($settings['better_payment_email_from_customer'])){ $better_payment_email_from_customer = sanitize_email($settings['better_payment_email_from_customer']); } if(isset($settings['better_payment_email_from_name_customer'])){ $better_payment_email_from_name_customer = sanitize_text_field($settings['better_payment_email_from_name_customer']); } if(isset($settings['better_payment_email_reply_to_customer'])){ $better_payment_email_reply_to_customer = sanitize_email($settings['better_payment_email_reply_to_customer']); } if(isset($settings['better_payment_email_cc_customer'])){ $better_payment_email_cc_customer = sanitize_email($settings['better_payment_email_cc_customer']); } if(isset($settings['better_payment_email_bcc_customer'])){ $better_payment_email_bcc_customer = sanitize_email($settings['better_payment_email_bcc_customer']); } if($better_payment_email_content == ''){ $better_payment_email_content = __('New better payment transaction! ', 'better-payment'); } if($better_payment_email_content_customer == ''){ $better_payment_email_content_customer = __('New better payment transaction! ', 'better-payment'); } $better_payment_email_headers = []; $better_payment_email_headers_customer = []; if($better_payment_email_content_type == 'html'){ $better_payment_email_headers[] = 'Content-Type: text/html; charset=UTF-8'; } if($better_payment_email_content_type_customer == 'html'){ $better_payment_email_headers_customer[] = 'Content-Type: text/html; charset=UTF-8'; } if($better_payment_email_from != ''){ $better_payment_email_headers[] = "From: $better_payment_email_from_name <$better_payment_email_from>"; } if($better_payment_email_cc != ''){ $better_payment_email_headers[] = "Cc: <$better_payment_email_cc>"; } if($better_payment_email_bcc != ''){ $better_payment_email_headers[] = "BCc: $better_payment_email_bcc"; } if($better_payment_email_reply_to != ''){ $better_payment_email_headers[] = "Reply-To: $better_payment_email_reply_to"; } //Customer Email if($better_payment_email_from_customer != ''){ $better_payment_email_headers_customer[] = "From: $better_payment_email_from_name_customer <$better_payment_email_from_customer>"; } $form_fields_info_array = []; if( ! empty( $form_fields_info ) ){ $form_fields_info_array = maybe_unserialize( $form_fields_info ); } $form_fields_info_cus_email = ! empty( $form_fields_info_array['primary_email'] ) ? sanitize_email( $form_fields_info_array['primary_email'] ) : ''; if($better_payment_email_cc_customer != '' || ! empty( $form_fields_info_cus_email ) ){ $better_payment_email_cc_customer_multiple = implode(',', [$form_fields_info_cus_email, $better_payment_email_cc_customer]); $better_payment_email_headers_customer[] = "Cc: $better_payment_email_cc_customer_multiple"; } if($better_payment_email_bcc_customer != ''){ $better_payment_email_headers_customer[] = "BCc: $better_payment_email_bcc_customer"; } if($better_payment_email_reply_to_customer != ''){ $better_payment_email_headers_customer[] = "Reply-To: $better_payment_email_reply_to_customer"; } $email_attachments = ! empty( $args['email_attachment_path'] ) ? [ $args['email_attachment_path'] ] : []; $allowed_extensions = array('jpg', 'jpeg', 'png', 'pdf'); $file_info = count( $email_attachments ) ? pathinfo($email_attachments[0]) : []; $file_extension = count( $file_info ) ? strtolower($file_info['extension']) : ''; if ( ! in_array( $file_extension, $allowed_extensions ) ){ $email_attachments = []; } self::send_better_email($better_cus_email, $better_payment_email_subject_customer, $better_payment_email_content_customer, $better_payment_email_headers_customer, $email_attachments); //customer mail self::send_better_email($better_payment_email_to, $better_payment_email_subject, $better_payment_email_content, $better_payment_email_headers); //admin mail } /** * Sends an HTML email. * * @since 0.0.2 * * @param string $to * @param string $subject * @param array $message * * @return bool false indicates mail sending failed while true doesn't gurantee that mail sent. * true just indicate script processed successfully without any errors. * Ref: https://developer.wordpress.org/reference/functions/wp_mail/ */ public static function send_better_email( $to, $subject, $message, $headers=[], $attachments = [] ) { $response = false; $mailValidated = filter_var($to, FILTER_VALIDATE_EMAIL); if ($mailValidated) { $response = wp_mail( $to, $subject, $message, $headers, $attachments ); } return $response; } /** * Email body * * * @return string * @since 0.0.1 */ public static function better_render_email_body( $email_body, $form_fields_info, $line_break, $type = 'admin', $transaction_obj = null, $args = [] ) { $transaction_id = $currency = $payment_date = $customer_name = $customer_first_name = $customer_last_name = $amount = ''; $helper_obj = new Helper(); if(null !== $transaction_obj && is_object($transaction_obj)){ $transaction_id = $transaction_obj->transaction_id; $amount = $transaction_obj->amount; $status = $transaction_obj->status; $source = $transaction_obj->source; $currency = $transaction_obj->currency; $currency_symbol = $helper_obj->get_currency_symbol( esc_html($currency) ); $payment_date = wp_date(get_option('date_format').' '.get_option('time_format'), strtotime($transaction_obj->payment_date)); } $is_empty_email_body = empty($email_body); $email_body = do_shortcode( $email_body ); $bp_form_fields_html_content = $email_body; $bp_all_fields_shortcode = 'bp-all-fields'; $referer_content_page_link = '#'; $field_text = __('Field', 'better-payment'); $value_text = __('Entry', 'better-payment'); $form_fields_info_arr = maybe_unserialize($form_fields_info); $email_logo_url = ! empty( $args['email_logo_url'] ) ? $args['email_logo_url'] : ''; $email_content_greeting = ! empty( $args['email_content_greeting'] ) ? 1 : 0; $email_form_name = ! empty( $args['email_form_name'] ) ? $args['email_form_name'] : 'N/A'; $bp_form_fields_html_header = ''; $bp_form_fields_html_footer = "
"; $content = ''. $line_break; foreach ( $form_fields_info_arr as $key => $field ) { if ( $key === 'is_payment_split_payment' ) { $is_payment_split_payment = 1; } //Hide few fields if( $key === 'referer_page_id' || $key === 'referer_widget_id' || $key === 'source' || $key === 'el_form_fields' || $key === 'is_woo_layout' || $key === 'is_payment_split_payment' || $key === 'split_payment_total_amount' || $key === 'split_payment_total_amount_price_id' || $key === 'split_payment_installment_price_id' ) { if($key === 'referer_page_id'){ $referer_content_page_link = !empty($field) ? get_permalink( $field ) : $referer_content_page_link; } continue; } if($key === 'primary_first_name'){ $key = 'first_name'; $customer_first_name = $field; } if($key === 'primary_last_name'){ $key = 'last_name'; $customer_last_name = $field; } if($key === 'primary_email'){ $key = 'email'; } if($key === 'primary_payment_amount'){ $key = 'payment_amount'; } $key_formatted = self::better_title_case($key); if($key_formatted === 'Amount'){ $key_formatted = __('Paid', 'better-payment'); if ( ! empty( $is_payment_split_payment ) ) { $key_formatted = __('Product Price: ', 'better-payment'); } } $content .= " $key_formatted $field "; } if($customer_first_name) { $customer_name = $customer_first_name . ' '; } if($customer_last_name) { $customer_name .= $customer_last_name . ' '; } $allowed_sources = ['paypal', 'stripe', 'paystack']; $source_image_url = BETTER_PAYMENT_ASSETS . '/img/stripe.png'; $source_image_alt = 'Stripe'; if( in_array( strtolower( $transaction_obj->source ), $allowed_sources ) ){ $source_image_url = strtolower( $transaction_obj->source ) == 'paypal' ? BETTER_PAYMENT_ASSETS . '/img/paypal.png' : BETTER_PAYMENT_ASSETS . "/img/{$transaction_obj->source}.png"; $source_image_alt = strtolower( $transaction_obj->source ) == 'paypal' ? 'PayPal' : ucfirst( strtolower( $transaction_obj->source ) ); } $amount_quantity = ! empty( $form_fields_info_arr['amount_quantity'] ) ? intval( $form_fields_info_arr['amount_quantity'] ) : 1; // #ToDo Product id or ids with comma $woo_product_id = ! empty( $form_fields_info_arr['woo_product_id'] ) ? intval( $form_fields_info_arr['woo_product_id'] ) : 0; $fluentcart_product_id = ! empty( $form_fields_info_arr['fluentcart_product_id'] ) ? intval( $form_fields_info_arr['fluentcart_product_id'] ) : 0; $woo_product_ids = ! empty( $form_fields_info_arr['woo_product_ids'] ) ? maybe_unserialize( $form_fields_info_arr['woo_product_ids'] ) : [0]; $fluentcart_product_ids = ! empty( $form_fields_info_arr['fluentcart_product_ids'] ) ? maybe_unserialize( $form_fields_info_arr['fluentcart_product_ids'] ) : [0]; $product_name = ''; $product_permalink = ''; $product_image_src = ''; // Handle WooCommerce products if (function_exists('wc_get_product') && $woo_product_id ) { $bp_woocommerce_product = wc_get_product($woo_product_id); $product = $bp_woocommerce_product; if ($product) { $product_name = $product->get_name(); $product_permalink = get_permalink($product->get_id()); $product_price = $product->get_price(); $product_image_src_array = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ), 'single-post-thumbnail' ); $product_image_src = is_array( $product_image_src_array ) && count( $product_image_src_array ) ? $product_image_src_array[0] : ''; } } if (function_exists('fluentCart') && $fluentcart_product_id ) { try { $fluentcart_product = \FluentCart\App\Models\Product::query() ->with(['detail', 'variants']) ->find($fluentcart_product_id); if ($fluentcart_product) { $product_name = $fluentcart_product->post_title; $product_permalink = get_permalink($fluentcart_product->ID); // Get price from the first variant or detail $product_price = 0; if (!empty($fluentcart_product->variants) && count($fluentcart_product->variants) > 0) { $product_price = $fluentcart_product->variants[0]->item_price; } elseif (!empty($fluentcart_product->detail)) { $product_price = $fluentcart_product->detail->min_price; } $product_image_src_array = wp_get_attachment_image_src( get_post_thumbnail_id( $fluentcart_product->ID ), 'single-post-thumbnail' ); $product_image_src = is_array( $product_image_src_array ) && count( $product_image_src_array ) ? $product_image_src_array[0] : ''; } } catch ( \Exception $e ) { // Handle error silently } } $detailed_product_info = isset( $form_fields_info_arr['detailed_product_info'] ) ? maybe_unserialize( $form_fields_info_arr['detailed_product_info'] ) : []; $all_data = [ 'amount' => $amount, 'amount_quantity' => $amount_quantity, 'woo_product_id' => $woo_product_id, 'woo_product_ids' => $woo_product_ids, 'fluentcart_product_id' => $fluentcart_product_id, 'fluentcart_product_ids' => $fluentcart_product_ids, 'product_name' => $product_name, 'product_permalink' => $product_permalink, 'product_image_src' => $product_image_src, 'detailed_product_info' => $detailed_product_info, 'amount_single' => $amount_quantity > 0 ? floatval( $amount / $amount_quantity ) : $amount, 'currency' => ! empty( $currency ) ? $currency : '', 'currency_symbol' => ! empty( $currency_symbol ) ? $currency_symbol : '', 'payment_date_time' => ! empty( $payment_date ) ? $payment_date : '', 'transaction_id' => ! empty( $transaction_id ) ? $transaction_id : '', 'payment_date_only' => wp_date(get_option('date_format'), strtotime($transaction_obj->payment_date)), 'status' => ucfirst( $status ), 'form_fields_info_arr' => $form_fields_info_arr, // 'admin_name' => $admin_name, 'customer_name' => $customer_name, 'site_title' => get_bloginfo( 'name' ), 'site_admin_email' => get_bloginfo( 'admin_email' ), 'form_name' => $email_form_name, 'payment_method' => ucfirst( $source ), 'email_logo_url' => $email_logo_url, 'source_image_url' => $source_image_url, 'source_image_alt' => $source_image_alt, 'view_transaction_link' => admin_url("admin.php?page=better-payment-transactions&action=view&id={$transaction_obj->id}"), 'email_content_heading_show' => intval( $args['email_content_heading_show'] ), 'email_content_from_section_show' => intval( $args['email_content_from_section_show'] ), 'email_content_to_section_show' => intval( $args['email_content_to_section_show'] ), 'email_content_transaction_summary_show' => intval( $args['email_content_transaction_summary_show'] ), 'email_content_footer_text_show' => intval( $args['email_content_footer_text_show'] ), 'email_content_customer' => wp_kses_post( $args['email_content_customer'] ), 'email_content_admin' => wp_kses_post( $args['email_content_admin'] ), 'is_elementor_form' => intval( $args['is_elementor_form'] ), 'email_content_type' => $args['email_content_type'] ?? 'html', 'email_content_type_customer' => $args['email_content_type_customer'] ?? 'html', ]; $bp_form_fields_html_body = $content; $bp_form_fields_html_content = $bp_form_fields_html_header . $bp_form_fields_html_body . $bp_form_fields_html_footer ; //Replace shortcode with form fields info $email_body = str_replace( "[$bp_all_fields_shortcode]", $bp_form_fields_html_content, $email_body ); // Email V2 // General content $form_name = ob_start(); include BETTER_PAYMENT_ADMIN_VIEWS_PATH . "/template-email-notification.php"; $email_body = ob_get_contents(); ob_end_clean(); return $email_body; } /** * String helper method * helps to convert string to title case * * @return string * @since 0.0.1 */ public static function better_title_case($string){ $string = str_replace('_',' ', $string); $string = ucwords($string); return $string; } /** * Safe icon rendering for payment form messages * * Handles multiple icon types: FontAwesome, Dashicons, SVG from media library * Works with or without Elementor being active * * @param array $icon_settings Icon settings from block/widget controls * @param array $html_attributes Optional HTML attributes for the icon element * * @return void (outputs HTML directly) * @since 2.0.4 */ public static function render_icon( $icon_settings = [], $html_attributes = [] ) { // Bail if no settings provided if ( empty( $icon_settings ) || ! is_array( $icon_settings ) ) { return; } // If value is empty, nothing to render if ( empty( $icon_settings['value'] ) ) { return; } $library = ! empty( $icon_settings['library'] ) ? $icon_settings['library'] : ''; $value = $icon_settings['value']; // Try to use Elementor's Icons_Manager if it's available and loaded if ( did_action( 'elementor/loaded' ) && class_exists( '\Elementor\Icons_Manager' ) ) { try { \Elementor\Icons_Manager::render_icon( $icon_settings, $html_attributes ); return; } catch ( \Exception $e ) { // If Elementor rendering fails, fall back to manual rendering } } // Handle SVG (uploaded via media library) if ( $library === 'svg' ) { if ( is_array( $value ) && ! empty( $value['url'] ) ) { $svg_url = esc_url( $value['url'] ); echo 'Icon'; return; } } // Handle FontAwesome icons (all variants: fa, fas, far, fab, fal, fad, etc.) if ( in_array( $library, [ 'fa', 'fas', 'far', 'fab', 'fal', 'fad', 'fontawesome', 'font-awesome' ], true ) ) { if ( is_string( $value ) && ! empty( $value ) ) { // Build complete FontAwesome class $icon_class = 'fa'; // Add variant if specified (fas, far, fab, fal) if ( ! empty( $library ) && $library !== 'fa' && $library !== 'fontawesome' && $library !== 'font-awesome' ) { $icon_class = esc_attr( $library ); } else { // Default to 'fas' if no variant specified $icon_class = 'fas'; } // Add the specific icon class $icon_class .= ' ' . esc_attr( $value ); $html_class = ! empty( $html_attributes['class'] ) ? ' ' . $html_attributes['class'] : ''; $aria_hidden = isset( $html_attributes['aria-hidden'] ) ? ' aria-hidden="' . esc_attr( $html_attributes['aria-hidden'] ) . '"' : ' aria-hidden="true"'; echo ''; return; } } // Handle Dashicons if ( in_array( $library, [ 'dashicons' ], true ) ) { if ( is_string( $value ) && ! empty( $value ) ) { $icon_class = 'dashicons dashicons-' . esc_attr( $value ); $html_class = ! empty( $html_attributes['class'] ) ? ' ' . $html_attributes['class'] : ''; $aria_hidden = isset( $html_attributes['aria-hidden'] ) ? ' aria-hidden="' . esc_attr( $html_attributes['aria-hidden'] ) . '"' : ' aria-hidden="true"'; echo ''; return; } } // Handle custom CSS classes (like 'bp-icon bp-check-circle') // These are custom icon fonts or CSS-based icons defined by the theme/plugin if ( 'custom' === $library ) { if ( is_string( $value ) && ! empty( $value ) ) { $html_class = ! empty( $html_attributes['class'] ) ? ' ' . $html_attributes['class'] : ''; $aria_hidden = isset( $html_attributes['aria-hidden'] ) ? ' aria-hidden="' . esc_attr( $html_attributes['aria-hidden'] ) . '"' : ' aria-hidden="true"'; echo ''; return; } } // If value is a plain string (might be a FontAwesome class without library specified) if ( is_string( $value ) && ! empty( $value ) && empty( $library ) ) { // Check if it looks like a FontAwesome class if ( strpos( $value, 'fa' ) !== false || strpos( $value, 'fa-' ) !== false ) { $icon_class = 'fas ' . esc_attr( $value ); $html_class = ! empty( $html_attributes['class'] ) ? ' ' . $html_attributes['class'] : ''; $aria_hidden = isset( $html_attributes['aria-hidden'] ) ? ' aria-hidden="' . esc_attr( $html_attributes['aria-hidden'] ) . '"' : ' aria-hidden="true"'; echo ''; return; } // Check if it looks like a dashicon if ( strpos( $value, 'dashicon' ) !== false || strpos( $value, 'dashicons-' ) !== false ) { $icon_class = 'dashicons ' . esc_attr( $value ); $html_class = ! empty( $html_attributes['class'] ) ? ' ' . $html_attributes['class'] : ''; $aria_hidden = isset( $html_attributes['aria-hidden'] ) ? ' aria-hidden="' . esc_attr( $html_attributes['aria-hidden'] ) . '"' : ' aria-hidden="true"'; echo ''; return; } } } }