PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.4.1
GiveWP – Donation Plugin and Fundraising Platform v3.4.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 / PayPalOrder.php
give / src / PaymentGateways / PayPalCommerce / Repositories Last commit date
Traits 2 years ago MerchantDetails.php 2 years ago PayPalAuth.php 2 years ago PayPalOrder.php 2 years ago Settings.php 2 years ago Webhooks.php 2 years ago
PayPalOrder.php
269 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 \stdClass
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 3.1.0 "payer" argument is deprecated, using payment_source/paypal.
101 * @since 2.9.0
102 * @since 2.16.2 Conditionally set transaction as donation or standard transaction in PayPal.
103 *
104 * @param array $array
105 *
106 * @return string
107 * @throws Exception
108 */
109 public function createOrder($array)
110 {
111 $this->validateCreateOrderArguments($array);
112
113 $request = new OrdersCreateRequest();
114 $request->payPalPartnerAttributionId(give('PAYPAL_COMMERCE_ATTRIBUTION_ID'));
115
116 $formId = (int)$array['formId'];
117 $donationCurrency = give_get_currency($formId);
118 $donationAmount = give_maybe_sanitize_amount(
119 $array['donationAmount'],
120 ['currency' => give_get_currency($formId)]
121 );
122 $request->body = [
123 'intent' => 'CAPTURE',
124 'payment_source' => [
125 "paypal" => [
126 'name' => [
127 "given_name" => $array['payer']['firstName'],
128 "surname" => $array['payer']['lastName']
129 ],
130 "email_address" => $array['payer']['email']
131 ]
132 ],
133 'purchase_units' => [
134 [
135 'reference_id' => get_post_field('post_name', $formId),
136 'description' => $array['formTitle'],
137 'amount' => [
138 'value' => $donationAmount,
139 'currency_code' => $donationCurrency,
140 ],
141 'payee' => [
142 'email_address' => $this->merchantDetails->merchantId,
143 'merchant_id' => $this->merchantDetails->merchantIdInPayPal,
144 ],
145 'payment_instruction' => [
146 'disbursement_mode' => 'INSTANT',
147 ],
148 ],
149 ],
150 'application_context' => [
151 'shipping_preference' => 'NO_SHIPPING',
152 'user_action' => 'PAY_NOW',
153 ],
154 ];
155
156 // Set PayPal transaction as donation.
157 if ($this->settings->isTransactionTypeDonation()) {
158 $request->body['purchase_units'][0]['items'] = [
159 [
160 'name' => get_post_field('post_name', $formId),
161 'unit_amount' => [
162 'value' => $donationAmount,
163 'currency_code' => $donationCurrency,
164 ],
165 'quantity' => 1,
166 'category' => 'DONATION',
167 ],
168 ];
169
170 $request->body['purchase_units'][0]['amount']['breakdown'] = [
171 'item_total' => [
172 'currency_code' => $donationCurrency,
173 'value' => $donationAmount,
174 ],
175 ];
176 }
177
178 if (! empty($array['payer']['address'])) {
179 $request->body['payment_source']['paypal']['address'] = $array['payer']['address'];
180 }
181
182 try {
183 return $this->paypalClient->getHttpClient()->execute($request)->result->id;
184 } catch (Exception $ex) {
185 logError(
186 'Create PayPal Commerce order failure',
187 sprintf(
188 '<strong>Request</strong><pre>%1$s</pre><br><strong>Response</strong><pre>%2$s</pre>',
189 print_r($request->body, true),
190 print_r(json_decode($ex->getMessage(), true), true)
191 )
192 );
193
194 throw $ex;
195 }
196 }
197
198 /**
199 * Refunds a processed payment
200 *
201 * @since 2.9.0
202 *
203 * @param $captureId
204 *
205 * @return string The id of the refund
206 * @throws Exception
207 */
208 public function refundPayment($captureId)
209 {
210 $refund = new CapturesRefundRequest($captureId);
211
212 try {
213 return $this->paypalClient->getHttpClient()->execute($refund)->result->id;
214 } catch (Exception $exception) {
215 logError(
216 'Create PayPal Commerce payment refund failure',
217 sprintf(
218 '<strong>Response</strong><pre>%1$s</pre>',
219 print_r(json_decode($exception->getMessage(), true), true)
220 )
221 );
222
223 throw $exception;
224 }
225 }
226
227 /**
228 * Validate argument given to create PayPal order.
229 *
230 * @since 2.9.0
231 *
232 * @param array $array
233 *
234 * @throws InvalidArgumentException
235 */
236 private function validateCreateOrderArguments($array)
237 {
238 $required = ['formId', 'donationAmount', 'payer'];
239 $array = array_filter($array); // Remove empty values.
240
241 if (array_diff($required, array_keys($array))) {
242 throw new InvalidArgumentException(
243 __(
244 'To create a paypal order, please provide formId, donationAmount and payer',
245 'give'
246 )
247 );
248 }
249 }
250
251 /**
252 * Get order details from paypal commerce.
253 *
254 * @since 2.19.0
255 *
256 * @param string $orderId
257 *
258 * @return PayPalOrderModel
259 * @throws HttpException | IOException
260 */
261 public function getOrder($orderId)
262 {
263 $orderDetailRequest = new OrdersGetRequest($orderId);
264 $orderDetails = (array)$this->paypalClient->getHttpClient()->execute($orderDetailRequest)->result;
265
266 return PayPalOrderModel::fromArray($orderDetails);
267 }
268 }
269