PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.19.8
GiveWP – Donation Plugin and Fundraising Platform v2.19.8
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 / PayPalOrder.php
give / src / PaymentGateways / PayPalCommerce / Repositories Last commit date
Traits 4 years ago MerchantDetails.php 4 years ago PayPalAuth.php 4 years ago PayPalOrder.php 4 years ago Settings.php 4 years ago Webhooks.php 4 years ago
PayPalOrder.php
264 lines
1 <?php
2
3 namespace Give\PaymentGateways\PayPalCommerce\Repositories;
4
5 use Give\Framework\Exceptions\Primitives\Exception;
6 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
7 use Give\PaymentGateways\PayPalCommerce\Models\MerchantDetail;
8 use Give\PaymentGateways\PayPalCommerce\PayPalClient;
9 use PayPalCheckoutSdk\Orders\OrdersCaptureRequest;
10 use PayPalCheckoutSdk\Orders\OrdersCreateRequest;
11 use PayPalCheckoutSdk\Orders\OrdersGetRequest;
12 use PayPalCheckoutSdk\Payments\CapturesRefundRequest;
13 use Give\PaymentGateways\PayPalCommerce\Models\PayPalOrder as PayPalOrderModel;
14
15 use PayPalHttp\HttpException;
16
17 use PayPalHttp\IOException;
18
19 use function give_record_gateway_error as logError;
20
21 /**
22 * Class PayPalOrder
23 * @package Give\PaymentGateways\PayPalCommerce\Repositories
24 *
25 * @since 2.9.0
26 */
27 class PayPalOrder
28 {
29 /**
30 * @since 2.9.0
31 *
32 * @var PayPalClient
33 */
34 private $paypalClient;
35
36 /**
37 * @since 2.9.0
38 *
39 * @var MerchantDetail
40 */
41 private $merchantDetails;
42
43 /**
44 * @since 2.16.2
45 * @var Settings
46 */
47 private $settings;
48
49 /**
50 * PayPalOrder constructor.
51 *
52 * @since 2.9.0
53 * @since 2.16.2 Add third param "Settings" to function
54 *
55 * @param PayPalClient $paypalClient
56 * @param MerchantDetail $merchantDetails
57 * @param Settings $settings
58 */
59 public function __construct(PayPalClient $paypalClient, MerchantDetail $merchantDetails, Settings $settings)
60 {
61 $this->paypalClient = $paypalClient;
62 $this->merchantDetails = $merchantDetails;
63 $this->settings = $settings;
64 }
65
66 /**
67 * Approve order.
68 *
69 * @since 2.9.0
70 *
71 * @param string $orderId
72 *
73 * @return string
74 * @throws Exception
75 */
76 public function approveOrder($orderId)
77 {
78 $request = new OrdersCaptureRequest($orderId);
79
80 try {
81 return $this->paypalClient->getHttpClient()->execute($request)->result;
82 } catch (Exception $ex) {
83 logError(
84 'Capture PayPal Commerce payment failure',
85 sprintf(
86 '<strong>Response</strong><pre>%1$s</pre>',
87 print_r(json_decode($ex->getMessage(), true), true)
88 )
89 );
90
91 throw $ex;
92 }
93 }
94
95 /**
96 * Create order.
97 *
98 * @see https://developer.paypal.com/docs/api/orders/v2
99 *
100 * @since 2.9.0
101 * @since 2.16.2 Conditionally set transaction as donation or standard transaction in PayPal.
102 *
103 * @param array $array
104 *
105 * @return string
106 * @throws Exception
107 */
108 public function createOrder($array)
109 {
110 $this->validateCreateOrderArguments($array);
111
112 $request = new OrdersCreateRequest();
113 $request->payPalPartnerAttributionId(give('PAYPAL_COMMERCE_ATTRIBUTION_ID'));
114
115 $formId = (int)$array['formId'];
116 $donationCurrency = give_get_currency($formId);
117 $donationAmount = give_maybe_sanitize_amount(
118 $array['donationAmount'],
119 ['currency' => give_get_currency($formId)]
120 );
121 $request->body = [
122 'intent' => 'CAPTURE',
123 'payer' => [
124 'given_name' => $array['payer']['firstName'],
125 'surname' => $array['payer']['lastName'],
126 'email_address' => $array['payer']['email'],
127 ],
128 'purchase_units' => [
129 [
130 'reference_id' => get_post_field('post_name', $formId),
131 'description' => $array['formTitle'],
132 'amount' => [
133 'value' => $donationAmount,
134 'currency_code' => $donationCurrency,
135 ],
136 'payee' => [
137 'email_address' => $this->merchantDetails->merchantId,
138 'merchant_id' => $this->merchantDetails->merchantIdInPayPal,
139 ],
140 'payment_instruction' => [
141 'disbursement_mode' => 'INSTANT',
142 ],
143 ],
144 ],
145 'application_context' => [
146 'shipping_preference' => 'NO_SHIPPING',
147 'user_action' => 'PAY_NOW',
148 ],
149 ];
150
151 // Set PayPal transaction as donation.
152 if ($this->settings->isTransactionTypeDonation()) {
153 $request->body['purchase_units'][0]['items'] = [
154 [
155 'name' => get_post_field('post_name', $formId),
156 'unit_amount' => [
157 'value' => $donationAmount,
158 'currency_code' => $donationCurrency,
159 ],
160 'quantity' => 1,
161 'category' => 'DONATION',
162 ],
163 ];
164
165 $request->body['purchase_units'][0]['amount']['breakdown'] = [
166 'item_total' => [
167 'currency_code' => $donationCurrency,
168 'value' => $donationAmount,
169 ],
170 ];
171 }
172
173 if ( ! empty($array['payer']['address'])) {
174 $request->body['payer']['address'] = $array['payer']['address'];
175 }
176
177 try {
178 return $this->paypalClient->getHttpClient()->execute($request)->result->id;
179 } catch (Exception $ex) {
180 logError(
181 'Create PayPal Commerce order failure',
182 sprintf(
183 '<strong>Request</strong><pre>%1$s</pre><br><strong>Response</strong><pre>%2$s</pre>',
184 print_r($request->body, true),
185 print_r(json_decode($ex->getMessage(), true), true)
186 )
187 );
188
189 throw $ex;
190 }
191 }
192
193 /**
194 * Refunds a processed payment
195 *
196 * @since 2.9.0
197 *
198 * @param $captureId
199 *
200 * @return string The id of the refund
201 * @throws Exception
202 */
203 public function refundPayment($captureId)
204 {
205 $refund = new CapturesRefundRequest($captureId);
206
207 try {
208 return $this->paypalClient->getHttpClient()->execute($refund)->result->id;
209 } catch (Exception $exception) {
210 logError(
211 'Create PayPal Commerce payment refund failure',
212 sprintf(
213 '<strong>Response</strong><pre>%1$s</pre>',
214 print_r(json_decode($exception->getMessage(), true), true)
215 )
216 );
217
218 throw $exception;
219 }
220 }
221
222 /**
223 * Validate argument given to create PayPal order.
224 *
225 * @since 2.9.0
226 *
227 * @param array $array
228 *
229 * @throws InvalidArgumentException
230 */
231 private function validateCreateOrderArguments($array)
232 {
233 $required = ['formId', 'donationAmount', 'payer'];
234 $array = array_filter($array); // Remove empty values.
235
236 if (array_diff($required, array_keys($array))) {
237 throw new InvalidArgumentException(
238 __(
239 'To create a paypal order, please provide formId, donationAmount and payer',
240 'give'
241 )
242 );
243 }
244 }
245
246 /**
247 * Get order details from paypal commerce.
248 *
249 * @since 2.19.0
250 *
251 * @param string $orderId
252 *
253 * @return PayPalOrderModel
254 * @throws HttpException | IOException
255 */
256 public function getOrder($orderId)
257 {
258 $orderDetailRequest = new OrdersGetRequest($orderId);
259 $orderDetails = (array)$this->paypalClient->getHttpClient()->execute($orderDetailRequest)->result;
260
261 return PayPalOrderModel::fromArray($orderDetails);
262 }
263 }
264