PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 2.4.1
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v2.4.1
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 / Admin / Elementor / Form_Actions / Stripe_Integration.php

Stripe_Integration.php in Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More 2.4.1, at includes/Admin/Elementor/Form_Actions/Stripe_Integration.php

306 lines 13.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\Admin\Elementor\Form_Actions;
4
5 use Better_Payment\Lite\Admin\DB;
6 use Better_Payment\Lite\Campaign\CampaignStats;
7 use Better_Payment\Lite\Classes\Handler;
8 use Better_Payment\Lite\Classes\PaymentRequestGuard;
9 use Elementor\Controls_Manager;
10 use ElementorPro\Modules\Forms\Classes\Action_Base;
11 use ElementorPro\Modules\Forms\Classes\Ajax_Handler;
12 use ElementorPro\Modules\Forms\Classes\Form_Record;
13
14 /**
15 * Stripe integration class
16 *
17 * @since 0.0.1
18 */
19 class Stripe_Integration extends Action_Base {
20 private $better_payment_global_settings = [];
21
22 public function __construct() {
23 wp_enqueue_script( 'better-payment' );
24 }
25
26 public function get_name() {
27 return 'stripe';
28 }
29
30 public function get_label() {
31 return __( 'Stripe', 'better-payment' );
32 }
33
34 public function get_script_depends() {
35 return [ 'better-payment' ];
36 }
37
38 /**
39 * @param \Elementor\Widget_Base $widget
40 */
41 public function register_settings_section( $widget ) {
42 $this->better_payment_global_settings = DB::get_settings();
43
44 $widget->start_controls_section(
45 'section_stripe_payment',
46 [
47 'label' => __( 'Stripe', 'better-payment' ),
48 'condition' => [
49 'submit_actions' => $this->get_name(),
50 'better_payment_payment_amount_enable' => 'yes'
51 ],
52 ]
53 );
54
55 $better_payment_helper = new \Better_Payment\Lite\Classes\Helper();
56
57 $widget->add_control(
58 'better_payment_form_stripe_currency',
59 [
60 'label' => esc_html__( 'Currency', 'better-payment' ),
61 'type' => Controls_Manager::SELECT,
62 'default' => esc_html($this->better_payment_global_settings['better_payment_settings_general_general_currency']),
63 'options' => $better_payment_helper->get_currency_list(),
64 ]
65 );
66
67 $widget->add_control(
68 'better_payment_form_currency_alignment_stripe',
69 [
70 'label' => esc_html__( 'Currency Alignment', 'better-payment' ),
71 'type' => Controls_Manager::CHOOSE,
72 'options' => [
73 'left' => [
74 'title' => esc_html__( 'Left', 'better-payment' ),
75 'icon' => 'eicon-text-align-left',
76 ],
77 'right' => [
78 'title' => esc_html__( 'Right', 'better-payment' ),
79 'icon' => 'eicon-text-align-right',
80 ],
81 ],
82 ]
83 );
84
85 $better_payment_is_stripe_live = $this->better_payment_global_settings['better_payment_settings_payment_stripe_live_mode'] == 'yes' ? 1 : 0;
86
87 $widget->add_control(
88 'better_payment_stripe_public_key',
89 [
90 'label' => __( 'Public Key', 'better-payment' ),
91 'type' => current_user_can('manage_options') ? Controls_Manager::TEXT : Controls_Manager::HIDDEN,
92 'dynamic' => [
93 'active' => true,
94 ],
95 'label_block' => true,
96 'default' => $better_payment_is_stripe_live ? esc_html($this->better_payment_global_settings['better_payment_settings_payment_stripe_live_public']) : esc_html($this->better_payment_global_settings['better_payment_settings_payment_stripe_test_public']),
97 'ai' => [
98 'active' => false,
99 ],
100 ]
101 );
102
103 $widget->add_control(
104 'better_payment_stripe_secret_key',
105 [
106 'label' => __( 'Secret Key', 'better-payment' ),
107 'type' => current_user_can('manage_options') ? Controls_Manager::TEXT : Controls_Manager::HIDDEN,
108 'input_type' => 'password',
109 'dynamic' => [
110 'active' => true,
111 ],
112 'label_block' => true,
113 'default' => $better_payment_is_stripe_live ? esc_html($this->better_payment_global_settings['better_payment_settings_payment_stripe_live_secret']) : esc_html($this->better_payment_global_settings['better_payment_settings_payment_stripe_test_secret']),
114 'ai' => [
115 'active' => false,
116 ],
117 ]
118 );
119
120 $widget->add_control(
121 'better_payment_stripe_live_mode',
122 [
123 'label' => __( 'Live Mode', 'better-payment' ),
124 'type' => Controls_Manager::SWITCHER,
125 'label_on' => __( 'Yes', 'better-payment' ),
126 'label_off' => __( 'No', 'better-payment' ),
127 'return_value' => 'yes',
128 'default' => esc_html($this->better_payment_global_settings['better_payment_settings_payment_paypal_live_mode']), //yes or no
129 ]
130 );
131 $widget->end_controls_section();
132 }
133
134 /**
135 * @param array $element
136 * @return array
137 */
138 public function on_export( $element ) {
139 unset(
140 $element[ 'settings' ][ 'better_payment_form_stripe_currency' ],
141 $element[ 'settings' ][ 'better_payment_stripe_public_key' ],
142 $element[ 'settings' ][ 'better_payment_stripe_secret_key' ],
143 $element[ 'settings' ][ 'better_payment_stripe_live_mode' ]
144 );
145 return $element;
146 }
147
148 /**
149 * @param Form_Record $record
150 * @param Ajax_Handler $ajax_handler
151 */
152 public function run( $record, $ajax_handler ) {
153 // $settings = $record->get( 'form_settings' );
154 $secret_key = $record->get_form_settings( 'better_payment_stripe_secret_key' );
155 $post_data = [];
156 $header_info = array(
157 'Authorization' => 'Basic ' . base64_encode( $secret_key . ':' ),
158 'Stripe-Version' => '2019-05-16'
159 );
160
161 $sent_data = $record->get( 'sent_data' );
162 $el_form_form_settings = $record->get('form_settings');
163 $page_id = $el_form_form_settings['form_post_id'] ? intval($el_form_form_settings['form_post_id']) : 0;
164 $widget_id = $el_form_form_settings['id'] ? sanitize_text_field($el_form_form_settings['id']) : '';
165
166 if ( empty( $sent_data['payment_amount'] ) && empty( $sent_data['primary_payment_amount_radio'] ) ) {
167 $ajax_handler->add_error_message( 'Amount field is required!' );
168 return false;
169 }
170
171 // Amount and quantity come from the form's field settings, never from the
172 // request — see PaymentRequestGuard.
173 $guarded = ( new PaymentRequestGuard() )->resolve_elementor_form_payment( (array) $el_form_form_settings, (array) $sent_data );
174
175 if ( is_wp_error( $guarded ) ) {
176 $ajax_handler->add_error_message( $guarded->get_error_message() );
177 return false;
178 }
179
180 $unit_amount = $guarded['unit_amount'];
181 $quantity = $guarded['quantity'];
182 $amount = $guarded['amount'];
183
184 $order_id = Handler::new_order_id( 'stripe' );
185 $request = [
186 'success_url' => add_query_arg( [
187 'better_payment_stripe_status' => 'success',
188 'better_payment_stripe_id' => $order_id,
189 'better_payment_widget_id' => sanitize_text_field( $record->get( 'form_settings' )[ 'id' ] )
190 ], get_permalink() ),
191 'cancel_url' => add_query_arg( [
192 'better_payment_error_status' => 'error',
193 'better_payment_stripe_id' => $order_id,
194 'better_payment_widget_id' => sanitize_text_field( $record->get( 'form_settings' )[ 'id' ] )
195 ], get_permalink() ),
196 'locale' => 'auto',
197 'payment_method_types' => [ 'card' ],
198 'client_reference_id' => time(),
199 'billing_address_collection' => 'required',
200 'metadata' => [
201 'order_id' => $order_id
202 ],
203 'line_items' => [
204 [
205 // Per unit: Stripe multiplies by `quantity` itself. Sending the
206 // quantity-multiplied total here charged quantity² units.
207 'amount' => (int) round( $unit_amount * 100 ),
208 'currency' => sanitize_text_field($record->get_form_settings( 'better_payment_form_stripe_currency' )),
209 'name' => sanitize_text_field( $record->get_form_settings( 'form_name' ) ),
210 'quantity' => $quantity
211 ]
212 ],
213 'payment_intent_data' => [
214 'capture_method' => 'automatic',
215 'description' => sanitize_text_field( $record->get_form_settings( 'form_name' ) ),
216 'metadata' => [
217 'order_id' => $order_id
218 ]
219 ]
220 ];
221
222 if ( !empty( $sent_data[ 'email' ] ) ) {
223 $request[ 'payment_intent_data' ][ 'metadata' ][ 'customer_email' ] = $request[ 'metadata' ][ 'customer_email' ] = $request[ 'customer_email' ] = sanitize_email( $sent_data[ 'email' ] );
224 }
225
226 if ( ! empty( $sent_data[ 'name' ] ) ) {
227 $request['customer_name'] = ! empty( $request['customer_name'] ) ? $request['customer_name'] . ' ' . sanitize_text_field( $sent_data['name'] ) : sanitize_text_field( $sent_data['name'] );
228 }
229
230 if ( ! empty( $sent_data['first_name'] ) ) {
231 $request['customer_name'] = ! empty( $request['customer_name'] ) ? $request[ 'customer_name' ] . ' ' . sanitize_text_field( $sent_data['first_name'] ) : sanitize_text_field( $sent_data['first_name'] );
232 }
233
234 if ( !empty( $sent_data[ 'last_name' ] ) ) {
235 $request['customer_name'] = ! empty( $request['customer_name'] ) ? $request['customer_name'] . ' ' . sanitize_text_field( $sent_data['last_name'] ) : sanitize_text_field( $sent_data['last_name'] );
236 }
237
238 if ( ! empty( $request['customer_name'] ) ) {
239 $request['payment_intent_data']['metadata']['customer_name'] = $request['metadata']['customer_name'] = $request['customer_name'];
240 unset( $request['customer_name'] );
241 }
242
243 $response = wp_safe_remote_post(
244 'https://api.stripe.com/v1/checkout/sessions',
245 array(
246 'method' => 'POST',
247 'headers' => $header_info,
248 'body' => $request,
249 'timeout' => 70,
250 )
251 );
252
253 $response_ar = json_decode( $response[ 'body' ] );
254
255 if ( ! empty( $response_ar->error ) ) {
256 $ajax_handler->add_error_message( sanitize_text_field( $response_ar->error->message ) );
257 return false;
258 }
259
260 if ( !empty( $response_ar->payment_intent ) ) {
261
262 //Form fields data to send via email
263 $better_form_fields = [
264 'primary_first_name' => ! empty( $request['payment_intent_data']['metadata']['customer_name'] ) ? sanitize_text_field( $request['payment_intent_data']['metadata']['customer_name'] ) : '',
265 'email' => !empty( $sent_data[ 'email' ]) ? sanitize_email($sent_data[ 'email' ]) : '',
266 'amount' => sanitize_text_field($record->get_form_settings( 'better_payment_form_stripe_currency' )) . floatval( $amount ),
267 'el_form_fields' => maybe_serialize($sent_data),
268 'referer_page_id' => $page_id,
269 'referer_widget_id' => $widget_id,
270 'source' => 'stripe'
271 ];
272
273 // Get campaign_id from form data if available
274 $campaign_id = $guarded['campaign_id'];
275
276 Handler::payment_create(
277 [
278 'amount' => $amount,
279 'order_id' => $order_id,
280 'payment_date' => date( 'Y-m-d H:i:s' ),
281 'source' => 'stripe',
282 'transaction_id' => sanitize_text_field($response_ar->payment_intent),
283 'customer_info' => maybe_serialize( $response_ar ),
284 'form_fields_info' => maybe_serialize( $better_form_fields ),
285 'obj_id' => sanitize_text_field($response_ar->id),
286 'status' => sanitize_text_field($response_ar->payment_status),
287 'currency' => sanitize_text_field($record->get_form_settings( 'better_payment_form_stripe_currency' )),
288 'referer' => "elementor-form",
289 'campaign_id' => $campaign_id,
290 ]
291 );
292 if ( $campaign_id ) {
293 CampaignStats::bust_cache( (int) $campaign_id );
294 }
295 $stripe_response = [
296 'stripe_data' => sanitize_text_field($response_ar->id),
297 'stripe_public_key' => sanitize_text_field( $record->get_form_settings( 'better_payment_stripe_public_key' ) )
298 ];
299
300 $ajax_handler->add_response_data( 'better_stripe_data', $stripe_response );
301 }
302 }
303 }
304
305
306