PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 1.0.2
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v1.0.2
2.4.1 2.4.0 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.2 2.2.1 2.2.0 2.1.2 2.1.1 trunk 0.0.1 0.0.2 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 All 68 releases
better-payment / includes / Classes / Better_Payment_Handler.php

Better_Payment_Handler.php in Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More 1.0.2, at includes/Classes/Better_Payment_Handler.php

850 lines 39.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Better_Payment\Lite\Classes;
4
5 use Better_Payment\Lite\Admin\Better_Payment_DB;
6 use Better_Payment\Lite\Controller;
7
8 /**
9 * Exit if accessed directly
10 */
11 if (!defined('ABSPATH')) {
12 exit;
13 }
14
15 /**
16 * The plugin handler class
17 *
18 * @since 0.0.1
19 */
20 class Better_Payment_Handler extends Controller{
21
22 /**
23 * PayPal button
24 *
25 * @since 0.0.1
26 */
27 public static function paypal_button( $widget_id = '' , $settings = [] ) {
28 global $wp;
29
30 $paypal_button_text = ! empty( $settings["better_payment_form_form_buttons_paypal_button_text"] ) ? $settings["better_payment_form_form_buttons_paypal_button_text"] : __('Proceed to Payment', 'better-payment');
31 $return_url = add_query_arg( $wp->query_vars, get_the_permalink() . '?better_payment_paypal_status=success&better_payment_widget_id=' . $widget_id );
32 $cancel_url = add_query_arg( $wp->query_vars, get_the_permalink() . '?better_payment_error_status=error&better_payment_widget_id=' . $widget_id );
33
34 ob_start();
35 $error_info = [
36 'business_email' => !empty($settings['better_payment_paypal_business_email'])
37 ];
38 ?>
39 <input type="hidden" name="return" value="<?php echo esc_url( $return_url ); ?>">
40 <input type="hidden" name="action" value="paypal_form_handle">
41 <input type="hidden" name="security" value="<?php echo esc_attr( wp_create_nonce('better-payment-paypal') ); ?>">
42 <input type="hidden" name="cancel_return" value="<?php echo esc_url( $cancel_url ); ?>">
43 <button data-paypal-info = <?php echo esc_attr(wp_json_encode( $error_info) ) ; ?> class="button is-medium is-fullwidth better-payment-paypal-bt <?php echo esc_attr( self::hide_show_payment_button_class($settings, 'paypal') ); ?>"><?php echo esc_html( $paypal_button_text ); ?></button>
44
45 <?php
46 $paypal_button_html = ob_get_clean();
47 $paypal_button_html = apply_filters( 'better_payment/elementor/editor/paypal_button_html', $paypal_button_html, $widget_id, $settings );
48
49 echo $paypal_button_html;
50 }
51
52 /**
53 * Stripe button
54 *
55 * @since 0.0.1
56 */
57 public static function stripe_button( $widget_id = '' , $settings = []) {
58 $stripe_button_text = ! empty( $settings["better_payment_form_form_buttons_stripe_button_text"] ) ? $settings["better_payment_form_form_buttons_stripe_button_text"] : __('Proceed to Payment', 'better-payment');
59
60 ob_start();
61 ?>
62 <button class="button is-medium is-fullwidth better-payment-stripe-bt <?php echo esc_attr( self::hide_show_payment_button_class($settings, 'stripe') ); ?>"><?php echo esc_html( $stripe_button_text ); ?></button>
63 <?php
64 $stripe_button_html = ob_get_clean();
65 $stripe_button_html = apply_filters( 'better_payment/elementor/editor/stripe_button_html', $stripe_button_html, $widget_id, $settings );
66
67 echo wp_kses( $stripe_button_html, (new Better_Payment_Handler())->bp_allowed_tags() );
68 }
69
70 /**
71 * Paystack button
72 *
73 * @since 0.0.1
74 */
75 public static function paystack_button( $widget_id = '' , $settings = []) {
76 $paystack_button_text = ! empty( $settings["better_payment_form_form_buttons_paystack_button_text"] ) ? $settings["better_payment_form_form_buttons_paystack_button_text"] : __('Proceed to Payment', 'better-payment');
77
78 ob_start();
79 ?>
80 <button class="button is-medium is-fullwidth better-payment-paystack-bt <?php echo esc_attr( self::hide_show_payment_button_class($settings, 'paystack') ); ?>"><?php echo esc_html( $paystack_button_text ); ?></button>
81 <?php
82 $paystack_button_html = ob_get_clean();
83 $paystack_button_html = apply_filters( 'better_payment/elementor/editor/paystack_button_html', $paystack_button_html, $widget_id, $settings );
84
85 echo wp_kses( $paystack_button_html, (new Better_Payment_Handler())->bp_allowed_tags() );
86 }
87
88 public static function hide_show_payment_button_class( $settings, $type = 'paypal' ){
89 $button_hidden_class = 'is-hidden';
90 $types = ['paypal', 'stripe', 'paystack'];
91
92 if( ! in_array($type, $types) ){
93 return $button_hidden_class;
94 }
95
96 $is_type_enable = ! empty( $settings[ "better_payment_form_{$type}_enable" ] ) && 'yes' === $settings[ "better_payment_form_{$type}_enable" ];
97
98 if( ! $is_type_enable ){
99 return $button_hidden_class;
100 }
101
102 $is_paypal_enable = ! empty( $settings[ "better_payment_form_paypal_enable" ] ) && 'yes' === $settings[ "better_payment_form_paypal_enable" ];
103 $is_stripe_enable = ! empty( $settings[ "better_payment_form_stripe_enable" ] ) && 'yes' === $settings[ "better_payment_form_stripe_enable" ];
104 $is_paystack_enable = ! empty( $settings[ "better_payment_form_paystack_enable" ] ) && 'yes' === $settings[ "better_payment_form_paystack_enable" ];
105
106 switch( $type ){
107 case 'paypal':
108 $button_hidden_class = '';
109 break;
110
111 case 'stripe':
112 if( ( ! $is_paypal_enable ) ){
113 $button_hidden_class = '';
114 }
115
116 break;
117
118 case 'paystack':
119 if( ( ! $is_paypal_enable ) && ( ! $is_stripe_enable ) ){
120 $button_hidden_class = '';
121 }
122 break;
123
124 default:
125 break;
126 }
127
128 return $button_hidden_class;
129 }
130
131 /**
132 * Payment create in db
133 *
134 * @since 0.0.1
135 */
136 public static function payment_create( $data ) {
137 global $wpdb;
138 $table = "{$wpdb->prefix}better_payment";
139 $wpdb->insert( $table, $data );
140 if ( $wpdb->insert_id ) {
141 return $wpdb->insert_id;
142 } else {
143 return false;
144 }
145 }
146
147 /**
148 * Mamage response
149 *
150 * @since 0.0.1
151 */
152 public static function manage_response( $settings = [], $widget_id = '' ) {
153 $status = false;
154
155 //if widget id is different then return false
156 if ( !empty( $_REQUEST[ 'better_payment_widget_id' ] ) && $_REQUEST[ 'better_payment_widget_id' ] !== $widget_id ) {
157 return $status;
158 }
159
160 if ( !empty( $_REQUEST[ 'better_payment_error_status' ] ) ) {
161 self::failed_message_template( $settings );
162 $redirection_url_error = ! empty( $settings['better_payment_form_error_page_url']['url'] ) ? esc_url( $settings['better_payment_form_error_page_url']['url'] ) : '';
163
164 if( $redirection_url_error ){
165 ?>
166 <script>
167 setTimeout(function(){
168 window.location.replace("<?php echo esc_url( $redirection_url_error ); ?>");
169 }, 2000);
170 </script>
171 <?php
172 }
173
174 return $status;
175 }
176
177 if ( !empty( $_REQUEST[ 'better_payment_paypal_status' ] ) && $_REQUEST[ 'better_payment_paypal_status' ] == 'success' ) {
178 $status = self::paypal_payment_success( $settings );
179 } elseif ( !empty( $_REQUEST[ 'better_payment_stripe_status' ] ) && $_REQUEST[ 'better_payment_stripe_status' ] == 'success' ) {
180 $status = self::stripe_payment_success( $settings );
181 } elseif ( !empty( $_REQUEST[ 'better_payment_paystack_status' ] ) && $_REQUEST[ 'better_payment_paystack_status' ] == 'success' ) {
182 $status = self::paystack_payment_success( $settings );
183 }
184
185 if ( $status ) {
186 self::success_message_template( $settings, $status );
187 $redirection_url_success = ! empty( $settings['better_payment_form_success_page_url']['url'] ) ? esc_url( $settings['better_payment_form_success_page_url']['url'] ) : '';
188
189 if( $redirection_url_success ){
190 ?>
191 <script>
192 setTimeout(function(){
193 window.location.replace("<?php echo esc_url( $redirection_url_success ); ?>");
194 }, 2000);
195 </script>
196 <?php
197 }
198 }
199 self::remove_arg();
200
201 return $status;
202 }
203
204 /**
205 * Paypal payment success
206 *
207 * @since 0.0.1
208 */
209 public static function paypal_payment_success( $settings = [] ) {
210 $data = $_REQUEST;
211
212 if ( !empty( $data[ 'payment_status' ] ) && !empty( $data[ 'payer_id' ] ) && !empty( $data[ 'payer_status' ] ) ) {
213 global $wpdb;
214 $table = "{$wpdb->prefix}better_payment";
215 $results = $wpdb->get_row(
216 $wpdb->prepare( "SELECT id,form_fields_info,referer FROM $table WHERE order_id=%s and status is NULL limit 1", sanitize_text_field( $_REQUEST[ 'item_number' ] ) )
217 );
218
219 if ( !empty( $results->id ) ) {
220 $updated = $wpdb->update(
221 $table,
222 array(
223 'transaction_id' => sanitize_text_field( $data[ 'txn_id' ] ),
224 'status' => sanitize_text_field( $data[ 'payment_status' ] ),
225 'email' => sanitize_email( $data[ 'payer_email' ] ),
226 'customer_info' => maybe_serialize( $data ),
227 ),
228 array( 'ID' => $results->id )
229 );
230
231 if ( false !== $updated ) {
232 //Send email notification
233 if (
234 ( isset($settings[ 'better_payment_form_email_enable' ]) && $settings[ 'better_payment_form_email_enable' ] == 'yes' )
235 || ( $results->referer === 'elementor-form' )
236 ) {
237 self::better_email_notification(sanitize_text_field( $data[ 'txn_id' ] ), sanitize_email( $data[ 'payer_email' ] ), $settings, 'PayPal', $results->form_fields_info);
238 }
239
240 return sanitize_text_field( $data[ 'txn_id' ] );
241 }
242 }
243 }else if($data['better_payment_paypal_status'] === 'success'){
244 return ( isset($data[ 'txn_id' ]) && !empty( sanitize_text_field( $data[ 'txn_id' ] ) ) ) ? sanitize_text_field( $data[ 'txn_id' ] ) : __('Payment under processing!', 'better-payment');
245 }
246 return false;
247 }
248
249 /**
250 * Stripe payment success
251 *
252 * @since 0.0.1
253 */
254 public static function stripe_payment_success( $settings = [] ) {
255
256 $data = $_REQUEST;
257
258 if ( !empty( $data[ 'better_payment_stripe_id' ] ) ) {
259 global $wpdb;
260 $table = "{$wpdb->prefix}better_payment";
261 $results = $wpdb->get_row(
262 $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_stripe_id' ] ) )
263 );
264
265 if ( !empty( $results->obj_id ) && !empty( $settings[ 'better_payment_stripe_secret_key' ] ) ) {
266 $header = array(
267 'Authorization' => 'Basic ' . base64_encode( sanitize_text_field( $settings[ 'better_payment_stripe_secret_key' ] ) . ':' ),
268 'Stripe-Version' => '2019-05-16',
269 );
270
271 $request = [
272 'expand' => [
273 'subscription.latest_invoice.payment_intent',
274 'payment_intent'
275 ]
276 ];
277
278 $response = wp_safe_remote_post(
279 'https://api.stripe.com/v1/checkout/sessions/' . $results->obj_id,
280 array(
281 'method' => 'GET',
282 'headers' => $header,
283 'timeout' => 70,
284 'body' => $request
285 )
286 );
287
288 if ( is_wp_error( $response ) || empty( $response[ 'body' ] ) ) {
289 return new \WP_Error( 'stripe_error', __( 'There was a problem connecting to the Stripe API endpoint.', 'better-payment' ) );
290 }
291
292 $response = json_decode( $response[ 'body' ] );
293
294 if ( isset( $response->error->message ) ) {
295 return new \WP_Error( 'stripe_error', __( 'There was a problem connecting to the Stripe API endpoint.', 'better-payment' ) );
296 }
297
298 $updated = $wpdb->update(
299 $table,
300 array(
301 'status' => sanitize_text_field( $response->payment_status ),
302 'email' => sanitize_email( current( $response->payment_intent->charges->data )->billing_details->email ),
303 'customer_info' => maybe_serialize( $response ),
304 ),
305 array( 'ID' => $results->id )
306 );
307
308 if ( false !== $updated ) {
309 //Send email notification
310 $better_customer_email = sanitize_email( current( $response->payment_intent->charges->data )->billing_details->email );
311 if (
312 (isset($settings[ 'better_payment_form_email_enable' ]) && $settings[ 'better_payment_form_email_enable' ] == 'yes' )
313 || ( $results->referer === 'elementor-form' )
314 ) {
315 self::better_email_notification($results->transaction_id, $better_customer_email, $settings, 'Stripe', $results->form_fields_info);
316 }
317
318 return $results->transaction_id;
319 }
320 }
321 }
322 return false;
323 }
324
325 /**
326 * Paystack payment success
327 *
328 * @since 0.0.1
329 */
330 public static function paystack_payment_success( $settings = [] ) {
331 $data = $_REQUEST;
332
333 if ( ! empty( $data[ 'better_payment_paystack_id' ] ) ) {
334 global $wpdb;
335 $table = "{$wpdb->prefix}better_payment";
336 $results = $wpdb->get_row(
337 $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' ] ) )
338 );
339
340 $header_info = array(
341 'Authorization' => 'Bearer ' . sanitize_text_field( $settings[ 'better_payment_paystack_secret_key' ] ),
342 "Cache-Control: no-cache",
343 );
344
345 $response = wp_safe_remote_get(
346 'https://api.paystack.co/transaction/verify/'. sanitize_text_field( $data[ 'reference' ] ),
347 array(
348 'headers' => $header_info,
349 'timeout' => 70,
350 )
351 );
352
353 $response = json_decode(wp_remote_retrieve_body($response));
354
355 if ( ! empty( $response->status ) ) {
356 $updated = $wpdb->update(
357 $table,
358 array(
359 'status' => ! empty( $response->data->status ) ? sanitize_text_field( $response->data->status ) : '',
360 'amount' => ! empty( $response->data->amount ) ? floatval( $response->data->amount ) : 0,
361 'obj_id' => ! empty( $response->data->id ) ? sanitize_text_field( $response->data->id ) : '',
362 'transaction_id' => ! empty( $response->data->reference ) ? sanitize_text_field( $response->data->reference ) : '',
363 'customer_info' => ! empty( $response->data->customer ) ? maybe_serialize( $response->data->customer ) : '',
364 'email' => ! empty( $response->data->customer->email ) ? sanitize_email( $response->data->customer->email ) : '',
365 ),
366 array( 'ID' => $results->id )
367 );
368 }
369
370 $better_customer_email = ! empty( $response->data->customer->email ) ? maybe_serialize( $response->data->customer->email ) : '';
371 $transaction_id = ! empty( $response->data->reference ) ? sanitize_text_field( $response->data->reference ) : '';
372
373 if ( ! empty( $updated ) && $better_customer_email ) {
374 //Send email notification
375 if (
376 (isset($settings[ 'better_payment_form_email_enable' ]) && $settings[ 'better_payment_form_email_enable' ] == 'yes' )
377 || ( $results->referer === 'elementor-form' )
378 ) {
379 self::better_email_notification($transaction_id, $better_customer_email, $settings, 'Stripe', $results->form_fields_info);
380 }
381
382 return $transaction_id;
383 }
384 }
385 return false;
386 }
387
388 /**
389 * Get currency symbols
390 *
391 * @since 0.0.1
392 */
393 public static function get_currency_symbols( $currency = 'USD' ) {
394 $list = [
395 'AED' => "د.إ",
396 'AUD' => "$",
397 'CAD' => "$",
398 'CZK' => "Kč",
399 'DKK' => "kr",
400 'EUR' => "€",
401 'HKD' => "$",
402 'HUF' => "ft",
403 'ILS' => "₪",
404 'JPY' => "¥",
405 'MXN' => "$",
406 'NOK' => "kr",
407 'NZD' => "$",
408 'PHP' => "₱",
409 'PLN' => "zł",
410 'GBP' => "£",
411 'RUB' => "₽",
412 'SGD' => "$",
413 'SEK' => "kr",
414 'CHF' => "CHF",
415 'TWD' => "$",
416 'THB' => "฿",
417 'TRY' => "₺",
418 'USD' => "$",
419 'ZAR' => "R",
420 ];
421 return !empty( $list[ $currency ] ) ? $list[ $currency ] : '$';
422 }
423
424 /**
425 * Success message template
426 *
427 * @since 0.0.1
428 */
429 public static function success_message_template( $settings = [], $tr_id = '' ) {
430 if ( empty( $tr_id ) || is_wp_error($tr_id)) {
431 return false;
432 }
433 wp_enqueue_script('better-payment-admin-script');
434 $image_url = BETTER_PAYMENT_ASSETS . '/img/success.svg';
435 $show_icon = 0;
436
437 if ( !empty( $settings[ 'better_payment_form_success_message_icon' ][ 'library' ] ) ) {
438 if ( $settings[ 'better_payment_form_success_message_icon' ][ 'library' ] == 'svg' ) {
439 $image_url = $settings[ 'better_payment_form_success_message_icon' ][ 'value' ][ 'url' ];
440 } else {
441 $show_icon = 1;
442 $image_url = $settings[ 'better_payment_form_success_message_icon' ][ 'value' ];
443 }
444 }
445 ?>
446 <div class="pt140 pb140 background__grey2">
447 <div class="better-payment-payment__report better-payment-success-report">
448 <div class="report__thumb">
449 <?php if($show_icon) : ?>
450 <i class="<?php echo esc_attr($image_url); ?>"></i>
451 <?php else : ?>
452 <img src="<?php echo esc_url($image_url); ?>" alt="Success image">
453 <?php endif; ?>
454 </div>
455 <div class="report__content">
456 <h3 class="transaction__success"><?php echo ( isset( $settings[ 'better_payment_form_success_message_heading' ] ) ) ? esc_html__( $settings['better_payment_form_success_message_heading'], 'better-payment' ) : esc_html__('Payment Successful', 'better-payment'); ?> </h3>
457 <p class="transaction__number">
458 <?php printf( "%s : <span id='bp_copy_clipboard_input_1' class='better-payment-success-transaction-number'>%s</span>", ( isset( $settings['better_payment_form_success_message_transaction'] ) ) ? esc_html__( $settings['better_payment_form_success_message_transaction'], 'better-payment' ) : esc_html__('Transaction Number', 'better-payment'), esc_html( $tr_id ) );; ?>
459 <span id="bp_copy_clipboard_1" class="bp-icon bp-copy-square bp-copy-clipboard" title="Copy" data-bp_txn_counter="1" style="color: rgb(42, 50, 86);"></span>
460 </p>
461 <p class="payment__greeting"><?php echo ( isset( $settings['better_payment_form_success_message_thanks'] ) ) ? esc_html__( $settings['better_payment_form_success_message_thanks'], 'better-payment' ) : esc_html__('Thank you for your payment', 'better-payment'); ?></p>
462 </div>
463 </div>
464 </div>
465 <?php
466 }
467
468
469 /**
470 * Error message template
471 *
472 * @since 0.0.1
473 */
474 public static function failed_message_template( $settings = [] ) {
475
476 $image_url = BETTER_PAYMENT_ASSETS . '/img/fail.svg';
477 $show_icon = 0;
478
479 if ( !empty( $settings[ 'better_payment_form_error_message_icon' ][ 'library' ] ) ) {
480 if ( $settings[ 'better_payment_form_error_message_icon' ][ 'library' ] == 'svg' ) {
481 $image_url = $settings[ 'better_payment_form_error_message_icon' ][ 'value' ][ 'url' ];
482 } else {
483 $show_icon = 1;
484 $image_url = $settings[ 'better_payment_form_error_message_icon' ][ 'value' ];
485 }
486 }
487 ?>
488 <div class="pb140 background__grey2">
489 <div class="better-payment-payment__report better-payment-error-report">
490 <div class="report__thumb">
491 <?php if($show_icon) : ?>
492 <i class="<?php echo esc_attr($image_url); ?>"></i>
493 <?php else : ?>
494 <img src="<?php echo esc_url($image_url); ?>" alt="Error image">
495 <?php endif; ?>
496 </div>
497 <div class="report__content">
498 <h3 class="transaction__failed"><?php echo ( isset( $settings['better_payment_form_error_message_heading'] ) ) ? esc_html__( $settings['better_payment_form_error_message_heading'], 'better-payment' ) : esc_html__('Payment Failed', 'better-payment'); ?></h3>
499 </div>
500 </div>
501 </div>
502 <?php
503 }
504
505 /**
506 * Remove args from url
507 *
508 * @since 0.0.1
509 */
510 public static function remove_arg() {
511 ?>
512 <script>
513
514 if(typeof params === 'undefined'){
515 let params = '';
516 }
517
518 params = new URLSearchParams(location.search);
519
520 if (params.has('better_payment_paypal_status') || params.has('better_payment_stripe_status') || params.has('better_payment_paystack_status')) {
521 params.delete('better_payment_paypal_status');
522 params.delete('better_payment_stripe_status');
523 params.delete('better_payment_paystack_status');
524 params.delete('better_payment_widget_id');
525 params.delete('better_payment_stripe_id');
526 params.delete('better_payment_paystack_id');
527 window.history.replaceState({}, '', `${location.pathname}?${params}`);
528 }
529 </script>
530 <?php
531 }
532
533 /**
534 * Email template
535 *
536 * @since 0.0.1
537 */
538 public static function better_email_notification($transaction_id, $customer_email, $settings, $referrer='Stripe', $form_fields_info=''){
539 //Send Email: customer and admin
540 $better_txn_id = sanitize_text_field( $transaction_id );
541 $better_cus_email = sanitize_email( $customer_email );
542 $better_payment_global_settings = Better_Payment_DB::get_settings();
543
544 $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' );
545 $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'] : __('Better Payment Transaction', 'better-payment');
546 $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'] : '';
547 $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'] : '';
548 $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'] : '';
549 $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'] : '';
550 $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'] : '';
551 $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'] : '';
552 $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';
553
554 $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'] : __('Better Payment Transaction', 'better-payment');
555 $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'] : '';
556 $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'] : '';
557 $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'] : '';
558 $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'] : '';
559 $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'] : '';
560 $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'] : '';
561 $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';
562
563 if(isset($settings['better_payment_email_to'])){
564 $better_payment_email_to = sanitize_email($settings['better_payment_email_to']);
565 }
566
567 if(isset($settings['better_payment_email_subject'])){
568 $better_payment_email_subject = sanitize_text_field($settings['better_payment_email_subject']);
569 }
570
571 if(isset($settings['better_payment_email_subject_customer'])){
572 $better_payment_email_subject_customer = sanitize_text_field($settings['better_payment_email_subject_customer']);
573 }
574
575 if(isset($settings['better_payment_email_content_type'])){
576 $better_payment_email_content_type = sanitize_text_field($settings['better_payment_email_content_type']);
577 }
578
579 if(isset($settings['better_payment_email_content_type_customer'])){
580 $better_payment_email_content_type_customer = sanitize_text_field($settings['better_payment_email_content_type_customer']);
581 }
582
583 $line_break = $better_payment_email_content_type == 'html' ? '<br>' : "\n";
584 $line_break_customer = $better_payment_email_content_type_customer == 'html' ? '<br>' : "\n";
585
586 global $wpdb;
587 $table = "{$wpdb->prefix}better_payment";
588 $transaction_obj = $wpdb->get_row(
589 $wpdb->prepare( "SELECT * FROM $table WHERE transaction_id=%s limit 1", sanitize_text_field( $transaction_id ) )
590 );
591
592 if(isset($settings['better_payment_email_content'])){
593 $better_payment_email_content = sanitize_text_field($settings['better_payment_email_content']);
594 $better_payment_email_content = self::better_render_email_body( $better_payment_email_content, $form_fields_info, $line_break, 'admin', $transaction_obj );
595 } else if ( !empty($better_payment_email_content) ){
596 $better_payment_email_content = self::better_render_email_body( $better_payment_email_content, $form_fields_info, $line_break, 'admin', $transaction_obj );
597 }
598
599 if(isset($settings['better_payment_email_content_customer'])){
600 $better_payment_email_content_customer = sanitize_text_field($settings['better_payment_email_content_customer']);
601 $better_payment_email_content_customer = self::better_render_email_body( $better_payment_email_content_customer, $form_fields_info, $line_break_customer, 'customer', $transaction_obj );
602 } else if ( !empty($better_payment_email_content_customer) ){
603 $better_payment_email_content_customer = self::better_render_email_body( $better_payment_email_content_customer, $form_fields_info, $line_break, 'customer', $transaction_obj ); //$line_break_customer not used : need to check type on parent method and add headers accordingly.
604 }
605
606 if(isset($settings['better_payment_email_from'])){
607 $better_payment_email_from = sanitize_email($settings['better_payment_email_from']);
608 }
609
610 if(isset($settings['better_payment_email_from_name'])){
611 $better_payment_email_from_name = sanitize_text_field($settings['better_payment_email_from_name']);
612 }
613
614 if(isset($settings['better_payment_email_reply_to'])){
615 $better_payment_email_reply_to = sanitize_email($settings['better_payment_email_reply_to']);
616 }
617
618 if(isset($settings['better_payment_email_cc'])){
619 $better_payment_email_cc = sanitize_email($settings['better_payment_email_cc']);
620 }
621
622 if(isset($settings['better_payment_email_bcc'])){
623 $better_payment_email_bcc = sanitize_email($settings['better_payment_email_bcc']);
624 }
625
626 //Customer Email
627 if(isset($settings['better_payment_email_from_customer'])){
628 $better_payment_email_from_customer = sanitize_email($settings['better_payment_email_from_customer']);
629 }
630
631 if(isset($settings['better_payment_email_from_name_customer'])){
632 $better_payment_email_from_name_customer = sanitize_text_field($settings['better_payment_email_from_name_customer']);
633 }
634
635 if(isset($settings['better_payment_email_reply_to_customer'])){
636 $better_payment_email_reply_to_customer = sanitize_email($settings['better_payment_email_reply_to_customer']);
637 }
638
639 if(isset($settings['better_payment_email_cc_customer'])){
640 $better_payment_email_cc_customer = sanitize_email($settings['better_payment_email_cc_customer']);
641 }
642
643 if(isset($settings['better_payment_email_bcc_customer'])){
644 $better_payment_email_bcc_customer = sanitize_email($settings['better_payment_email_bcc_customer']);
645 }
646
647 if($better_payment_email_content == ''){
648 $better_payment_email_content = __('New better payment transaction! ', 'better-payment');
649 }
650
651 if($better_payment_email_content_customer == ''){
652 $better_payment_email_content_customer = __('New better payment transaction! ', 'better-payment');
653 }
654
655 $better_payment_email_headers = [];
656 $better_payment_email_headers_customer = [];
657
658 if($better_payment_email_content_type == 'html'){
659 $better_payment_email_headers[] = 'Content-Type: text/html; charset=UTF-8';
660 $better_payment_email_headers_customer[] = 'Content-Type: text/html; charset=UTF-8';
661 }
662
663 if($better_payment_email_from != ''){
664 $better_payment_email_headers[] = "From: $better_payment_email_from_name <$better_payment_email_from>";
665 }
666
667 if($better_payment_email_cc != ''){
668 $better_payment_email_headers[] = "Cc: <$better_payment_email_cc>";
669 }
670
671 if($better_payment_email_bcc != ''){
672 $better_payment_email_headers[] = "BCc: $better_payment_email_bcc";
673 }
674
675 if($better_payment_email_reply_to != ''){
676 $better_payment_email_headers[] = "Reply-To: $better_payment_email_reply_to";
677 }
678
679 //Customer Email
680 if($better_payment_email_from_customer != ''){
681 $better_payment_email_headers_customer[] = "From: $better_payment_email_from_name_customer <$better_payment_email_from_customer>";
682 }
683
684 $form_fields_info_array = [];
685
686 if( ! empty( $form_fields_info ) ){
687 $form_fields_info_array = maybe_unserialize( $form_fields_info );
688 }
689
690 $form_fields_info_cus_email = ! empty( $form_fields_info_array['primary_email'] ) ? sanitize_email( $form_fields_info_array['primary_email'] ) : '';
691
692 if($better_payment_email_cc_customer != '' || ! empty( $form_fields_info_cus_email ) ){
693 $better_payment_email_cc_customer_multiple = implode(',', [$form_fields_info_cus_email, $better_payment_email_cc_customer]);
694 $better_payment_email_headers_customer[] = "Cc: $better_payment_email_cc_customer_multiple";
695 }
696
697 if($better_payment_email_bcc_customer != ''){
698 $better_payment_email_headers_customer[] = "BCc: $better_payment_email_bcc_customer";
699 }
700
701 if($better_payment_email_reply_to_customer != ''){
702 $better_payment_email_headers_customer[] = "Reply-To: $better_payment_email_reply_to_customer";
703 }
704
705 self::send_better_email($better_cus_email, $better_payment_email_subject_customer, $better_payment_email_content_customer, $better_payment_email_headers_customer); //customer mail
706 self::send_better_email($better_payment_email_to, $better_payment_email_subject, $better_payment_email_content, $better_payment_email_headers); //admin mail
707 }
708
709 /**
710 * Sends an HTML email.
711 *
712 * @since 0.0.2
713 *
714 * @param string $to
715 * @param string $subject
716 * @param array $message
717 *
718 * @return bool false indicates mail sending failed while true doesn't gurantee that mail sent.
719 * true just indicate script processed successfully without any errors.
720 * Ref: https://developer.wordpress.org/reference/functions/wp_mail/
721 */
722 public static function send_better_email( $to, $subject, $message, $headers=[]) {
723 $response = false;
724
725 $mailValidated = filter_var($to, FILTER_VALIDATE_EMAIL);
726
727 if ($mailValidated) {
728 $response = wp_mail( $to, $subject, $message, $headers );
729 }
730
731 return $response;
732 }
733
734 /**
735 * Email body
736 *
737 *
738 * @return string
739 * @since 0.0.1
740 */
741 public static function better_render_email_body( $email_body, $form_fields_info, $line_break, $type = 'admin', $transaction_obj = null ) {
742 $transaction_id =
743 $currency =
744 $payment_date =
745 $customer_name =
746 $customer_first_name =
747 $customer_last_name =
748 $amount = '';
749
750 if(null !== $transaction_obj && is_object($transaction_obj)){
751 $transaction_id = $transaction_obj->transaction_id;
752 $amount = $transaction_obj->amount;
753 $currency = $transaction_obj->currency;
754 $payment_date = wp_date(get_option('date_format').' '.get_option('time_format'), strtotime($transaction_obj->payment_date));
755 }
756
757 $is_empty_email_body = empty($email_body);
758
759 $email_body = do_shortcode( $email_body );
760 $bp_form_fields_html_content = $email_body;
761
762 $bp_all_fields_shortcode = 'bp-all-fields';
763 $referer_content_page_link = '#';
764
765 $field_text = __('Field', 'better-payment');
766 $value_text = __('Entry', 'better-payment');
767
768 $bp_form_fields_html_header = '<table style="margin-bottom: 20px; font-size: 14px; border-collapse: collapse; width: 100%;">';
769
770 $bp_form_fields_html_footer = "</table>";
771
772 if ( false !== strpos( $email_body, $bp_all_fields_shortcode ) ) {
773 $content = ''. $line_break;
774 $form_fields_info_arr = maybe_unserialize($form_fields_info);
775
776 foreach ( $form_fields_info_arr as $key => $field ) {
777 //Hide few fields
778 if($key === 'referer_page_id' || $key === 'referer_widget_id' || $key === 'source' || $key === 'el_form_fields') {
779 if($key === 'referer_page_id'){
780 $referer_content_page_link = !empty($field) ? get_permalink( $field ) : $referer_content_page_link;
781 }
782
783 continue;
784 }
785
786 if($key === 'primary_first_name'){
787 $key = 'first_name';
788 $customer_first_name = $field;
789 }
790 if($key === 'primary_last_name'){
791 $key = 'last_name';
792 $customer_last_name = $field;
793 }
794
795 if($key === 'primary_email'){
796 $key = 'email';
797 }
798
799 if($key === 'primary_payment_amount'){
800 $key = 'payment_amount';
801 }
802
803 $key_formatted = self::better_title_case($key);
804 if($key_formatted === 'Amount'){
805 $key_formatted = __('Paid', 'better-payment');
806 }
807
808 $content .= "<tr>
809 <td style='padding: 7px; border: 1px solid #666;'> <strong>$key_formatted</strong> </td>
810 <td style='padding: 7px; border: 1px solid #666;'> $field </td>
811 </tr>";
812 }
813
814 if($customer_first_name) {
815 $customer_name = $customer_first_name . ' ';
816 }
817 if($customer_last_name) {
818 $customer_name .= $customer_last_name . ' ';
819 }
820
821 $bp_form_fields_html_body = $content;
822 $bp_form_fields_html_content = $bp_form_fields_html_header . $bp_form_fields_html_body . $bp_form_fields_html_footer ;
823
824 //Replace shortcode with form fields info
825 $email_body = str_replace( "[$bp_all_fields_shortcode]", $bp_form_fields_html_content, $email_body );
826 }
827
828 ob_start();
829 include BETTER_PAYMENT_ADMIN_VIEWS_PATH . "/template-email-notification.php";
830 $email_body = ob_get_contents();
831 ob_end_clean();
832
833 return $email_body;
834 }
835
836 /**
837 * String helper method
838 * helps to convert string to title case
839 *
840 * @return string
841 * @since 0.0.1
842 */
843 public static function better_title_case($string){
844 $string = str_replace('_',' ', $string);
845 $string = ucwords($string);
846 return $string;
847 }
848
849 }
850