/** * Process a payment */ public function process_payment($order_id) { $order = wc_get_order($order_id); if (!is_user_logged_in()) { wc_add_notice(__('Payment error:', 'custom-points-product') . ' ' . __('You must be logged in to use this payment method', 'custom-points-product'), 'error'); return; } $user_id = $order->get_user_id(); $available_points = WC_Points_Rewards_Manager::get_users_points($user_id); $total_points = Custom_Points_Order::get_order_points_cost_total($order); if ($available_points < $total_points) { wc_add_notice(__('Payment error:', 'custom-points-product') . ' ' . __('Insufficient points in your account.', 'custom-points-product'), 'error'); return; } // deduct points from account WC_Points_Rewards_Manager::decrease_points($user_id, $total_points, 'custom-points-gateway'); $order->set_total(0); // Payment complete $order->payment_complete(); // Remove cart WC()->cart->empty_cart(); // Return thankyou redirect return array('result' => 'success', 'redirect' => $this->get_return_url($order)); }
/** * Handle an order that is cancelled or refunded by: * * 1) Removing any points earned for the order * * 2) Crediting points redeemed for a discount back to the customer's account if the order that they redeemed the points * for a discount on is cancelled or refunded * * @since 1.0 * @param int $order_id the WC_Order ID */ public function handle_cancelled_refunded_order($order_id) { global $wc_points_rewards; $order = new WC_Order($order_id); // bail for guest user if (!$order->user_id) { return; } // handle removing any points earned for the order $points_earned = get_post_meta($order->id, '_wc_points_earned', true); if ($points_earned > 0) { // remove points WC_Points_Rewards_Manager::decrease_points($order->user_id, $points_earned, 'order-cancelled', null, $order->id); // remove points from order delete_post_meta($order->id, '_wc_points_earned'); // add order note $order->add_order_note(sprintf(__('%d %s removed.', 'wc_points_rewards'), $points_earned, $wc_points_rewards->get_points_label($points_earned))); } // handle crediting points redeemed for a discount $points_redeemed = get_post_meta($order->id, '_wc_points_redeemed', true); if ($points_redeemed > 0) { // credit points WC_Points_Rewards_Manager::increase_points($order->user_id, $points_redeemed, 'order-cancelled', null, $order->id); // remove points from order delete_post_meta($order->id, '_wc_points_redeemed'); // add order note $order->add_order_note(sprintf(__('%d %s credited back to customer.', 'wc_points_rewards'), $points_redeemed, $wc_points_rewards->get_points_label($points_redeemed))); } }