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)';
?>
'true']);
} else {
// Fallback to default icons
echo '';
}
?>
:
-
-
-
-
-
-
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;
?>
'true']);
} else {
// Fallback to default icons
echo '';
}
?>
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 '
';
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;
}
}
}
}