diff --git a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php index e33ab3b69..e0b9f8d43 100644 --- a/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/ApproveOrderEndpoint.php @@ -14,13 +14,15 @@ use Exception; use Psr\Log\LoggerInterface; use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint; use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus; -use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource; use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException; use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies; use WooCommerce\PayPalCommerce\ApiClient\Helper\OrderHelper; use WooCommerce\PayPalCommerce\Button\Exception\RuntimeException; +use WooCommerce\PayPalCommerce\Button\Helper\ContextTrait; use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure; +use WooCommerce\PayPalCommerce\Button\Helper\WooCommerceOrderCreator; use WooCommerce\PayPalCommerce\Session\SessionHandler; +use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway; use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; /** @@ -28,6 +30,8 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; */ class ApproveOrderEndpoint implements EndpointInterface { + use ContextTrait; + const ENDPOINT = 'ppc-approve-order'; /** @@ -79,6 +83,27 @@ class ApproveOrderEndpoint implements EndpointInterface { */ protected $order_helper; + /** + * Whether the final review is enabled. + * + * @var bool + */ + protected $final_review_enabled; + + /** + * The WC gateway. + * + * @var PayPalGateway + */ + protected $gateway; + + /** + * The WooCommerce order creator. + * + * @var WooCommerceOrderCreator + */ + protected $wc_order_creator; + /** * The logger. * @@ -89,14 +114,17 @@ class ApproveOrderEndpoint implements EndpointInterface { /** * ApproveOrderEndpoint constructor. * - * @param RequestData $request_data The request data helper. - * @param OrderEndpoint $order_endpoint The order endpoint. - * @param SessionHandler $session_handler The session handler. - * @param ThreeDSecure $three_d_secure The 3d secure helper object. - * @param Settings $settings The settings. - * @param DccApplies $dcc_applies The DCC applies object. - * @param OrderHelper $order_helper The order helper. - * @param LoggerInterface $logger The logger. + * @param RequestData $request_data The request data helper. + * @param OrderEndpoint $order_endpoint The order endpoint. + * @param SessionHandler $session_handler The session handler. + * @param ThreeDSecure $three_d_secure The 3d secure helper object. + * @param Settings $settings The settings. + * @param DccApplies $dcc_applies The DCC applies object. + * @param OrderHelper $order_helper The order helper. + * @param bool $final_review_enabled Whether the final review is enabled. + * @param PayPalGateway $gateway The WC gateway. + * @param WooCommerceOrderCreator $wc_order_creator The WooCommerce order creator. + * @param LoggerInterface $logger The logger. */ public function __construct( RequestData $request_data, @@ -106,17 +134,23 @@ class ApproveOrderEndpoint implements EndpointInterface { Settings $settings, DccApplies $dcc_applies, OrderHelper $order_helper, + bool $final_review_enabled, + PayPalGateway $gateway, + WooCommerceOrderCreator $wc_order_creator, LoggerInterface $logger ) { - $this->request_data = $request_data; - $this->api_endpoint = $order_endpoint; - $this->session_handler = $session_handler; - $this->threed_secure = $three_d_secure; - $this->settings = $settings; - $this->dcc_applies = $dcc_applies; - $this->order_helper = $order_helper; - $this->logger = $logger; + $this->request_data = $request_data; + $this->api_endpoint = $order_endpoint; + $this->session_handler = $session_handler; + $this->threed_secure = $three_d_secure; + $this->settings = $settings; + $this->dcc_applies = $dcc_applies; + $this->order_helper = $order_helper; + $this->final_review_enabled = $final_review_enabled; + $this->gateway = $gateway; + $this->wc_order_creator = $wc_order_creator; + $this->logger = $logger; } /** @@ -182,6 +216,7 @@ class ApproveOrderEndpoint implements EndpointInterface { ); } $this->session_handler->replace_order( $order ); + wp_send_json_success(); } @@ -200,6 +235,14 @@ class ApproveOrderEndpoint implements EndpointInterface { $this->session_handler->replace_funding_source( $funding_source ); $this->session_handler->replace_order( $order ); + + if ( ! $this->final_review_enabled && ! $this->is_checkout() ) { + $wc_order = $this->wc_order_creator->create_from_paypal_order( $order, WC()->cart->get_cart() ); + $this->gateway->process_payment( $wc_order->get_id() ); + $order_received_url = $wc_order->get_checkout_order_received_url(); + + wp_send_json_success( array( 'order_received_url' => $order_received_url ) ); + } wp_send_json_success(); return true; } catch ( Exception $error ) {