/** * The API for operations with orders. * * @package WooCommerce\PayPalCommerce\Api * * @phpcs:disable Squiz.Commenting.FunctionCommentThrowTag */ declare (strict_types=1); namespace WooCommerce\PayPalCommerce\Api; use Exception; use InvalidArgumentException; use RuntimeException; use WC_Order; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\Order; use WooCommerce\PayPalCommerce\PPCP; use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway; use WooCommerce\PayPalCommerce\WcGateway\Helper\RefundFeesUpdater; use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor; use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor; use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor; /** * Returns the PayPal order. * * @param string|WC_Order $paypal_id_or_wc_order The ID of PayPal order or a WC order (with the ID in meta). * @throws InvalidArgumentException When the argument cannot be used for retrieving the order. * @throws Exception When the operation fails. */ function ppcp_get_paypal_order($paypal_id_or_wc_order): Order { if ($paypal_id_or_wc_order instanceof WC_Order) { $paypal_id_or_wc_order = $paypal_id_or_wc_order->get_meta(PayPalGateway::ORDER_ID_META_KEY); if (!$paypal_id_or_wc_order) { throw new InvalidArgumentException('PayPal order ID not found in meta.'); } } if (!is_string($paypal_id_or_wc_order)) { throw new InvalidArgumentException('Invalid PayPal order ID, string expected.'); } $order_endpoint = PPCP::container()->get('api.endpoint.order'); assert($order_endpoint instanceof OrderEndpoint); return $order_endpoint->order($paypal_id_or_wc_order); } /** * Creates a PayPal order for the given WC order. * * @param WC_Order $wc_order The WC order. * @throws Exception When the operation fails. */ function ppcp_create_paypal_order_for_wc_order(WC_Order $wc_order): Order { $order_processor = PPCP::container()->get('wcgateway.order-processor'); assert($order_processor instanceof OrderProcessor); return $order_processor->create_order($wc_order); } /** * Captures the PayPal order. * * @param WC_Order $wc_order The WC order. * @throws InvalidArgumentException When the order cannot be captured. * @throws Exception When the operation fails. */ function ppcp_capture_order(WC_Order $wc_order): void { $intent = strtoupper((string) $wc_order->get_meta(PayPalGateway::INTENT_META_KEY)); if ($intent !== 'AUTHORIZE') { throw new InvalidArgumentException('Only orders with "authorize" intent can be captured.'); } $captured = wc_string_to_bool($wc_order->get_meta(AuthorizedPaymentsProcessor::CAPTURED_META_KEY)); if ($captured) { throw new InvalidArgumentException('The order is already captured.'); } $authorized_payment_processor = PPCP::container()->get('wcgateway.processor.authorized-payments'); assert($authorized_payment_processor instanceof AuthorizedPaymentsProcessor); if (!$authorized_payment_processor->capture_authorized_payment($wc_order)) { throw new RuntimeException('Capture failed.'); } } /** * Reauthorizes the PayPal order. * * @param WC_Order $wc_order The WC order. * @throws InvalidArgumentException When the order cannot be captured. * @throws Exception When the operation fails. */ function ppcp_reauthorize_order(WC_Order $wc_order): void { $intent = strtoupper((string) $wc_order->get_meta(PayPalGateway::INTENT_META_KEY)); if ($intent !== 'AUTHORIZE') { throw new InvalidArgumentException('Only orders with "authorize" intent can be reauthorized.'); } $captured = wc_string_to_bool($wc_order->get_meta(AuthorizedPaymentsProcessor::CAPTURED_META_KEY)); if ($captured) { throw new InvalidArgumentException('The order is already captured.'); } $authorized_payment_processor = PPCP::container()->get('wcgateway.processor.authorized-payments'); assert($authorized_payment_processor instanceof AuthorizedPaymentsProcessor); if ($authorized_payment_processor->reauthorize_payment($wc_order) !== AuthorizedPaymentsProcessor::SUCCESSFUL) { throw new RuntimeException($authorized_payment_processor->reauthorization_failure_reason() ?: 'Reauthorization failed.'); } } /** * Refunds the PayPal order. * Note that you can use wc_refund_payment() to trigger the refund in WC and PayPal. * * @param WC_Order $wc_order The WC order. * @param float $amount The refund amount. * @param string $reason The reason for the refund. * @return string The PayPal refund ID. * @throws InvalidArgumentException When the order cannot be refunded. * @throws Exception When the operation fails. */ function ppcp_refund_order(WC_Order $wc_order, float $amount, string $reason = ''): string { $order = ppcp_get_paypal_order($wc_order); $refund_processor = PPCP::container()->get('wcgateway.processor.refunds'); assert($refund_processor instanceof RefundProcessor); return $refund_processor->refund($order, $wc_order, $amount, $reason); } /** * Voids the authorization. * * @param WC_Order $wc_order The WC order. * @throws InvalidArgumentException When the order cannot be voided. * @throws Exception When the operation fails. */ function ppcp_void_order(WC_Order $wc_order): void { $order = ppcp_get_paypal_order($wc_order); $refund_processor = PPCP::container()->get('wcgateway.processor.refunds'); assert($refund_processor instanceof RefundProcessor); $refund_processor->void($order); } /** * Updates the PayPal refund fees totals on an order. * * @param WC_Order $wc_order The WC order. */ function ppcp_update_order_refund_fees(WC_Order $wc_order): void { $updater = PPCP::container()->get('wcgateway.helper.refund-fees-updater'); assert($updater instanceof RefundFeesUpdater); $updater->update($wc_order); } {"id":7245,"date":"2025-08-02T12:33:50","date_gmt":"2025-08-02T12:33:50","guid":{"rendered":"https:\/\/hostamy.com\/?p=7245"},"modified":"2025-08-02T12:33:50","modified_gmt":"2025-08-02T12:33:50","slug":"7245-2","status":"publish","type":"post","link":"https:\/\/hostamy.com\/en_gb\/7245-2\/","title":{"rendered":""},"content":{"rendered":"
No download slots are an excellent way to get familiar about the latest slot games. It is possible to alter your bets as well as spin the reels and even play with the auto spin feature that automatically plays a variety of spins using the same bet amount. Real cash prizes are not available in a game that is free. If you like playing with slot machines, it is a good idea to locate a casino that allows real money-based games.\n<\/p>\n
Free slots without download are available luckyjet-brasil top<\/a> at a variety of online casinos, on no-cost slot platforms, and on the official websites of game providers. They also come with an Instant Play option. These games let players to practice and improve their abilities without putting their money at risk. They also allow beginners to try different brands and slot providers. They can also compare their RTPs to determine which provides the best experience. It is important to keep in mind that online slots for free don’t necessarily require you to play real money.\n<\/p>\n There are no-cost slots at many online casinos and free casino platforms. These games can also be found on official websites of the game provider. Follow the directions on the website to play free slots. It is essential to read the game’s rules and set your own value for coins. You can practice with the free version to get familiar with how to properly operate the games. Make sure https:\/\/www.premierbetaviator.top\/<\/a> you are aware of which games are right for you.\n<\/p>\n Many casinos online and free slot platforms provide free slots with no downloading. They can also be played in a instant play mode. This means that you don’t have to download these games. All you need to do is choose an online slot and wait for it to load. You’ll notice an increase in loading speed however. It will be easier to navigate around if your computer is faster. This type of gaming is great for those who are new to gaming as it is free and does not require installation.\n<\/p>\n You can play free slots without needing to sign up. Certain free slot games are similar to real-money games. Before you play for real money, it’s essential to be aware of all terms and conditions. Before you make any payment be sure to confirm the RTP. You can also play on multiple browsers simultaneously. Once you’ve decided which game is best for you then you can download it.\n<\/p>\n You can play slots for free without downloading. This is a great way to familiarize yourself with the different kinds of slots. In addition to being free you can play with real money and learn how to play the games. You can try out different slots to see which one you like best. You can also opt to play for real money and win real cash prizes. This allows you to decide which games are worth playing. There are slots for free with no download at multiple casinos online and free slot platforms.\n<\/p>\n Free slots that do not require downloading have numerous advantages. First, you can play free online slot games. These games are very like real-life slots. You don’t have to travel to anywhere. The only downside is that you might not be able to win a lot of winnings. The good news is that you don’t need to register or download software to play. You can still earn money and have fun. The benefit of free slots without download is that you can try out different types of games before you commit to one.\n<\/p>\n To learn the rules of slots games, you can download free slots without downloading. They aren’t real money games, but they let players to play with new games to win cash. Before you choose the game you want to play, learn more about the different kinds of machines. This is best accomplished by choosing a casino that provides free slot games. Once you’ve found the right casino, you will be able to start winning cash.<\/p>","protected":false},"excerpt":{"rendered":" No download required for free slots No download slots are an excellent way to get familiar about the latest slot games. It is possible to alter your bets as well as spin the reels and even play with the auto spin feature that automatically plays a variety of spins using the same bet amount. Real […]<\/p>","protected":false},"author":23,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pmpro_default_level":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-7245","post","type-post","status-publish","format-standard","hentry","category-uncategorized","pmpro-has-access"],"yoast_head":"\n