Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4ca793ee2c | |||
| 69f348d48b |
+2
-2
@@ -13,7 +13,7 @@ extern fn el_script_inline(code: String) -> String
|
|||||||
extern fn el_nav(attrs: String, children: String) -> String
|
extern fn el_nav(attrs: String, children: String) -> String
|
||||||
extern fn el_div(attrs: String, children: String) -> String
|
extern fn el_div(attrs: String, children: String) -> String
|
||||||
extern fn el_a(href: String, attrs: String, children: String) -> String
|
extern fn el_a(href: String, attrs: String, children: String) -> String
|
||||||
extern fn el_img(attrs: String) -> String
|
extern fn el_img(src: String, alt: String, attrs: String) -> String
|
||||||
extern fn el_p(attrs: String, children: String) -> String
|
extern fn el_p(attrs: String, children: String) -> String
|
||||||
extern fn el_h1(attrs: String, text: String) -> String
|
extern fn el_h1(attrs: String, text: String) -> String
|
||||||
extern fn el_button(attrs: String, label: String) -> String
|
extern fn el_button(attrs: String, label: String) -> String
|
||||||
@@ -520,7 +520,7 @@ fn account_css() -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn account_nav() -> String {
|
fn account_nav() -> String {
|
||||||
let logo_img: String = el_img("src=\"/assets/brand/neuron-wordmark-on-light.png\" srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" alt=\"Neuron\" height=\"28\"")
|
let logo_img: String = el_img("/assets/brand/neuron-wordmark-on-light.png", "Neuron", "srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" height=\"28\"")
|
||||||
el_nav(
|
el_nav(
|
||||||
"id=\"nav\"",
|
"id=\"nav\"",
|
||||||
el_div(
|
el_div(
|
||||||
|
|||||||
+14
-11
@@ -699,21 +699,24 @@ fn handle_request_inner(method: String, path: String, headers: Map, body: String
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free tier: $0 PaymentIntent for age verification (18+ requirement).
|
// Free tier: SetupIntent for age verification (18+ requirement).
|
||||||
// Verifies card is valid. No charge, no capture.
|
// Verifies card is valid and saves it. No charge, no capture.
|
||||||
// Note: setup_future_usage cannot be used with amount=0.
|
// $0 PaymentIntents are rejected by Stripe; SetupIntent is the correct tool.
|
||||||
if str_eq(plan, "free") {
|
if str_eq(plan, "free") {
|
||||||
let free_pi_body: String = "amount=0"
|
let si_body: String = "automatic_payment_methods[enabled]=true"
|
||||||
+ "¤cy=usd"
|
+ "&usage=off_session"
|
||||||
+ "&payment_method_types[]=card"
|
|
||||||
+ "&metadata[plan]=free"
|
+ "&metadata[plan]=free"
|
||||||
+ "&metadata[purpose]=age_verification"
|
+ "&metadata[purpose]=age_verification"
|
||||||
let free_pi_body = if !str_eq(pi_cus_id, "") { free_pi_body + "&customer=" + pi_cus_id } else { free_pi_body }
|
let si_body = if !str_eq(pi_cus_id, "") { si_body + "&customer=" + pi_cus_id } else { si_body }
|
||||||
let free_pi_resp: String = http_post_form_auth(
|
let si_resp: String = http_post_form_auth(
|
||||||
"https://api.stripe.com/v1/payment_intents",
|
"https://api.stripe.com/v1/setup_intents",
|
||||||
free_pi_body,
|
si_body,
|
||||||
auth_header)
|
auth_header)
|
||||||
return free_pi_resp
|
if str_starts_with(si_resp, "{") {
|
||||||
|
let inner: String = str_slice(si_resp, 1, str_len(si_resp))
|
||||||
|
return "{\"setup_mode\":true,\"plan\":\"free\"," + inner
|
||||||
|
}
|
||||||
|
return si_resp
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup-mode path: save payment method, do not charge. Only valid
|
// Setup-mode path: save payment method, do not charge. Only valid
|
||||||
|
|||||||
Reference in New Issue
Block a user