PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.0.4
GiveWP – Donation Plugin and Fundraising Platform v3.0.4
4.16.4 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 3 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 2 years ago PayPalClient.php 2 years ago PayPalCommerce.php 2 years ago RefreshToken.php 3 years ago RefundPaymentHandler.php 4 years ago ScriptLoader.php 2 years ago Utils.php 2 years ago onBoardingRedirectHandler.php 2 years ago
AjaxRequestHandler.php
394 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 3.0.0 Add support for accountType. This param is required to get partner link.
136 * @since 2.30.0 Add support for mode param.
137 * @since 2.9.0
138 */
139 public function onGetPartnerUrlAjaxRequestHandler()
140 {
141 $this->validateAdminRequest();
142
143 if (empty($accountType = $_GET['accountType']) || ! in_array($accountType, ScriptLoader::$accountTypes, true)) {
144 wp_send_json_error('Must include valid account type');
145 }
146
147 if (empty($country = $_GET['countryCode']) || ! isset(give_get_country_list()[$country])) {
148 wp_send_json_error('Must include valid 2-character country code');
149 }
150
151 if (empty($_GET['mode']) || ! in_array($_GET['mode'], ['sandbox', 'live'])) {
152 wp_send_json_error('Must include valid mode');
153 }
154
155 $country = sanitize_text_field(wp_unslash($_GET['countryCode']));
156 $accountType = sanitize_text_field(wp_unslash($_GET['accountType']));
157 $mode = sanitize_text_field(wp_unslash($_GET['mode']));
158 $redirectUrl = add_query_arg(
159 [
160 'tab' => 'gateways',
161 'section' => 'paypal',
162 'group' => 'paypal-commerce',
163 'mode' => $mode
164 ],
165 admin_url('edit.php?post_type=give_forms&page=give-settings')
166 );
167
168 // Set PayPal client mode.
169 give(PayPalClient::class)->setMode($mode);
170
171 $data = $this->payPalAuth->getSellerPartnerLink($redirectUrl, $accountType);
172
173 if (! $data) {
174 wp_send_json_error();
175 }
176
177 $this->settings->updateAccountCountry($country);
178 $this->settings->updatePartnerLinkDetails($data);
179
180 wp_send_json_success($data);
181 }
182
183 /**
184 * give_paypal_commerce_disconnect_account ajax request handler.
185 *
186 * @since 2.30.0 Add support for mode param.
187 * @since 2.25.0 Remove merchant seller token.
188 * @since 2.9.0
189 */
190 public function removePayPalAccount()
191 {
192 if (! current_user_can('manage_give_settings')) {
193 wp_send_json_error(['error' => esc_html__('You are not allowed to perform this action.', 'give')]);
194 }
195
196 try {
197 $mode = give_clean($_POST['mode']);
198 $this->webhooksRepository->setMode($mode);
199 $this->merchantRepository->setMode($mode);
200 $this->refreshToken->setMode($mode);
201 $this->settings->setMode($mode);
202
203 $this->validateAdminRequest();
204
205 // Remove the webhook from PayPal if there is one
206 if ($webhookConfig = $this->webhooksRepository->getWebhookConfig()) {
207 $this->webhooksRepository->deleteWebhook($this->merchantDetails->accessToken, $webhookConfig->id);
208 $this->webhooksRepository->deleteWebhookConfig();
209 }
210
211 $this->merchantRepository->delete();
212 $this->merchantRepository->deleteAccountErrors();
213 $this->merchantRepository->deleteClientToken();
214 $this->settings->deleteSellerAccessToken();
215 $this->refreshToken->deleteRefreshTokenCronJob();
216
217 wp_send_json_success();
218 } catch (\Exception $exception) {
219 wp_send_json_error(['error' => $exception->getMessage()]);
220 }
221 }
222
223 /**
224 * Create order.
225 *
226 * @todo: handle payment create error on frontend.
227 *
228 * @since 2.9.0
229 */
230 public function createOrder()
231 {
232 $this->validateFrontendRequest();
233
234 $postData = give_clean($_POST);
235 $formId = absint($postData['give-form-id']);
236
237 $data = [
238 'formId' => $formId,
239 'formTitle' => give_payment_gateway_item_title(['post_data' => $postData], 127),
240 'donationAmount' => isset($postData['give-amount']) ?
241 (float)apply_filters(
242 'give_donation_total',
243 give_maybe_sanitize_amount(
244 $postData['give-amount'],
245 ['currency' => give_get_currency($formId)]
246 )
247 ) :
248 '0.00',
249 'payer' => [
250 'firstName' => $postData['give_first'],
251 'lastName' => $postData['give_last'],
252 'email' => $postData['give_email'],
253 'address' => $this->getDonorAddressFromPostedDataForPaypalOrder($postData),
254 ],
255 'application_context' => [
256 'shipping_preference' => 'NO_SHIPPING',
257 ],
258 ];
259
260 try {
261 $result = give(PayPalOrder::class)->createOrder($data);
262
263 wp_send_json_success(
264 [
265 'id' => $result,
266 ]
267 );
268 } catch (\Exception $ex) {
269 wp_send_json_error(
270 [
271 'error' => json_decode($ex->getMessage(), true),
272 ]
273 );
274 }
275 }
276
277 /**
278 * Approve order.
279 *
280 * @todo: handle payment capture error on frontend.
281 *
282 * @since 2.9.0
283 */
284 public function approveOrder()
285 {
286 $this->validateFrontendRequest();
287
288 $orderId = give_clean($_GET['order']);
289
290 try {
291 $result = give(PayPalOrder::class)->approveOrder($orderId);
292 wp_send_json_success(
293 [
294 'order' => $result,
295 ]
296 );
297 } catch (\Exception $ex) {
298 wp_send_json_error(
299 [
300 'error' => json_decode($ex->getMessage(), true),
301 ]
302 );
303 }
304 }
305
306 /**
307 * Return on boarding trouble notice.
308 *
309 * @since 2.9.6
310 */
311 public function onBoardingTroubleNotice()
312 {
313 if (! current_user_can('manage_give_settings')) {
314 wp_die();
315 }
316
317 /* @var AdminSettingFields $adminSettingFields */
318 $adminSettingFields = give(AdminSettingFields::class);
319
320 $actionList = sprintf(
321 '<ol><li>%1$s</li><li>%2$s</li><li>%3$s</li></ol>',
322 esc_html__(
323 'Make sure to complete the entire PayPal process. Do not close the window until you have finished the process.',
324 'give'
325 ),
326 esc_html__(
327 '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.',
328 'give'
329 ),
330 esc_html__(
331 'If you’re still having problems connecting: ',
332 'give'
333 ) . $adminSettingFields->getAdminGuidanceNotice(false)
334 );
335
336 $standardError = sprintf(
337 '<div id="give-paypal-onboarding-trouble-notice" class="give-hidden"><p class="error-message">%1$s</p><p>%2$s</p></div>',
338 esc_html__('Having trouble connecting to PayPal?', 'give'),
339 $actionList
340 );
341
342 wp_send_json_success($standardError);
343 }
344
345 /**
346 * Validate admin ajax request.
347 *
348 * @since 2.9.0
349 */
350 private function validateAdminRequest()
351 {
352 if (! current_user_can('manage_give_settings')) {
353 wp_die();
354 }
355 }
356
357 /**
358 * Validate frontend ajax request.
359 *
360 * @since 2.9.0
361 */
362 private function validateFrontendRequest()
363 {
364 $formId = absint($_POST['give-form-id']);
365
366 if (! $formId || ! give_verify_donation_form_nonce(give_clean($_POST['give-form-hash']), $formId)) {
367 wp_die();
368 }
369 }
370
371 /**
372 * @since 2.11.1
373 *
374 * @param array $postedData
375 *
376 * @return array
377 */
378 private function getDonorAddressFromPostedDataForPaypalOrder($postedData)
379 {
380 if (! $this->settings->canCollectBillingInformation()) {
381 return [];
382 }
383
384 $address['address_line1'] = ! empty($postedData['card_address']) ? $postedData['card_address'] : '';
385 $address['address_line_2'] = ! empty($postedData['card_address_2']) ? $postedData['card_address_2'] : '';
386 $address['admin_line_1'] = ! empty($postedData['card_city']) ? $postedData['card_city'] : '';
387 $address['admin_line_2'] = ! empty($postedData['card_state']) ? $postedData['card_state'] : '';
388 $address['postal_code'] = ! empty($postedData['card_zip']) ? $postedData['card_zip'] : '';
389 $address['country_code'] = ! empty($postedData['billing_country']) ? $postedData['billing_country'] : '';
390
391 return $address;
392 }
393 }
394