PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.2.4
LatePoint – Calendar Booking Plugin for Appointments and Events v5.2.4
5.6.7 5.6.6 5.6.5 5.6.4 5.6.3 5.6.2 5.6.1 5.6.0 5.5.2 5.5.1 5.5.0 5.4.2 trunk 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.1.91 5.1.92 5.1.93 5.1.94 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1
latepoint / lib / controllers / stripe_connect_controller.php
latepoint / lib / controllers Last commit date
activities_controller.php 1 year ago auth_controller.php 9 months ago booking_form_settings_controller.php 1 year ago bookings_controller.php 1 year ago calendars_controller.php 9 months ago carts_controller.php 1 year ago controller.php 9 months ago customer_cabinet_controller.php 9 months ago customers_controller.php 9 months ago dashboard_controller.php 9 months ago default_agent_controller.php 1 year ago events_controller.php 1 year ago form_fields_controller.php 9 months ago integrations_controller.php 9 months ago invoices_controller.php 1 year ago manage_booking_by_key_controller.php 1 year ago manage_order_by_key_controller.php 1 year ago notifications_controller.php 1 year ago orders_controller.php 1 year ago pro_controller.php 1 year ago process_jobs_controller.php 9 months ago processes_controller.php 1 year ago search_controller.php 1 year ago services_controller.php 9 months ago settings_controller.php 1 year ago steps_controller.php 9 months ago stripe_connect_controller.php 9 months ago support_topics_controller.php 1 year ago todos_controller.php 1 year ago transactions_controller.php 1 year ago wizard_controller.php 1 year ago
stripe_connect_controller.php
248 lines
1 <?php
2 /*
3 * Copyright (c) 2024 LatePoint LLC. All rights reserved.
4 */
5
6 if ( ! defined( 'ABSPATH' ) ) {
7 exit; // Exit if accessed directly.
8 }
9
10
11 if ( ! class_exists( 'OsStripeConnectController' ) ) :
12
13
14 class OsStripeConnectController extends OsController {
15
16
17 function __construct() {
18 parent::__construct();
19
20 $this->action_access['public'] = array_merge( $this->action_access['public'], [ 'webhook', 'create_payment_intent_for_transaction', 'create_payment_intent' ] );
21 $this->action_access['customer'] = array_merge( $this->action_access['customer'], [] );
22 $this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'stripe_connect/';
23 }
24
25 public function create_payment_intent_for_transaction() {
26 if ( ! filter_var( $this->params['invoice_id'], FILTER_VALIDATE_INT ) ) {
27 exit();
28 }
29 try {
30
31 $invoice = new OsInvoiceModel( $this->params['invoice_id'] );
32
33 $transaction_intent = OsTransactionIntentHelper::create_or_update_transaction_intent( $invoice, $this->params );
34
35 if ( OsSettingsHelper::get_settings_value( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id' ) ) ) {
36 $payment_intent_data = OsStripeConnectHelper::generate_payment_intent_id_and_secret_for_transaction_intent( $transaction_intent );
37 $payment_intent_id = $payment_intent_data['id'];
38 $payment_intent_client_secret = $payment_intent_data['client_secret'];
39 } else {
40 throw new Exception( __( 'Stripe connect account ID not set', 'latepoint' ) );
41 }
42
43 $transaction_intent->set_payment_data_value( 'token', $payment_intent_id, false );
44 if ( ! $transaction_intent->save() ) {
45 throw new Exception( __( 'Unable to save transaction intent', 'latepoint' ) );
46 }
47
48
49 if ( $this->get_return_format() == 'json' ) {
50 $this->send_json( [
51 'status' => LATEPOINT_STATUS_SUCCESS,
52 'continue_transaction_intent_url' => OsTransactionIntentHelper::generate_continue_intent_url( $transaction_intent->intent_key ),
53 'payment_intent_id' => $payment_intent_id,
54 'payment_intent_secret' => $payment_intent_client_secret,
55 'transaction_intent_key' => $transaction_intent->intent_key
56 ] );
57 }
58 } catch ( Exception $e ) {
59 if ( $this->get_return_format() == 'json' ) {
60 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
61 }
62 }
63 }
64
65 public function webhook() {
66 $payload = @file_get_contents( 'php://input' );
67 $data = json_decode( $payload, true );
68 if ( empty( $data['server_token'] ) || $data['server_token'] != OsStripeConnectHelper::get_server_token() || $data['stripe_account_id'] != OsStripeConnectHelper::get_connect_account_id() ) {
69 http_response_code( 400 );
70 echo 'Validation issue with webhook';
71 exit();
72 }
73 $event = $data['event'];
74 // Handle the event
75 switch ( $event['type'] ) {
76 case 'payment_intent.succeeded':
77 if ( ! empty( $event['data']['order_intent_key'] ) ) {
78 $order_intent = OsOrderIntentHelper::get_order_intent_by_intent_key( $event['data']['order_intent_key'] );
79 if ( $order_intent->is_new_record() ) {
80 OsDebugHelper::log( 'Error processing stripe connect webhook: Order intent not found for key' );
81 http_response_code( 400 );
82 exit();
83 }
84 if ( $order_intent->convert_to_order() ) {
85 http_response_code( 200 );
86 } else {
87 http_response_code( 400 );
88 OsDebugHelper::log( 'Error converting order intent', 'stripe_connect_webhook', $order_intent->get_error_messages() );
89 }
90 }
91 if ( ! empty( $event['data']['transaction_intent_key'] ) ) {
92 $transaction_intent = OsTransactionIntentHelper::get_transaction_intent_by_intent_key( $event['data']['transaction_intent_key'] );
93 if ( $transaction_intent->is_new_record() ) {
94 OsDebugHelper::log( 'Error processing stripe connect webhook: Transaction intent not found for key' );
95 http_response_code( 400 );
96 exit();
97 }
98 if ( $transaction_intent->convert_to_transaction() ) {
99 http_response_code( 200 );
100 } else {
101 http_response_code( 400 );
102 OsDebugHelper::log( 'Error converting transaction intent' );
103 }
104 }
105 break;
106 }
107 exit();
108 }
109
110 private function get_env_from_params(): string {
111 return ( ! empty( $this->params['env'] && in_array( $this->params['env'], [
112 LATEPOINT_PAYMENTS_ENV_LIVE,
113 LATEPOINT_PAYMENTS_ENV_DEV
114 ] ) ) ) ? $this->params['env'] : OsSettingsHelper::get_payments_environment();
115 }
116
117 public function start_connect_process() {
118 $env = $this->get_env_from_params();
119 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'enable_payment_processor_stripe_connect', $env ), LATEPOINT_VALUE_ON );
120 $url = OsStripeConnectHelper::get_connect_url( $env );
121 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'url' => $url, 'message' => __( 'Redirecting to Stripe', 'latepoint' ) ) );
122 }
123
124 public function disconnect_connect_account() {
125 $env = $this->get_env_from_params();
126 try {
127 $path = 'server-tokens/' . OsStripeConnectHelper::get_server_token( $env ) . '/disconnect/';
128 $response = OsStripeConnectHelper::do_account_request( $path, $env, '', 'DELETE' );
129 if ( $response['status']['code'] == 200 ) {
130 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled' ) );
131 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id' ) );
132 OsStripeConnectHelper::reset_server_token($env);
133 } else {
134 OsDebugHelper::log( 'Stripe Connect Error', 'stripe_connect_disconnect_error', $response );
135 }
136 } catch ( Exception $e ) {
137 OsDebugHelper::log( 'Error getting status of a stripe connection', 'stripe', [ 'error_message' => $e->getMessage() ] );
138 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
139 }
140 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => OsStripeConnectHelper::get_connection_buttons_and_status( $env ) ) );
141 }
142
143
144 public function check_connect_status() {
145 $env = $this->get_env_from_params();
146 try {
147 $response = OsStripeConnectHelper::do_request( 'server-tokens/' . OsStripeConnectHelper::get_server_token( $env ) . '/status', '', 'GET', [], [], $env );
148 if($env == 'live'){
149 if(empty($response['data']['transaction_fee_info'])){
150 OsSettingsHelper::save_setting_by_name( 'stripe_connect_transaction_fee_info', '0' );
151 }else{
152 OsSettingsHelper::save_setting_by_name( 'stripe_connect_transaction_fee_info', $response['data']['transaction_fee_info'] );
153 }
154 }
155 if ( ! empty( $response['data'] ) && ! empty( $response['data']['account_id'] ) ) {
156 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id', $env ), $response['data']['account_id'] );
157 if ( ! empty( $response['data']['charges_enabled'] ) ) {
158 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled', $env ), LATEPOINT_VALUE_ON );
159 } else {
160 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled', $env ) );
161 }
162 } else {
163 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled', $env ) );
164 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id', $env ) );
165 }
166 if ( ! empty( $response['data']['active_site_urls'] ) ) {
167 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_duplicate_token_activations', $env ), $response['data']['active_site_urls'] );
168 }else{
169 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_duplicate_token_activations', $env ) );
170 }
171 if ( ! empty( $response['data']['error'] ) ) {
172 OsDebugHelper::log( 'Error checking status of server token', 'stripe_connect_error', [ 'error_message' => $response['data']['error'] ] );
173 }
174 } catch ( Exception $e ) {
175 OsDebugHelper::log( 'Error getting status of a stripe connection', 'stripe_connect_error', [ 'error_message' => $e->getMessage() ] );
176 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
177 }
178 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => OsStripeConnectHelper::get_connection_buttons_and_status( $env ) ) );
179 }
180
181
182 public function heartbeat() {
183 $payload = @file_get_contents( 'php://input' );
184 $data = json_decode( $payload, true );
185
186 if ( empty( $data['wp_latepoint_server_token'] ) ) {
187 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => 'Token is missing' ), 404 );
188 }
189 if ( $data['wp_latepoint_server_token'] != OsStripeConnectHelper::get_server_token() ) {
190 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => 'Invalid Token' ), 404 );
191 }
192
193 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => 'Heartbeat detected' ), 200 );
194 }
195
196 public function create_payment_intent() {
197 try {
198 OsStepsHelper::set_required_objects( $this->params );
199
200 $booking_form_page_url = $this->params['booking_form_page_url'] ?? OsUtilHelper::get_referrer();
201 $order_intent = OsOrderIntentHelper::create_or_update_order_intent( OsStepsHelper::$cart_object, OsStepsHelper::$restrictions, OsStepsHelper::$presets, $booking_form_page_url, OsStepsHelper::get_customer_object_id() );
202
203 if ( ! $order_intent->is_bookable() ) {
204 throw new Exception( empty( $order_intent->get_error_messages() ) ? __( 'Booking slot is not available anymore.', 'latepoint' ) : implode( ', ', $order_intent->get_error_messages() ) );
205 }
206
207 if ( OsSettingsHelper::get_settings_value( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id' ) ) ) {
208 $payment_intent_data = OsStripeConnectHelper::generate_payment_intent_id_and_secret_for_order_intent( $order_intent );
209 $payment_intent_id = $payment_intent_data['id'];
210 $payment_intent_client_secret = $payment_intent_data['client_secret'];
211 } else {
212 throw new Exception( __( 'Stripe connect account ID not set', 'latepoint' ) );
213 }
214
215
216 // update cart with payment intent id
217 OsStepsHelper::$cart_object->payment_token = $payment_intent_id;
218
219 // cart_item_data might be changed after filters run, make sure to get the latest version
220 $cart_items_data = json_decode( $order_intent->cart_items_data, true );
221 $payment_data = json_decode( $order_intent->payment_data, true );
222
223 $payment_data['token'] = $payment_intent_id;
224 $order_intent->update_attributes( [
225 'cart_items_data' => wp_json_encode( $cart_items_data ),
226 'payment_data' => wp_json_encode( $payment_data )
227 ] );
228 if ( $this->get_return_format() == 'json' ) {
229 $this->send_json( [
230 'status' => LATEPOINT_STATUS_SUCCESS,
231 'continue_order_intent_url' => OsOrderIntentHelper::generate_continue_intent_url( $order_intent->intent_key ),
232 'payment_intent_id' => $payment_intent_id,
233 'payment_intent_secret' => $payment_intent_client_secret,
234 'order_intent_key' => $order_intent->intent_key
235 ] );
236 }
237 } catch ( Exception $e ) {
238 if ( $this->get_return_format() == 'json' ) {
239 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
240 }
241 }
242
243 }
244 }
245
246
247 endif;
248