Set order status to pending when no payment is needed (https://github.com/woocommerce/woocommerce-blocks/pull/4186)
This commit is contained in:
parent
286d52befb
commit
d1f55724e6
|
@ -264,7 +264,13 @@ class Checkout extends AbstractCartRoute {
|
||||||
/**
|
/**
|
||||||
* Process the payment and return the results.
|
* Process the payment and return the results.
|
||||||
*/
|
*/
|
||||||
$payment_result = $this->order->needs_payment() ? $this->process_payment( $request ) : $this->process_without_payment( $request );
|
$payment_result = new PaymentResult();
|
||||||
|
|
||||||
|
if ( $this->order->needs_payment() ) {
|
||||||
|
$this->process_payment( $request, $payment_result );
|
||||||
|
} else {
|
||||||
|
$this->process_without_payment( $request, $payment_result );
|
||||||
|
}
|
||||||
|
|
||||||
return $this->prepare_item_for_response(
|
return $this->prepare_item_for_response(
|
||||||
(object) [
|
(object) [
|
||||||
|
@ -478,33 +484,35 @@ class Checkout extends AbstractCartRoute {
|
||||||
* For orders which do not require payment, just update status.
|
* For orders which do not require payment, just update status.
|
||||||
*
|
*
|
||||||
* @param WP_REST_Request $request Request object.
|
* @param WP_REST_Request $request Request object.
|
||||||
* @return PaymentResult
|
* @param PaymentResult $payment_result Payment result object.
|
||||||
*/
|
*/
|
||||||
private function process_without_payment( WP_REST_Request $request ) {
|
private function process_without_payment( WP_REST_Request $request, PaymentResult $payment_result ) {
|
||||||
|
// Transition the order to pending, and then completed. This ensures transactional emails fire for pending_to_complete events.
|
||||||
|
$this->order->update_status( 'pending' );
|
||||||
$this->order->payment_complete();
|
$this->order->payment_complete();
|
||||||
|
|
||||||
$result = new PaymentResult( 'success' );
|
// Mark the payment as successful.
|
||||||
$result->set_redirect_url( $this->order->get_checkout_order_received_url() );
|
$payment_result->set_status( 'success' );
|
||||||
|
$payment_result->set_redirect_url( $this->order->get_checkout_order_received_url() );
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fires an action hook instructing active payment gateways to process the payment for an order and provide a result.
|
* Fires an action hook instructing active payment gateways to process the payment for an order and provide a result.
|
||||||
*
|
*
|
||||||
* @throws RouteException On error.
|
* @throws RouteException On error.
|
||||||
|
*
|
||||||
* @param WP_REST_Request $request Request object.
|
* @param WP_REST_Request $request Request object.
|
||||||
* @return PaymentResult
|
* @param PaymentResult $payment_result Payment result object.
|
||||||
*/
|
*/
|
||||||
private function process_payment( WP_REST_Request $request ) {
|
private function process_payment( WP_REST_Request $request, PaymentResult $payment_result ) {
|
||||||
try {
|
try {
|
||||||
$result = new PaymentResult();
|
// Transition the order to pending before making payment.
|
||||||
|
$this->order->update_status( 'pending' );
|
||||||
|
|
||||||
|
// Prepare the payment context object to pass through payment hooks.
|
||||||
$context = new PaymentContext();
|
$context = new PaymentContext();
|
||||||
$context->set_payment_method( $this->get_request_payment_method_id( $request ) );
|
$context->set_payment_method( $this->get_request_payment_method_id( $request ) );
|
||||||
$context->set_payment_data( $this->get_request_payment_data( $request ) );
|
$context->set_payment_data( $this->get_request_payment_data( $request ) );
|
||||||
|
|
||||||
// Orders are made pending before attempting payment.
|
|
||||||
$this->order->update_status( 'pending' );
|
|
||||||
$context->set_order( $this->order );
|
$context->set_order( $this->order );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -512,19 +520,16 @@ class Checkout extends AbstractCartRoute {
|
||||||
*
|
*
|
||||||
* @hook woocommerce_rest_checkout_process_payment_with_context
|
* @hook woocommerce_rest_checkout_process_payment_with_context
|
||||||
*
|
*
|
||||||
* @throws Exception If there is an error taking payment, an Exception object can be thrown
|
* @throws Exception If there is an error taking payment, an Exception object can be thrown with an error message.
|
||||||
* with an error message.
|
|
||||||
*
|
*
|
||||||
* @param PaymentContext $context Holds context for the payment, including order ID and payment method.
|
* @param PaymentContext $context Holds context for the payment, including order ID and payment method.
|
||||||
* @param PaymentResult $result Result object for the transaction.
|
* @param PaymentResult $payment_result Result object for the transaction.
|
||||||
*/
|
*/
|
||||||
do_action_ref_array( 'woocommerce_rest_checkout_process_payment_with_context', [ $context, &$result ] );
|
do_action_ref_array( 'woocommerce_rest_checkout_process_payment_with_context', [ $context, &$payment_result ] );
|
||||||
|
|
||||||
if ( ! $result instanceof PaymentResult ) {
|
if ( ! $payment_result instanceof PaymentResult ) {
|
||||||
throw new RouteException( 'woocommerce_rest_checkout_invalid_payment_result', __( 'Invalid payment result received from payment method.', 'woo-gutenberg-products-block' ), 500 );
|
throw new RouteException( 'woocommerce_rest_checkout_invalid_payment_result', __( 'Invalid payment result received from payment method.', 'woo-gutenberg-products-block' ), 500 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
|
||||||
} catch ( Exception $e ) {
|
} catch ( Exception $e ) {
|
||||||
throw new RouteException( 'woocommerce_rest_checkout_process_payment_error', $e->getMessage(), 400 );
|
throw new RouteException( 'woocommerce_rest_checkout_process_payment_error', $e->getMessage(), 400 );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue