Paga sin necesidad de iniciar sesión en WooCommerce

4 minutos de lectura

Avatar de usuario de Mos
Mos

Para una tienda web de WooCommerce, enviamos muchos enlaces de pago por correo electrónico. Antes de llegar a la página de pago, los clientes están obligados a iniciar sesión primero. Nos gustaría que el cliente pueda completar el pago sin iniciar sesión, ya que a menudo no conocen su contraseña debido a los diferentes departamentos de la empresa.

Encontré este código, pero solo permite que el administrador pague sin iniciar sesión:

function your_custom_function_name($allcaps, $caps, $args)
{
    if (isset($caps[0])) {
        switch ($caps[0]) {
        case 'pay_for_order':
            $user_id = $args[1];
            $order_id = isset($args[2]) ? $args[2] : null;

            // When no order ID, we assume it's a new order
            // and thus, customer can pay for it

            if (!$order_id) {
                $allcaps['pay_for_order'] = true;
                break;
            }

            $user = get_userdata($user_id);
            if (in_array('administrator', (array)$user->roles)) {
                $allcaps['pay_for_order'] = true;
            }

            $order = wc_get_order($order_id);
            if ($order && ($user_id == $order->get_user_id() || !$order - > get_user_id())) {
                $allcaps['pay_for_order'] = true;
            }

            break;
        }
    }

    return $allcaps;
}

add_filter('user_has_cap', 'your_custom_function_name', 10, 3);

  • Gracias, pero ya está habilitado el pago de invitados. El problema es que no se trata de un pago como invitado, sino que los pedidos se asignan a los clientes, por lo que necesito encontrar una solución para que no obtengan el formulario de inicio de sesión, sino que realicen el pago de inmediato.

    – Mos

    21 de marzo de 2018 a las 10:43

  • si ese código funciona correctamente como desea para el administrador, simplemente necesita cambiar esta línea if (in_array(‘administrador’, (arreglo) $usuario->roles)) a su rol de cliente en su lugar

    – Kashalo

    21 de marzo de 2018 a las 10:49

  • Muchas gracias. ¿No necesitaría cambiar de administrador en algún tipo de rol de invitado?

    – Mos

    21 de marzo de 2018 a las 11:06

Aquí está la función de trabajo con todos los usuarios, solo pruébelo:

function your_custom_function_name( $allcaps, $caps, $args ) {
if ( isset( $caps[0] ) ) {
switch ( $caps[0] ) {
case 'pay_for_order' :


$order_id = isset( $args[2] ) ? $args[2] : null;
$order = wc_get_order( $order_id );
$user = $order->get_user();
$user_id = $user->ID;

// When no order ID, we assume it's a new order
// and thus, customer can pay for it
if ( ! $order_id ) {
  $allcaps['pay_for_order'] = true;
  break;
}

$order = wc_get_order( $order_id );

if ( $order && ( $user_id == $order->get_user_id() || ! $order->get_user_id() ) ) {
  $allcaps['pay_for_order'] = true;
}
break;
}
}

return $allcaps;
}

add_filter( 'user_has_cap', 'your_custom_function_name', 10, 3 );

  • ¡Muchas gracias! ¡Realmente lo aprecio!

    – Mos

    21 de marzo de 2018 a las 13:52

Creé una solución diferente para este problema, permitiendo que cualquier persona que tenga la URL de pago generada por WooCommerce (que incluye la clave de pedido) complete el pago de ese pedido. (Por lo tanto, conservamos parte de la seguridad/protección, en lugar de permitir que cualquiera pague por cualquier cosa y vea cualquier pedido).

function allow_payment_without_login( $allcaps, $caps, $args ) {
    // Check we are looking at the WooCommerce Pay For Order Page
    if ( !isset( $caps[0] ) || $caps[0] != 'pay_for_order' )
        return $allcaps;
    // Check that a Key is provided
    if ( !isset( $_GET['key'] ) )
        return $allcaps;

    // Find the Related Order
    $order = wc_get_order( $args[2] );
    if( !$order )
        return $allcaps; # Invalid Order

    // Get the Order Key from the WooCommerce Order
    $order_key = $order->get_order_key();
    // Get the Order Key from the URL Query String
    $order_key_check = $_GET['key'];

    // Set the Permission to TRUE if the Order Keys Match
    $allcaps['pay_for_order'] = ( $order_key == $order_key_check );

    return $allcaps;
}
add_filter( 'user_has_cap', 'allow_payment_without_login', 10, 3 );

Con esta función, un usuario que visite una URL que tenga un número de pedido y la clave de pedido asociada podrá completar el pago, pero si la clave de pedido no es válida o no está presente, fallará.

Ejemplos:

  • su.dominio/pago/pedido-pago/987/?pay_for_order=true&key=wc_order_5c4155dd4462c
    APROBAR si “wc_order_5c4155dd4462c” es la clave de pedido para el pedido n.º 987
  • su.dominio/checkout/order-pay/987/?pay_for_order=true
    FALLAR como ningún parámetro clave presente
  • su.dominio/pago/pedido-pago/987/
    FALLAR como ningún parámetro clave presente

¿Ha sido útil esta solución?