gpt4 book ai didi

javascript - 为什么 PayPal 无法识别我的 Items Array?

转载 作者:行者123 更新时间:2023-12-02 21:15:10 25 4
gpt4 key购买 nike

我目前正在构建一个网站,其中有一个商店部分,并且我正在尝试集成 PayPal 智能按钮。我希望 PayPal 在结帐时向他们提供时间列表,并且我知道我必须使用“items: []”数组来执行此操作。但我希望这些商品能够根据用户购物车中的商品进行更改。我的购物车是使用 VanillaCartJS 集成的,这是我的 cart.js 文件:

'use strict';

let cart = (JSON.parse(localStorage.getItem('cart')) || []);
const cartDOM = document.querySelector('.cart');
const addToCartButtonsDOM = document.querySelectorAll('[data-action="ADD_TO_CART"]');

if (cart.length > 0) {
cart.forEach(cartItem => {
const product = cartItem;
insertItemToDOM(product);
countCartTotal();

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
const productDOM = addToCartButtonDOM.parentNode;

if (productDOM.querySelector('.product__name').innerText === product.name) {
handleActionButtons(addToCartButtonDOM, product);
}
});

});
}

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
addToCartButtonDOM.addEventListener('click', () => {
const productDOM = addToCartButtonDOM.parentNode;
const product = {
image: productDOM.querySelector('.product__image').getAttribute('src'),
name: productDOM.querySelector('.product__name').innerText,
price: productDOM.querySelector('.product__price').innerText,
quantity: 1,
};

const isInCart = (cart.filter(cartItem => (cartItem.name === product.name)).length > 0);

if (!isInCart) {
insertItemToDOM(product);
cart.push(product);
saveCart();
handleActionButtons(addToCartButtonDOM, product);
}
});
});

function insertItemToDOM(product) {
cartDOM.insertAdjacentHTML('beforeend', `
<div class="cart__item">
<img class="cart__item__image" src="${product.image}" alt="${product.name}">
<h3 class="cart__item__name">${product.name}</h3>
<h3 class="cart__item__price">${product.price}</h3>
<button class="btn btn--primary btn--small${(product.quantity === 1 ? ' btn--danger' : '')}" data-action="DECREASE_ITEM">&minus;</button>
<h3 class="cart__item__quantity">${product.quantity}</h3>
<button class="btn btn--primary btn--small" data-action="INCREASE_ITEM">&plus;</button>
<button class="btn btn--danger btn--small" data-action="REMOVE_ITEM">&times;</button>
</div>
`);

addCartFooter();
}

function handleActionButtons(addToCartButtonDOM, product) {
addToCartButtonDOM.innerText = 'In Cart';
addToCartButtonDOM.disabled = true;

const cartItemsDOM = cartDOM.querySelectorAll('.cart__item');
cartItemsDOM.forEach(cartItemDOM => {
if (cartItemDOM.querySelector('.cart__item__name').innerText === product.name) {
cartItemDOM.querySelector('[data-action="INCREASE_ITEM"]').addEventListener('click', () => increaseItem(product, cartItemDOM));
cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').addEventListener('click', () => decreaseItem(product, cartItemDOM, addToCartButtonDOM));
cartItemDOM.querySelector('[data-action="REMOVE_ITEM"]').addEventListener('click', () => removeItem(product, cartItemDOM, addToCartButtonDOM));
}
});
}

function increaseItem(product, cartItemDOM) {
cart.forEach(cartItem => {
if (cartItem.name === product.name) {
cartItemDOM.querySelector('.cart__item__quantity').innerText = ++cartItem.quantity;
cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.remove('btn--danger');
saveCart();
}
});
}

function decreaseItem(product, cartItemDOM, addToCartButtonDOM) {
cart.forEach(cartItem => {
if (cartItem.name === product.name) {
if (cartItem.quantity > 1) {
cartItemDOM.querySelector('.cart__item__quantity').innerText = --cartItem.quantity;
saveCart();
} else {
removeItem(product, cartItemDOM, addToCartButtonDOM);
}

if (cartItem.quantity === 1) {
cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.add('btn--danger');
}
}
});
}

function removeItem(product, cartItemDOM, addToCartButtonDOM) {
cartItemDOM.classList.add('cart__item--removed');
setTimeout(() => cartItemDOM.remove(), 250);
cart = cart.filter(cartItem => cartItem.name !== product.name);
saveCart();
addToCartButtonDOM.innerText = 'Add To Cart';
addToCartButtonDOM.disabled = false;

if (cart.length < 1) {
document.querySelector('.cart-footer').remove();
}
}

function addCartFooter() {
if (document.querySelector('.cart-footer') === null) {
cartDOM.insertAdjacentHTML('afterend', `
<div class="cart-footer">
<button data-action="CLEAR_CART">Clear Cart</button>
<p data-action="CHECKOUT">Total:</p>
</div>
`);

document.querySelector('[data-action="CLEAR_CART"]').addEventListener('click', () => clearCart());
}
}

