PluginProbe
MakeCommerce for WooCommerce / 3.0.12
MakeCommerce for WooCommerce v3.0.12
4.1.0 4.0.8 trunk 1.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 2.0.0 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2.0 2.2.1 2.2.2 All 96 releases
← All changes | payment/payment.php +54 -153 4.1.03.0.12 View file →
@@ -11,9 +11,8 @@
11 11 */
12 12
13 13 namespace MakeCommerce;
14 14
15 -use Automattic\WooCommerce\Utilities\OrderUtil;
16 15 /**
17 16 * The payment functionality of the plugin.
18 17 *
19 18 * Defines the plugin name, version, and two examples hooks for how to
@@ -58,9 +57,8 @@
58 57 $this->version = $version;
59 58 $this->loader = $loader;
60 59
61 60 $this->loader->add_action( 'plugins_loaded', $this, 'initialize_payment_gateways' );
62 - $this->loader->add_action( 'woocommerce_before_checkout_form', $this, 'check_payment_status' );
63 61 }
64 62
65 63 /**
66 64 * Initialize all payment gateways
@@ -67,8 +65,14 @@
67 65 *
68 66 * @since 3.0.0
69 67 */
70 68 public function initialize_payment_gateways() {
69 +
70 + //Simplecheckout
71 + if ( get_option( 'mk_checkout_sco', 'no' ) == "yes" ) {
72 + new Payment\Gateway\Simplecheckout();
73 + }
74 +
71 75 //WooCommerce
72 76 new Payment\Gateway\WooCommerce( true );
73 77 }
74 78
@@ -126,39 +130,13 @@
126 130
127 131 }
128 132
129 133 /**
130 - * Add check for unsuccesful payment redirects
131 - * Displays notice if something went wrong
132 - *
133 - * @since 3.0.12
134 - */
135 - public function check_payment_status()
136 - {
137 - if ( isset ( $_GET['mc_payment_status'] ) ) {
138 - switch( $_GET['mc_payment_status'] ) {
139 - case 'failed':
140 - wc_add_notice( __( 'Payment failed', 'wc_makecommerce_domain' ), 'error' );
141 - break;
142 - case 'cancelled':
143 - wc_add_notice( __( 'Payment transaction cancelled', 'wc_makecommerce_domain' ), 'error' );
144 - break;
145 - case 'expired':
146 - wc_add_notice( __( 'Payment transaction expired', 'wc_makecommerce_domain' ), 'error' );
147 - break;
148 - }
149 -
150 - // Avoid multiple error messages
151 - unset($_GET['mc_payment_status']);
152 - }
153 - }
154 -
155 - /**
156 134 * Check payment and process order if completed, canceled
157 135 *
158 136 * @since 3.0.0
159 137 */
160 - public static function check_payment( $settings = array() ) {
138 + public static function check_payment() {
161 139
162 140 global $woocommerce;
163 141
164 142 $api = \MakeCommerce::get_api();
@@ -185,17 +163,16 @@
185 163 }
186 164
187 165 if ( !empty( $data['message_type'] ) ) {
188 166
189 - if ( $data['message_type'] === 'payment_return' ) {
167 + if ( $data['message_type'] == 'payment_return' ) {
190 168
191 169 $transactionId = $data['transaction'];
192 170 $reference = $data['reference'];
193 171 $paymentStatus = $data['status'];
194 - $totalAmount = $data['amount'];
195 172 }
196 173
197 - if ( $data['message_type'] === 'token_return' ) {
174 + if ( $data['message_type'] == 'token_return' ) {
198 175 if ( !empty( $data['transaction']['reference'] ) ) {
199 176 $reference = $data['transaction']['reference'];
200 177 }
201 178
@@ -205,9 +182,9 @@
205 182 }
206 183 }
207 184
208 185 // if we didn't find reference to an Order, we send user to shop landing-page. TODO: could be improved
209 - if ( empty( $transactionId ) ) {
186 + if ( !$transactionId ) {
210 187 return $returnUrl;
211 188 }
212 189
213 190 //get the post id using transactionid
@@ -212,51 +189,27 @@
212 189
213 190 //get the post id using transactionid
214 191 $orderId = self::get_postid_using_metakey( '_makecommerce_transaction_id', $transactionId );
215 192
216 - $order = wc_get_order( $orderId );
193 + //still nothing. Lets try matching _order_number (SCO doesnt seem to have transaction id, transaction is created via SCO instead)
194 + if ( $orderId == null ) {
195 + $orderId = self::get_postid_using_metakey( '_order_number', $reference );
196 + }
197 +
198 + //try using reference as orderId
199 + if ( !$orderId ) {
200 + $orderId = $reference;
201 + }
217 202
203 + $order = new \WC_Order( $orderId );
204 +
218 205 // if we didn't find the Order, we send user to shop landing-page. TODO: could be improved
219 - if ( !$order || !$order->get_id() ) {
206 + if ( !$order->get_id() ) {
220 207 return $returnUrl;
221 208 }
222 209
223 - $returnUrl = $order->get_meta( '_makecommerce_order_received_url', true );
224 - if ( !$returnUrl ) {
225 - $returnUrl = $order->get_checkout_order_received_url();
226 - }
210 + $returnUrl = $order->get_checkout_order_received_url();
227 211
228 - // Disregard with subscription method change as amounts do not match (0 vs order total)
229 - // Only check sums if $totalAmount is set
230 - // Trx total and order total did not match
231 - if ( $order->get_status() !== 'active' && isset( $totalAmount ) && $totalAmount != $order->get_total() ) {
232 -
233 - if ( $paymentStatus == 'COMPLETED' ) {
234 - $notes[] = sprintf('%s: %s.',
235 - __( 'Order total and transaction amount did not match! Please contact us at', 'wc_makecommerce_domain' ),
236 - __( 'support@maksekeskus.ee', 'wc_makecommerce_domain' )
237 - );
238 - $notes[] = sprintf('%s: %s.',
239 - __( 'Transaction ID that was assigned to this order', 'wc_makecommerce_domain' ),
240 - '<a target=_blank href="'.$api->getEnvUrls()->merchantUrl.'merchant/shop/deals/detail.html?id='. $transactionId .'">'.$transactionId.'</a>'
241 - );
242 - $notes[] = sprintf('%s: %s€',
243 - __( 'Amount that was paid', 'wc_makecommerce_domain' ),
244 - $totalAmount
245 - );
246 -
247 - $order->add_order_note( implode( "\r\n", $notes ) );
248 -
249 - // Empty the cart so the customer is not tempted to pay again
250 - $woocommerce->cart->empty_cart();
251 -
252 - return $returnUrl;
253 - }
254 -
255 - // If the payment was not complete then send the customer back to checkout
256 - return wc_get_checkout_url();
257 - }
258 -
259 212 if ( $paymentStatus == 'EXPIRED' || $paymentStatus == 'CANCELLED' || $paymentStatus == 'COMPLETED' ) {
260 213
261 214 //get transaction to update the payment method.
262 215 $transaction = $api->getTransaction( $transactionId );
@@ -266,11 +219,10 @@
266 219 if ( isset( $transaction->type ) && isset( $transaction->method ) ) {
267 220 $paymentMethod = $transaction->channel;
268 221 }
269 222
270 - //update _makecommerce_preselected_method
271 - $order->update_meta_data( '_makecommerce_preselected_method', $paymentMethod );
272 - $order->save();
223 + //update _makecommerce_preselected_method
224 + update_post_meta( $order->get_id(), '_makecommerce_preselected_method', $paymentMethod );
273 225 }
274 226
275 227 if ( $paymentStatus == 'CANCELLED' || ( $paymentStatus == 'EXPIRED' && $order->get_status() == "pending" ) ) {
276 228 //send client back to checkout
@@ -276,46 +228,19 @@
276 228 //send client back to checkout
277 229 $returnUrl = wc_get_checkout_url();
278 230 }
279 231
280 - // Avoid duplicate method changes for subscriptions
281 - $check_status = true;
282 -
283 - if ( !empty( $data['token']['id'] ) && !empty( $data['token']['multiuse'] ) ) {
284 - // Order is a subscription and saved token is different from response token
285 - if ( $order->get_meta( '_makecommerce_payment_token', true) !== $data['token']['id'] ) {
286 - $check_status = false;
287 - }
288 - }
289 -
290 - // Lock processing for this order+status to avoid race conditions between callback and redirect
291 - $lock_key = '_makecommerce_payment_lock_status_' . $paymentStatus;
292 - $locked = add_post_meta( $orderId, $lock_key, time(), true );
293 - if ( ! $locked ) {
294 - return $returnUrl;
295 - }
296 -
297 232 //check if we already processed this status in the past.
298 - if ( $check_status && $order->get_meta( '_makecommerce_payment_processed_status', true ) == $paymentStatus ) {
233 + if (get_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', true ) == $paymentStatus ) {
299 234 return $returnUrl;
300 235 }
301 236
302 - if ( $paymentStatus === 'COMPLETED' ) {
303 - $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
304 - $order->save();
305 - }
306 -
307 237 switch( $paymentStatus ) {
308 238
309 239 case 'CANCELLED':
310 - // Do not update status when disabled in settings
311 - if ( ( $settings['disable_cancelled_payment_update'] ?? '' ) !== 'yes' ) {
312 - // Update automatically
313 - $order->update_status( 'cancelled' );
314 - $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
315 - }
316 -
240 + $order->update_status( 'cancelled' );
317 241 $returnUrl = add_query_arg( 'mc_payment_status', 'cancelled', $returnUrl );
242 + update_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', $paymentStatus );
318 243
319 244 break;
320 245 case 'EXPIRED':
321 246 //only update if order status is pending payment
@@ -320,16 +245,11 @@
320 245 case 'EXPIRED':
321 246 //only update if order status is pending payment
322 247 if ( $order->get_status() == "pending" ) {
323 248
324 - // Do not update order status if disabled in settings
325 - if ( ( $settings['disable_expired_payment_update'] ?? '' ) !== 'yes' ) {
326 - // Update automatically
327 - $order->update_status( 'cancelled' );
328 - $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
329 - }
330 -
249 + $order->update_status( 'cancelled' );
331 250 $returnUrl = add_query_arg( 'mc_payment_status', 'expired', $returnUrl );
251 + update_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', $paymentStatus );
332 252 }
333 253
334 254 break;
335 255 case 'COMPLETED':
@@ -339,14 +259,15 @@
339 259 $transactionIdText = \MakeCommerce\i18n::get_string_from_mo( 'Transaction ID', 'wc_makecommerce_domain', \MakeCommerce\i18n::get_site_default_language() );
340 260 $paymentOptionText = \MakeCommerce\i18n::get_string_from_mo( 'Payment option', 'wc_makecommerce_domain', \MakeCommerce\i18n::get_site_default_language() );
341 261
342 262 $orderNote[] = $transactionIdText . ': <a target=_blank href="'.$api->getEnvUrls()->merchantUrl.'merchant/shop/deals/detail.html?id='. $transactionId .'">'.$transactionId.'</a>';
343 - $orderNote[] = $paymentOptionText . ': ' . $order->get_meta( '_makecommerce_preselected_method', true );
263 + $orderNote[] = $paymentOptionText . ': ' . get_post_meta( $order->get_id(), '_makecommerce_preselected_method', true );
344 264 $order->add_order_note( implode( "\r\n", $orderNote ) );
345 265
346 266 if ( !empty( $data['token'] ) && !empty( $data['token']['multiuse'] ) ) {
347 - $order->update_meta_data( '_makecommerce_payment_token', $data['token']['id'] );
348 - $order->update_meta_data( '_makecommerce_payment_token_valid_until', $data['token']['valid_until'] );
267 +
268 + update_post_meta( $order->get_id(), '_makecommerce_payment_token', $data['token']['id'] );
269 + update_post_meta( $order->get_id(), '_makecommerce_payment_token_valid_until', $data['token']['valid_until'] );
349 270 }
350 271
351 272 if ( isset( $_GET['lang1'] ) ) {
352 273 $order->update_meta_data( 'wpml_language', $_GET["lang1"] );
@@ -353,53 +274,33 @@
353 274 }
354 275
355 276 $order->payment_complete( $transactionId );
356 277 $woocommerce->cart->empty_cart();
278 +
279 + update_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', $paymentStatus );
357 280
358 281 break;
359 282 }
360 283
361 - // Save all changes to order
362 - $order->save();
363 -
364 284 return $returnUrl;
365 285 }
366 286
367 - /**
368 - * Returns post_id using transaction id or false if not found
369 - *
370 - * @since 3.0.4
371 - */
372 - public static function get_postid_using_metakey( $meta_key, $transactionId ) {
373 - global $wpdb;
287 + /**
288 + * Returns post_id using transaction id or false if not found
289 + *
290 + * @since 3.0.4
291 + */
292 + public static function get_postid_using_metakey( $meta_key, $transactionId ) {
293 +
294 + global $wpdb;
374 295
375 - if ( class_exists( OrderUtil::class )
376 - && OrderUtil::custom_orders_table_usage_is_enabled()
377 - ) {
378 - // HPOS
379 - $results = $wpdb->get_results(
380 - $wpdb->prepare("
381 - SELECT {$wpdb->prefix}wc_orders.id
382 - FROM {$wpdb->prefix}wc_orders
383 - INNER JOIN {$wpdb->prefix}wc_orders_meta AS meta ON meta.order_id = {$wpdb->prefix}wc_orders.id AND meta.meta_key = %s
384 - WHERE meta.meta_value = %s
385 - ",
386 - $meta_key,
387 - $transactionId
388 - )
389 - );
296 + $wpdb->query("SELECT `post_id` FROM $wpdb->postmeta WHERE `meta_key` = '". $meta_key ."' AND `meta_value` = '" . $transactionId . "'");
297 +
298 + foreach ( $wpdb->last_result as $row ) {
299 + if ( isset( $row->post_id ) ) {
300 + return $row->post_id;
301 + }
302 + }
390 303
391 - if ( isset( $results[0]->id ) ) {
392 - return $results[0]->id;
393 - }
394 - } else {
395 - // Legacy DB
396 - $wpdb->query("SELECT `post_id` FROM $wpdb->postmeta WHERE `meta_key` = '". $meta_key ."' AND `meta_value` = '" . $transactionId . "'");
397 -
398 - if ( isset( $wpdb->last_result[0]->post_id ) ) {
399 - return $wpdb->last_result[0]->post_id;
400 - }
401 - }
402 -
403 - return false;
404 - }
405 -}
304 + return false;
305 + }
306 +}