PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 0.0.7
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v0.0.7
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_Actions.php

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

417 lines 17.4 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 /**
6 * Exit if accessed directly
7 */
8 if (!defined('ABSPATH')) {
9 exit;
10 }
11
12 /**
13 * The plugin action class
14 *
15 * @since 0.0.1
16 */
17 class Better_Payment_Actions {
18 /**
19 * Constructor
20 *
21 * @since 0.0.1
22 */
23 public function __construct() {
24 add_action( 'admin_post_paypal_form_handle', [ $this, 'paypal_form_handle' ] );
25 add_action( 'admin_post_nopriv_paypal_form_handle', [ $this, 'paypal_form_handle' ] );
26
27 add_action( 'wp_ajax_better_payment_stripe_get_token', [ $this, 'better_payment_stripe_get_token' ] );
28 add_action( 'wp_ajax_nopriv_better_payment_stripe_get_token', [ $this, 'better_payment_stripe_get_token' ] );
29 }
30
31
32 /**
33 * Handle the paypal form
34 *
35 * @since 0.0.1
36 */
37 public function paypal_form_handle() {
38
39 check_admin_referer( 'better-payment-paypal', 'security' );
40
41 if ( !empty( $_POST[ 'better_payment_page_id' ] ) ) {
42 $page_id = intval( $_POST[ 'better_payment_page_id' ], 10 );
43 } else {
44 $this->redirect_previous_page();
45 }
46
47 if ( !empty( $_POST[ 'better_payment_widget_id' ] ) ) {
48 $widget_id = sanitize_text_field( $_POST[ 'better_payment_widget_id' ] );
49 } else {
50 $this->redirect_previous_page();
51 }
52
53 $el_settings = $this->better_payment_widget_settings( $page_id, $widget_id );
54
55 if ( empty( $el_settings ) ) {
56 $this->redirect_previous_page();
57 }
58
59 if ( empty( $el_settings[ 'better_payment_paypal_business_email' ] ) ) {
60 $this->redirect_previous_page();
61 }
62
63 if ( $el_settings[ 'better_payment_paypal_live_mode' ] == 'yes' ) {
64 $path = "paypal";
65 } else {
66 $path = "sandbox.paypal";
67 }
68
69 $el_settings_currency = $el_settings[ 'better_payment_form_currency' ];
70
71 if(!empty($el_settings['better_payment_form_currency_use_woocommerce']) && 'yes' === $el_settings['better_payment_form_currency_use_woocommerce'] &&
72 !empty($el_settings['better_payment_form_currency_woocommerce'])){
73 $el_settings_currency = $el_settings['better_payment_form_currency_woocommerce'];
74 }
75
76 $el_settings_currency_symbol = \Better_Payment\Lite\Classes\Better_Payment_Handler::get_currency_symbols( esc_html($el_settings_currency) );
77
78 $primary_payment_amount = floatval( $_POST[ 'primary_payment_amount' ] );
79
80 if( empty( $_POST['primary_payment_amount'] ) && ! empty( $_POST['primary_payment_amount_radio'] ) ){
81 $primary_payment_amount = floatval( $_POST['primary_payment_amount_radio'] );
82 }
83 $order_id = 'paypal_' . uniqid();
84 $request_data = [
85 'business' => $el_settings[ 'better_payment_paypal_business_email' ],
86 'currency_code' => $el_settings_currency,
87 'rm' => '2',
88 'return' => esc_url_raw( $_POST[ 'return' ] ),
89 'cancel_return' => esc_url_raw( $_POST[ 'cancel_return' ] ),
90 'item_number' => $order_id,
91 'item_name' => esc_html__('Better Payment', 'better-payment'),
92 'amount' => $primary_payment_amount,
93 'cmd' => $el_settings[ 'better_payment_paypal_button_type' ],
94 ];
95
96 //Form fields data to send via email
97 $better_form_fields = [
98 'amount' => sanitize_text_field($el_settings_currency_symbol) . $primary_payment_amount,
99 'referer_page_id' => $page_id,
100 'referer_widget_id' => $widget_id,
101 'source' => 'paypal'
102 ];
103
104 $better_form_fields = array_merge( $better_form_fields, $this->fetch_better_form_fields($el_settings, $_POST) );
105
106 if ( !empty( $better_form_fields[ 'primary_first_name' ] ) ) {
107 $request_data[ 'primary_first_name' ] = sanitize_text_field( $better_form_fields[ 'primary_first_name' ] );
108 }
109
110 if ( !empty( $better_form_fields[ 'primary_last_name' ] ) ) {
111 $request_data[ 'primary_last_name' ] = sanitize_text_field( $better_form_fields[ 'primary_last_name' ] );
112 }
113
114 if ( !empty( $better_form_fields[ 'primary_email' ] ) ) {
115 $request_data[ 'primary_email' ] = sanitize_email( $better_form_fields[ 'primary_email' ] );
116 }
117
118 Better_Payment_Handler::payment_create(
119 [
120 'amount' => floatval( $_POST[ 'primary_payment_amount' ] ),
121 'order_id' => $order_id,
122 'payment_date' => date( 'Y-m-d H:i:s' ),
123 'source' => 'paypal',
124 'form_fields_info' => maybe_serialize( $better_form_fields ),
125 'currency' => sanitize_text_field($el_settings_currency),
126 'referer' => "widget",
127 ]
128 );
129 $paypal_url = "https://www.$path.com/cgi-bin/webscr?";
130 $paypal_url .= http_build_query( $request_data );
131 wp_redirect( esc_url_raw($paypal_url) );
132 }
133
134 /**
135 * Get the stripe token
136 *
137 * @since 0.0.1
138 */
139 public function better_payment_stripe_get_token() {
140 if ( !check_admin_referer( 'better-payment', 'security' ) ) {
141 wp_send_json_error();
142 }
143
144 $setting_data_page_id = isset($_POST[ 'setting_data' ]['page_id']) ? intval( $_POST[ 'setting_data' ]['page_id'] ) : 0;
145 $setting_data_widget_id = isset($_POST[ 'setting_data' ]['widget_id']) ? sanitize_text_field( $_POST[ 'setting_data' ]['widget_id'] ) : 0;
146
147 if ( !empty( $setting_data_page_id ) ) {
148 $page_id = $setting_data_page_id;
149 } else {
150 $err_msg = __( 'Page ID is missing', 'better-payment' );
151 wp_send_json_error( esc_html($err_msg) );
152 }
153
154 if ( !empty( $setting_data_widget_id ) ) {
155 $widget_id = sanitize_text_field( $setting_data_widget_id );
156 } else {
157 $err_msg = __( 'Widget ID is missing', 'better-payment' );
158 wp_send_json_error( esc_html($err_msg) );
159 }
160
161 $el_settings = $this->better_payment_widget_settings( $page_id, $widget_id );
162 if ( empty( $el_settings ) ) {
163 wp_send_json_error( esc_html(__( 'Setting Data is missing', 'better-payment' )) );
164 }
165
166 $amount = isset($_POST[ 'fields' ][ 'primary_payment_amount' ]) ? floatval($_POST[ 'fields' ][ 'primary_payment_amount' ]) : 0;
167 if ( empty( $_POST[ 'fields' ][ 'primary_payment_amount' ] ) && ! empty( $_POST[ 'fields' ][ 'primary_payment_amount_radio' ] ) ) {
168 $amount = floatval($_POST[ 'fields' ][ 'primary_payment_amount_radio' ]);
169 }
170
171 if ( empty( $el_settings[ 'better_payment_stripe_public_key' ] ) || empty( $el_settings[ 'better_payment_stripe_secret_key' ] ) ) {
172 wp_send_json_error( esc_html(__( 'Stripe Key missing', 'better-payment' )) );
173 }
174
175 $header_info = array(
176 'Authorization' => 'Basic ' . base64_encode( sanitize_text_field( $el_settings[ 'better_payment_stripe_secret_key' ] ) . ':' ),
177 'Stripe-Version' => '2019-05-16'
178 );
179
180 $order_id = 'stripe_' . uniqid();
181
182 $el_settings_currency = $el_settings[ 'better_payment_form_currency' ];
183
184 if(!empty($settings['better_payment_form_currency_use_woocommerce']) && 'yes' === $settings['better_payment_form_currency_use_woocommerce'] &&
185 !empty($settings['better_payment_form_currency_woocommerce'])){
186 $el_settings_currency = $settings['better_payment_form_currency_woocommerce'];
187 }
188
189 $el_settings_currency_symbol = \Better_Payment\Lite\Classes\Better_Payment_Handler::get_currency_symbols( esc_html($el_settings_currency) );
190
191 $request = [
192 'success_url' => add_query_arg( [
193 'better_payment_stripe_status' => 'success',
194 'better_payment_stripe_id' => $order_id,
195 'better_payment_widget_id' => $widget_id
196 ], get_permalink( $setting_data_page_id ) ),
197 'cancel_url' => add_query_arg( [
198 'better_payment_error_status' => 'error',
199 'better_payment_stripe_id' => $order_id,
200 'better_payment_widget_id' => $widget_id
201 ], get_permalink( $setting_data_page_id ) ),
202 'locale' => 'auto',
203 'payment_method_types' => [ 'card' ],
204 'client_reference_id' => time(),
205 'billing_address_collection' => 'required',
206 'metadata' => [
207 'order_id' => $order_id
208 ],
209 'line_items' => [
210 [
211 'amount' => ( $amount * 100 ),
212 'currency' => $el_settings_currency,
213 'name' => esc_html__('Better Payment', 'better-payment'),
214 'quantity' => 1
215 ]
216 ],
217 'payment_intent_data' => [
218 'capture_method' => 'automatic',
219 'description' => esc_html__('Better Payment', 'better-payment'),
220 'metadata' => [
221 'order_id' => $order_id
222 ]
223 ]
224 ];
225
226 //Form fields data to send via email
227 $better_form_fields = [
228 'amount' => $el_settings_currency_symbol . $amount,
229 'referer_page_id' => $page_id,
230 'referer_widget_id' => $widget_id,
231 'source' => 'stripe'
232 ];
233
234 $better_form_fields = array_merge( $better_form_fields, $this->fetch_better_form_fields($el_settings, $_POST['fields']) );
235
236 if ( !empty( $better_form_fields['primary_first_name'] ) ) {
237 $request[ 'customer_name' ] = $better_form_fields['primary_first_name'];
238 }
239
240 if ( !empty( $better_form_fields['primary_last_name'] ) ) {
241 $request[ 'customer_name' ] = !empty( $request[ 'customer_name' ] ) ? $request[ 'customer_name' ] . ' ' . $better_form_fields['primary_last_name'] : $better_form_fields['primary_last_name'];
242 }
243
244 if ( !empty( $request[ 'customer_name' ] ) ) {
245 $request[ 'metadata' ][ 'customer_name' ] = $request[ 'customer_name' ];
246 $request[ 'payment_intent_data' ][ 'metadata' ][ 'customer_name' ] = $request[ 'customer_name' ];
247 unset( $request[ 'customer_name' ] );
248 }
249
250 if ( !empty( $better_form_fields['primary_email'] ) ) {
251 $request[ 'customer_email' ] = $better_form_fields['primary_email'];
252 $request[ 'metadata' ][ 'customer_email' ] = $request[ 'customer_email' ];
253 $request[ 'payment_intent_data' ][ 'metadata' ][ 'customer_email' ] = $request[ 'customer_email' ];
254
255 }
256
257 #ToDo: Need to prefill name field on stripe checkout
258 $response = wp_safe_remote_post(
259 'https://api.stripe.com/v1/checkout/sessions',
260 array(
261 'method' => 'POST',
262 'headers' => $header_info,
263 'body' => $request,
264 'timeout' => 70,
265 )
266 );
267
268 $response_ar = json_decode( $response[ 'body' ] );
269
270 if ( !empty( $response_ar->payment_intent ) ) {
271 Better_Payment_Handler::payment_create(
272 [
273 'amount' => $amount,
274 'order_id' => $order_id,
275 'payment_date' => date( 'Y-m-d H:i:s' ),
276 'source' => 'stripe',
277 'transaction_id' => sanitize_text_field($response_ar->payment_intent),
278 'customer_info' => maybe_serialize( $response_ar ),
279 'form_fields_info' => maybe_serialize( $better_form_fields ),
280 'obj_id' => sanitize_text_field($response_ar->id),
281 'status' => sanitize_text_field($response_ar->payment_status),
282 'currency' => $el_settings_currency,
283 'referer' => "widget",
284 ]
285 );
286 wp_send_json_success(
287 [
288 'stripe_data' => sanitize_text_field($response_ar->id),
289 'stripe_public_key' => sanitize_text_field( $el_settings[ 'better_payment_stripe_public_key' ] )
290 ]
291 );
292 } else {
293 $error_message = 'Something went wrong!';
294
295 if (isset($response_ar->error)){
296 $error_message = sanitize_text_field($response_ar->error->message);
297 }
298
299 wp_send_json_error( $error_message );
300 }
301 }
302
303 /**
304 * Widget settings
305 *
306 * @since 1.0.0
307 */
308 public function better_payment_widget_settings( $page_id, $widget_id ) {
309 $document = \Elementor\Plugin::$instance->documents->get( $page_id );
310 $settings = [];
311 if ( $document ) {
312 $elements = \Elementor\Plugin::instance()->documents->get( $page_id )->get_elements_data();
313 $widget_data = $this->find_element_recursive( $elements, $widget_id );
314 $widget = \Elementor\Plugin::instance()->elements_manager->create_element_instance( $widget_data );
315 if ( $widget ) {
316 $settings = $widget->get_settings_for_display();
317 }
318 }
319 return $settings;
320 }
321
322 /**
323 * Find element recursive
324 *
325 * @since 1.0.0
326 */
327 public function find_element_recursive( $elements, $form_id ) {
328
329 foreach ( $elements as $element ) {
330 if ( $form_id === $element[ 'id' ] ) {
331 return $element;
332 }
333
334 if ( !empty( $element[ 'elements' ] ) ) {
335 $element = $this->find_element_recursive( $element[ 'elements' ], $form_id );
336
337 if ( $element ) {
338 return $element;
339 }
340 }
341 }
342
343 return false;
344 }
345
346 /**
347 * Redirect to referer page
348 *
349 * @since 1.0.0
350 */
351 public function redirect_previous_page() {
352 $location = $_SERVER[ 'HTTP_REFERER' ];
353 wp_safe_redirect( $location );
354 exit();
355 }
356
357 /**
358 * Fetch form fields
359 *
360 * @since 0.0.4
361 */
362
363 public function fetch_better_form_fields($el_settings, $post_data_form_fields) {
364 $better_form_fields = array();
365
366 $better_payment_helper_obj = new Better_Payment_Helper();
367 $post_data_primary_first_name = '';
368 $post_data_primary_last_name = '';
369 $post_data_primary_email = '';
370
371 $post_fields = $post_data_form_fields;
372
373 //in case of duplicate post name using the first one
374 if(isset($el_settings['better_payment_form_fields']) && count($el_settings['better_payment_form_fields'])){
375 foreach ($el_settings['better_payment_form_fields'] as $item) {
376
377 $item_field_name = $better_payment_helper_obj->titleToSnake($item["better_payment_field_name_heading"]);
378 if(!empty($item['better_payment_primary_field_type']) ){
379 $item_primary_field_type = $item['better_payment_primary_field_type'];
380
381 if( isset($post_fields[$item_primary_field_type]) ) {
382 $post_fields[$item_primary_field_type] = is_array($post_fields[$item_primary_field_type]) ? $post_fields[$item_primary_field_type][0] : $post_fields[$item_primary_field_type];
383 }
384
385 if( isset($post_fields[$item_field_name]) ) {
386 $post_fields[$item_field_name] = is_array($post_fields[$item_field_name]) ? $post_fields[$item_field_name][0] : $post_fields[$item_field_name];
387 }
388
389 if ( 'primary_first_name' == $item_primary_field_type && isset($post_fields[$item_primary_field_type])){
390 $better_form_fields[$item_primary_field_type] = sanitize_text_field($post_fields[$item_primary_field_type]);
391 $post_data_primary_first_name = sanitize_text_field($post_fields[$item_primary_field_type]);
392
393 }else if ( 'primary_last_name' == $item_primary_field_type && isset($post_fields[$item_primary_field_type])){
394 $better_form_fields[$item_primary_field_type] = sanitize_text_field($post_fields[$item_primary_field_type]);
395 $post_data_primary_last_name = sanitize_text_field($post_fields[$item_primary_field_type]);
396
397 }else if( 'primary_email' == $item_primary_field_type && isset($post_fields[$item_primary_field_type])){
398 $better_form_fields[$item_primary_field_type] = sanitize_email($post_fields[$item_primary_field_type]);
399 $post_data_primary_email = sanitize_email($post_fields[$item_primary_field_type]);
400
401 }else if ( 'primary_payment_amount' == $item_primary_field_type && isset($post_fields[$item_primary_field_type]) ){
402 $better_form_fields[$item_primary_field_type] = floatval($post_fields[$item_primary_field_type]);
403
404 } else {
405 $better_form_fields[$item_field_name] = !empty($post_fields[$item_field_name]) ? sanitize_text_field($post_fields[$item_field_name]) : '';
406 }
407
408 }
409 }
410 }
411
412 return $better_form_fields;
413 }
414
415 }
416
417