Como recuperar o carrinho entre dispositivos
Este guia mostra como implementar a recuperação automática do carrinho de compras quando o cliente faz login em um novo dispositivo ou navegador, utilizando as queries checkoutRecoverLastCart
e checkoutLite
.
Com essa abordagem, o usuário mantém os produtos adicionados ao carrinho em qualquer dispositivo, proporcionando uma experiência de compra contínua.
Fluxo de funcionamento
- Detectar usuário logado — via
customerAccessToken
salvo em cookie. - Checar se já existe carrinho local — via cookie
carrinho-id
. - Consultar se o carrinho local tem produtos — query
checkoutLite
. - Caso não tenha produtos, recuperar último carrinho do usuário — query
checkoutRecoverLastCart
. - Substituir carrinho atual pelo recuperado e atualizar a página.
- Evitar execução repetida — usando um cookie de controle (
sf_cart_recovered
).
Exemplo de implementação em JavaScript
// 1. Verifica se o checkout tem produtos
async function hasProductsCheckout(checkoutId) {
if (!checkoutId) return false;
try {
const query = `
query GetCarrinho {
checkoutLite(checkoutId:"${checkoutId}") {
hasProducts
}
}`;
const result = await client.query(query);
return result?.checkoutLite?.hasProducts || false;
} catch {
return false;
}
}
// 2. Recupera o último carrinho do usuário
async function recoverLastCart(customerAccessToken) {
if (!customerAccessToken) return null;
try {
const query = `
query GetUltimoCarrinho {
checkoutRecoverLastCart(customerAccessToken:"${customerAccessToken}") {
checkoutId
}
}`;
const result = await client.query(query);
return result?.checkoutRecoverLastCart?.checkoutId || null;
} catch {
return null;
}
}
// 3. Função principal
async function carrinhoCompartilhado() {
const cartRecoverCookieName = "sf_cart_recovered";
const cartRecoverStatus = client.cookie.get(cartRecoverCookieName);
const customerAccessToken = client.cookie.get("sf_customer_access_token");
if (!customerAccessToken || cartRecoverStatus) return;
const checkoutId = client.cookie.get("carrinho-id");
const executarRecuperacao = async () => {
const lastCheckoutId = await recoverLastCart(customerAccessToken);
client.cookie.set(cartRecoverCookieName, "1");
if (lastCheckoutId) {
await client.checkout.setCheckoutId(lastCheckoutId);
refreshPage();
}
};
if (!checkoutId) {
await executarRecuperacao();
} else {
client.cookie.set(cartRecoverCookieName, "1");
const hasProducts = await hasProductsCheckout(checkoutId);
if (!hasProducts) {
await executarRecuperacao();
}
}
}
Pontos de atenção
- Idempotência: use um cookie (
sf_cart_recovered
) para evitar múltiplas execuções no mesmo login. - Customização: este exemplo pode ser adaptado para outros cenários, como sempre sobrescrever o carrinho ou mesclar itens.
- Fallback seguro: em caso de erro nas queries, funções retornam
false
/null
para não quebrar o fluxo. - Atualização imediata:
refreshPage()
garante que a UI exiba o carrinho atualizado.
Links úteis
Updated 1 day ago