stripe-confirm-and-capture-payment
Stripe secret key (sk_test_... for test mode)
import sys
import os
import subprocess
import time
import urllib.request
import json
# ─────────────────────────────────────────
# PRE_EXECUTION
# ─────────────────────────────────────────
for attempt in range(2):
try:
req = urllib.request.Request(
"https://checklist.day/api/registry/stripe",
headers={"User-Agent": "checklist-agent/1.0"}
)
with urllib.request.urlopen(req, timeout=10) as resp:
registry = json.loads(resp.read())
break
except Exception as e:
if attempt == 1:
print(f"ABORT: registry unreachable — {e}")
sys.exit(1)
time.sleep(2)
warnings = registry.get("warnings", [])
if warnings:
print("[stripe] WARNINGS:")
for w in warnings if isinstance(warnings, list) else [warnings]:
print(f" ⚠ {w}")
# ─────────────────────────────────────────
# EXECUTION
# ─────────────────────────────────────────
subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "stripe>=7.0.0"])
import stripe
STRIPE_SECRET_KEY = os.environ.get("STRIPE_SECRET_KEY")
if not STRIPE_SECRET_KEY:
print("ABORT: STRIPE_SECRET_KEY not set"); sys.exit(1)
if not STRIPE_SECRET_KEY.startswith("sk_test_"):
print("ABORT: use test mode key (sk_test_...)"); sys.exit(1)
stripe.api_key = STRIPE_SECRET_KEY
AMOUNT_CENTS = 2000
# 1. Create PaymentIntent with manual capture
# FOOTGUN: capture_method="manual" required for separate authorize + capture flow
intent = stripe.PaymentIntent.create(
amount=AMOUNT_CENTS,
currency="usd",
capture_method="manual",
payment_method_types=["card"],
idempotency_key=f"checklist-confirm-{int(time.time())}",
)
payment_intent_id = intent.id
print(f" created: {payment_intent_id} (capture_method=manual)")
# 2. Confirm with test card
# FOOTGUN: pm_card_visa is the standard test card token — works without 3DS
intent = stripe.PaymentIntent.confirm(
payment_intent_id,
payment_method="pm_card_visa",
return_url="https://checklist.day",
)
confirmed_status = intent.status
print(f" confirmed: status={confirmed_status}")
# 3. Capture
# FOOTGUN: capture only works when status is "requires_capture"
intent = stripe.PaymentIntent.capture(payment_intent_id)
captured_status = intent.status
amount_captured = intent.amount_received
print(f" captured: status={captured_status} amount={amount_captured}")
# ─────────────────────────────────────────
# POST_EXECUTION
# ─────────────────────────────────────────
assert confirmed_status == "requires_capture", f"FAIL: expected requires_capture, got {confirmed_status}"
assert captured_status == "succeeded", f"FAIL: expected succeeded, got {captured_status}"
assert amount_captured == AMOUNT_CENTS, f"FAIL: expected {AMOUNT_CENTS}, got {amount_captured}"
result = {
"payment_intent_id": payment_intent_id,
"confirmed_status": confirmed_status,
"captured_status": captured_status,
"amount_captured": amount_captured,
}
print(json.dumps(result, indent=2))
print("PASS")