<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Checkout</title>
<style>
body { font-family: system-ui, sans-serif; max-width: 480px; margin: 40px auto; padding: 20px; }
#loading-spinner { text-align: center; padding: 40px; color: #666; }
button { width: 100%; padding: 12px; background: #0066cc; color: white; border: none; border-radius: 6px; cursor: pointer; }
button:disabled { opacity: 0.5; cursor: not-allowed; }
</style>
</head>
<body>
<div id="loading-spinner">Loading payment form...</div>
<div id="purse-dropin"></div>
<button id="pay-button" disabled>Pay</button>
<script src="https://cdn.purse-sandbox.com/dropin-checkout/latest/purse.js"></script>
<script>
async function init() {
try {
const payButton = document.getElementById("pay-button");
const dropin = await Purse.createDropinCheckout({
session: "YOUR_CLIENT_SESSION_DATA",
eventListener: (event) => {
if (event.code === "ready") {
document.getElementById("loading-spinner").style.display = "none";
}
if (event.code === "error") {
console.error("Drop-in error:", event.payload);
}
}
});
await dropin.mount(document.getElementById("purse-dropin"));
dropin.isPaymentFulfilled.subscribe((isFulfilled) => {
payButton.disabled = !isFulfilled;
});
payButton.addEventListener("click", async () => {
payButton.disabled = true;
payButton.textContent = "Processing...";
try {
await dropin.submitPayment();
} catch (error) {
console.error(error.message);
payButton.disabled = false;
payButton.textContent = "Pay";
}
});
} catch (error) {
console.error("Failed to initialize Drop-in:", error);
}
}
init();
</script>
</body>
</html>