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