@using BTCPayServer.Views.Stores @using Microsoft.AspNetCore.Html @inject Security.ContentSecurityPolicies Csp @inject BTCPayNetworkProvider NetworkProvider @model BTCPayServer.Plugins.PayButton.Models.PayButtonViewModel @{ ViewData.SetActivePage(StoreNavPages.PayButton, "Pay Button", Context.GetStoreData().Id); Csp.UnsafeEval(); } @section PageHeadContent { } @section PageFootContent { if (!window.btcpay) { var script = document.createElement('script'); script.src = @(Safe.Json(Model.UrlRoot + "modal/btcpay.js")); document.getElementsByTagName('head')[0].append(script); } function handleFormSubmit(event) { event.preventDefault(); var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200 && this.responseText) { window.btcpay.appendInvoiceFrame(JSON.parse(this.responseText).invoiceId); } }; xhttp.open('POST', event.target.getAttribute('action'), true); xhttp.send(new FormData(event.target)); } document.querySelectorAll(".btcpay-form").forEach(function(el) { if (!el.dataset.initialized) { el.addEventListener('submit', handleFormSubmit); el.dataset.initialized = true; } }); function handlePlusMinus(event) { event.preventDefault(); const root = event.target.closest('.btcpay-form'); const el = root.querySelector('.btcpay-input-price'); const step = parseInt(event.target.dataset.step) || 1; const min = parseInt(event.target.dataset.min) || 1; const max = parseInt(event.target.dataset.max); const type = event.target.dataset.type; const price = parseInt(el.value) || min; if (type === '-') { el.value = price - step < min ? min : price - step; } else if (type === '+') { el.value = price + step > max ? max : price + step; } } document.querySelectorAll(".btcpay-form .plus-minus").forEach(function(el) { if (!el.dataset.initialized) { el.addEventListener('click', handlePlusMinus); el.dataset.initialized = true; } }); function handlePriceInput(event) { event.preventDefault(); const root = event.target.closest('.btcpay-form'); const price = parseInt(event.target.dataset.price); if (isNaN(event.target.value)) root.querySelector('.btcpay-input-price').value = price; const min = parseInt(event.target.getAttribute('min')) || 1; const max = parseInt(event.target.getAttribute('max')); if (event.target.value < min) { event.target.value = min; } else if (event.target.value > max) { event.target.value = max; } } document.querySelectorAll(".btcpay-form .btcpay-input-price").forEach(function(el) { if (!el.dataset.initialized) { el.addEventListener('input', handlePriceInput); el.dataset.initialized = true; } }); function handleSliderChange(event) { event.preventDefault(); const root = event.target.closest('.btcpay-form'); const el = root.querySelector('.btcpay-input-price'); const price = parseInt(el.value); const min = parseInt(event.target.getAttribute('min')) || 1; const max = parseInt(event.target.getAttribute('max')); if (price < min) { el.value = min; } else if (price > max) { el.value = max; } root.querySelector('.btcpay-input-range').value = el.value; } function handleSliderInput(event) { event.target.closest('.btcpay-form').querySelector('.btcpay-input-price').value = event.target.value; } document.querySelectorAll(".btcpay-form .btcpay-input-range").forEach(function(el) { if (!el.dataset.initialized) { el.addEventListener('input', handleSliderInput); el.dataset.initialized = true; } }); document.querySelectorAll(".btcpay-form .btcpay-input-price").forEach(function(el) { if (!el.dataset.initialized) { el.addEventListener('change', handleSliderChange); el.dataset.initialized = true; } }); }
@ViewLocalizer["Using the payment button for e-commerce integrations is not recommended since order relevant information can be modified by the user. For e-commerce, you should use our {0}. If this store process commercial transactions, we advise you to {1} before using the payment button.", Html.ActionLink(StringLocalizer["Greenfield API"], "SwaggerDocs", "UIHome", new { }, new { @class = "alert-link" }), Html.ActionLink(StringLocalizer["create a separate store"], "CreateStore", "UIUserStores", new { }, new { @class = "alert-link" })]
Configure your Pay Button, and the generated code will be displayed at the bottom of the page to copy into your project.
@ViewLocalizer["Specify additional query string parameters that should be appended to the checkout page once the invoice is created. For example, lang=da-DK
would load the checkout page in Danish by default."]
Link this Pay Button to an app instead. Some features are disabled due to the different endpoint capabilities. You can set which perk/item this button should be targeting.