Fix free tier checkout and Stripe duplicate customers
Free tier: - checkout-stripe.el bails out immediately for plan=free (no Stripe init) - checkout-auth.el skips payment section reveal and initStripe for free plan - checkout-free.el shows #free-success panel after auth (no card ever shown) - /api/payment-intent returns early for free plan — no Stripe call Stripe dedup (all paid plans): - Stripe init now deferred to window.initStripe(email, name), called by checkout-auth.el after sign-in — email is known before intent is created - /api/payment-intent finds-or-creates Stripe Customer by email before creating the PaymentIntent/SetupIntent and attaches customer upfront - Eliminates the window between intent creation and /api/link-customer that was producing duplicate guest customers
This commit is contained in:
@@ -31,8 +31,13 @@ fn main() -> Void {
|
||||
if (spinner) spinner.style.display = loading ? '' : 'none';
|
||||
}
|
||||
|
||||
// Free plan has no payment form — bail out entirely.
|
||||
if (str_eq(PLAN, 'free')) return;
|
||||
|
||||
window._neuronMode = 'payment';
|
||||
var paymentEl = null;
|
||||
var userEmail = '';
|
||||
var userName = '';
|
||||
|
||||
function appearance() {
|
||||
return {
|
||||
@@ -80,7 +85,7 @@ fn main() -> Void {
|
||||
return fetch('/api/payment-intent', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({ plan: PLAN, timing: timing })
|
||||
body: JSON.stringify({ plan: PLAN, timing: timing, email: userEmail, name: userName })
|
||||
})
|
||||
.then(function(r) { return r.json(); })
|
||||
.then(function(data) {
|
||||
@@ -117,11 +122,17 @@ fn main() -> Void {
|
||||
});
|
||||
}
|
||||
|
||||
fetchAndMount();
|
||||
var tNow = document.getElementById('timing-now');
|
||||
var tLater = document.getElementById('timing-later');
|
||||
if (tNow) tNow.addEventListener('change', fetchAndMount);
|
||||
if (tLater) tLater.addEventListener('change', fetchAndMount);
|
||||
// Don't init Stripe at page load — wait for auth.
|
||||
// checkout-auth.el calls window.initStripe(email, name) after sign-in.
|
||||
window.initStripe = function(email, name) {
|
||||
userEmail = email || '';
|
||||
userName = name || '';
|
||||
fetchAndMount();
|
||||
var tNow = document.getElementById('timing-now');
|
||||
var tLater = document.getElementById('timing-later');
|
||||
if (tNow) tNow.addEventListener('change', fetchAndMount);
|
||||
if (tLater) tLater.addEventListener('change', fetchAndMount);
|
||||
};
|
||||
|
||||
var form = document.getElementById('payment-form');
|
||||
if (form) form.addEventListener('submit', async function(e) {
|
||||
|
||||
Reference in New Issue
Block a user