PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.25.3
GiveWP – Donation Plugin and Fundraising Platform v2.25.3
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 / Repositories / PayPalAuth.php
give / src / PaymentGateways / PayPalCommerce / Repositories Last commit date
Traits 4 years ago MerchantDetails.php 4 years ago PayPalAuth.php 3 years ago PayPalOrder.php 4 years ago Settings.php 3 years ago Webhooks.php 4 years ago
PayPalAuth.php
249 lines
1 <?php
2
3 namespace Give\PaymentGateways\PayPalCommerce\Repositories;
4
5 use Give\Framework\Exceptions\Primitives\Exception;
6 use Give\Framework\Http\ConnectServer\Client\ConnectClient;
7 use Give\Helpers\ArrayDataSet;
8 use Give\Log\Log;
9 use Give\PaymentGateways\PayPalCommerce\PayPalClient;
10
11 class PayPalAuth
12 {
13 /**
14 * @since 2.9.0
15 *
16 * @var PayPalClient
17 */
18 private $payPalClient;
19
20 /**
21 * @since 2.9.0
22 *
23 * @var ConnectClient
24 */
25 private $connectClient;
26
27 /**
28 * PayPalAuth constructor.
29 *
30 * @since 2.9.0
31 *
32 * @param PayPalClient $payPalClient
33 * @param ConnectClient $connectClient
34 */
35 public function __construct(PayPalClient $payPalClient, ConnectClient $connectClient)
36 {
37 $this->payPalClient = $payPalClient;
38 $this->connectClient = $connectClient;
39 }
40
41 /**
42 * Retrieves a token for the Client ID and Secret
43 *
44 * @since 2.25.0 Validate paypal response.
45 * @since 2.9.0
46 *
47 * @param string $client_id
48 * @param string $client_secret
49 *
50 * @throws Exception
51 */
52 public function getTokenFromClientCredentials($client_id, $client_secret): array
53 {
54 $auth = base64_encode("$client_id:$client_secret");
55
56 $request = wp_remote_post(
57 $this->payPalClient->getApiUrl('v1/oauth2/token'),
58 [
59 'headers' => [
60 'Authorization' => "Basic $auth",
61 'Content-Type' => 'application/x-www-form-urlencoded',
62 ],
63 'body' => [
64 'grant_type' => 'client_credentials',
65 ],
66 ]
67 );
68
69 if (200 !== wp_remote_retrieve_response_code($request)) {
70 give(Log::class)->http(
71 'PayPal Commerce: Error retrieving access token',
72 [
73 'category' => 'Payment Gateway',
74 'source' => 'Paypal Commerce',
75 'response' => $request,
76 ]
77 );
78
79 throw new Exception('PayPal Commerce: Error retrieving access token');
80 }
81
82 $decodedResponse = json_decode(wp_remote_retrieve_body($request), true);
83
84 $this->validateAccessToken($decodedResponse);
85
86 return ArrayDataSet::camelCaseKeys($decodedResponse);
87 }
88
89 /**
90 * Retrieves a token from the authorization code
91 *
92 * @since 2.9.0
93 *
94 * @param string $authCode
95 * @param string $sharedId
96 * @param string $nonce
97 *
98 * @return array|null
99 */
100 public function getTokenFromAuthorizationCode($authCode, $sharedId, $nonce)
101 {
102 $response = wp_remote_retrieve_body(
103 wp_remote_post(
104 $this->payPalClient->getApiUrl('v1/oauth2/token'),
105 [
106 'headers' => [
107 'Authorization' => sprintf(
108 'Basic %1$s',
109 base64_encode($sharedId)
110 ),
111 'Content-Type' => 'application/x-www-form-urlencoded',
112 ],
113 'body' => [
114 'grant_type' => 'authorization_code',
115 'code' => $authCode,
116 'code_verifier' => $nonce, // Seller nonce.
117 ],
118 ]
119 )
120 );
121
122 return empty($response) ? null : ArrayDataSet::camelCaseKeys(json_decode($response, true));
123 }
124
125 /**
126 * Retrieves a Partner Link for on-boarding
127 *
128 * @param $returnUrl
129 * @param $country
130 *
131 * @return array|null
132 */
133 public function getSellerPartnerLink($returnUrl, $country)
134 {
135 $response = wp_remote_retrieve_body(
136 wp_remote_post(
137 sprintf(
138 $this->connectClient->getApiUrl('paypal?mode=%1$s&request=partner-link'),
139 $this->payPalClient->mode
140 ),
141 [
142 'body' => [
143 'return_url' => $returnUrl,
144 'country_code' => $country,
145 ],
146 ]
147 )
148 );
149
150 return empty($response) ? null : json_decode($response, true);
151 }
152
153 /**
154 * Get seller on-boarding details from seller.
155 *
156 * @since 2.9.0
157 *
158 * @param string $accessToken
159 *
160 * @param string $merchantId
161 *
162 * @return array
163 */
164 public function getSellerOnBoardingDetailsFromPayPal($merchantId, $accessToken)
165 {
166 $request = wp_remote_post(
167 $this->connectClient->getApiUrl(
168 sprintf(
169 'paypal?mode=%1$s&request=seller-status',
170 $this->payPalClient->mode
171 )
172 ),
173 [
174 'body' => [
175 'merchant_id' => $merchantId,
176 'token' => $accessToken,
177 ],
178 ]
179 );
180
181 return json_decode(wp_remote_retrieve_body($request), true);
182 }
183
184 /**
185 * Get seller rest API credentials
186 *
187 * @since 2.9.0
188 *
189 * @param string $accessToken
190 *
191 * @return array
192 */
193 public function getSellerRestAPICredentials($accessToken)
194 {
195 $request = wp_remote_post(
196 $this->connectClient->getApiUrl(
197 sprintf(
198 'paypal?mode=%1$s&request=seller-credentials',
199 $this->payPalClient->mode
200 )
201 ),
202 [
203 'body' => [
204 'token' => $accessToken,
205 ],
206 ]
207 );
208
209 return json_decode(wp_remote_retrieve_body($request), true);
210 }
211
212 /**
213 * Validate PayPal access token.
214 *
215 * Sample paypal access token: https://developer.paypal.com/api/rest/authentication/#link-sampleresponse
216 *
217 * @since 2.25.0
218 *
219 * @param array $accessToken Access token response from PayPal.
220 *
221 * @return void
222 * @throws Exception
223 */
224 private function validateAccessToken(array $accessToken)
225 {
226 $requiredKeys = [
227 'scope',
228 'access_token',
229 'token_type',
230 'app_id',
231 'expires_in',
232 'nonce'
233 ];
234
235 if (array_diff($requiredKeys, array_keys($accessToken))) {
236 give(Log::class)->error(
237 'PayPal Commerce: Invalid access token',
238 [
239 'category' => 'Payment Gateway',
240 'source' => 'Paypal Commerce',
241 'response' => $accessToken,
242 ]
243 );
244
245 throw new Exception('PayPal Commerce: Error retrieving access token');
246 }
247 }
248 }
249