PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.27.1
GiveWP – Donation Plugin and Fundraising Platform v2.27.1
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
DataTransferObjects 4 years ago Exceptions 3 years ago Migrations 4 years ago Models 3 years ago PayPalCheckoutSdk 3 years ago Repositories 3 years ago Webhooks 4 years ago AccountAdminNotices.php 4 years ago AdminSettingFields.php 3 years ago AdvancedCardFields.php 4 years ago AjaxRequestHandler.php 3 years ago DonationDetailsPage.php 4 years ago DonationFormPaymentMethod.php 4 years ago PayPalClient.php 3 years ago PayPalCommerce.php 3 years ago RefreshToken.php 3 years ago RefundPaymentHandler.php 4 years ago ScriptLoader.php 3 years ago Utils.php 4 years ago onBoardingRedirectHandler.php 3 years ago
AjaxRequestHandler.php
345 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.9.0
95 */
96 public function onBoardedUserAjaxRequestHandler()
97 {
98 $this->validateAdminRequest();
99
100 $partnerLinkInfo = $this->settings->getPartnerLinkDetails();
101
102 $payPalResponse = $this->payPalAuth->getTokenFromAuthorizationCode(
103 give_clean($_GET['authCode']),
104 give_clean($_GET['sharedId']),
105 $partnerLinkInfo['nonce']
106 );
107
108 if ( ! $payPalResponse || array_key_exists('error', $payPalResponse)) {
109 wp_send_json_error();
110 }
111
112 $this->settings->updateAccessToken($payPalResponse);
113
114 give(RefreshToken::class)->registerCronJobToRefreshToken($payPalResponse['expiresIn']);
115
116 wp_send_json_success();
117 }
118
119 /**
120 * give_paypal_commerce_get_partner_url action handler
121 *
122 * @since 2.9.0
123 */
124 public function onGetPartnerUrlAjaxRequestHandler()
125 {
126 $this->validateAdminRequest();
127
128 if (empty($country = $_GET['countryCode']) || ! isset(give_get_country_list()[$country])) {
129 wp_send_json_error('Must include valid 2-character country code');
130 }
131
132 $data = $this->payPalAuth->getSellerPartnerLink(
133 admin_url(
134 'edit.php?post_type=give_forms&page=give-settings&tab=gateways&section=paypal&group=paypal-commerce'
135 ),
136 $country
137 );
138
139 if ( ! $data) {
140 wp_send_json_error();
141 }
142
143 $this->settings->updateAccountCountry($country);
144 $this->settings->updatePartnerLinkDetails($data);
145
146 wp_send_json_success($data);
147 }
148
149 /**
150 * give_paypal_commerce_disconnect_account ajax request handler.
151 *
152 * @since 2.25.0 Remove merchant seller token.
153 * @since 2.9.0
154 */
155 public function removePayPalAccount()
156 {
157 $this->validateAdminRequest();
158
159 // Remove the webhook from PayPal if there is one
160 if ($webhookConfig = $this->webhooksRepository->getWebhookConfig()) {
161 $this->webhooksRepository->deleteWebhook($this->merchantDetails->accessToken, $webhookConfig->id);
162 $this->webhooksRepository->deleteWebhookConfig();
163 }
164
165 $this->merchantRepository->delete();
166 $this->merchantRepository->deleteAccountErrors();
167 $this->merchantRepository->deleteClientToken();
168 $this->settings->deleteSellerAccessToken();
169 $this->refreshToken->deleteRefreshTokenCronJob();
170
171 wp_send_json_success();
172 }
173
174 /**
175 * Create order.
176 *
177 * @todo: handle payment create error on frontend.
178 *
179 * @since 2.9.0
180 */
181 public function createOrder()
182 {
183 $this->validateFrontendRequest();
184
185 $postData = give_clean($_POST);
186 $formId = absint($postData['give-form-id']);
187
188 $data = [
189 'formId' => $formId,
190 'formTitle' => give_payment_gateway_item_title(['post_data' => $postData], 127),
191 'donationAmount' => isset($postData['give-amount']) ?
192 (float)apply_filters(
193 'give_donation_total',
194 give_maybe_sanitize_amount(
195 $postData['give-amount'],
196 ['currency' => give_get_currency($formId)]
197 )
198 ) :
199 '0.00',
200 'payer' => [
201 'firstName' => $postData['give_first'],
202 'lastName' => $postData['give_last'],
203 'email' => $postData['give_email'],
204 'address' => $this->getDonorAddressFromPostedDataForPaypalOrder($postData),
205 ],
206 'application_context' => [
207 'shipping_preference' => 'NO_SHIPPING',
208 ],
209 ];
210
211 try {
212 $result = give(PayPalOrder::class)->createOrder($data);
213
214 wp_send_json_success(
215 [
216 'id' => $result,
217 ]
218 );
219 } catch (\Exception $ex) {
220 wp_send_json_error(
221 [
222 'error' => json_decode($ex->getMessage(), true),
223 ]
224 );
225 }
226 }
227
228 /**
229 * Approve order.
230 *
231 * @todo: handle payment capture error on frontend.
232 *
233 * @since 2.9.0
234 */
235 public function approveOrder()
236 {
237 $this->validateFrontendRequest();
238
239 $orderId = give_clean($_GET['order']);
240
241 try {
242 $result = give(PayPalOrder::class)->approveOrder($orderId);
243 wp_send_json_success(
244 [
245 'order' => $result,
246 ]
247 );
248 } catch (\Exception $ex) {
249 wp_send_json_error(
250 [
251 'error' => json_decode($ex->getMessage(), true),
252 ]
253 );
254 }
255 }
256
257 /**
258 * Return on boarding trouble notice.
259 *
260 * @since 2.9.6
261 */
262 public function onBoardingTroubleNotice()
263 {
264 if ( ! current_user_can('manage_give_settings')) {
265 wp_die();
266 }
267
268 /* @var AdminSettingFields $adminSettingFields */
269 $adminSettingFields = give(AdminSettingFields::class);
270
271 $actionList = sprintf(
272 '<ol><li>%1$s</li><li>%2$s</li><li>%3$s</li></ol>',
273 esc_html__(
274 'Make sure to complete the entire PayPal process. Do not close the window until you have finished the process.',
275 'give'
276 ),
277 esc_html__(
278 '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.',
279 'give'
280 ),
281 esc_html__(
282 'If you’re still having problems connecting: ',
283 'give'
284 ) . $adminSettingFields->getAdminGuidanceNotice(false)
285 );
286
287 $standardError = sprintf(
288 '<div id="give-paypal-onboarding-trouble-notice" class="give-hidden"><p class="error-message">%1$s</p><p>%2$s</p></div>',
289 esc_html__('Having trouble connecting to PayPal?', 'give'),
290 $actionList
291 );
292
293 wp_send_json_success($standardError);
294 }
295
296 /**
297 * Validate admin ajax request.
298 *
299 * @since 2.9.0
300 */
301 private function validateAdminRequest()
302 {
303 if ( ! current_user_can('manage_give_settings')) {
304 wp_die();
305 }
306 }
307
308 /**
309 * Validate frontend ajax request.
310 *
311 * @since 2.9.0
312 */
313 private function validateFrontendRequest()
314 {
315 $formId = absint($_POST['give-form-id']);
316
317 if ( ! $formId || ! give_verify_donation_form_nonce(give_clean($_POST['give-form-hash']), $formId)) {
318 wp_die();
319 }
320 }
321
322 /**
323 * @since 2.11.1
324 *
325 * @param array $postedData
326 *
327 * @return array
328 */
329 private function getDonorAddressFromPostedDataForPaypalOrder($postedData)
330 {
331 if ( ! $this->settings->canCollectBillingInformation()) {
332 return [];
333 }
334
335 $address['address_line1'] = ! empty($postedData['card_address']) ? $postedData['card_address'] : '';
336 $address['address_line_2'] = ! empty($postedData['card_address_2']) ? $postedData['card_address_2'] : '';
337 $address['admin_line_1'] = ! empty($postedData['card_city']) ? $postedData['card_city'] : '';
338 $address['admin_line_2'] = ! empty($postedData['card_state']) ? $postedData['card_state'] : '';
339 $address['postal_code'] = ! empty($postedData['card_zip']) ? $postedData['card_zip'] : '';
340 $address['country_code'] = ! empty($postedData['billing_country']) ? $postedData['billing_country'] : '';
341
342 return $address;
343 }
344 }
345