PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 2.2.2
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v2.2.2
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 1.0.5 1.0.6 All 66 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.2.2, at includes/Admin/Elementor/Form_Actions/Stripe_Integration.php

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