PluginProbe
MakeCommerce for WooCommerce / 3.0.9
MakeCommerce for WooCommerce v3.0.9
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 +61 -157 trunk3.0.9 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();
@@ -179,23 +157,25 @@
179 157 $reference = false;
180 158
181 159 if ( !empty( $data['error'] ) ) {
182 160
183 - //add status and send client back to checkout
184 - return add_query_arg( 'mc_payment_status', 'failed', wc_get_checkout_url() );
161 + //add error and send client back to checkout
162 + wc_add_notice( __( 'Payment failed', 'wc_makecommerce_domain' ), 'error' );
163 + $returnUrl = wc_get_checkout_url();
164 +
165 + return $returnUrl;
185 166 }
186 167
187 168 if ( !empty( $data['message_type'] ) ) {
188 169
189 - if ( $data['message_type'] === 'payment_return' ) {
170 + if ( $data['message_type'] == 'payment_return' ) {
190 171
191 172 $transactionId = $data['transaction'];
192 173 $reference = $data['reference'];
193 174 $paymentStatus = $data['status'];
194 - $totalAmount = $data['amount'];
195 175 }
196 176
197 - if ( $data['message_type'] === 'token_return' ) {
177 + if ( $data['message_type'] == 'token_return' ) {
198 178 if ( !empty( $data['transaction']['reference'] ) ) {
199 179 $reference = $data['transaction']['reference'];
200 180 }
201 181
@@ -205,9 +185,9 @@
205 185 }
206 186 }
207 187
208 188 // if we didn't find reference to an Order, we send user to shop landing-page. TODO: could be improved
209 - if ( empty( $transactionId ) ) {
189 + if ( !$transactionId ) {
210 190 return $returnUrl;
211 191 }
212 192
213 193 //get the post id using transactionid
@@ -212,51 +192,27 @@
212 192
213 193 //get the post id using transactionid
214 194 $orderId = self::get_postid_using_metakey( '_makecommerce_transaction_id', $transactionId );
215 195
216 - $order = wc_get_order( $orderId );
196 + //still nothing. Lets try matching _order_number (SCO doesnt seem to have transaction id, transaction is created via SCO instead)
197 + if ( $orderId == null ) {
198 + $orderId = self::get_postid_using_metakey( '_order_number', $reference );
199 + }
200 +
201 + //try using reference as orderId
202 + if ( !$orderId ) {
203 + $orderId = $reference;
204 + }
217 205
206 + $order = new \WC_Order( $orderId );
207 +
218 208 // if we didn't find the Order, we send user to shop landing-page. TODO: could be improved
219 - if ( !$order || !$order->get_id() ) {
209 + if ( !$order->get_id() ) {
220 210 return $returnUrl;
221 211 }
222 212
223 - $returnUrl = $order->get_meta( '_makecommerce_order_received_url', true );
224 - if ( !$returnUrl ) {
225 - $returnUrl = $order->get_checkout_order_received_url();
226 - }
213 + $returnUrl = $order->get_checkout_order_received_url();
227 214
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 215 if ( $paymentStatus == 'EXPIRED' || $paymentStatus == 'CANCELLED' || $paymentStatus == 'COMPLETED' ) {
260 216
261 217 //get transaction to update the payment method.
262 218 $transaction = $api->getTransaction( $transactionId );
@@ -266,11 +222,10 @@
266 222 if ( isset( $transaction->type ) && isset( $transaction->method ) ) {
267 223 $paymentMethod = $transaction->channel;
268 224 }
269 225
270 - //update _makecommerce_preselected_method
271 - $order->update_meta_data( '_makecommerce_preselected_method', $paymentMethod );
272 - $order->save();
226 + //update _makecommerce_preselected_method
227 + update_post_meta( $order->get_id(), '_makecommerce_preselected_method', $paymentMethod );
273 228 }
274 229
275 230 if ( $paymentStatus == 'CANCELLED' || ( $paymentStatus == 'EXPIRED' && $order->get_status() == "pending" ) ) {
276 231 //send client back to checkout
@@ -276,60 +231,28 @@
276 231 //send client back to checkout
277 232 $returnUrl = wc_get_checkout_url();
278 233 }
279 234
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 235 //check if we already processed this status in the past.
298 - if ( $check_status && $order->get_meta( '_makecommerce_payment_processed_status', true ) == $paymentStatus ) {
236 + if (get_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', true ) == $paymentStatus ) {
299 237 return $returnUrl;
300 238 }
301 239
302 - if ( $paymentStatus === 'COMPLETED' ) {
303 - $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
304 - $order->save();
305 - }
306 -
307 240 switch( $paymentStatus ) {
308 241
309 242 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 - }
243 + $order->update_status( 'cancelled' );
244 + wc_add_notice( __( 'Payment transaction cancelled', 'wc_makecommerce_domain' ), 'error' );
245 + update_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', $paymentStatus );
316 246
317 - $returnUrl = add_query_arg( 'mc_payment_status', 'cancelled', $returnUrl );
318 -
319 247 break;
320 248 case 'EXPIRED':
321 249 //only update if order status is pending payment
322 250 if ( $order->get_status() == "pending" ) {
323 251
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 -
331 - $returnUrl = add_query_arg( 'mc_payment_status', 'expired', $returnUrl );
252 + $order->update_status( 'cancelled' );
253 + wc_add_notice( __( 'Payment transaction expired', 'wc_makecommerce_domain' ), 'error' );
254 + update_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', $paymentStatus );
332 255 }
333 256
334 257 break;
335 258 case 'COMPLETED':
@@ -339,14 +262,15 @@
339 262 $transactionIdText = \MakeCommerce\i18n::get_string_from_mo( 'Transaction ID', 'wc_makecommerce_domain', \MakeCommerce\i18n::get_site_default_language() );
340 263 $paymentOptionText = \MakeCommerce\i18n::get_string_from_mo( 'Payment option', 'wc_makecommerce_domain', \MakeCommerce\i18n::get_site_default_language() );
341 264
342 265 $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 );
266 + $orderNote[] = $paymentOptionText . ': ' . get_post_meta( $order->get_id(), '_makecommerce_preselected_method', true );
344 267 $order->add_order_note( implode( "\r\n", $orderNote ) );
345 268
346 269 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'] );
270 +
271 + update_post_meta( $order->get_id(), '_makecommerce_payment_token', $data['token']['id'] );
272 + update_post_meta( $order->get_id(), '_makecommerce_payment_token_valid_until', $data['token']['valid_until'] );
349 273 }
350 274
351 275 if ( isset( $_GET['lang1'] ) ) {
352 276 $order->update_meta_data( 'wpml_language', $_GET["lang1"] );
@@ -353,53 +277,33 @@
353 277 }
354 278
355 279 $order->payment_complete( $transactionId );
356 280 $woocommerce->cart->empty_cart();
281 +
282 + update_post_meta( $order->get_id(), '_makecommerce_payment_processed_status', $paymentStatus );
357 283
358 284 break;
359 285 }
360 286
361 - // Save all changes to order
362 - $order->save();
363 -
364 287 return $returnUrl;
365 288 }
366 289
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;
290 + /**
291 + * Returns post_id using transaction id or false if not found
292 + *
293 + * @since 3.0.4
294 + */
295 + public static function get_postid_using_metakey( $meta_key, $transactionId ) {
296 +
297 + global $wpdb;
374 298
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 - );
299 + $wpdb->query("SELECT `post_id` FROM $wpdb->postmeta WHERE `meta_key` = '". $meta_key ."' AND `meta_value` = '" . $transactionId . "'");
300 +
301 + foreach ( $wpdb->last_result as $row ) {
302 + if ( isset( $row->post_id ) ) {
303 + return $row->post_id;
304 + }
305 + }
390 306
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 -}
307 + return false;
308 + }
309 +}