Procesar checkout usando la API REST de WC

26 nov 2017, 18:18:41
Vistas: 14.5K
Votos: 3

Con un sitio principal usando WordPress/WooCommerce, y un sitio remoto sirviendo el frontend; ¿es posible procesar el formulario de checkout usando la API REST de WooCommerce, y recibir una URL de redirección a la Pasarela de Pago seleccionada?

Intenté crear una función AJAX personalizada, pero parece que requiere un campo nonce en el formulario enviado, y eso es problemático porque el frontend no está en el mismo servidor.

0
Todas las respuestas a la pregunta 1
4

Para procesar el pago de un pedido en WooCommerce, el flujo de trabajo es el siguiente:

  1. Crear un pedido en WooCommerce
  2. Procesar el pago para este pedido, utilizando uno de los WC_Payment_Gateways
  3. Cambiar el estado del pedido (por defecto es pendiente->procesando, o a completado si es un pedido vacío)

En mi opinión, el paso dos puede implementarse de la siguiente manera:

  1. Usar una librería front-end para tokenizar la información de pago, utilizando frameworks como Stripe o PayPal.
  2. Pasar el token de pago a tu backend de WordPress usando WP REST API
  3. Dejar que WordPress y WooCommerce procesen el pago como de costumbre.

Puedes crear un endpoint personalizado de REST API para procesar pagos en tu sitio WooCommerce, añade el siguiente código a tu código.

add_action( 'rest_api_init', 'wc_rest_payment_endpoints' );
function wc_rest_payment_endpoints() {
    /**
     * Manejar solicitud de método de pago.
     */
    register_rest_route( 'wc/v2', 'payment', array(
        'methods'  => 'POST',
        'callback' => 'wc_rest_payment_endpoint_handler',
    ) );
}
function wc_rest_payment_endpoint_handler( $request = null ) {
    $response       = array();
    $parameters     = $request->get_json_params();
    $payment_method = sanitize_text_field( $parameters['payment_method'] );
    $order_id       = sanitize_text_field( $parameters['order_id'] );
    $payment_token  = sanitize_text_field( $parameters['payment_token'] );
    $error          = new WP_Error();

    if ( $payment_method === "stripe" ) {
        $wc_gateway_stripe                = new WC_Gateway_Stripe();
        $_POST['stripe_token']            = $payment_token;
        $payment_result               = $wc_gateway_stripe->process_payment( $order_id );
        if ( $payment_result['result'] === "success" ) {
            $response['code']    = 200;
            $response['message'] = __( "Tu pago se realizó con éxito", "wc-rest-payment" );
        } else {
            return new WP_REST_Response( array("c"), 123 );
            $response['code']    = 401;
            $response['message'] = __( "Por favor ingresa detalles de tarjeta válidos", "wc-rest-payment" );
        }
    }  else {
        $response['code'] = 405;
        $response['message'] = __( "Por favor selecciona un método de pago disponible. Los métodos de pago soportados se pueden encontrar en https://wordpress.org/plugins/wc-rest-payment/#description", "wc-rest-payment" );
    }

    return new WP_REST_Response( $response, 123 );
}

Si buscas una forma sencilla de hacer esto, puedes revisar nuestro plugin WC REST Payment.

Soporta pasarelas de pago de WooCommerce incluyendo Stripe, PayPal Express, PayPal Standard, Transferencia Bancaria Directa, Cheque, Pago Contra Entrega.

24 ene 2018 23:09:54
Comentarios

gracias por la guía detallada, pero opté por llamar a process_checkout usando ajax hace algún tiempo. Este sitio utiliza una pasarela de pago menos conocida, así que es todo o nada cuando la llamo desde el front-end (sin tokenización). Pero como no lo mencioné en la pregunta, marco esto como respuesta.

steakoverflow steakoverflow
26 ene 2018 09:17:44

¿cómo sabes cuáles son los códigos de rechazo de Stripe? No veo cómo los manejarías aquí...

Spencer Bigum Spencer Bigum
8 mar 2019 01:33:29

No puedes, si estás usando WooCommerce Stripe Gateway. He revisado su código fuente, no devuelven el error. Sin embargo, si activas el registro de depuración, puedes ver el error en WooCommerce -> Estado -> Registros

Jack Song Jack Song
8 mar 2019 02:00:55

@JackSong esto funciona bien para Stripe, muchas gracias. ¿Qué arquitectura sugerirías implementar para PayPal? He encontrado bibliotecas de React para los botones de PayPal que parecen funcionar bien, ¿harías una llamada separada a WordPress para colocar el pedido con status: confirmed al tener éxito? Me parece un poco inseguro por eso pregunto

Timothy Dalton Timothy Dalton
6 may 2020 15:56:04