Настройка виджета (По желанию, не обязательно)
Данный код нужно вставить в HTML-блок (T123 блок) на любой странице, лучше всего - header, чтобы виджет появлялся везде под кнопкой купить
<script src="https://pay.yandex.ru/sdk/v1/pay.js"></script>
<script>
// Version 1.4
const MID = '!!!ВСТАВИТЬ_СЮДА_МЕРЧАНТ_ID!!!'; // Merchant ID (идентификатор клиента из настроек Яндекс Пэй)
const METHODS = ['SPLIT', 'CARD']; // ['SPLIT', 'CARD'] - для отображения кешбэк + сплит, ['SPLIT'] - для отображения только сплит
const BNPL_BADGES = true; // true - показать бейджи сплита, false - скрыть бейджи сплита
const CASHBACK_BADGE = true; // true - показать бейджи кешбэка, false - скрыть бейджи кешбэка
const THEME = 'light'; // dark - темная тема оформления, light - светлая тема оформления
function addBadges(){
    let productsNodes = [];
        productsNodes = document.querySelectorAll('.t-store__card');
    if (productsNodes.length == 0){
        productsNodes = document.querySelectorAll('.t776__col');
    }
    productsNodes.forEach((product, index) => {
        if (product.querySelector('.splitochek-badge') === null){
            let badgeWrapper = document.createElement("div");
            let splitochekBadge = `splitochek-badge-${index}`;
            badgeWrapper.id = splitochekBadge;
            badgeWrapper.classList = 'splitochek-badge';
            let priceWrapper = null;
            priceWrapper = product.querySelector('.js-store-price-wrapper');
            if (priceWrapper === null){
                priceWrapper = product.querySelector('.t776__btn-wrapper');
            }
            priceWrapper.appendChild(badgeWrapper);
            let priceNode = null;
            priceNode = product.querySelector('.js-product-price');
            if (priceNode === null){
                priceNode = product.querySelector('.t776__btn_second td');
            }
            let price = priceNode.textContent.replace(/\s/g, '').match(/\d+/g);
            if (BNPL_BADGES){
                YaPay.mountBadge(document.querySelector(`#${splitochekBadge}`),
                {
                    type: 'bnpl',
                    theme: THEME,
                    amount: price[0],
                    size: 's', // размер бейджика (s, m, l)
                    variant: 'simple', // simple - простой вариант бейджа, detailed - детальный вариант бейджа
                    color: 'grey', // цветовое оформление (primary, green, grey, transparent)
                    align: 'center', // выравнивание информации (left, center, right)
                    merchantId: MID
                });
            }
            if (CASHBACK_BADGE){
                YaPay.mountBadge(document.querySelector(`#${splitochekBadge}`),
                {
                    type: 'cashback',
                    theme: THEME,
                    amount: price[0], // передаем цену для расчета
                    size: 's', // размер бейджика (s, m, l)
                    variant: 'default', // default - вариант бейджа по умолчанию, compact - компактный вариант бейджа
                    color: 'primary', // цветовое оформление (primary, grey, transparent)
                    align: 'center', // выравнивание информации (left, center, right)
                    merchantId: MID
                });
            }
        }
    });
}
document.addEventListener('tStoreRendered', addBadges);
document.addEventListener('DOMContentLoaded', addBadges);
function addWidget(selector, popupWidget = false){
    const YaPay = window.YaPay;
    let activeSession = null;
    let priceNode = null;
    priceNode = document.querySelector(`${selector} .js-product-price`);
    if (priceNode === null){
        priceNode = document.querySelector(`${selector} .t706__cartwin-prodamount-wrap .t706__cartwin-prodamount-price`);
    }
    if (priceNode === null){
        priceNode = document.querySelector(`${selector} .t706__sidebar-prodamount .t706__cartwin-prodamount-price`);
    }
    if (priceNode === null){
        priceNode = document.querySelector(`${selector} .t1025__price-wrapper .t1025__price-value`);
    }
    let amount = priceNode.textContent.replace(/\s/g, '').match(/\d+/g);
    const paymentData = {
        env: YaPay.PaymentEnv,
        version: 4,
                currencyCode: YaPay.CurrencyCode.Rub,
        merchantId: MID,
        totalAmount: amount[0],
        availablePaymentMethods: METHODS
    };
    function onPayButtonClick(){}
    YaPay.createSession(paymentData, {
        onPayButtonClick: onPayButtonClick
    })
    .then(function(paymentSession){
        activeSession = paymentSession;
        paymentSession.mountWidget(document.querySelector(`${selector} .splitochek-widget`), {
            //какой тип виджеты выводим?
            widgetType: YaPay.WidgetType.BnplPreview,
            //widgetTheme: YaPay.WidgetTheme.Light,
            //padding: YaPay.WidgetPaddingType.None,
            //borderRadius: 5
        });
        if (popupWidget){
            document.addEventListener('popupHidden', function(){
                paymentSession.unmountWidget(document.querySelector(`${selector} .splitochek-widget`),{});
            });
        }
    })
    .catch(function(err){
        console.error(err);
    });
    let observer = new MutationObserver(mutationRecords => {
        let amountContent = null;
        try {
            amountContent = mutationRecords[0].addedNodes[0].textContent;
            if (!amountContent){
                amountContent = mutationRecords[0].addedNodes[0].innerText;
            }
        } catch (err) {
            console.log(err);
        }
        let newAmount = amountContent.replace(/\s/g, '');
        activeSession.update(async function(){
            return {
                totalAmount: newAmount,
            };
        });
    });
    observer.observe(priceNode.parentNode, {
        childList: true, subtree: true
    });
}
document.addEventListener('DOMContentLoaded', function(){
    let widgetSnippetWrapper = document.createElement('div');
    widgetSnippetWrapper.classList = 'splitochek-widget';
    let snippetWrapper = null;
    snippetWrapper = document.querySelector('.t-store__product-snippet .js-store-price-wrapper');
    if (snippetWrapper === null){
        snippetWrapper = document.querySelector('.t744 .js-store-price-wrapper');
        if (snippetWrapper !== null){
            snippetWrapper.appendChild(widgetSnippetWrapper); 
            addWidget('.t744');
        }
    } else {
        snippetWrapper.appendChild(widgetSnippetWrapper); 
        addWidget('.t-store__product-snippet');
    }
    let widgetCheckoutWrapper = document.createElement('div');
    widgetCheckoutWrapper.classList = 'splitochek-widget';
    let checkoutWrapper = document.querySelector('.t706__cartwin-content .t706__cartwin-prodamount-wrap');
    if (checkoutWrapper !== null){
        checkoutWrapper.appendChild(widgetCheckoutWrapper);
    }
});
document.addEventListener('tStoreRendered', function(){
    let widgetPopupWrapper = document.createElement('div');
    widgetPopupWrapper.classList = 'splitochek-widget';
    let popupWrapper = document.querySelector('.t-store__product-popup .js-store-price-wrapper');
    if (popupWrapper !== null){
        popupWrapper.appendChild(widgetPopupWrapper);
    }
    let widgetPopupProdWrapper = document.createElement('div');
    widgetPopupProdWrapper.classList = 'splitochek-widget';
    let popupProdWrapper = document.querySelector('.t-store__product-popup .t1025__price-wrapper');
    if (popupProdWrapper !== null){
        popupWrapper.appendChild(widgetPopupProdWrapper);
    }
    let widgetCartWrapper = document.createElement('div');
    widgetCartWrapper.classList = 'splitochek-widget';
    let cartPageWrapper = document.querySelector('.t706__cartpage-content .t706__cartpage-info-wrapper');
    if (cartPageWrapper !== null){
        cartPageWrapper.appendChild(widgetCartWrapper);
    }
    let widgetSidebarWrapper = document.createElement('div');
    widgetSidebarWrapper.classList = 'splitochek-widget';
    let cartSidebarWrapper = document.querySelector('.t706__sidebar-content .t706__sidebar-prodamount-wrap');
    if (cartSidebarWrapper !== null){
        cartSidebarWrapper.appendChild(widgetSidebarWrapper);
    }
    let widgetCheckoutWrapper = document.createElement('div');
        widgetCheckoutWrapper.classList = 'splitochek-widget';
    let checkoutWrapper = document.querySelector('.t706__cartwin-content .t706__cartwin-prodamount-wrap');
    if (checkoutWrapper !== null){
        checkoutWrapper.appendChild(widgetCheckoutWrapper);
    }
});
document.addEventListener('popupShowed', function(){
    setTimeout(function(){
        let popupNode = document.querySelector('.t-body_popupshowed');
        let cartPageNode = document.querySelector('.t706__body_cartpageshowed');
        let cartSidebarNode = document.querySelector('.t706__body_cartsidebarshowed');
        let checkoutNode = document.querySelector('.t706__body_cartwinshowed');
        if (popupNode !== null){
            addWidget('.t-store__product-popup', true);
        }
        if (cartPageNode !== null){
            addWidget('.t706__cartpage-content', true);
        }
        if (cartSidebarNode !== null){
            addWidget('.t706__sidebar-content', true);
        }
        if (checkoutNode !== null){
            addWidget('.t706__cartwin-content', true);
        }
    }, 200);
});
</script>
<style>
.splitochek-badge {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
}
.splitochek-badge yandex-pay-badge {
    margin-top: 0.75rem;
}
.splitochek-widget .ya-pay-widget {
    margin-top: 20px!important;
    margin-bottom: 0!important;
}
.t706__sidebar-prodamount-wrap {
    padding-top: 20px!important;
    padding-bottom: 20px!important;
}
.t706__cartpage-info-wrapper .splitochek-widget .ya-pay-widget {
    margin-top: -30px!important;
    margin-bottom: 20px!important;
}
.t706__cartpage-totals {
    padding-top: 20px!important;
}
</style>
Last modified: 30 декабря 2024