Si tenemos una tienda online de nueva creación, es muy recomendable ofrecer varias alternativas como método de pago. Entre ellas, PayPal y el pago contra reembolso o contra entrega son las opciones más aconsejables. Esta última opción genera mucha confianza en los clientes, puesto que pagan el producto solo cuando ven que cumple con las expectativas de calidad, condiciones de envío, etc. Sin embargo, no todo es un camino de rosas, ya que en muchas ocasiones el cliente decide no completar la compra, ya sea porque se lo ha pensado mejor, porque ha comprado sin querer, o por cualquier otro motivo.
Para estas situaciones, siempre recomiendo llamar al cliente para confirmar la entrega, pero, aún así, muchas veces lo niegan, no están en casa, etc., lo que hace que la entrega no se realice. Esto supone un coste muy alto para nosotros, tanto por el envío del producto como por los gastos de retorno a nuestros almacenes.
Si esto te sucede con frecuencia, existe una alternativa: cobrar previamente el importe del envío al cliente para asegurar que no perdemos ese dinero o que la pérdida sea menor. Por ello, en este tutorial vamos a ver cómo cobrar únicamente el importe del envío si el cliente selecciona el método de pago contra reembolso en WooCommerce.
Cobrar solo el transporte cuando el cliente selecciona un método de envío
No he encontrado ningún plugin que permita hacer esto, por lo que lo haremos a código. Lo primero será crear el método de envío contra entrega en la zona de envío y ponerle el importe. En este punto no me centraré en el tutorial ya que te lo explico todo en mi guía de envíos para WooCommerce.

En esta modalidad de envío que hemos creado, tenemos que saber cual es su value. Esto lo podemos saber al inspeccionar el método de envío en el checkout:

En este caso, el envío que he creado tiene de value: flat_rate:20. En vuestro caso será otro valor. Si os habéis perdido en este punto, en el vídeo anclado a este tutorial lo explico en profundidad y paso a paso de forma técnica. Una vez ya tenemos nuestro value, tendremos que sustituirlo en el código por flat_rate:20.
El último paso, será pegar el siguiente código modificado con el value de nuestro envío en el functions.php de nuestro Child Theme o en nuestro plugin de funcionalidades como explico aquí:
// Mostrar el mensaje en el checkout si se selecciona el método de envío "flat_rate:20"
add_action( 'woocommerce_cart_totals_after_shipping', 'dl_mostrar_aviso_cobrar_envio_contra_reembolso' );
add_action( 'woocommerce_review_order_after_shipping', 'dl_mostrar_aviso_cobrar_envio_contra_reembolso' );
function dl_mostrar_aviso_cobrar_envio_contra_reembolso() {
// Definir los métodos de envío a los que se aplicará el mensaje
$targeted_shipping_methods = array('flat_rate:20'); // ID/value del método de envío "Envío contra reembolso"
// Obtener el método de envío seleccionado
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
if ( ! empty( $chosen_methods ) ) {
$chosen_method = reset( $chosen_methods );
// Verificar si el método de envío seleccionado está en la lista de métodos de envío objetivo
if ( in_array( $chosen_method, $targeted_shipping_methods ) ) {
// Mostrar el mensaje personalizado, puedes personalizarlo entre las comillas del echo
echo '<tr class="shipping">
<td colspan="2" style="text-align:center; background:#e0e0e0;">
<strong>El importe del envío se cobrará ahora. El resto del pedido se cobrará contra reembolso a la entrega.</strong>
</td>
</tr>';
}
}
}
// Ajusta el total del carrito cuando se selecciona el método de envío del que hemos sacado el value, en este caso "flat_rate:20"
add_filter( 'woocommerce_calculated_total', 'dl_ajustar_total_al_seleccionar_el_envio', 10, 1 );
function dl_ajustar_total_al_seleccionar_el_envio( $total ) {
// Obtener el método de envío seleccionado
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
if ( ! empty( $chosen_methods ) ) {
$chosen_method = reset( $chosen_methods );
// Verificar si el método de envío seleccionado es "flat_rate:20"
if ( $chosen_method == 'flat_rate:20' ) {
// Obtener el costo del envío con impuestos incluidos
$shipping_cost = WC()->cart->get_shipping_total() + WC()->cart->get_shipping_tax();
// Establecer el total del carrito como el costo de envío (sin productos)
return $shipping_cost;
}
}
return $total;
}
// Ajusta el monto que se cobra al cliente en el pago (solo el costo del envío)
add_action( 'woocommerce_checkout_create_order', 'dl_cambiar_importe_metodo_de_envio', 20, 2 );
function dl_cambiar_importe_metodo_de_envio( $order, $data ) {
// Obtener el método de envío seleccionado
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
if ( ! empty( $chosen_methods ) ) {
$chosen_method = reset( $chosen_methods );
// Verificar si el método de envío seleccionado es "flat_rate:20"
if ( $chosen_method == 'flat_rate:20' ) {
// Obtener el costo de envío con impuestos incluidos
$shipping_cost = WC()->cart->get_shipping_total() + WC()->cart->get_shipping_tax();
// Establecer el total del pedido a solo el costo de envío
$order->set_total( $shipping_cost );
// Establecer los productos del pedido a 0 (solo el envío)
foreach ( $order->get_items() as $item_id => $item ) {
$item->set_total( 0 ); // Establece el total de los productos a 0
$item->save();
}
}
}
}
// Asegurarse de que las pasarelas de pago también reciban el total correcto (solo el costo de envío)
add_filter( 'woocommerce_order_total', 'modify_payment_total_for_shipping_only', 10, 1 );
function modify_payment_total_for_shipping_only( $total ) {
// Verificar si el pedido tiene un solo costo de envío
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
if ( ! empty( $chosen_methods ) ) {
$chosen_method = reset( $chosen_methods );
// Si el método de envío es "flat_rate:20", ajustamos el total para que solo sea el envío
if ( $chosen_method == 'flat_rate:20' ) {
// Obtener el costo de envío con impuestos incluidos
$shipping_cost = WC()->cart->get_shipping_total() + WC()->cart->get_shipping_tax();
// Establecer el total a solo el costo de envío
return $shipping_cost;
}
}
return $total;
}
En el código también podrás cambiar el mensaje que se muestra al seleccionar el envío, o bien si no quieres mostrar el mensaje, quitar esa parte del código. Una vez seleccionado como vemos en la siguiente imagen el coste del pedido es el coste del envío:

Como podemos ver, el coste del producto es de 10, pero al hacer clic en envío contra reembolso solo se queda el coste del envío, mientras que en el resto de envíos funcionan correctamente como en el caso de la izquierda.
Espero que os haya ayudado mucho y si quieres saber más de configurar el contra reembolso te djeo mi guía completa:
Deja una respuesta