function clearCart() {
cartDOM.querySelectorAll('.cart__item').forEach(cartItemDOM => {
cartItemDOM.classList.add('cart__item--removed');
setTimeout(() => cartItemDOM.remove(), 250);
});

cart = [];
localStorage.removeItem('cart');
document.querySelector('.cart-footer').remove();

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
addToCartButtonDOM.innerText = 'Add To Cart';
addToCartButtonDOM.disabled = false;
});
}

function countCartTotal() {
let cartTotal = 0;
cart.forEach(cartItem => cartTotal += cartItem.quantity * cartItem.price);
document.querySelector('[data-action="CHECKOUT"]').innerText = `Pay $${cartTotal}`;
return cartTotal;
}

function saveCart() {
localStorage.setItem('cart', JSON.stringify(cart));
countCartTotal();
}

function arrayOfItems (cartItem, product)
{
let cartItemName = cartItem.name;
'use strict';

let cart = (JSON.parse(localStorage.getItem('cart')) || []);
const cartDOM = document.querySelector('.cart');
const addToCartButtonsDOM = document.querySelectorAll('[data-action="ADD_TO_CART"]');

if (cart.length > 0) {
cart.forEach(cartItem => {
const product = cartItem;
insertItemToDOM(product);
countCartTotal();

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
const productDOM = addToCartButtonDOM.parentNode;

if (productDOM.querySelector('.product__name').innerText === product.name) {
handleActionButtons(addToCartButtonDOM, product);
}
});

});
}

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
addToCartButtonDOM.addEventListener('click', () => {
const productDOM = addToCartButtonDOM.parentNode;
const product = {
image: productDOM.querySelector('.product__image').getAttribute('src'),
name: productDOM.querySelector('.product__name').innerText,
price: productDOM.querySelector('.product__price').innerText,
quantity: 1,
};

const isInCart = (cart.filter(cartItem => (cartItem.name === product.name)).length > 0);

if (!isInCart) {
insertItemToDOM(product);
cart.push(product);
saveCart();
handleActionButtons(addToCartButtonDOM, product);
}
});
});

function insertItemToDOM(product) {
cartDOM.insertAdjacentHTML('beforeend', `
<div class="cart__item">
<img class="cart__item__image" src="${product.image}" alt="${product.name}">
<h3 class="cart__item__name">${product.name}</h3>
<h3 class="cart__item__price">${product.price}</h3>
<button class="btn btn--primary btn--small${(product.quantity === 1 ? ' btn--danger' : '')}" data-action="DECREASE_ITEM">&minus;</button>
<h3 class="cart__item__quantity">${product.quantity}</h3>
<button class="btn btn--primary btn--small" data-action="INCREASE_ITEM">&plus;</button>
<button class="btn btn--danger btn--small" data-action="REMOVE_ITEM">&times;</button>
</div>
`);

addCartFooter();
}

function handleActionButtons(addToCartButtonDOM, product) {
addToCartButtonDOM.innerText = 'In Cart';
addToCartButtonDOM.disabled = true;

const cartItemsDOM = cartDOM.querySelectorAll('.cart__item');
cartItemsDOM.forEach(cartItemDOM => {
if (cartItemDOM.querySelector('.cart__item__name').innerText === product.name) {
cartItemDOM.querySelector('[data-action="INCREASE_ITEM"]').addEventListener('click', () => increaseItem(product, cartItemDOM));
cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').addEventListener('click', () => decreaseItem(product, cartItemDOM, addToCartButtonDOM));
cartItemDOM.querySelector('[data-action="REMOVE_ITEM"]').addEventListener('click', () => removeItem(product, cartItemDOM, addToCartButtonDOM));
}
});
}

function increaseItem(product, cartItemDOM) {
cart.forEach(cartItem => {
if (cartItem.name === product.name) {
cartItemDOM.querySelector('.cart__item__quantity').innerText = ++cartItem.quantity;
cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.remove('btn--danger');
saveCart();
}
});
}

function decreaseItem(product, cartItemDOM, addToCartButtonDOM) {
cart.forEach(cartItem => {
if (cartItem.name === product.name) {
if (cartItem.quantity > 1) {
cartItemDOM.querySelector('.cart__item__quantity').innerText = --cartItem.quantity;
saveCart();
} else {
removeItem(product, cartItemDOM, addToCartButtonDOM);
}

if (cartItem.quantity === 1) {
cartItemDOM.querySelector('[data-action="DECREASE_ITEM"]').classList.add('btn--danger');
}
}
});
}

