Shop Review A M9: Mindestbetrag 0,50 EUR (Stripe) und Sitzungsende direkt vor dem Stripe-Aufruf nachfuehren
berechne lehnt Gesamtbetraege unter 0,50 EUR mit dem Code mindestbetrag und einem Kaeufertext ab. legeBestellungAn schiebt expires_at um die seit Beginn vergangenen ganzen Sekunden (Warten auf Sperren) weiter und fuehrt ablaufAt auf denselben Wert nach, damit Stripes 30-Minuten-Minimum sicher bleibt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
cb6291410d
commit
d4b9e6a5b9
5 files changed
+55
-4
No files matched your search
@@ -257,6 +257,7 @@ export async function legeBestellungAn(ctx, eingabe, { now = new Date(), ipHash
|
||||
const geschlossen = () => fehler(409, 'geschlossen', GESCHLOSSEN_TEXT)
|
||||
if (!shop.stripeAccountId) throw geschlossen()
|
||||
const jetzt = new Date(now)
|
||||
const start = performance.now()
|
||||
const { positionen, lieferart, land } = istObjekt(eingabe) ? eingabe : {}
|
||||
|
||||
// 1. Pruefen, rechnen und reservieren: alles unter einer Sperre je Shop, damit der letzte Artikel nur einmal weggeht
|
||||
@@ -329,7 +330,18 @@ export async function legeBestellungAn(ctx, eingabe, { now = new Date(), ipHash
|
||||
})
|
||||
|
||||
// 2. Kasse bei Stripe starten (ausserhalb der Sperre: die offene Bestellung haelt den Bestand schon)
|
||||
const { orderId, token, bestellnummer, daten, ergebnis, produkte, sessionEnde } = angelegt
|
||||
const { orderId, token, bestellnummer, daten, ergebnis, produkte } = angelegt
|
||||
// Ende der Sitzung direkt vor dem Aufruf nachfuehren: die Zeit seit Beginn (Warten auf Sperren, Lesen) ganzer Sekunden schiebt es
|
||||
// weiter, damit Stripes Minimum von 30 Minuten sicher bleibt (30 s Reserve decken den Rest); ablaufAt folgt demselben Wert
|
||||
const sessionEnde = angelegt.sessionEnde + Math.floor((performance.now() - start) / 1000)
|
||||
if (sessionEnde !== angelegt.sessionEnde) {
|
||||
try {
|
||||
await updateDocument(col(), orderId, { ablaufAt: new Date(sessionEnde * 1000).toISOString() })
|
||||
} catch {
|
||||
await storniere(orderId, daten, 'stripe_fehler', jetzt).catch(() => {})
|
||||
throw fehler(503, 'zahlung_nicht_moeglich', ZAHLUNG_TEXT)
|
||||
}
|
||||
}
|
||||
const rueck = pruefeRueckUrl(eingabe?.rueckUrl, ctx)
|
||||
const metadata = { wkShop: '1', shopId: shop.id, orderId, bestellnummer }
|
||||
const parameter = (zahlungsarten) => ({
|
||||
|
||||
Reference in new issue
Block a user