PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.19.4
GiveWP – Donation Plugin and Fundraising Platform v3.19.4
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 / RefreshToken.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 1 year ago AdvancedCardFields.php 4 years ago AjaxRequestHandler.php 1 year ago DonationDetailsPage.php 4 years ago DonationFormPaymentMethod.php 2 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 2 years ago onBoardingRedirectHandler.php 1 year ago
RefreshToken.php
184 lines
1 <?php
2
3 namespace Give\PaymentGateways\PayPalCommerce;
4
5 use Give\Framework\Exceptions\Primitives\Exception;
6 use Give\Log\Log;
7 use Give\PaymentGateways\PayPalCommerce\Models\MerchantDetail;
8 use Give\PaymentGateways\PayPalCommerce\Repositories\MerchantDetails;
9 use Give\PaymentGateways\PayPalCommerce\Repositories\PayPalAuth;
10 use Give\PaymentGateways\PayPalCommerce\Repositories\Traits\HasMode;
11
12 /**
13 * Class RefreshToken
14 *
15 * @since 2.30.0 Add support for mode.
16 * @since 2.9.0
17 */
18 class RefreshToken
19 {
20 use HasMode;
21
22 /* @var MerchantDetail */
23 private $merchantDetail;
24
25 /**
26 * @since 2.9.0
27 *
28 * @var MerchantDetails
29 */
30 private $detailsRepository;
31
32 /**
33 * @since 2.9.0
34 *
35 * @var PayPalAuth
36 */
37 private $payPalAuth;
38
39 /**
40 * This time reduced from token expiration time to refresh token before it expires.
41 *
42 * @since 2.25.0
43 *
44 * @var int $expirationTimeOffset Expiration time offset in seconds.
45 */
46 private $expirationTimeOffset = 1800; // 30 minutes
47
48 /**
49 * RefreshToken constructor.
50 *
51 * @since 2.9.0
52 * @since 2.9.6 Add MerchantDetail constructor param.
53 *
54 * @param MerchantDetails $detailsRepository
55 * @param PayPalAuth $payPalAuth
56 * @param MerchantDetail $merchantDetail
57 */
58 public function __construct(
59 MerchantDetails $detailsRepository,
60 PayPalAuth $payPalAuth,
61 MerchantDetail $merchantDetail
62 ) {
63 $this->detailsRepository = $detailsRepository;
64 $this->payPalAuth = $payPalAuth;
65 $this->merchantDetail = $merchantDetail;
66
67 $this->setMode(give_is_test_mode() ? 'sandbox' : 'live');
68 }
69
70 /**
71 * Return cron json name which uses to refresh token.
72 *
73 * @since 2.9.0
74 */
75 private function getCronJobHookName(): string
76 {
77 return "give_paypal_commerce_refresh_{$this->mode}_token";
78 }
79
80 /**
81 * Register cron job to refresh access token.
82 * Note: only for internal use.
83 *
84 * @since 2.9.0
85 *
86 * @param string $tokenExpires
87 *
88 */
89 public function registerCronJobToRefreshToken($tokenExpires)
90 {
91 // Refresh token before half hours of expires date.
92 wp_schedule_single_event(
93 time() + ($tokenExpires - $this->expirationTimeOffset),
94 $this->getCronJobHookName()
95 );
96 }
97
98 /**
99 * Delete cron job which refresh access token.
100 * Note: only for internal use.
101 *
102 * @since 2.9.0
103 *
104 */
105 public function deleteRefreshTokenCronJob()
106 {
107 wp_clear_scheduled_hook($this->getCronJobHookName());
108 }
109
110 /**
111 * Refresh token.
112 * Note: only for internal use
113 *
114 * @since 2.25.0 Handle exception. Refresh access token every 5 minute on faliure.
115 * @since 2.9.6 Refresh token only if paypal merchant id exist.
116 * @since 2.9.0
117 */
118 public function refreshToken()
119 {
120 // Exit if account is not connected.
121 if (! $this->detailsRepository->accountIsConnected()) {
122 return;
123 }
124
125 // Default expiration date of access token.
126 // This is used when we are unable to get access token from PayPal.
127 $expiresIn = $this->expirationTimeOffset - 1500; // 5 minutes
128
129 try {
130 $tokenDetails = $this->payPalAuth->getTokenFromClientCredentials(
131 $this->merchantDetail->clientId,
132 $this->merchantDetail->clientSecret
133 );
134
135 $this->merchantDetail->setTokenDetails($tokenDetails);
136 $this->detailsRepository->save($this->merchantDetail);
137
138 $expiresIn = $tokenDetails['expiresIn'];
139 } catch (Exception $exception) {
140 give(Log::class)->warning(
141 'PayPal Commerce: Error refresh access token',
142 [
143 'category' => 'Payment Gateway',
144 'source' => 'Paypal Commerce',
145 'exception' => $exception,
146 ]
147 );
148 }
149
150 $this->deleteRefreshTokenCronJob();
151 $this->registerCronJobToRefreshToken($expiresIn);
152 }
153
154 /**
155 * This function handles cron job to refresh access token.
156 *
157 * Cron job action names:
158 * - give_paypal_commerce_refresh_sandbox_token
159 * - give_paypal_commerce_refresh_live_token
160 *
161 * @since 2.30.0
162 * @return void
163 */
164 public function cronJobRefreshToken()
165 {
166 // Set mode.
167 $mode = 'live';
168 if (doing_action('give_paypal_commerce_refresh_sandbox_token')) {
169 $mode = 'sandbox';
170 }
171 $this->setMode($mode);
172
173 // Fetch merchant details.
174 $this->detailsRepository->setMode($mode);
175 $this->merchantDetail = $this->detailsRepository->getDetails();
176
177 // Set mode to PayPalClient. PayPalAuth use it to make api request to paypal.
178 $paypalClient = give(PayPalClient::class);
179 $paypalClient->setMode($mode);
180
181 $this->refreshToken();
182 }
183 }
184