PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.31.1
GiveWP – Donation Plugin and Fundraising Platform v2.31.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 / Repositories / PayPalAuth.php
give / src / PaymentGateways / PayPalCommerce / Repositories Last commit date
Traits 2 years ago MerchantDetails.php 2 years ago PayPalAuth.php 3 years ago PayPalOrder.php 4 years ago Settings.php 3 years ago Webhooks.php 3 years ago
PayPalAuth.php
248 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 * @since 2.9.0
129 *
130 * @return array|null
131 */
132 public function getSellerPartnerLink($returnUrl, $country)
133 {
134 $response = wp_remote_retrieve_body(
135 wp_remote_post(
136 sprintf(
137 $this->connectClient->getApiUrl('paypal?mode=%1$s&request=partner-link'),
138 $this->payPalClient->getMode()
139 ),
140 [
141 'body' => [
142 'return_url' => $returnUrl,
143 'country_code' => $country,
144 ],
145 ]
146 )
147 );
148
149 return empty($response) ? null : json_decode($response, true);
150 }
151
152 /**
153 * Get seller on-boarding details from seller.
154 *
155 * @since 2.9.0
156 *
157 * @param string $accessToken
158 *
159 * @param string $merchantId
160 *
161 * @return array
162 */
163 public function getSellerOnBoardingDetailsFromPayPal($merchantId, $accessToken)
164 {
165 $request = wp_remote_post(
166 $this->connectClient->getApiUrl(
167 sprintf(
168 'paypal?mode=%1$s&request=seller-status',
169 $this->payPalClient->getMode()
170 )
171 ),
172 [
173 'body' => [
174 'merchant_id' => $merchantId,
175 'token' => $accessToken,
176 ],
177 ]
178 );
179
180 return json_decode(wp_remote_retrieve_body($request), true);
181 }
182
183 /**
184 * Get seller rest API credentials
185 *
186 * @since 2.9.0
187 *
188 * @param string $accessToken
189 *
190 * @return array
191 */
192 public function getSellerRestAPICredentials($accessToken)
193 {
194 $request = wp_remote_post(
195 $this->connectClient->getApiUrl(
196 sprintf(
197 'paypal?mode=%1$s&request=seller-credentials',
198 $this->payPalClient->getMode()
199 )
200 ),
201 [
202 'body' => [
203 'token' => $accessToken,
204 ],
205 ]
206 );
207
208 return json_decode(wp_remote_retrieve_body($request), true);
209 }
210
211 /**
212 * Validate PayPal access token.
213 *
214 * Sample paypal access token: https://developer.paypal.com/api/rest/authentication/#link-sampleresponse
215 *
216 * @since 2.25.0
217 *
218 * @param array $accessToken Access token response from PayPal.
219 *
220 * @return void
221 * @throws Exception
222 */
223 private function validateAccessToken(array $accessToken)
224 {
225 $requiredKeys = [
226 'scope',
227 'access_token',
228 'token_type',
229 'app_id',
230 'expires_in',
231 'nonce'
232 ];
233
234 if (array_diff($requiredKeys, array_keys($accessToken))) {
235 give(Log::class)->error(
236 'PayPal Commerce: Invalid access token',
237 [
238 'category' => 'Payment Gateway',
239 'source' => 'Paypal Commerce',
240 'response' => $accessToken,
241 ]
242 );
243
244 throw new Exception('PayPal Commerce: Error retrieving access token');
245 }
246 }
247 }
248