PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.33.0
GiveWP – Donation Plugin and Fundraising Platform v2.33.0
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / PaymentGateways / PayPalCommerce / AjaxRequestHandler.php
give / src / PaymentGateways / PayPalCommerce Last commit date
Banners 2 years ago DataTransferObjects 4 years ago Exceptions 3 years ago Migrations 2 years ago Models 2 years ago PayPalCheckoutSdk 2 years ago Repositories 2 years ago Webhooks 2 years ago AccountAdminNotices.php 4 years ago AdminSettingFields.php 2 years ago AdvancedCardFields.php 4 years ago AjaxRequestHandler.php 2 years ago DonationDetailsPage.php 4 years ago DonationFormPaymentMethod.php 4 years ago PayPalClient.php 2 years ago PayPalCommerce.php 2 years ago RefreshToken.php 2 years ago RefundPaymentHandler.php 4 years ago ScriptLoader.php 2 years ago Utils.php 4 years ago onBoardingRedirectHandler.php 2 years ago
AjaxRequestHandler.php
388 lines
1 <?php
2
3 namespace Give\PaymentGateways\PayPalCommerce;
4
5 use Give\Framework\Http\ConnectServer\Client\ConnectClient;
6 use Give\PaymentGateways\PayPalCommerce\Models\MerchantDetail;
7 use Give\PaymentGateways\PayPalCommerce\Repositories\MerchantDetails;
8 use Give\PaymentGateways\PayPalCommerce\Repositories\PayPalAuth;
9 use Give\PaymentGateways\PayPalCommerce\Repositories\PayPalOrder;
10 use Give\PaymentGateways\PayPalCommerce\Repositories\Settings;
11 use Give\PaymentGateways\PayPalCommerce\Repositories\Webhooks;
12
13 /**
14 * Class AjaxRequestHandler
15 * @package Give\PaymentGateways\PaypalCommerce
16 *
17 * @sicne 2.9.0
18 */
19 class AjaxRequestHandler
20 {
21 /**
22 * @since 2.9.0
23 *
24 * @var Webhooks
25 */
26 private $webhooksRepository;
27
28 /**
29 * @since 2.9.0
30 *
31 * @var MerchantDetail
32 */
33 private $merchantDetails;
34
35 /**
36 * @since 2.9.0
37 *
38 * @var PayPalAuth
39 */
40 private $payPalAuth;
41
42 /**
43 * @since 2.9.0
44 *
45 * @var MerchantDetails
46 */
47 private $merchantRepository;
48
49 /**
50 * @since 2.9.0
51 *
52 * @var ConnectClient
53 */
54 private $refreshToken;
55
56 /**
57 * @since 2.9.0
58 *
59 * @var Settings
60 */
61 private $settings;
62
63 /**
64 * AjaxRequestHandler constructor.
65 *
66 * @since 2.9.0
67 *
68 * @param Webhooks $webhooksRepository
69 * @param MerchantDetail $merchantDetails
70 * @param MerchantDetails $merchantRepository
71 * @param RefreshToken $refreshToken
72 * @param Settings $settings
73 * @param PayPalAuth $payPalAuth
74 */
75 public function __construct(
76 Webhooks $webhooksRepository,
77 MerchantDetail $merchantDetails,
78 MerchantDetails $merchantRepository,
79 RefreshToken $refreshToken,
80 Settings $settings,
81 PayPalAuth $payPalAuth
82 ) {
83 $this->webhooksRepository = $webhooksRepository;
84 $this->merchantDetails = $merchantDetails;
85 $this->merchantRepository = $merchantRepository;
86 $this->refreshToken = $refreshToken;
87 $this->settings = $settings;
88 $this->payPalAuth = $payPalAuth;
89 }
90
91 /**
92 * give_paypal_commerce_user_onboarded ajax action handler
93 *
94 * @since 2.32.0 Return error response on exception when fetch access token from authorization code.
95 * @since 2.9.0
96 */
97 public function onBoardedUserAjaxRequestHandler()
98 {
99 $this->validateAdminRequest();
100
101 if (empty($_GET['mode']) || ! in_array($_GET['mode'], ['sandbox', 'live'])) {
102 wp_send_json_error('Must include valid mode');
103 }
104
105 $mode = sanitize_text_field(wp_unslash($_GET['mode']));
106
107 // Set PayPal client mode.
108 give(PayPalClient::class)->setMode($mode);
109
110 $partnerLinkInfo = $this->settings->getPartnerLinkDetails();
111
112 try{
113 $payPalResponse = $this->payPalAuth->getTokenFromAuthorizationCode(
114 give_clean($_GET['authCode']),
115 give_clean($_GET['sharedId']),
116 $partnerLinkInfo['nonce']
117 );
118 } catch ( \Exception $exception ) {
119 wp_send_json_error();
120 }
121
122 $this->settings->updateAccessToken($payPalResponse);
123
124 // Set cron job to refresh token.
125 $refreshToken = give(RefreshToken::class);
126 $refreshToken->setMode($mode);
127 $refreshToken->registerCronJobToRefreshToken($payPalResponse['expiresIn']);
128
129 wp_send_json_success();
130 }
131
132 /**
133 * This function handle ajax request with give_paypal_commerce_get_partner_url action.
134 *
135 * @since 2.30.0 Add support for mode param.
136 * @since 2.9.0
137 */
138 public function onGetPartnerUrlAjaxRequestHandler()
139 {
140 $this->validateAdminRequest();
141
142 if (empty($country = $_GET['countryCode']) || ! isset(give_get_country_list()[$country])) {
143 wp_send_json_error('Must include valid 2-character country code');
144 }
145
146 if (empty($_GET['mode']) || ! in_array($_GET['mode'], ['sandbox', 'live'])) {
147 wp_send_json_error('Must include valid mode');
148 }
149
150 $country = sanitize_text_field(wp_unslash($_GET['countryCode']));
151 $mode = sanitize_text_field(wp_unslash($_GET['mode']));
152 $redirectUrl = add_query_arg(
153 [
154 'tab' => 'gateways',
155 'section' => 'paypal',
156 'group' => 'paypal-commerce',
157 'mode' => $mode
158 ],
159 admin_url('edit.php?post_type=give_forms&page=give-settings')
160 );
161
162 // Set PayPal client mode.
163 give(PayPalClient::class)->setMode($mode);
164
165 $data = $this->payPalAuth->getSellerPartnerLink($redirectUrl, $country);
166
167 if (! $data) {
168 wp_send_json_error();
169 }
170
171 $this->settings->updateAccountCountry($country);
172 $this->settings->updatePartnerLinkDetails($data);
173
174 wp_send_json_success($data);
175 }
176
177 /**
178 * give_paypal_commerce_disconnect_account ajax request handler.
179 *
180 * @since 2.30.0 Add support for mode param.
181 * @since 2.25.0 Remove merchant seller token.
182 * @since 2.9.0
183 */
184 public function removePayPalAccount()
185 {
186 if (! current_user_can('manage_give_settings')) {
187 wp_send_json_error(['error' => esc_html__('You are not allowed to perform this action.', 'give')]);
188 }
189
190 try {
191 $mode = give_clean($_POST['mode']);
192 $this->webhooksRepository->setMode($mode);
193 $this->merchantRepository->setMode($mode);
194 $this->refreshToken->setMode($mode);
195 $this->settings->setMode($mode);
196
197 $this->validateAdminRequest();
198
199 // Remove the webhook from PayPal if there is one
200 if ($webhookConfig = $this->webhooksRepository->getWebhookConfig()) {
201 $this->webhooksRepository->deleteWebhook($this->merchantDetails->accessToken, $webhookConfig->id);
202 $this->webhooksRepository->deleteWebhookConfig();
203 }
204
205 $this->merchantRepository->delete();
206 $this->merchantRepository->deleteAccountErrors();
207 $this->merchantRepository->deleteClientToken();
208 $this->settings->deleteSellerAccessToken();
209 $this->refreshToken->deleteRefreshTokenCronJob();
210
211 wp_send_json_success();
212 } catch (\Exception $exception) {
213 wp_send_json_error(['error' => $exception->getMessage()]);
214 }
215 }
216
217 /**
218 * Create order.
219 *
220 * @todo: handle payment create error on frontend.
221 *
222 * @since 2.9.0
223 */
224 public function createOrder()
225 {
226 $this->validateFrontendRequest();
227
228 $postData = give_clean($_POST);
229 $formId = absint($postData['give-form-id']);
230
231 $data = [
232 'formId' => $formId,
233 'formTitle' => give_payment_gateway_item_title(['post_data' => $postData], 127),
234 'donationAmount' => isset($postData['give-amount']) ?
235 (float)apply_filters(
236 'give_donation_total',
237 give_maybe_sanitize_amount(
238 $postData['give-amount'],
239 ['currency' => give_get_currency($formId)]
240 )
241 ) :
242 '0.00',
243 'payer' => [
244 'firstName' => $postData['give_first'],
245 'lastName' => $postData['give_last'],
246 'email' => $postData['give_email'],
247 'address' => $this->getDonorAddressFromPostedDataForPaypalOrder($postData),
248 ],
249 'application_context' => [
250 'shipping_preference' => 'NO_SHIPPING',
251 ],
252 ];
253
254 try {
255 $result = give(PayPalOrder::class)->createOrder($data);
256
257 wp_send_json_success(
258 [
259 'id' => $result,
260 ]
261 );
262 } catch (\Exception $ex) {
263 wp_send_json_error(
264 [
265 'error' => json_decode($ex->getMessage(), true),
266 ]
267 );
268 }
269 }
270
271 /**
272 * Approve order.
273 *
274 * @todo: handle payment capture error on frontend.
275 *
276 * @since 2.9.0
277 */
278 public function approveOrder()
279 {
280 $this->validateFrontendRequest();
281
282 $orderId = give_clean($_GET['order']);
283
284 try {
285 $result = give(PayPalOrder::class)->approveOrder($orderId);
286 wp_send_json_success(
287 [
288 'order' => $result,
289 ]
290 );
291 } catch (\Exception $ex) {
292 wp_send_json_error(
293 [
294 'error' => json_decode($ex->getMessage(), true),
295 ]
296 );
297 }
298 }
299
300 /**
301 * Return on boarding trouble notice.
302 *
303 * @since 2.9.6
304 */
305 public function onBoardingTroubleNotice()
306 {
307 if (! current_user_can('manage_give_settings')) {
308 wp_die();
309 }
310
311 /* @var AdminSettingFields $adminSettingFields */
312 $adminSettingFields = give(AdminSettingFields::class);
313
314 $actionList = sprintf(
315 '<ol><li>%1$s</li><li>%2$s</li><li>%3$s</li></ol>',
316 esc_html__(
317 'Make sure to complete the entire PayPal process. Do not close the window until you have finished the process.',
318 'give'
319 ),
320 esc_html__(
321 'The last screen of the PayPal connect process includes a button to be sent back to your site. It is important you click this and do not close the window yourself.',
322 'give'
323 ),
324 esc_html__(
325 'If you’re still having problems connecting: ',
326 'give'
327 ) . $adminSettingFields->getAdminGuidanceNotice(false)
328 );
329
330 $standardError = sprintf(
331 '<div id="give-paypal-onboarding-trouble-notice" class="give-hidden"><p class="error-message">%1$s</p><p>%2$s</p></div>',
332 esc_html__('Having trouble connecting to PayPal?', 'give'),
333 $actionList
334 );
335
336 wp_send_json_success($standardError);
337 }
338
339 /**
340 * Validate admin ajax request.
341 *
342 * @since 2.9.0
343 */
344 private function validateAdminRequest()
345 {
346 if (! current_user_can('manage_give_settings')) {
347 wp_die();
348 }
349 }
350
351 /**
352 * Validate frontend ajax request.
353 *
354 * @since 2.9.0
355 */
356 private function validateFrontendRequest()
357 {
358 $formId = absint($_POST['give-form-id']);
359
360 if (! $formId || ! give_verify_donation_form_nonce(give_clean($_POST['give-form-hash']), $formId)) {
361 wp_die();
362 }
363 }
364
365 /**
366 * @since 2.11.1
367 *
368 * @param array $postedData
369 *
370 * @return array
371 */
372 private function getDonorAddressFromPostedDataForPaypalOrder($postedData)
373 {
374 if (! $this->settings->canCollectBillingInformation()) {
375 return [];
376 }
377
378 $address['address_line1'] = ! empty($postedData['card_address']) ? $postedData['card_address'] : '';
379 $address['address_line_2'] = ! empty($postedData['card_address_2']) ? $postedData['card_address_2'] : '';
380 $address['admin_line_1'] = ! empty($postedData['card_city']) ? $postedData['card_city'] : '';
381 $address['admin_line_2'] = ! empty($postedData['card_state']) ? $postedData['card_state'] : '';
382 $address['postal_code'] = ! empty($postedData['card_zip']) ? $postedData['card_zip'] : '';
383 $address['country_code'] = ! empty($postedData['billing_country']) ? $postedData['billing_country'] : '';
384
385 return $address;
386 }
387 }
388