PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.17.0
GiveWP – Donation Plugin and Fundraising Platform v4.17.0
4.17.0 4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 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 All 256 releases
give / src / PaymentGateways / PayPalCommerce / PayPalCheckoutSdk / AuthorizationInjector.php

AuthorizationInjector.php in GiveWP – Donation Plugin and Fundraising Platform 4.17.0, at src/PaymentGateways/PayPalCommerce/PayPalCheckoutSdk/AuthorizationInjector.php

104 lines 3.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Give\PaymentGateways\PayPalCommerce\PayPalCheckoutSdk;
4
5 use Give\PaymentGateways\PayPalCommerce\RefreshToken;
6 use Give\PaymentGateways\PayPalCommerce\Repositories\MerchantDetails;
7 use Give\PaymentGateways\PayPalCommerce\Repositories\PayPalAuth;
8 use PayPalCheckoutSdk\Core\AccessTokenRequest;
9 use PayPalCheckoutSdk\Core\RefreshTokenRequest;
10 use PayPalHttp\HttpRequest;
11 use PayPalHttp\Injector;
12
13 /**
14 * Class AuthorizationInjector
15 *
16 * This class set Authorization in http request header if missing.
17 * Authorization header build with merchant access token.
18 * Fresh Merchant access token will be fetched from PayPal if expired, for http request.
19 *
20 * @since 2.32.0 Remove unnecessary properties and methods.
21 * @since 2.25.0
22 *
23 * @see \PayPalCheckoutSdk\Core\AuthorizationInjector
24 */
25 class AuthorizationInjector implements Injector
26 {
27 public $accessToken;
28
29 /**
30 * Adds an Authorization header to the request.
31 *
32 * @since 2.25.0
33 */
34 public function inject($request)
35 {
36 if (! $this->hasAuthHeader($request) && ! $this->isAuthRequest($request)) {
37 if (is_null($this->accessToken) || $this->accessToken->isExpired()) {
38 $this->accessToken = $this->fetchAccessToken();
39 }
40 $request->headers['Authorization'] = "Bearer {$this->accessToken->token}";
41 }
42 }
43
44 /**
45 * Returns an AccessToken.
46 *
47 * @since 2.32.0 use client credentials to fetch access token.
48 * @since 2.25.0
49 */
50 protected function fetchAccessToken(): AccessToken
51 {
52 $merchantDetail = give(MerchantDetails::class)->getDetails();
53 $accessToken = give(PayPalAuth::class)->getTokenFromClientCredentials(
54 $merchantDetail->clientId,
55 $merchantDetail->clientSecret
56 );
57
58 $this->registerRefreshTokenCronJob($accessToken);
59
60 return AccessToken::fromArray($accessToken);
61 }
62
63 /**
64 * Return true if the request is an AccessTokenRequest or RefreshTokenRequest.
65 *
66 * @since 2.25.0
67 */
68 private function isAuthRequest($request): bool
69 {
70 return $request instanceof AccessTokenRequest || $request instanceof RefreshTokenRequest;
71 }
72
73 /**
74 * Return true if the request has an Authorization header.
75 *
76 * @since 2.25.0
77 */
78 private function hasAuthHeader(HttpRequest $request): bool
79 {
80 return array_key_exists("Authorization", $request->headers);
81 }
82
83 /**
84 * Should save new access token and add a cron job to refresh token.
85 *
86 * @since 2.32.0 Get latest merchant details from database.
87 * @since 2.25.0
88 *
89 * @return void
90 */
91 private function registerRefreshTokenCronJob(array $accessToken)
92 {
93 $refreshToken = give(RefreshToken::class);
94 $merchantDetailRepository = give(MerchantDetails::class);
95 $merchantDetail = $merchantDetailRepository->getDetails();
96
97 $merchantDetail->setTokenDetails($accessToken);
98 $merchantDetailRepository->save($merchantDetail);
99
100 $refreshToken->deleteRefreshTokenCronJob();
101 $refreshToken->registerCronJobToRefreshToken($accessToken['expiresIn']);
102 }
103 }
104