E-Commerce-Bestandsverwaltung mit externem Zahlungsgateway

8

Diese Frage ist ähnlich wie diese , aber mit einer Wendung (so die Antwort akzeptiert für die ältere Frage ist im folgenden Szenario nicht gültig)

Ich habe eine Website für den Verkauf von Tickets (PHP / MySQL). Angenommen, ich habe nur noch ein Ticket:

  • Käufer A legt das Ticket in ihren Einkaufswagen und geht zur Zahlungs-Gateway-Seite (dh Paypal)
  • Das Ticket ist für 5 Minuten gesperrt, also kann Käufer B es nicht kaufen
  • Käufer A wartet 5 Minuten mit offener Paypal-Seite, ohne etwas zu tun
  • Das Ticket ist nicht gesperrt, so dass Käufer B es in seinen Warenkorb legt und die paypal-Seite
  • aufruft
  • Käufer A führt den Zahlungsvorgang bei paypal mit Erfolg aus
  • Käufer B führt den Zahlungsvorgang bei paypal mit Erfolg aus

Ich kann länger warten, aber ich denke nicht, dass dies das Problem im allgemeineren Fall lösen wird. Außerdem, wenn ich das tue, wird es möglich sein, eine Art von DoS zu machen und die Artikel auf Lager für längere Zeit zu sperren.

Was ist der beste Weg, um dieses Szenario zu behandeln?

    
gpilotino 24.11.2009, 21:58
quelle

4 Antworten

6

Alle Zahlungs-Gateways führen ein Postback durch, um Sie (zB) über die Zahlungsreferenz usw. zu informieren. Die meisten werden auch Autorisierungs- / Authentifizierungsinformationen wie CSC / CVV2-Prüfergebnisse zurückgeben, damit Sie (der Händler) das letzte Wort haben ob die Zahlung akzeptiert wird oder nicht.

Nach Erhalt des Postbacks sollten Sie prüfen können, ob das Ticket noch "gesperrt" ist, und wenn nicht, dann eine Zahlungsstornierung über das Zahlungsgateway veranlassen, um die Zahlung zu stornieren. Sie müssen dann eine Nachricht anzeigen "sorry, Timeout überschritten, bitte versuchen Sie es erneut"

Wenn das Gateway keine "Instant-Reversal" -Funktionalität unterstützt, dann werden sie zumindest eine Art von "Leere" -Funktionalität unterstützen, wobei die Gelder niemals wirklich von der Kundenkarte genommen werden, und die Autorisierungssperre automatisch abfällt nach zwei Tagen, obwohl es bei einigen Karten länger dauern kann). Für die (hoffentlich kleine) Anzahl von Transaktionen, die eine Zeitüberschreitung aufweisen, kann dies akzeptabel sein. Es würde sich lohnen, zu überwachen, wie viele Transaktionen auslaufen, so dass die Zeitüberschreitung angepasst werden kann.

Wenn das Ticket nicht mehr gesperrt ist (und wenn das Gateway dies unterstützt), senden Sie alternativ eine Rückerstattungszahlung zurück.

    
PaulG 25.11.2009 13:44
quelle
2

Es ist wahrscheinlich, dass Sie keine Einstiegsseite für ein externes Zahlungsgateway verwenden können und das tun, was Sie versuchen zu tun.

Paypal und viele andere Prozessoren haben eine direkte Webservice-Integrationsroute. Das bedeutet, dass Sie die Zahlungsinformationen auf Ihrer Seite erfassen, sie an Ihren Server gesendet werden und Sie den Web-Service-Anruf tätigen und eine sofortige Antwort vom Prozessor erhalten. (Ich erinnere mich nicht, wie PayPal das Produkt nennt, das das tut, aber es hieß früher PayFlow Pro und wurde von Verisign gekauft.)

Sie sperren also die Tickets nicht, wenn sie in den Einkaufswagen gelegt werden. Ihr Workflow wäre:

  1. Zahlungsinformationen sammeln.
  2. Sobald die Zahlungsinformationen an Ihren Server gesendet wurden: ein. Versuchen Sie, die Tickets zu sperren - geben Sie einen Fehler zurück, wenn dieser nicht verfügbar ist b. Bei erfolgreicher Sperre Prozessberechtigung
  3. Nach erfolgreicher Autorisierung werden Tickets aus dem verfügbaren Pool entfernt.
  4. Bei fehlgeschlagener Autorisierung oder fehlendem Fehler sind Tickets für andere Benutzer freigegeben und verfügbar.

Sie müssen sich nicht mit Sperrzeitüberschreitungen befassen. Sie sind nur lange genug gesperrt, um eine gültige Zahlung zu bestätigen.

Sie haben nicht darum gebeten, das Problem zu lösen und gleichzeitig die PCI-Exposition zu verhindern. Da wirst du wahrscheinlich fragen:

Es gibt Prozessoren, mit denen Sie die Zahlungsinformationensammlung in Ihre eigene Seite einbetten können. Es gibt einige, die es Ihnen ermöglichen, ein "Token" zu erhalten, um eine Kartennummer zu ersetzen, so dass Ihr Server niemals eine Kartennummer erhält. Das Token kann dann auf dem serverseitigen Web-Service-Aufruf verwendet werden. Sie bekommen, was Sie brauchen, und Sie müssen sich nicht mit PCI-Problemen rund um den Erhalt von Kartennummern auseinandersetzen.

    
Nathan 05.12.2009 07:05
quelle
1

Wie wäre es mit einer eher sozialen als einer technischen Lösung? Warum sollte es nicht absolut offensichtlich sein, dass ein Ticket freigeschaltet wird, wenn Sie zu lange warten?

    
Peter Stuifzand 24.11.2009 22:37
quelle
1

Ich denke, du solltest das Ticket nicht blockieren, wenn jemand es in seinen Einkaufswagen legt wie in diesen 5 Minuten. Sie könnten am Ende einige andere Kunden vertreiben ...

Ich schlage vor, dass Sie jedem erlauben, das Ticket in seinen Warenkorb zu legen, es sei denn, jemand nimmt die Zahlung tatsächlich vor und kauft sie. Wenn nun andere zur Kasse gehen, blicke einfach eine Nachricht als "Entschuldigung, du bist spät ... Ticket ausverkauft !!!" und Ticket sollte aus ihrem Warenkorb entfernt werden.

Auf diese Weise wird das Ticket nicht von Ihren Kunden blockiert und das Szenario, dass zwei Personen die Zahlung für dasselbe Ticket tätigen, wird nicht auftreten.

    
Aditya 02.12.2009 18:46
quelle