2009-08-31 10 views
10

Actualmente estoy construyendo un sitio de comercio electrónico con PHP/MySQL. Recientemente, he estado trabajando en la integración del carrito de compras. El cliente quería asegurarse de que las existencias estuvieran disponibles para los compradores potenciales, por lo que creé un sistema de gestión de existencias. El carrito de compra funciona de la siguiente manera:Gestión de carro de compra y stock

  • El cliente agrega una cantidad de un artículo a su carro.
  • Cantidad del artículo se reserva de disponible en la base de datos.
  • Nadie más puede comprar acciones reservadas.
  • El stock permanece reservado hasta que el cliente procesa el pedido, donde el stock es entonces eliminado de la base de datos.
  • Si el cliente abandona su carrito, el stock queda reservado.
  • Si otro cliente desea comprar un artículo, pero solo el material disponible está reservado por otro cliente, entonces el cliente puede robar el stock reservado si ha estado inactivo durante 20 minutos.

Mi pregunta es, ¿cuáles son las mejores prácticas para este tipo de escenario? ¿Estoy haciendo esto correctamente? Lo principal es que el cliente no quiere vender acciones que no tiene.

Estoy buscando tener una discusión sobre cómo mejorar la funcionalidad, o lo que otros están haciendo para lograr esto.

Respuesta

14

Un enfoque alternativo puede ser no reservar una acción al colocarla en el carrito de compras. Realice un control cada vez que vuelva a cargar una página, si el artículo no está más disponible, muestre un mensaje como "El artículo que desea comprar se acaba de vender. Pronto estará disponible". Y quita el producto del carrito de compras.

Ahora, debe reservar el contenido del carrito de compras justo antes de iniciar la operación de pago, luego eliminarlo del stock o eliminar la reserva en función del éxito/fracaso del pago. Lo haces mejor en una ejecución de código, para que la reserva dure lo más brevemente posible.

ProcessOrder() 
{ 
    bool reserved = ReserveShoppingCartContents(); 
    if (reserved) 
    { 
     bool paymentStatus = ProcessPayment(); 
     if (paymentStatus) 
      RemoveShoppingCartContentsFromStock(); 
     else 
      ReleaseShoppingCartReserve(); 
    } 
    else 
    { 
     RefreshShoppingCartContents(); // Remove positions or adjust quantities 
     MessageBox ("Could not reserve your shopping cart contents. Please check out your selection"); 
    } 
} 

El más breve de su reserva de duración, mayor será la posibilidad de que su artículo será vende realmente. Minimiza la posibilidad de un conflicto: CustomerA comienza con el carro de la compra, el artículo se reserva, CustomerB viene, ve que el artículo no está en stock y se va, CustomerA decide que no le gusta el precio y cancela la operación. Usted tenía dos clientes potenciales pero no podía venderlos a ninguno.

+0

Gracias por el asesoramiento. Voy a volver a trabajar la funcionalidad. Sabía que no era la mejor manera de hacer esto. La congelación de valores probablemente no sea una buena idea, a menos que venda productos únicos, como boletos de conciertos. – jgallant

+0

Sí, al igual que con el control de fuente y las transacciones de base de datos, el bloqueo predeterminado es optimista a menos que tenga una buena razón para hacer lo contrario. – Jerph

3

comprobo el stock en cada recarga de las páginas durante el proceso de compra y las redirijo a la página del carrito con un mensaje de error si durante el proceso los artículos se agotaron. El stock se reduce solo en el pedido confirmado También restauro el stock si el pedido se cancela.

Cuestiones relacionadas