PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.1.91
LatePoint – Calendar Booking Plugin for Appointments and Events v5.1.91
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 1 year ago booking_form_settings_controller.php 1 year ago bookings_controller.php 1 year ago calendars_controller.php 1 year ago carts_controller.php 1 year ago controller.php 1 year ago customer_cabinet_controller.php 1 year ago customers_controller.php 1 year ago dashboard_controller.php 1 year ago default_agent_controller.php 1 year ago events_controller.php 1 year ago form_fields_controller.php 1 year ago integrations_controller.php 1 year 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 1 year ago processes_controller.php 1 year ago search_controller.php 1 year ago services_controller.php 1 year ago settings_controller.php 1 year ago steps_controller.php 1 year ago stripe_connect_controller.php 1 year 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
221 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' ] );
21 $this->action_access['customer'] = array_merge( $this->action_access['customer'], [ 'create_payment_intent' ] );
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 'Error converting order intent';
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' );
89 }
90 }
91 break;
92 }
93 exit();
94 }
95
96 private function get_env_from_params(): string {
97 return ( ! empty( $this->params['env'] && in_array( $this->params['env'], [
98 LATEPOINT_PAYMENTS_ENV_LIVE,
99 LATEPOINT_PAYMENTS_ENV_DEV
100 ] ) ) ) ? $this->params['env'] : OsSettingsHelper::get_payments_environment();
101 }
102
103 public function start_connect_process() {
104 $env = $this->get_env_from_params();
105 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'enable_payment_processor_stripe_connect', $env ), LATEPOINT_VALUE_ON );
106 $url = OsStripeConnectHelper::get_connect_url( $env );
107 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'url' => $url, 'message' => __( 'Redirecting to Stripe', 'latepoint' ) ) );
108 }
109
110 public function disconnect_connect_account() {
111 $env = $this->get_env_from_params();
112 try {
113 $path = 'server-tokens/' . OsStripeConnectHelper::get_server_token( $env ) . '/disconnect/';
114 $response = OsStripeConnectHelper::do_account_request( $path, $env, '', 'DELETE' );
115 if ( $response['status']['code'] == 200 ) {
116 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled' ) );
117 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id' ) );
118 } else {
119 OsDebugHelper::log( 'Stripe Connect Error', 'stripe_connect_disconnect_error', $response );
120 }
121 } catch ( Exception $e ) {
122 OsDebugHelper::log( 'Error getting status of a stripe connection', 'stripe', [ 'error_message' => $e->getMessage() ] );
123 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
124 }
125 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => OsStripeConnectHelper::get_connection_buttons_and_status( $env ) ) );
126 }
127
128
129 public function check_connect_status() {
130 $env = $this->get_env_from_params();
131 try {
132 $response = OsStripeConnectHelper::do_request( 'server-tokens/' . OsStripeConnectHelper::get_server_token( $env ) . '/status', '', 'GET', [], [], $env );
133 if ( ! empty( $response['data'] ) && ! empty( $response['data']['account_id'] ) ) {
134 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id', $env ), $response['data']['account_id'] );
135 if ( ! empty( $response['data']['charges_enabled'] ) ) {
136 OsSettingsHelper::save_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled', $env ), LATEPOINT_VALUE_ON );
137 } else {
138 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled', $env ) );
139 }
140 } else {
141 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_charges_enabled', $env ) );
142 OsSettingsHelper::remove_setting_by_name( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id', $env ) );
143 }
144 if ( ! empty( $response['data']['error'] ) ) {
145 OsDebugHelper::log( 'Error checking status of server token', 'stripe_connect_error', [ 'error_message' => $response['data']['error'] ] );
146 }
147 } catch ( Exception $e ) {
148 OsDebugHelper::log( 'Error getting status of a stripe connection', 'stripe_connect_error', [ 'error_message' => $e->getMessage() ] );
149 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
150 }
151 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => OsStripeConnectHelper::get_connection_buttons_and_status( $env ) ) );
152 }
153
154
155 public function heartbeat() {
156 $payload = @file_get_contents( 'php://input' );
157 $data = json_decode( $payload, true );
158
159 if ( empty( $data['wp_latepoint_server_token'] ) ) {
160 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => 'Token is missing' ), 404 );
161 }
162 if ( $data['wp_latepoint_server_token'] != OsStripeConnectHelper::get_server_token() ) {
163 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => 'Invalid Token' ), 404 );
164 }
165
166 $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => 'Heartbeat detected' ), 200 );
167 }
168
169 public function create_payment_intent() {
170 try {
171 OsStepsHelper::set_required_objects( $this->params );
172
173 $booking_form_page_url = $this->params['booking_form_page_url'] ?? OsUtilHelper::get_referrer();
174 $order_intent = OsOrderIntentHelper::create_or_update_order_intent( OsStepsHelper::$cart_object, OsStepsHelper::$restrictions, OsStepsHelper::$presets, $booking_form_page_url );
175
176 if ( ! $order_intent->is_bookable() ) {
177 throw new Exception( empty( $order_intent->get_error_messages() ) ? __( 'Booking slot is not available anymore.', 'latepoint' ) : implode( ', ', $order_intent->get_error_messages() ) );
178 }
179
180 if ( OsSettingsHelper::get_settings_value( OsSettingsHelper::append_payment_env_key( 'stripe_connect_account_id' ) ) ) {
181 $payment_intent_data = OsStripeConnectHelper::generate_payment_intent_id_and_secret_for_order_intent( $order_intent );
182 $payment_intent_id = $payment_intent_data['id'];
183 $payment_intent_client_secret = $payment_intent_data['client_secret'];
184 } else {
185 throw new Exception( __( 'Stripe connect account ID not set', 'latepoint' ) );
186 }
187
188
189 // update cart with payment intent id
190 OsStepsHelper::$cart_object->payment_token = $payment_intent_id;
191
192 // cart_item_data might be changed after filters run, make sure to get the latest version
193 $cart_items_data = json_decode( $order_intent->cart_items_data, true );
194 $payment_data = json_decode( $order_intent->payment_data, true );
195
196 $payment_data['token'] = $payment_intent_id;
197 $order_intent->update_attributes( [
198 'cart_items_data' => wp_json_encode( $cart_items_data ),
199 'payment_data' => wp_json_encode( $payment_data )
200 ] );
201 if ( $this->get_return_format() == 'json' ) {
202 $this->send_json( [
203 'status' => LATEPOINT_STATUS_SUCCESS,
204 'continue_order_intent_url' => OsOrderIntentHelper::generate_continue_intent_url( $order_intent->intent_key ),
205 'payment_intent_id' => $payment_intent_id,
206 'payment_intent_secret' => $payment_intent_client_secret,
207 'order_intent_key' => $order_intent->intent_key
208 ] );
209 }
210 } catch ( Exception $e ) {
211 if ( $this->get_return_format() == 'json' ) {
212 $this->send_json( array( 'status' => LATEPOINT_STATUS_ERROR, 'message' => $e->getMessage() ) );
213 }
214 }
215
216 }
217 }
218
219
220 endif;
221