@@ -200,96 +200,72 @@ private function verify_and_complete_order( $order_id, $payment ) {
200200 return ;
201201 }
202202
203- // Acquire lock to prevent race condition with IPN webhook.
204- // IMPORTANT: Must use same lock key pattern as IPN to prevent race conditions.
205- $ lock_key = WC_Monei_Lock_Helper::get_payment_lock_key ( $ payment ->getId () );
206- $ lock_value = wp_rand ();
203+ /** @var string $payment_status */
204+ $ payment_status = $ payment ->getStatus ();
205+ $ order_status = $ order ->get_status ();
207206
208- if ( ! WC_Monei_Lock_Helper::acquire_lock ( $ lock_key , $ lock_value , 60 ) ) {
209- WC_Monei_Logger::log ( sprintf ( '[MONEI] Order completion already in progress [order_id=%s, payment_id=%s] ' , $ order_id , $ payment ->getId () ), 'debug ' );
207+ WC_Monei_Logger::log ( sprintf ( '[MONEI] Redirect verification [payment_id=%s, order_id=%s, payment_status=%s, order_status=%s] ' , $ payment ->getId (), $ order_id , $ payment_status , $ order_status ), 'debug ' );
208+
209+ // Only process if order is still pending/on-hold/failed and payment succeeded
210+ if ( ! in_array ( $ order_status , array ( 'pending ' , 'on-hold ' , 'failed ' ), true ) ) {
211+ WC_Monei_Logger::log ( sprintf ( '[MONEI] Order already processed, skipping [order_id=%s, status=%s] ' , $ order_id , $ order_status ), 'debug ' );
210212 return ;
211213 }
212214
213- try {
214- // Check if payment was already processed (prevent duplicate processing)
215- $ processed_payment_id = $ order ->get_meta ( '_monei_payment_id_processed ' , true );
216- if ( $ processed_payment_id === $ payment ->getId () ) {
217- WC_Monei_Logger::log ( sprintf ( '[MONEI] Payment already processed via IPN [payment_id=%s, order_id=%s] ' , $ payment ->getId (), $ order_id ), 'debug ' );
215+ // If payment is SUCCEEDED or AUTHORIZED, complete the order
216+ if ( PaymentStatus::SUCCEEDED === $ payment_status || PaymentStatus::AUTHORIZED === $ payment_status ) {
217+ $ amount = $ payment ->getAmount ();
218+ $ order_total = $ order ->get_total ();
219+
220+ // Verify amounts match (with 1 cent exception for subscriptions)
221+ if ( ( (int ) $ amount !== monei_price_format ( $ order_total ) ) && ( 1 !== $ amount ) ) {
222+ $ order ->update_status (
223+ 'on-hold ' ,
224+ sprintf (
225+ /* translators: 1: Order amount, 2: Payment amount */
226+ __ ( 'Validation error: Order vs. Payment amounts do not match (order: %1$s - received: %2$s). ' , 'monei ' ),
227+ monei_price_format ( $ order_total ),
228+ $ amount
229+ )
230+ );
231+ WC_Monei_Logger::log ( sprintf ( '[MONEI] Amount mismatch [order_id=%s, order_amount=%s, payment_amount=%s] ' , $ order_id , monei_price_format ( $ order_total ), $ amount ), 'error ' );
218232 return ;
219233 }
220234
221- /** @var string $payment_status */
222- $ payment_status = $ payment ->getStatus ();
223- $ order_status = $ order ->get_status ();
224-
225- WC_Monei_Logger::log ( sprintf ( '[MONEI] Redirect verification [payment_id=%s, order_id=%s, payment_status=%s, order_status=%s] ' , $ payment ->getId (), $ order_id , $ payment_status , $ order_status ), 'debug ' );
235+ $ order ->update_meta_data ( '_payment_order_number_monei ' , $ payment ->getId () );
236+ $ order ->update_meta_data ( '_payment_order_status_monei ' , $ payment_status );
237+ $ order ->update_meta_data ( '_payment_order_status_code_monei ' , $ payment ->getStatusCode () );
238+ $ order ->update_meta_data ( '_payment_order_status_message_monei ' , $ payment ->getStatusMessage () );
226239
227- // Only process if order is still pending/on-hold/failed and payment succeeded
228- if ( ! in_array ( $ order_status , array ( ' pending ' , ' on-hold ' , ' failed ' ), true ) ) {
229- WC_Monei_Logger:: log ( sprintf ( ' [MONEI] Order already processed, skipping [order_id=%s, status=%s] ' , $ order_id , $ order_status ), ' debug ' );
230- return ;
240+ // Store formatted payment method display
241+ $ payment_method_display = $ this -> paymentMethodFormatter -> get_payment_method_display_from_payment ( $ payment );
242+ if ( $ payment_method_display ) {
243+ $ order -> update_meta_data ( ' _monei_payment_method_display ' , $ payment_method_display ) ;
231244 }
232245
233- // If payment is SUCCEEDED or AUTHORIZED, complete the order
234- if ( PaymentStatus::SUCCEEDED === $ payment_status || PaymentStatus::AUTHORIZED === $ payment_status ) {
235- $ amount = $ payment ->getAmount ();
236- $ order_total = $ order ->get_total ();
237-
238- // Verify amounts match (with 1 cent exception for subscriptions)
239- if ( ( (int ) $ amount !== monei_price_format ( $ order_total ) ) && ( 1 !== $ amount ) ) {
240- $ order ->update_status (
241- 'on-hold ' ,
242- sprintf (
243- /* translators: 1: Order amount, 2: Payment amount */
244- __ ( 'Validation error: Order vs. Payment amounts do not match (order: %1$s - received: %2$s). ' , 'monei ' ),
245- monei_price_format ( $ order_total ),
246- $ amount
247- )
248- );
249- WC_Monei_Logger::log ( sprintf ( '[MONEI] Amount mismatch [order_id=%s, order_amount=%s, payment_amount=%s] ' , $ order_id , monei_price_format ( $ order_total ), $ amount ), 'error ' );
250- return ;
251- }
252-
253- // Mark payment as processed to prevent duplicate processing by IPN
254- $ order ->update_meta_data ( '_monei_payment_id_processed ' , $ payment ->getId () );
255- $ order ->update_meta_data ( '_payment_order_number_monei ' , $ payment ->getId () );
256- $ order ->update_meta_data ( '_payment_order_status_monei ' , $ payment_status );
257- $ order ->update_meta_data ( '_payment_order_status_code_monei ' , $ payment ->getStatusCode () );
258- $ order ->update_meta_data ( '_payment_order_status_message_monei ' , $ payment ->getStatusMessage () );
259-
260- // Store formatted payment method display
261- $ payment_method_display = $ this ->paymentMethodFormatter ->get_payment_method_display_from_payment ( $ payment );
262- if ( $ payment_method_display ) {
263- $ order ->update_meta_data ( '_monei_payment_method_display ' , $ payment_method_display );
264- }
246+ if ( PaymentStatus::AUTHORIZED === $ payment_status ) {
247+ $ order ->update_meta_data ( '_payment_not_captured_monei ' , 1 );
248+ $ order_note = __ ( 'Payment verified via redirect - <strong>Payment Authorized</strong> ' , 'monei ' ) . '. <br><br> ' ;
249+ $ order_note .= __ ( 'MONEI Transaction id: ' , 'monei ' ) . $ payment ->getId () . '. <br><br> ' ;
250+ $ order_note .= __ ( 'MONEI Status Message: ' , 'monei ' ) . $ payment ->getStatusMessage ();
251+ $ order ->add_order_note ( $ order_note );
252+ $ order ->update_status ( 'on-hold ' , __ ( 'Order On-Hold by MONEI ' , 'monei ' ) );
253+ } else {
254+ // SUCCEEDED
255+ $ order_note = __ ( 'Payment verified via redirect - <strong>Payment Completed</strong> ' , 'monei ' ) . '. <br><br> ' ;
256+ $ order_note .= __ ( 'MONEI Transaction id: ' , 'monei ' ) . $ payment ->getId () . '. <br><br> ' ;
257+ $ order_note .= __ ( 'MONEI Status Message: ' , 'monei ' ) . $ payment ->getStatusMessage ();
258+ $ order ->add_order_note ( $ order_note );
259+ $ order ->payment_complete ();
265260
266- if ( PaymentStatus::AUTHORIZED === $ payment_status ) {
267- $ order ->update_meta_data ( '_payment_not_captured_monei ' , 1 );
268- $ order_note = __ ( 'Payment verified via redirect - <strong>Payment Authorized</strong> ' , 'monei ' ) . '. <br><br> ' ;
269- $ order_note .= __ ( 'MONEI Transaction id: ' , 'monei ' ) . $ payment ->getId () . '. <br><br> ' ;
270- $ order_note .= __ ( 'MONEI Status Message: ' , 'monei ' ) . $ payment ->getStatusMessage ();
271- $ order ->add_order_note ( $ order_note );
272- $ order ->update_status ( 'on-hold ' , __ ( 'Order On-Hold by MONEI ' , 'monei ' ) );
273- } else {
274- // SUCCEEDED
275- $ order_note = __ ( 'Payment verified via redirect - <strong>Payment Completed</strong> ' , 'monei ' ) . '. <br><br> ' ;
276- $ order_note .= __ ( 'MONEI Transaction id: ' , 'monei ' ) . $ payment ->getId () . '. <br><br> ' ;
277- $ order_note .= __ ( 'MONEI Status Message: ' , 'monei ' ) . $ payment ->getStatusMessage ();
278- $ order ->add_order_note ( $ order_note );
279- $ order ->payment_complete ();
280-
281- $ payment_method_woo_id = $ order ->get_payment_method ();
282- if ( 'completed ' === monei_get_settings ( 'orderdo ' , $ payment_method_woo_id ) ) {
283- $ order ->update_status ( 'completed ' , __ ( 'Order Completed by MONEI ' , 'monei ' ) );
284- }
261+ $ payment_method_woo_id = $ order ->get_payment_method ();
262+ if ( 'completed ' === monei_get_settings ( 'orderdo ' , $ payment_method_woo_id ) ) {
263+ $ order ->update_status ( 'completed ' , __ ( 'Order Completed by MONEI ' , 'monei ' ) );
285264 }
286-
287- $ order ->save ();
288- WC_Monei_Logger::log ( sprintf ( '[MONEI] Order completed via redirect verification [order_id=%s, payment_status=%s] ' , $ order_id , $ payment_status ), 'debug ' );
289265 }
290- } finally {
291- // Always release the lock.
292- WC_Monei_Lock_Helper:: release_lock ( $ lock_key , $ lock_value );
266+
267+ $ order -> save ();
268+ WC_Monei_Logger:: log ( sprintf ( ' [MONEI] Order completed via redirect verification [order_id=%s, payment_status=%s] ' , $ order_id , $ payment_status ), ' debug ' );
293269 }
294270 }
295271}
0 commit comments