Añadir Bizum como método de pago manual en WooCommerce (sin pasarela)
Snippet para añadir Bizum como método de pago manual en el checkout de WooCommerce cuando no usas una pasarela que ya lo traiga incluido, con el pedido en espera hasta verificar el pago a mano.
En España, Bizum mueve muchísimo volumen entre cierto tipo de clientes, sobre todo en tiendas pequeñas y locales. No tenerlo como opción de pago es dejar ventas sobre la mesa.
Antes de nada: si ya usas una pasarela como Redsys u otras similares, es muy probable que Bizum ya venga incluido de fábrica en esa integración, con confirmación automática del pago — en ese caso no necesitas nada de lo de abajo, solo activarlo en los ajustes de la pasarela. Este snippet es para el caso contrario: cuando no tienes (ni quieres montar) una pasarela con confirmación automática, y prefieres una opción manual sencilla en la que el cliente hace el Bizum y el pedido queda en espera hasta que confirmas el ingreso a mano.
add_filter( 'woocommerce_payment_gateways', 'anadir_gateway_bizum' );
function anadir_gateway_bizum( $gateways ) {
$gateways[] = 'WC_Gateway_Bizum';
return $gateways;
}
add_action( 'plugins_loaded', 'init_gateway_bizum' );
function init_gateway_bizum() {
class WC_Gateway_Bizum extends WC_Payment_Gateway {
public function __construct() {
$this->id = 'bizum';
$this->icon = '';
$this->has_fields = false;
$this->method_title = 'Bizum';
$this->method_description = 'Pago manual por Bizum, pendiente de confirmación.';
$this->init_form_fields();
$this->init_settings();
$this->title = $this->get_option( 'title' );
$this->description = $this->get_option( 'description' );
add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
}
public function init_form_fields() {
$this->form_fields = array(
'enabled' => array(
'title' => 'Activar/desactivar',
'type' => 'checkbox',
'label' => 'Activar pago por Bizum',
'default' => 'yes',
),
'title' => array(
'title' => 'Título',
'type' => 'text',
'default' => 'Bizum',
),
'description' => array(
'title' => 'Instrucciones',
'type' => 'textarea',
'default' => 'Envía el importe por Bizum al 600 000 000 e indica tu número de pedido en el concepto. Tu pedido se confirma en cuanto verifiquemos el ingreso.',
),
);
}
public function process_payment( $order_id ) {
$order = wc_get_order( $order_id );
$order->update_status( 'on-hold', 'Pendiente de confirmación por Bizum.' );
wc_reduce_stock_levels( $order_id );
WC()->cart->empty_cart();
return array(
'result' => 'success',
'redirect' => $this->get_return_url( $order ),
);
}
}
}
Cosas a tener en cuenta
Este método deja el pedido en estado “en espera” (on-hold), no en “procesando” — es importante para no preparar ni enviar nada hasta comprobar de verdad que el Bizum ha llegado. Tendrás que revisar manualmente los pedidos pendientes y cambiarles el estado tú mismo, lo cual funciona bien en volúmenes bajos/medios, pero se vuelve un incordio si la tienda crece — en ese caso merece más la pena una pasarela con confirmación automática.
El número de teléfono y las instrucciones se configuran desde WooCommerce → Ajustes → Pagos → Bizum, sin tocar el código de nuevo.
Si el problema de tu tienda no es solo el checkout, sino que directamente vende poco, tiene más sentido revisarlo de raíz — lo cuento en por qué tu tienda WooCommerce vende poco.