PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 0.0.4
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v0.0.4
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.4, at includes/Classes/Better_Payment_Actions.php

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