Я пытаюсь встроить интеллектуальные кнопки оплаты PayPal в свою корзину на моем веб-сайте. Моя корзина интегрирована с использованием VanillaCart JS, и вот мой основной. 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">−</button>
<h3 class="cart__item__quantity">${product.quantity}</h3>
<button class="btn btn--primary btn--small" data-action="INCREASE_ITEM">+</button>
<button class="btn btn--danger btn--small" data-action="REMOVE_ITEM">×</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 class="btn btn--danger" data-action="CLEAR_CART">Clear Cart</button>
<button class="btn btn--primary" data-action="CHECKOUT">Pay</button>
</div>
`);
document.querySelector('[data-action="CLEAR_CART"]').addEventListener('click', () => clearCart());
document.querySelector('[data-action="CHECKOUT"]').addEventListener('click', () => checkout());
}
}
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 checkout() {
}
function countCartTotal() {
let cartTotal = 0;
cart.forEach(cartItem => cartTotal += cartItem.quantity * cartItem.price);
document.querySelector('[data-action="CHECKOUT"]').innerText = `Pay $${cartTotal}`;
}
function saveCart() {
localStorage.setItem('cart', JSON.stringify(cart));
countCartTotal();
}
Чтобы разбить его, эта функция позволяет мне добавлять товары в раздел корзины, добавлять и убирать количество, очистить всю корзину и отобразить кнопку оплаты с указанием суммы, которую должен заплатить пользователь, и эта часть работает. Учебное пособие, которое я использовал, является старым, а метод оплаты PayPal был старым и не работал. Итак, мы перешли к https://developer.paypal.com/docs/checkout/ и попытались следовать этому уроку.
Он дает различные шаги для рендеринга кнопок, и в итоге получается скрипт, подобный этому:
<script
src="https://www.paypal.com/sdk/js?client-id=SB_CLIENT_ID"> // Required. Replace SB_CLIENT_ID with your sandbox client ID.
</script>
<div id="paypal-button-container"></div>
<script>
paypal.Buttons().render('#paypal-button-container');
// This function displays Smart Payment Buttons on your web page.
</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: '0.01'
}
}]
});
},
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.
alert('Transaction completed by ' + details.payer.name.given_name);
});
}
}).render('#paypal-button-container');
//This function displays Smart Payment Buttons on your web page.
</script>
Это работает, когда выполнено, однако, оно взимает с клиента все данные в «значении:« 0,01 »». Но мне нужна кнопка PayPal, чтобы зарядить всю корзину. Проблема заключается в том, что скрипт запускает индекс. html и код корзины находится в главном. js файле.
Переменная, в которой хранится значение корзины, называется 'cartTotal', но когда Я перемещаю код Paypal на главную. js перестает работать, и когда я изменяю 'value: 0.01' на 'value: cartTotal', это тоже не работает
Корзина выглядит так, с Добавлено товаров:
Строка JavaScript для кнопки оплаты:
<button class="btn btn--primary" data-action="CHECKOUT">Pay</button>
Часть после ответы:
Мой файл html Форма выглядит так:
Раздел корзины:
<div class="mm-twothird">
<section class="section">
<h1 class="mm-heading-title">Cart</h1>
<div class="cart"></div>
</section>
<div class="mm-right">
<div id="paypal-button-container" style="width: 25%;"></div>
</div
</div>
И раздел main. js файл, содержащий cartTotal:
function countCartTotal() {
let cartTotal = 0;
cart.forEach(cartItem => cartTotal += cartItem.quantity * cartItem.price);
document.querySelector('[data-action="CHECKOUT"]').innerText = `Pay £ ${cartTotal}`;
}
Окно PayPal всплывает, а затем исчезает, и я попробовал следующий код:
<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()
}
}]
});
}
}).render('#paypal-button-container');
</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: document.getElementById('cartTotal').value
}
}]
});
}
}).render('#paypal-button-container');
</script>
Но когда я заменяю "value: document.getElementById ('cartTotal'). Value" или "value: countCartTotal ()", скажем, "value: '0.01'", окно загружается нормально?