function removeItem(product, cartItemDOM, addToCartButtonDOM) {
cartItemDOM.classList.add('cart__item--removed');
setTimeout(() => cartItemDOM.remove(), 250);
cart = cart.filter(cartItem => cartItem.name !== product.name);
saveCart();
addToCartButtonDOM.innerText = 'Add To Cart';
addToCartButtonDOM.disabled = false;

if (cart.length < 1) {
document.querySelector('.cart-footer').remove();
}
}

function addCartFooter() {
if (document.querySelector('.cart-footer') === null) {
cartDOM.insertAdjacentHTML('afterend', `
<div class="cart-footer">
<button data-action="CLEAR_CART">Clear Cart</button>
<p data-action="CHECKOUT">Total:</p>
</div>
`);

document.querySelector('[data-action="CLEAR_CART"]').addEventListener('click', () => clearCart());
}
}

function clearCart() {
cartDOM.querySelectorAll('.cart__item').forEach(cartItemDOM => {
cartItemDOM.classList.add('cart__item--removed');
setTimeout(() => cartItemDOM.remove(), 250);
});

cart = [];
localStorage.removeItem('cart');
document.querySelector('.cart-footer').remove();

addToCartButtonsDOM.forEach(addToCartButtonDOM => {
addToCartButtonDOM.innerText = 'Add To Cart';
addToCartButtonDOM.disabled = false;
});
}

function countCartTotal() {
let cartTotal = 0;
cart.forEach(cartItem => cartTotal += cartItem.quantity * cartItem.price);
document.querySelector('[data-action="CHECKOUT"]').innerText = `Pay $${cartTotal}`;
return cartTotal;
}

function saveCart() {
localStorage.setItem('cart', JSON.stringify(cart));
countCartTotal();
}

}

function PayPalItems() {

return cart.map((cartItem, index) => {
++index;
let currency = cartItem.price;
let quantity = cartItem.quantity;
let itemName = cartItem.name;

let items = [{"unit_amount": {"currency_code": "USD","value": currency},"quantity": quantity,"name": itemName,}];

return items;
});

}

它使用“cartItem.name”、“cartItem.price”和“cartItem.quantity”等内容获取购物车商品。最后一个函数“PayPalItems()”是我试图用来调用 items 数组的函数。如下:

function PayPalItems() {

return cart.map((cartItem, index) => {
++index;
let currency = cartItem.price;
let quantity = cartItem.quantity;
let itemName = cartItem.name;

let items = [{"unit_amount": {"currency_code": "USD","value": currency},"quantity": quantity,"name": itemName,}];

return items;
});

}

在我渲染 PayPal 按钮的脚本中,如下所示:

<!-- JavaScript to call cart.js file and render PayPal Buttons -->
<script src="cart.js"></script>

<script>
paypal.Buttons({
createOrder: function(data, actions) {
// This function sets up the details of the transaction, including the amount and line item details.
return actions.order.create({
"purchase_units": [{
"amount": {
"value": countCartTotal(),
"currency_code": "USD",
"breakdown": {
"item_total": {
"currency_code": "USD",
"value": countCartTotal()
},
},
},
"items": PayPalItems()
}
]
});
},
onApprove: function(data, actions) {
// This function captures the funds from the transaction.
return actions.order.capture().then(function(details) {
// This function shows a transaction success message to your buyer.
window.location.href = "orderConfirmed.php";
clearCart()
});
}
}).render('#paypal-button-container');
//This function displays Smart Payment Buttons on your web page.
</script>

在值部分,我使用一个名为“countCartTotal()”的函数,该函数将购物车中的所有商品相加,得出 PayPal 可以在结帐时向用户收取的总额。当我运行代码时,向用户收取正确的金额,但未显示项目,当我查看 JavaScript 控制台时,出现以下错误:

Error: /v2/checkout/orders returned status: 400 (Corr ID: 62dab91ed532d)

我该如何解决这个问题?

更新

我的 PayPalItems() 的代码是:

function PayPalItems() {

return cart.forEach((cartItem, index) => {
++index;
let currency = cartItem.price;
let quantity = cartItem.quantity;
let itemName = cartItem.name;

const items = [{"unit_amount": {"currency_code": "USD","value": currency},"quantity": quantity,"name": itemName,}];
console.log(items);
});
}

当我在本地主机上运行此代码时,PayPal 按钮收取正确的金额,但未给出项目。在我的控制台日志中,这是 JavaScript 控制台给我的内容:

enter image description here

这是购物车中的测试数据。系统正在识别那里有什么,只是不会在 PayPal 沙箱窗口中输出它们。我认为这可能是 [] 的问题,但我不确定。

最佳答案

你的循环是错误的,并且你对循环的调试是错误的

let items 需要在循环之外并预初始化一个空数组

在循环内您需要添加项目,而不是覆盖它

console.log(项目);需要位于循环之外,而不是内部。

然后,您需要确保实际上只返回 items,而不是 cart.forEach 。

关于javascript - 为什么 PayPal 无法识别我的 Items Array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60990757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com