PluginProbe
MakeCommerce for WooCommerce / 3.5.2
MakeCommerce for WooCommerce v3.5.2
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
makecommerce / payment / payment.php

payment.php in MakeCommerce for WooCommerce 3.5.2, at payment/payment.php

388 lines 11.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * The payment functionality of the plugin.
5 *
6 * @link https://makecommerce.net/
7 * @since 3.0.0
8 *
9 * @package Makecommerce
10 * @subpackage Makecommerce/admin
11 */
12
13 namespace MakeCommerce;
14
15 use Automattic\WooCommerce\Utilities\OrderUtil;
16 /**
17 * The payment functionality of the plugin.
18 *
19 * Defines the plugin name, version, and two examples hooks for how to
20 * enqueue the admin-specific stylesheet and JavaScript.
21 *
22 * @package Makecommerce
23 * @subpackage Makecommerce/payment
24 * @author Maksekeskus AS <support@maksekeskus.ee>
25 */
26 class Payment {
27
28 /**
29 * The ID of this plugin.
30 *
31 * @since 3.0.0
32 * @access private
33 * @var string $plugin_name The ID of this plugin.
34 */
35 private $plugin_name;
36
37 /**
38 * The version of this plugin.
39 *
40 * @since 3.0.0
41 * @access private
42 * @var string $version The current version of this plugin.
43 */
44 private $version;
45
46 private Loader $loader;
47
48 /**
49 * Initialize the class and set its properties.
50 *
51 * @since 3.0.0
52 * @param string $plugin_name The name of this plugin.
53 * @param string $version The version of this plugin.
54 */
55 public function __construct( $plugin_name, $version, Loader $loader ) {
56
57 $this->plugin_name = $plugin_name;
58 $this->version = $version;
59 $this->loader = $loader;
60
61 $this->loader->add_action( 'plugins_loaded', $this, 'initialize_payment_gateways' );
62 $this->loader->add_action( 'woocommerce_before_checkout_form', $this, 'check_payment_status' );
63 }
64
65 /**
66 * Initialize all payment gateways
67 *
68 * @since 3.0.0
69 */
70 public function initialize_payment_gateways() {
71 //WooCommerce
72 new Payment\Gateway\WooCommerce( true );
73 }
74
75 /**
76 * Returns price excluding taxes
77 *
78 * @since 3.0.0
79 */
80 public static function get_rate_without_taxes( $method, $rate ) {
81
82 if ( empty( $rate[$method] ) ) {
83 return 0;
84 }
85
86 $rate = $rate[$method];
87
88 return $rate->cost;
89 }
90
91 /**
92 * Returns price including taxes
93 *
94 * @since 3.0.0
95 */
96 public static function get_rate_with_taxes( $method, $rate ) {
97
98 if ( empty( $rate[$method] ) ) {
99 return 0;
100 }
101
102 $rate = $rate[$method];
103 $price = $rate->cost;
104
105 if ( empty( $rate->taxes ) ) {
106 return $price;
107 }
108
109 foreach ( $rate->taxes as $tax ) {
110 $price += $tax;
111 }
112
113 return $price;
114 }
115
116 /**
117 * Update banklinks
118 *
119 * @since 3.0.0
120 */
121 public static function update_banklinks() {
122
123 $obj = new Payment\Gateway\WooCommerce( true );
124
125 $obj->mc_banklinks_reload( true );
126
127 }
128
129 /**
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 * Check payment and process order if completed, canceled
157 *
158 * @since 3.0.0
159 */
160 public static function check_payment( $settings = array() ) {
161
162 global $woocommerce;
163
164 $api = \MakeCommerce::get_api();
165
166 //set the correct language
167 if ( isset( $_GET["lang1"] ) ) {
168 \MakeCommerce\i18n::switch_language( $_GET["lang1"] );
169 }
170
171 $returnUrl = home_url();
172
173 $request = stripslashes_deep( $_POST );
174
175 if ( $api->verifyMac( $request ) ) {
176
177 $data = $api->extractRequestData( $request );
178 $transactionId = false;
179 $reference = false;
180
181 if ( !empty( $data['error'] ) ) {
182
183 //add status and send client back to checkout
184 return add_query_arg( 'mc_payment_status', 'failed', wc_get_checkout_url() );
185 }
186
187 if ( !empty( $data['message_type'] ) ) {
188
189 if ( $data['message_type'] === 'payment_return' ) {
190
191 $transactionId = $data['transaction'];
192 $reference = $data['reference'];
193 $paymentStatus = $data['status'];
194 $totalAmount = $data['amount'];
195 }
196
197 if ( $data['message_type'] === 'token_return' ) {
198 if ( !empty( $data['transaction']['reference'] ) ) {
199 $reference = $data['transaction']['reference'];
200 }
201
202 $paymentStatus = $data['transaction']['status'];
203 $transactionId = $data['transaction']['id'];
204 }
205 }
206 }
207
208 // if we didn't find reference to an Order, we send user to shop landing-page. TODO: could be improved
209 if ( empty( $transactionId ) ) {
210 return $returnUrl;
211 }
212
213 //get the post id using transactionid
214 $orderId = self::get_postid_using_metakey( '_makecommerce_transaction_id', $transactionId );
215
216 $order = wc_get_order( $orderId );
217
218 // if we didn't find the Order, we send user to shop landing-page. TODO: could be improved
219 if ( !$order || !$order->get_id() ) {
220 return $returnUrl;
221 }
222
223 $returnUrl = $order->get_meta( '_makecommerce_order_received_url', true );
224 if ( !$returnUrl ) {
225 $returnUrl = $order->get_checkout_order_received_url();
226 }
227
228 // Only check sums if $totalAmount is set
229 // Trx total and order total did not match
230 if ( isset( $totalAmount ) && $totalAmount != $order->get_total() ) {
231
232 if ( $paymentStatus == 'COMPLETED' ) {
233 $notes[] = sprintf('%s: %s.',
234 __( 'Order total and transaction amount did not match! Please contact us at', 'wc_makecommerce_domain' ),
235 __( 'support@maksekeskus.ee', 'wc_makecommerce_domain' )
236 );
237 $notes[] = sprintf('%s: %s.',
238 __( 'Transaction ID that was assigned to this order', 'wc_makecommerce_domain' ),
239 '<a target=_blank href="'.$api->getEnvUrls()->merchantUrl.'merchant/shop/deals/detail.html?id='. $transactionId .'">'.$transactionId.'</a>'
240 );
241 $notes[] = sprintf('%s: %s€',
242 __( 'Amount that was paid', 'wc_makecommerce_domain' ),
243 $totalAmount
244 );
245
246 $order->add_order_note( implode( "\r\n", $notes ) );
247
248 // Empty the cart so the customer is not tempted to pay again
249 $woocommerce->cart->empty_cart();
250
251 return $returnUrl;
252 }
253
254 // If the payment was not complete then send the customer back to checkout
255 return wc_get_checkout_url();
256 }
257
258 if ( $paymentStatus == 'EXPIRED' || $paymentStatus == 'CANCELLED' || $paymentStatus == 'COMPLETED' ) {
259
260 //get transaction to update the payment method.
261 $transaction = $api->getTransaction( $transactionId );
262
263 //make sure the payment method is the same for simplecheckout and normal version.
264 $paymentMethod = "";
265 if ( isset( $transaction->type ) && isset( $transaction->method ) ) {
266 $paymentMethod = $transaction->channel;
267 }
268
269 //update _makecommerce_preselected_method
270 $order->update_meta_data( '_makecommerce_preselected_method', $paymentMethod );
271 $order->save();
272 }
273
274 if ( $paymentStatus == 'CANCELLED' || ( $paymentStatus == 'EXPIRED' && $order->get_status() == "pending" ) ) {
275 //send client back to checkout
276 $returnUrl = wc_get_checkout_url();
277 }
278
279 //check if we already processed this status in the past.
280 if ( $order->get_meta( '_makecommerce_payment_processed_status', true ) == $paymentStatus ) {
281 return $returnUrl;
282 }
283
284 if ( $paymentStatus === 'COMPLETED' ) {
285 $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
286 $order->save();
287 }
288
289 switch( $paymentStatus ) {
290
291 case 'CANCELLED':
292 // Do not update status when disabled in settings
293 if ( ( $settings['disable_cancelled_payment_update'] ?? '' ) !== 'yes' ) {
294 // Update automatically
295 $order->update_status( 'cancelled' );
296 $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
297 }
298
299 $returnUrl = add_query_arg( 'mc_payment_status', 'cancelled', $returnUrl );
300
301 break;
302 case 'EXPIRED':
303 //only update if order status is pending payment
304 if ( $order->get_status() == "pending" ) {
305
306 // Do not update order status if disabled in settings
307 if ( ( $settings['disable_expired_payment_update'] ?? '' ) !== 'yes' ) {
308 // Update automatically
309 $order->update_status( 'cancelled' );
310 $order->update_meta_data( '_makecommerce_payment_processed_status', $paymentStatus );
311 }
312
313 $returnUrl = add_query_arg( 'mc_payment_status', 'expired', $returnUrl );
314 }
315
316 break;
317 case 'COMPLETED':
318 $orderNote = array();
319 $transactionIdText = __( 'Transaction ID', 'wc_makecommerce_domain' );
320 $paymentOptionText = __( 'Payment option', 'wc_makecommerce_domain' );
321 $transactionIdText = \MakeCommerce\i18n::get_string_from_mo( 'Transaction ID', 'wc_makecommerce_domain', \MakeCommerce\i18n::get_site_default_language() );
322 $paymentOptionText = \MakeCommerce\i18n::get_string_from_mo( 'Payment option', 'wc_makecommerce_domain', \MakeCommerce\i18n::get_site_default_language() );
323
324 $orderNote[] = $transactionIdText . ': <a target=_blank href="'.$api->getEnvUrls()->merchantUrl.'merchant/shop/deals/detail.html?id='. $transactionId .'">'.$transactionId.'</a>';
325 $orderNote[] = $paymentOptionText . ': ' . $order->get_meta( '_makecommerce_preselected_method', true );
326 $order->add_order_note( implode( "\r\n", $orderNote ) );
327
328 if ( !empty( $data['token'] ) && !empty( $data['token']['multiuse'] ) ) {
329 $order->update_meta_data( '_makecommerce_payment_token', $data['token']['id'] );
330 $order->update_meta_data( '_makecommerce_payment_token_valid_until', $data['token']['valid_until'] );
331 }
332
333 if ( isset( $_GET['lang1'] ) ) {
334 $order->update_meta_data( 'wpml_language', $_GET["lang1"] );
335 }
336
337 $order->payment_complete( $transactionId );
338 $woocommerce->cart->empty_cart();
339
340 break;
341 }
342
343 // Save all changes to order
344 $order->save();
345
346 return $returnUrl;
347 }
348
349 /**
350 * Returns post_id using transaction id or false if not found
351 *
352 * @since 3.0.4
353 */
354 public static function get_postid_using_metakey( $meta_key, $transactionId ) {
355 global $wpdb;
356
357 if ( class_exists( OrderUtil::class )
358 && OrderUtil::custom_orders_table_usage_is_enabled()
359 ) {
360 // HPOS
361 $results = $wpdb->get_results(
362 $wpdb->prepare("
363 SELECT {$wpdb->prefix}wc_orders.id
364 FROM {$wpdb->prefix}wc_orders
365 INNER JOIN {$wpdb->prefix}wc_orders_meta AS meta ON meta.order_id = {$wpdb->prefix}wc_orders.id AND meta.meta_key = %s
366 WHERE meta.meta_value = %s
367 ",
368 $meta_key,
369 $transactionId
370 )
371 );
372
373 if ( isset( $results[0]->id ) ) {
374 return $results[0]->id;
375 }
376 } else {
377 // Legacy DB
378 $wpdb->query("SELECT `post_id` FROM $wpdb->postmeta WHERE `meta_key` = '". $meta_key ."' AND `meta_value` = '" . $transactionId . "'");
379
380 if ( isset( $wpdb->last_result[0]->post_id ) ) {
381 return $wpdb->last_result[0]->post_id;
382 }
383 }
384
385 return false;
386 }
387 }
388