PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.3.21
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.3.21
1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 All 49 releases
fluent-cart / app / Modules / PaymentMethods / StripeGateway / Connect / ConnectConfig.php

ConnectConfig.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.3.21, at app/Modules/PaymentMethods/StripeGateway/Connect/ConnectConfig.php

283 lines 10.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Modules\PaymentMethods\StripeGateway\Connect;
4
5 use FluentCart\App\Helpers\Helper;
6 use FluentCart\App\Modules\PaymentMethods\Core\GatewayManager;
7 use FluentCart\App\Modules\PaymentMethods\StripeGateway\API\Account;
8 use FluentCart\App\Modules\PaymentMethods\StripeGateway\Stripe;
9 use FluentCart\App\Modules\PaymentMethods\StripeGateway\StripeSettingsBase;
10 use FluentCart\App\Vite;
11 use FluentCart\Framework\Support\Arr;
12
13 class ConnectConfig
14 {
15 private static $connectBase = 'https://api.fluentcart.com/connect/';
16
17 public static function handleConnect($data)
18 {
19 // Permission check - only administrators can perform Stripe connect
20 if (!current_user_can('manage_options')) {
21 wp_die(__('You do not have permission to perform this action.', 'fluent-cart'), __('Security Check Failed', 'fluent-cart'), ['response' => 403]);
22 }
23
24 $intent = Arr::get($data, 'intent', '');
25
26 // Nonce verification for connect intent (initiated from admin)
27 if ($intent == 'connect') {
28 if (!isset($_REQUEST['_wpnonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_wpnonce'])), 'fluentcart')) {
29 wp_die(__('Security check failed. Please try again.', 'fluent-cart'), __('Security Check Failed', 'fluent-cart'), ['response' => 403]);
30 }
31 }
32
33 $stripeSettings = new StripeSettingsBase();
34
35 $mode = Arr::get($data, 'mode', '') === 'test' ? 'test' : 'live';
36
37 if (!$intent) {
38 wp_redirect(admin_url('admin.php?page=fluent-cart#/settings/payments/stripe'));
39 exit;
40 }
41
42 if ($intent == 'connect') {
43 if ($stripeSettings->getApiKey($mode)) {
44 // already connected
45 wp_redirect(admin_url('admin.php?page=fluent-cart#/settings/payments/stripe'));
46 exit;
47 }
48
49 $connectHash = md5('stripe_connect_' . $mode . '_' . wp_generate_uuid4());
50 $prevSettings = $stripeSettings->get();
51 $prevSettings[$mode . '_connect_hash'] = $connectHash;
52 $stripeSettings->updateSettings($prevSettings);
53
54 $redirectUrl = add_query_arg([
55 'mode' => $mode,
56 'hash' => $connectHash,
57 'url_base' => home_url('?fluent-cart=stripe_connect')
58 ], self::$connectBase);
59 wp_redirect($redirectUrl);
60 exit;
61 }
62 if ($intent == 'success') {
63 $apiUrl = self::$connectBase . 'stripe_tokens';
64
65 $paypload = [
66 'hash' => $stripeSettings->get($mode . '_connect_hash'),
67 'state' => Arr::get($data, 'state', ''),
68 'mode' => Arr::get($data, 'mode', '') === 'live' ? 'live' : 'test',
69 'set_webhook' => home_url('?fluent-cart=fct_payment_listener_ipn&method=stripe'),
70 'code' => Arr::get($data, 'code', '')
71 ];
72
73 $response = wp_remote_request($apiUrl, [
74 'method' => 'POST',
75 'timeout' => 45,
76 'redirection' => 5,
77 'sslverify' => false,
78 'blocking' => true,
79 'body' => $paypload,
80 'cookies' => []
81 ]);
82
83 if (!is_wp_error($response)) {
84 $responseBody = json_decode(wp_remote_retrieve_body($response), true);
85 $tokens = Arr::get($responseBody, 'tokens', []);
86 $prevSettings = $stripeSettings->get();
87 if ($tokens) {
88 $updateData = [
89 'is_active' => 'yes',
90 $mode . '_account_id' => Arr::get($tokens, 'stripe_user_id', ''),
91 $mode . '_publishable_key' => Arr::get($tokens, 'stripe_publishable_key', ''),
92 $mode . '_secret_key' => Helper::encryptKey(Arr::get($tokens, 'access_token', '')),
93 $mode . '_is_encrypted' => 'yes'
94 ];
95 $prevSettings = wp_parse_args($updateData, $prevSettings);
96 $stripeSettings->updateSettings($prevSettings);
97 }
98 }
99 }
100
101 wp_redirect(admin_url('admin.php?page=fluent-cart#/settings/payments/stripe'));
102 }
103
104 public static function getConnectConfig(): array
105 {
106 $settings = (new StripeSettingsBase())->get();
107
108 // Generate nonces for secure connect URLs
109 $liveNonce = wp_create_nonce('fluentcart');
110 $testNonce = wp_create_nonce('fluentcart');
111
112 return [
113 'connect_config' => [
114 'live_redirect' => add_query_arg([
115 'fluent-cart' => 'stripe_connect',
116 'intent' => 'connect',
117 'mode' => 'live',
118 '_wpnonce' => $liveNonce
119 ], home_url()),
120 'test_redirect' => add_query_arg([
121 'fluent-cart' => 'stripe_connect',
122 'intent' => 'connect',
123 'mode' => 'test',
124 '_wpnonce' => $testNonce
125 ], home_url()),
126 'image_url' => Vite::getAssetUrl('images/payment-methods/stripe-icon.png'),
127 ],
128 'test_account' => self::getAccountInfo($settings, 'test'),
129 'live_account' => self::getAccountInfo($settings, 'live'),
130 'settings' => $settings
131 ];
132 }
133
134 public static function verifyAuthorizeSuccess($data)
135 {
136 $response = wp_remote_post(self::$connectBase . 'stripe-verify-code', [
137 'method' => 'POST',
138 'timeout' => 45,
139 'redirection' => 5,
140 'httpversion' => '1.0',
141 'sslverify' => false,
142 'blocking' => true,
143 'headers' => array(),
144 'body' => $data,
145 'cookies' => array()
146 ]);
147
148 if (is_wp_error($response)) {
149 $message = $response->get_error_message();
150 echo '<div class="fct_message fct_message_error">' . esc_html($message) . '</div>';
151 return;
152 }
153
154 $response = json_decode(wp_remote_retrieve_body($response), true);
155
156 if (empty($response['stripe_user_id'])) {
157 $message = Arr::get($response, 'message');
158 if (!$message) {
159 $message = __('Invalid Stripe Request. Please configure stripe payment gateway again', 'fluent-cart');
160 }
161 echo '<div class="fct_message fct_message_error">' . esc_html($message) . '</div>';
162 return;
163 }
164
165 $settings = (new StripeSettingsBase())->get();
166
167 $settings['provider'] = 'connect';
168
169 $settings['is_active'] = 'yes';
170
171 if (!empty($response['livemode'])) {
172 $settings['payment_mode'] = 'live';
173 $settings['live_account_id'] = $response['stripe_user_id'];
174 $settings['live_publishable_key'] = $response['stripe_publishable_key'];
175 $settings['live_secret_key'] = $response['access_token'];
176 } else {
177 $settings['payment_mode'] = 'test';
178 $settings['test_account_id'] = $response['stripe_user_id'];
179 $settings['test_publishable_key'] = $response['stripe_publishable_key'];
180 $settings['test_secret_key'] = $response['access_token'];
181 }
182
183 (new Stripe())->updateSettings($settings);
184 }
185
186 private static function getAccountInfo($settings, $mode)
187 {
188
189 // if ($settings['is_active'] != 'yes') {
190 // return false;
191 // }
192
193 if ($settings['provider'] != 'connect') {
194 return false;
195 }
196
197 $apiKey = Helper::decryptKey($settings[$mode . '_secret_key']);
198
199 $accountId = Arr::get($settings, $mode . '_account_id');
200
201 if (!$accountId) {
202 return false;
203 }
204
205 $account = Account::retrive($accountId, $apiKey);
206
207 if (is_wp_error($account)) {
208 return [
209 'error' => $account->get_error_message()
210 ];
211 }
212
213 // Find the email.
214 $email = isset($account->email)
215 ? esc_html($account->email)
216 : '';
217
218 // Find a Display Name.
219 $display_name = isset($account->display_name)
220 ? esc_html($account->display_name)
221 : '';
222
223 if (
224 empty($display_name) &&
225 isset($account->settings) &&
226 isset($account->settings->dashboard) &&
227 isset($account->settings->dashboard->display_name)
228 ) {
229 $display_name = esc_html($account->settings->dashboard->display_name);
230 }
231
232 return [
233 'account_id' => $accountId,
234 'display_name' => $display_name,
235 'email' => $email
236 ];
237
238 }
239
240 public static function disconnect($mode, $sendResponse = true)
241 {
242 $stripeSettings = (new StripeSettingsBase())->get();
243
244 if (empty($stripeSettings[$mode . '_account_id'])) {
245 if ($sendResponse) {
246 wp_send_json([
247 'message' => __('Selected Account does not exist', 'fluent-cart')
248 ], 422);
249 }
250 return false;
251 }
252
253 $stripeSettings[$mode . '_account_id'] = '';
254 $stripeSettings[$mode . '_publishable_key'] = '';
255 $stripeSettings[$mode . '_secret_key'] = '';
256
257 if ($mode == 'live') {
258 $alternateMode = 'test';
259 } else {
260 $alternateMode = 'live';
261 }
262
263 if (empty($stripeSettings[$alternateMode . '_account_id'])) {
264 $stripeSettings['is_active'] = 'no';
265 $stripeSettings['payment_mode'] = 'test';
266 } else {
267 $stripeSettings['payment_mode'] = $alternateMode;
268 }
269
270 $stripe = GatewayManager::getInstance('stripe');
271 $sendResponse = $stripe->updateSettings($stripeSettings);
272
273 if ($sendResponse) {
274 wp_send_json([
275 'message' => __('Stripe settings has been disconnected', 'fluent-cart'),
276 'settings' => $stripeSettings
277 ], 200);
278 }
279
280 return true;
281 }
282 }
283