PluginProbe
PayPlug for WooCommerce (Official) / 3.1.0
PayPlug for WooCommerce (Official) v3.1.0
3.1.0 3.0.0 2.18.0 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.1.0 1.10.0 1.10.1 1.2.1 1.2.10 1.2.11 1.2.2 1.2.3 1.2.4 1.2.5 All 102 releases
← All changes | src/Gateway/PayplugResponse.php +441 -282 1.2.10 → 3.1.0 View file →
@@ -2,365 +2,524 @@
2 2
3 3 namespace Payplug\PayplugWoocommerce\Gateway;
4 4
5 5 // Exit if accessed directly
6 -if ( ! defined( 'ABSPATH' ) ) {
7 - exit;
6 +if (!defined('ABSPATH')) {
7 + exit;
8 8 }
9 9
10 +use Automattic\WooCommerce\Utilities\OrderUtil;
10 11 use Payplug\PayplugWoocommerce\PayplugWoocommerceHelper;
11 12 use Payplug\Resource\IVerifiableAPIResource;
12 13 use Payplug\Resource\Payment as PaymentResource;
13 14 use Payplug\Resource\Refund as RefundResource;
15 +use WC_Payment_Token_CC;
14 16 use WC_Payment_Tokens;
15 -use WC_Payment_Token_CC;
16 17
17 18 /**
18 19 * Process responses from PayPlug.
19 - *
20 - * @package Payplug\PayplugWoocommerce\Gateway
21 20 */
22 -class PayplugResponse {
21 +class PayplugResponse
22 +{
23 + private $gateway;
23 24
24 - private $gateway;
25 + public function __construct(PayplugGateway $gateway)
26 + {
27 + $this->gateway = $gateway;
28 + }
25 29
26 - public function __construct( PayplugGateway $gateway ) {
27 - $this->gateway = $gateway;
28 - }
30 + /**
31 + * Process payment.
32 + *
33 + * @param $resource
34 + * @param $is_payment_with_token
35 + *
36 + * @throws \WC_Data_Exception
37 + *
38 + * @return void
39 + */
40 + public function process_payment($resource, $is_payment_with_token = false, $source = ''): void
41 + {
42 + $order_id = wc_clean($resource->metadata['order_id']);
29 43
30 - /**
31 - * Process payment.
32 - *
33 - * @param $resource
34 - * @param $is_payment_with_token
35 - *
36 - * @return void
37 - * @throws \WC_Data_Exception
38 - */
39 - public function process_payment( $resource, $is_payment_with_token = false ) {
40 - $order_id = wc_clean( $resource->metadata['order_id'] );
41 - $order = wc_get_order( $order_id );
42 - if ( ! $order ) {
43 - PayplugGateway::log( sprintf( 'Coudn\'t find order #%s (Transaction %s).', $order_id, wc_clean( $resource->id ) ), 'error' );
44 + $order = wc_get_order($order_id);
45 + $gateway_id = $order->get_payment_method();
46 + $metadata = PayplugWoocommerceHelper::extract_transaction_metadata($resource);
44 47
45 - return;
46 - }
48 + // Ignore undefined orders
49 + if (!$order) {
50 + PayplugGateway::log(sprintf('Coudn\'t find order #%s (Transaction %s).', $order_id, wc_clean($resource->id)), 'error');
47 51
48 - PayplugGateway::log( sprintf( 'Order #%s : Begin processing payment IPN %s', $order_id, $resource->id ) );
52 + return;
53 + }
49 54
50 - // Ignore paid orders
51 - if ( $order->is_paid() ) {
52 - PayplugGateway::log( sprintf( 'Order #%s : Order is already complete. Ignoring IPN.', $order_id ) );
55 + /**
56 + * Checking if it is coming from the order confirmation page or the IPN
57 + */
58 + if (($gateway_id == $this->gateway->id) || (!empty($source) && ($source === 'ipn'))) {
59 + // Ignore cancelled orders
60 + if ($order->has_status('refunded')) {
61 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' order has been refunded. Ignoring IPN', $order_id));
53 62
54 - return;
55 - }
63 + return;
64 + }
65 + $paid_date = $order->get_date_paid();
66 + if (isset($paid_date) && !$order->is_paid()) {
67 + $finished_status = wc_get_is_paid_statuses();
68 + $order->set_status($finished_status[0]);
69 + }
56 70
57 - // Ignore cancelled orders
58 - if ( $order->has_status( 'refunded' ) ) {
59 - PayplugGateway::log( sprintf( 'Order #%s : Order has been refunded. Ignoring IPN', $order_id ) );
71 + // Ignore paid orders
72 + if ($order->is_paid()) {
73 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' order is already complete. Ignoring IPN. "' . !empty($source) ? '[IPN]' : '' . '"', $order_id));
60 74
61 - return;
62 - }
75 + return;
76 + }
63 77
64 - $metadata = PayplugWoocommerceHelper::extract_transaction_metadata( $resource );
65 - $order_metadata = $order->get_meta('_payplug_metadata', true);
78 + // Handle failed payments
79 + if (!empty($resource->failure)) {
80 + if ($order->get_status() != 'failed') {
81 + $order->update_status('failed', sprintf(__('PayPlug %s OK | Transaction %s failed : %s', 'payplug'), strtoupper($source), $resource->id, wc_clean($resource->failure->message)));
82 + }
66 83
67 - if ( isset( $resource->payment_method ) && is_array( $resource->payment_method ) ) {
68 - if ( in_array( $resource->payment_method['type'], array( 'oney_x3_with_fees', 'oney_x4_with_fees' ) ) ) {
69 - if ( is_array( $order_metadata ) && array_key_exists( 'transaction_in_progress', $order_metadata ) ) {
70 - PayplugGateway::log( sprintf( 'Order #%s : Order Oney IPN already in progress. Ignoring IPN', $order_id ) );
71 - return;
84 + /** This action is documented in src/Gateway/PayplugResponse */
85 + \do_action('payplug_gateway_payment_response_processed', $order_id, $resource);
86 + PayplugWoocommerceHelper::set_flag_ipn_order($order, $metadata, false);
87 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' payment IPN %s processing completed but failed.', $order_id, $resource->id));
88 + wc_increase_stock_levels($order);
89 +
90 + return;
91 + } elseif (($resource->failure == null) && !empty($resource->payment_method['is_pending'])
92 + && ($resource->payment_method['is_pending'] == true)) {
93 + $this->handle_pending_oney($order, $resource, $source);
94 + }
95 +
96 + // Save Logs of the payment for the different payment gateways:
97 + // For Oney 4 gateways & Bancontact gateway: "$resource->payment_method" exists and is an array
98 + // but not for Payplug credit card gateway (in this case we check the payment_method from the order itself not the $resource)
99 + if (isset($resource->payment_method) && is_array($resource->payment_method)) {
100 + $gateway_id = $resource->payment_method['type'];
101 +
102 + switch ($gateway_id) {
103 + case 'oney_' === substr($gateway_id, 0, 5):
104 + $this->oney_ipn($resource);
105 + break;
106 + case 'bancontact':
107 + $this->bancontact_ipn($resource, $source);
108 + break;
109 + case 'apple_pay':
110 + $this->apple_pay_ipn($resource, $source);
111 + break;
112 + case 'american_express':
113 + $this->amex_ipn($resource, $source);
114 + break;
72 115 }
116 + } elseif ('payplug' == $gateway_id) {
117 + if (!$is_payment_with_token) {
118 + $this->payplug_ipn($resource, $source);
119 + }
73 120 }
121 +
122 + // Handle successful payments
123 + if ($resource->is_paid) {
124 + if (!$is_payment_with_token) {
125 + $this->maybe_save_card($resource);
126 + }
127 + $this->maybe_save_address_hash($resource);
128 + $order->add_order_note(sprintf(__('PayPlug %s OK | Transaction %s', 'payplug'), strtoupper($source), wc_clean($resource->id)));
129 + $order->payment_complete(wc_clean($resource->id));
130 + if (PayplugWoocommerceHelper::is_pre_30()) {
131 + $order->reduce_order_stock();
132 + }
133 + /**
134 + * Fires once a payment response has been processed.
135 + *
136 + * @param int $order_id Order ID
137 + * @param PaymentResource $resource Payment resource
138 + */
139 + \do_action('payplug_gateway_payment_response_processed', $order_id, $resource);
140 + PayplugWoocommerceHelper::set_flag_ipn_order($order, $metadata, false);
141 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' payment %s %s processing completed successfully.', strtoupper($source), $order_id, $resource->id));
142 + }
74 143 }
144 + }
75 145
76 - if ( $resource->is_paid ) {
77 - PayplugWoocommerceHelper::set_flag_ipn_order($order, $metadata, true);
78 - if ( ! $is_payment_with_token ) {
79 - $this->maybe_save_card( $resource );
80 - }
146 + /**
147 + * Handle pending oney payments orders
148 + *
149 + * @param $order
150 + * @param $resource
151 + *
152 + * @return void
153 + */
154 + public function handle_pending_oney($order, $resource, $source): void
155 + {
156 + $order->add_order_note(sprintf(__('PayPlug %s OK | Transaction %s | Payment PENDING to be checked by an Oney agent', 'payplug'), strtoupper($source), wc_clean($resource->id)));
157 + wc_reduce_stock_levels($order);
158 + }
81 159
82 - $this->maybe_save_address_hash( $resource );
160 + /**
161 + * Payplug IPN
162 + *
163 + * @param $resource
164 + */
165 + public function payplug_ipn($resource, $source): void
166 + {
167 + $order_id = wc_clean($resource->metadata['order_id']);
168 + PayplugGateway::log(sprintf('Order #%s : Begin processing Payplug payment %s %s', $order_id, strtoupper($source), $resource->id));
169 + }
83 170
84 - $order->add_order_note( sprintf( __( 'PayPlug IPN OK | Transaction %s', 'payplug' ), wc_clean( $resource->id ) ) );
85 - $order->payment_complete( wc_clean( $resource->id ) );
86 - if ( PayplugWoocommerceHelper::is_pre_30() ) {
87 - $order->reduce_order_stock();
88 - }
171 + /**
172 + * Bancontact IPN
173 + *
174 + * @param $resource
175 + */
176 + public function bancontact_ipn($resource, $source): void
177 + {
178 + $order_id = wc_clean($resource->metadata['order_id']);
179 + PayplugGateway::log(sprintf('Order #%s : Begin processing Bancontact payment %s %s', $order_id, strtoupper($source), $resource->id));
180 + }
89 181
90 - /**
91 - * Fires once a payment response has been processed.
92 - *
93 - * @param int $order_id Order ID
94 - * @param PaymentResource $resource Payment resource
95 - */
96 - \do_action( 'payplug_gateway_payment_response_processed', $order_id, $resource );
97 - PayplugWoocommerceHelper::set_flag_ipn_order($order, $metadata, false);
98 - PayplugGateway::log( sprintf( 'Order #%s : Payment IPN %s processing completed.', $order_id, $resource->id ) );
182 + /**
183 + * Apple Pay IPN
184 + *
185 + * @param $resource
186 + */
187 + public function apple_pay_ipn($resource, $source): void
188 + {
189 + $order_id = wc_clean($resource->metadata['order_id']);
190 + PayplugGateway::log(sprintf('Order #%s : Begin processing Apple Pay payment %s %s', $order_id, strtoupper($source), $resource->id));
191 + }
99 192
100 - return;
101 - }
193 + /**
194 + * American Express IPN
195 + *
196 + * @param $resource
197 + */
198 + public function amex_ipn($resource, $source): void
199 + {
200 + $order_id = wc_clean($resource->metadata['order_id']);
201 + PayplugGateway::log(sprintf('Order #%s : Begin processing Amex payment %s %s', $order_id, strtoupper($source), $resource->id));
202 + }
102 203
103 - if ( ! empty( $resource->failure ) ) {
104 - PayplugWoocommerceHelper::set_flag_ipn_order($order, $metadata, true);
105 - $order->update_status(
106 - 'failed',
107 - sprintf( __( 'PayPlug IPN OK | Transaction %s failed : %s', 'payplug' ), $resource->id, wc_clean( $resource->failure->message ) )
108 - );
204 + /**
205 + * Oney IPN
206 + *
207 + * @param $resource
208 + */
209 + public function oney_ipn($resource): void
210 + {
211 + $gateway_id = $resource->payment_method['type'];
212 + $order_id = wc_clean($resource->metadata['order_id']);
109 213
110 - /** This action is documented in src/Gateway/PayplugResponse */
111 - \do_action( 'payplug_gateway_payment_response_processed', $order_id, $resource );
112 - PayplugWoocommerceHelper::set_flag_ipn_order($order, $metadata, false);
113 - PayplugGateway::log( sprintf( 'Order #%s : Payment IPN %s processing completed.', $order_id, $resource->id ) );
214 + if (($resource->is_paid == true) && ($resource->failure == null)) {
215 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' payment SUCCESS', $order_id));
216 + }
114 217
115 - return;
116 - }
117 - }
218 + if (($resource->is_paid == false) && ($resource->failure != null)) {
219 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' payment FAILED', $order_id));
220 + }
118 221
119 - /**
120 - * Process refund.
121 - *
122 - * @param $resource
123 - * @param bool $ignore_woocommerce_refund Flag to determine if IPN notification for refunds created by WooCommerce
124 - * should be ignored or not. Default to true.
125 - *
126 - * @throws \Exception
127 - */
128 - public function process_refund( $resource, $ignore_woocommerce_refund = true ) {
129 - $refund_id = wc_clean( $resource->id );
130 - $transaction_id = wc_clean( $resource->payment_id );
131 - $order = $this->get_order_from_transaction_id( $transaction_id );
132 - if ( ! $order ) {
133 - PayplugGateway::log( sprintf( 'Coudn\'t find order for transaction %s (Refund %s).', wc_clean( $resource->payment_id ), wc_clean( $resource->id ) ), 'error' );
222 + if (($resource->is_paid == false) && ($resource->failure == null) && ($resource->payment_method['is_pending'] == true)) {
223 + PayplugGateway::log(sprintf('Order #%s : ' . $this->gateway_name($gateway_id) . ' payment PENDING and checked by an Oney agent', $order_id));
224 + }
225 + }
134 226
135 - return;
136 - }
137 - $order_id = PayplugWoocommerceHelper::is_pre_30() ? $order->id : $order->get_id();
227 + /**
228 + * Get the gateway name from the gateway_id
229 + *
230 + * @param $gateway_id
231 + */
232 + private function gateway_name($gateway_id)
233 + {
234 + return ucwords(str_replace('_', ' ', $gateway_id));
235 + }
138 236
139 - PayplugGateway::log( sprintf( 'Order #%s : Begin processing refund IPN %s', $order_id, $resource->id ) );
237 + /**
238 + * Process refund.
239 + *
240 + * @param $resource
241 + * @param bool $ignore_woocommerce_refund Flag to determine if IPN notification for refunds created by WooCommerce
242 + * should be ignored or not. Default to true.
243 + *
244 + * @throws \Exception
245 + */
246 + public function process_refund($resource, $ignore_woocommerce_refund = true): void
247 + {
248 + $refund_id = wc_clean($resource->id);
249 + $transaction_id = wc_clean($resource->payment_id);
250 + $order = $this->get_order_from_transaction_id($transaction_id);
251 + if (!$order) {
252 + PayplugGateway::log(sprintf('Coudn\'t find order for transaction %s (Refund %s).', wc_clean($resource->payment_id), wc_clean($resource->id)), 'error');
140 253
141 - $refund_exist = $this->refund_exist_for_order( $order_id, $refund_id );
142 - if ( $refund_exist ) {
143 - PayplugGateway::log( sprintf( 'Order #%s : Refund has already been processed. Ignoring IPN.', $order_id ) );
254 + return;
255 + }
256 + $order_id = PayplugWoocommerceHelper::is_pre_30() ? $order->id : $order->get_id();
144 257
145 - return;
146 - }
258 + PayplugGateway::log(sprintf('Order #%s : Begin processing refund IPN %s', $order_id, $resource->id));
147 259
148 - // Since refund notification doesn't contain the full resource, we need to retrieve
149 - // the refund resource to access its metadata.
150 - try {
151 - $refund = $this->gateway->api->refund_retrieve( $transaction_id, $refund_id );
152 - } catch ( \Exception $e ) {
153 - PayplugGateway::log( sprintf( 'Order #%s : Fail to retrieve refund data with error %s', $order_id, $e->getMessage() ) );
260 + $refund_exist = $this->refund_exist_for_order($order_id, $refund_id);
261 + if ($refund_exist) {
262 + PayplugGateway::log(sprintf('Order #%s : Refund has already been processed. Ignoring IPN.', $order_id));
154 263
155 - return;
156 - }
264 + return;
265 + }
157 266
158 - if (
159 - $ignore_woocommerce_refund
160 - && isset( $refund->metadata['refund_from'] )
161 - && 'woocommerce' === $refund->metadata['refund_from']
162 - ) {
163 - PayplugGateway::log( sprintf( 'Order #%s : Refund created by WooCommerce. Ignoring IPN.', $order_id ) );
267 + // Since refund notification doesn't contain the full resource, we need to retrieve
268 + // the refund resource to access its metadata.
269 + try {
270 + $refund = $this->gateway->payplug_api->refund_retrieve($transaction_id, $refund_id);
271 + } catch (\Exception $e) {
272 + PayplugGateway::log(sprintf('Order #%s : Fail to retrieve refund data with error %s', $order_id, $e->getMessage()));
164 273
165 - return;
166 - }
274 + return;
275 + }
167 276
168 - $refund = wc_create_refund( [
169 - 'amount' => ( (int) $resource->amount ) / 100,
170 - 'reason' => isset( $resource->metadata['reason'] ) ? $resource->metadata['reason'] : null,
171 - 'order_id' => (int) $order_id,
172 - 'refund_id' => 0,
173 - 'refund_payment' => false,
174 - ] );
175 - if ( is_wp_error( $refund ) ) {
176 - PayplugGateway::log( $refund->get_error_message() );
177 - }
277 + if (
278 + $ignore_woocommerce_refund
279 + && isset($refund->metadata['refund_from'])
280 + && 'woocommerce' === $refund->metadata['refund_from']
281 + ) {
282 + PayplugGateway::log(sprintf('Order #%s : Refund created by WooCommerce. Ignoring IPN.', $order_id));
178 283
179 - $refund_meta_key = sprintf( '_pr_%s', wc_clean( $resource->id ) );
180 - if ( PayplugWoocommerceHelper::is_pre_30() ) {
181 - update_post_meta( $order_id, $refund_meta_key, $resource->id );
182 - } else {
183 - $order->add_meta_data( $refund_meta_key, $resource->id, true );
184 - $order->save();
185 - }
284 + return;
285 + }
186 286
187 - $note = sprintf( __( 'Refund %s : Refunded %s', 'payplug' ), wc_clean( $resource->id ), wc_price( ( (int) $resource->amount ) / 100 ) );
188 - if ( ! empty( $resource->metadata['reason'] ) ) {
189 - $note .= sprintf( ' (%s)', esc_html( $resource->metadata['reason'] ) );
190 - }
191 - $order->add_order_note( $note );
287 + $refund = wc_create_refund([
288 + 'amount' => ((int) $resource->amount) / 100,
289 + 'reason' => isset($resource->metadata['reason']) ? $resource->metadata['reason'] : null,
290 + 'order_id' => (int) $order_id,
291 + 'refund_id' => 0,
292 + 'refund_payment' => false,
293 + ]);
294 + if (is_wp_error($refund)) {
295 + PayplugGateway::log($refund->get_error_message());
296 + }
192 297
193 - /**
194 - * Fires once a refund response has been processed.
195 - *
196 - * @param int $order_id Order ID
197 - * @param RefundResource $resource Refund resource
198 - */
199 - \do_action( 'payplug_gateway_refund_response_processed', $order_id, $resource );
298 + $refund_meta_key = sprintf('_pr_%s', wc_clean($resource->id));
299 + if (PayplugWoocommerceHelper::is_pre_30()) {
300 + update_post_meta($order_id, $refund_meta_key, $resource->id);
301 + } else {
302 + $order->add_meta_data($refund_meta_key, $resource->id, true);
303 + $order->save();
304 + }
200 305
201 - try {
202 - $payment = $this->gateway->api->payment_retrieve( $transaction_id );
203 - $metadata = PayplugWoocommerceHelper::extract_transaction_metadata( $payment );
204 - PayplugWoocommerceHelper::save_transaction_metadata( $order, $metadata );
205 - } catch ( \Exception $e ) {}
306 + $note = sprintf(__('Refund %s : Refunded %s', 'payplug'), wc_clean($resource->id), wc_price(((int) $resource->amount) / 100));
307 + if (!empty($resource->metadata['reason'])) {
308 + $note .= sprintf(' (%s)', esc_html($resource->metadata['reason']));
309 + }
310 + $order->add_order_note($note);
206 311
207 - PayplugGateway::log( sprintf( 'Order #%s : Refund IPN %s processing completed.', $order_id, $resource->id ) );
208 - }
312 + /**
313 + * Fires once a refund response has been processed.
314 + *
315 + * @param int $order_id Order ID
316 + * @param RefundResource $resource Refund resource
317 + */
318 + \do_action('payplug_gateway_refund_response_processed', $order_id, $resource);
209 319
210 - /**
211 - * Get an order from its transaction id.
212 - *
213 - * @param int $transaction_id
214 - *
215 - * @return bool|\WC_Order
216 - */
217 - protected function get_order_from_transaction_id( $transaction_id ) {
218 - global $wpdb;
320 + try {
321 + $payment = $this->gateway->payplug_api->payment_retrieve($transaction_id);
322 + $metadata = PayplugWoocommerceHelper::extract_transaction_metadata($payment);
323 + PayplugWoocommerceHelper::save_transaction_metadata($order, $metadata);
324 + } catch (\Exception $e) {
325 + }
219 326
220 - $order_id = $wpdb->get_var(
221 - $wpdb->prepare(
222 - "
223 - SELECT post_id
224 - FROM $wpdb->postmeta
225 - WHERE meta_key = '_transaction_id'
226 - AND meta_value = %s
227 - ",
228 - $transaction_id
229 - )
230 - );
327 + PayplugGateway::log(sprintf('Order #%s : Refund IPN %s processing completed.', $order_id, $resource->id));
328 + }
231 329
232 - return ! is_null( $order_id ) ? wc_get_order( $order_id ) : false;
233 - }
330 + /**
331 + * Get an order from its transaction id.
332 + *
333 + * @param int $transaction_id
334 + *
335 + * @return bool|\WC_Order
336 + */
337 + protected function get_order_from_transaction_id($transaction_id)
338 + {
339 + global $wpdb;
234 340
235 - /**
236 - * Check if a refund id already exist for the order.
237 - *
238 - * @param string $refund_id
239 - *
240 - * @return bool
241 - */
242 - protected function refund_exist_for_order( $order_id, $refund_id ) {
243 - global $wpdb;
341 + if (OrderUtil::custom_orders_table_usage_is_enabled()) {
342 + $orders = wc_get_orders(
343 + [
344 + 'field_query' => [
345 + [
346 + 'field' => 'transaction_id',
347 + 'value' => $transaction_id,
348 + ],
349 + ],
350 + ]
351 + );
352 + $order = $orders[0];
353 + $order_id = $order->get_id();
354 + //$sql = "SELECT o.id FROM $wpdb->wc_orders o WHERE o.transaction_id = %s";
355 + } else {
356 + $order_id = $wpdb->get_var(
357 + $wpdb->prepare(
358 + "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_transaction_id' AND meta_value = %s",
359 + $transaction_id
360 + )
361 + );
362 + }
244 363
245 - $sql = "
364 + return !is_null($order_id) ? wc_get_order($order_id) : false;
365 + }
366 +
367 + /**
368 + * Check if a refund id already exist for the order.
369 + *
370 + * @param string $refund_id
371 + *
372 + * @return bool
373 + */
374 + protected function refund_exist_for_order($order_id, $refund_id)
375 + {
376 + global $wpdb;
377 +
378 + if (OrderUtil::custom_orders_table_usage_is_enabled()) {
379 + $results = wc_get_orders(
380 + [
381 + 'meta_query' => [
382 + [
383 + 'field_query' => [
384 + 'relation' => 'AND',
385 + [
386 + 'field' => 'meta_key',
387 + 'value' => '_pr_' . esc_sql($refund_id),
388 + ],
389 + [
390 + 'field' => 'meta_value',
391 + 'value' => $refund_id,
392 + ],
393 + [
394 + 'field' => 'order_id',
395 + 'value' => (int) $order_id,
396 + ],
397 + ],
398 + ],
399 + ],
400 + ]
401 + );
402 + } else {
403 + $sql = "
246 404 SELECT p.ID
247 - FROM $wpdb->posts p
248 - INNER JOIN $wpdb->postmeta pm
249 - ON p.ID = pm.post_id
250 - WHERE 1=1
251 - AND p.post_type = %s
252 - AND p.ID = %d
253 - AND pm.meta_key LIKE '_pr_" . esc_sql( $refund_id ) . "'
254 - AND pm.meta_value = %s
405 + FROM $wpdb->posts p
406 + INNER JOIN $wpdb->postmeta pm
407 + ON p.ID = pm.post_id
408 + WHERE 1=1
409 + AND p.post_type = %s
410 + AND p.ID = %d
411 + AND pm.meta_key LIKE '_pr_" . esc_sql($refund_id) . "'
412 + AND pm.meta_value = %s
255 413 LIMIT 1
256 - ";
414 + ";
257 415
258 - $results = $wpdb->get_col(
259 - $wpdb->prepare(
260 - $sql,
261 - 'shop_order',
262 - (int) $order_id,
263 - $refund_id
264 - )
265 - );
416 + $results = $wpdb->get_col(
417 + $wpdb->prepare(
418 + $sql,
419 + 'shop_order',
420 + (int) $order_id,
421 + $refund_id
422 + )
423 + );
424 + }
266 425
267 - return ! empty( $results ) ? true : false;
268 - }
426 + return !empty($results) ? true : false;
427 + }
269 428
270 - /**
271 - * Save card from the transaction.
272 - *
273 - * @param IVerifiableAPIResource $resource
274 - *
275 - * @return bool
276 - */
277 - protected function maybe_save_card( $resource ) {
429 + /**
430 + * Save card from the transaction.
431 + *
432 + * @param IVerifiableAPIResource $resource
433 + *
434 + * @return bool
435 + */
436 + protected function maybe_save_card($resource)
437 + {
438 + if (!isset($resource->card) || empty($resource->card->id)) {
439 + return false;
440 + }
278 441
279 - if ( ! isset( $resource->card ) || empty( $resource->card->id ) ) {
280 - return false;
281 - }
442 + if (!isset($resource->metadata['customer_id'])) {
443 + return false;
444 + }
282 445
283 - if ( ! isset( $resource->metadata['customer_id'] ) ) {
284 - return false;
285 - }
446 + $customer = get_user_by('id', $resource->metadata['customer_id']);
447 + if (!$customer || 0 === (int) $customer->ID) {
448 + return false;
449 + }
286 450
287 - $customer = get_user_by( 'id', $resource->metadata['customer_id'] );
288 - if ( ! $customer || 0 === (int) $customer->ID ) {
289 - return false;
290 - }
451 + $merchant_id = $this->gateway->get_merchant_id();
452 + if (empty($merchant_id)) {
453 + return false;
454 + }
291 455
292 - $merchant_id = $this->gateway->get_merchant_id();
293 - if ( empty( $merchant_id ) ) {
294 - return false;
295 - }
456 + PayplugGateway::log(sprintf('Saving card from transaction %s for customer %s', wc_clean($resource->id), $customer->ID));
296 457
297 - PayplugGateway::log( sprintf( 'Saving card from transaction %s for customer %s', wc_clean( $resource->id ), $customer->ID ) );
298 -
299 458 $token = new WC_Payment_Token_CC();
300 - $existing_tokens = WC_Payment_Tokens::get_customer_tokens( $customer->ID , $this->gateway->id );
301 - $set_token = wc_clean( $resource->card->id );
302 - $set_last4 = wc_clean( $resource->card->last4 );
303 - $set_expiry_year = wc_clean( $resource->card->exp_year ) ;
304 - $set_expiry_month = zeroise( (int) wc_clean( $resource->card->exp_month ), 2 ) ;
305 - $set_card_type = \strtolower( wc_clean( $resource->card->brand ) ) ;
306 - if(!empty($existing_tokens)) {
307 - foreach($existing_tokens as $token_id => $existing_token) {
459 + $existing_tokens = WC_Payment_Tokens::get_customer_tokens($customer->ID, $this->gateway->id);
460 + $set_token = wc_clean($resource->card->id);
461 + $set_last4 = wc_clean($resource->card->last4);
462 + $set_expiry_year = wc_clean($resource->card->exp_year);
463 + $set_expiry_month = zeroise((int) wc_clean($resource->card->exp_month), 2);
464 + $set_card_type = \strtolower(wc_clean($resource->card->brand));
465 + if (!empty($existing_tokens)) {
466 + foreach ($existing_tokens as $token_id => $existing_token) {
308 467 $current_data = $existing_token->get_data();
309 - if( $current_data['token'] === $set_token &&
310 - $current_data['last4'] === $set_last4 &&
311 - $current_data['expiry_year'] === $set_expiry_year &&
312 - $current_data['expiry_month'] === $set_expiry_month &&
468 + if ($current_data['token'] === $set_token &&
469 + $current_data['last4'] === $set_last4 &&
470 + $current_data['expiry_year'] === $set_expiry_year &&
471 + $current_data['expiry_month'] === $set_expiry_month &&
313 472 $current_data['card_type'] === $set_card_type) {
314 473 $token->set_id($current_data['id']);
315 474 }
316 475 }
317 476 }
318 -
319 - $token->set_token( $set_token );
320 - $token->set_gateway_id( 'payplug' );
321 - $token->set_last4( $set_last4 );
322 - $token->set_expiry_year( $set_expiry_year );
323 - $token->set_expiry_month( $set_expiry_month );
324 - $token->set_card_type( $set_card_type );
325 - $token->set_user_id( $customer->ID );
326 - $token->add_meta_data( 'mode', $resource->is_live ? 'live' : 'test', true );
327 - $token->add_meta_data( 'payplug_account', \wc_clean( $merchant_id ), true );
328 - $token->save();
329 477
330 - PayplugGateway::log( sprintf( 'Payment card saved', wc_clean( $resource->id ), $customer->ID ) );
478 + $token->set_token($set_token);
479 + $token->set_gateway_id('payplug');
480 + $token->set_last4($set_last4);
481 + $token->set_expiry_year($set_expiry_year);
482 + $token->set_expiry_month($set_expiry_month);
483 + $token->set_card_type($set_card_type);
484 + $token->set_user_id($customer->ID);
485 + $token->add_meta_data('mode', $resource->is_live ? 'live' : 'test', true);
486 + $token->add_meta_data('payplug_account', \wc_clean($merchant_id), true);
487 + $token->save();
331 488
332 - return true;
333 - }
489 + PayplugGateway::log(sprintf('Payment card saved', wc_clean($resource->id), $customer->ID));
334 490
335 - /**
336 - * Save shipping address.
337 - *
338 - * @param IVerifiableAPIResource $resource
339 - *
340 - * @return bool
341 - */
342 - protected function maybe_save_address_hash( $resource ) {
491 + return true;
492 + }
343 493
344 - if ( ! isset( $resource->metadata['customer_id'] ) ) {
345 - return false;
346 - }
494 + /**
495 + * Save shipping address.
496 + *
497 + * @param IVerifiableAPIResource $resource
498 + *
499 + * @return bool
500 + */
501 + protected function maybe_save_address_hash($resource)
502 + {
503 + if (!isset($resource->metadata['customer_id'])) {
504 + return false;
505 + }
347 506
348 - $customer = get_user_by( 'id', $resource->metadata['customer_id'] );
349 - if ( ! $customer || 0 === (int) $customer->ID ) {
350 - return false;
351 - }
507 + $customer = get_user_by('id', $resource->metadata['customer_id']);
508 + if (!$customer || 0 === (int) $customer->ID) {
509 + return false;
510 + }
352 511
353 - $shipping = [];
354 - foreach ( PayplugAddressData::$address_fields as $field ) {
355 - $shipping[ $field ] = $resource->shipping->{$field};
356 - }
512 + $shipping = [];
513 + foreach (PayplugAddressData::$address_fields as $field) {
514 + $shipping[$field] = $resource->shipping->{$field};
515 + }
357 516
358 - $shipping_hash = PayplugAddressData::hash_address( $shipping );
359 - $hash_list = PayplugAddressData::get_customer_addresses_hash( $customer->ID );
360 - $hash_list[] = $shipping_hash;
361 - $hash_list = array_unique( $hash_list );
362 - PayplugAddressData::update_customer_addresses_hash( $customer->ID, $hash_list );
517 + $shipping_hash = PayplugAddressData::hash_address($shipping);
518 + $hash_list = PayplugAddressData::get_customer_addresses_hash($customer->ID);
519 + $hash_list[] = $shipping_hash;
520 + $hash_list = array_unique($hash_list);
521 + PayplugAddressData::update_customer_addresses_hash($customer->ID, $hash_list);
363 522
364 - return true;
365 - }
523 + return true;
524 + }
366 525 }