2009-11-24 6 views
8

kwestia ta jest podobna do this one ale o skręcie (więc odpowiedź przyjęty do starszej pytanie nie jest ważny w następującym scenariuszu)ecommerce zarządzanie zapasami z bramki płatności zewnętrzny

Mam witryny do sprzedaży biletów (PHP/MYSQL). Załóżmy, że mam właśnie opuścił jeden bilet:

  • nabywcy stawia bilet w swoim koszyku i wychodzi na stronę bramy płatności (tj paypal.)
  • bilet jest zablokowany przez 5 minut, więc kupujący B nie można kupić to
  • kupującego czeka 5 minut z paypal otwartej stronie, nic nie robi
  • bilet jest odblokowany więc kupujący B stawia go w koszyk i idzie strona paypal
  • nabywcy wykonuje procedurę płatności na paypal z sukces
  • kupujący B wykonuje procedurę płatności na paypal z sukcesem

Mogę czekać dłużej, ale nie sądzę, że rozwiąże to problem w bardziej ogólnym przypadku. co więcej, jeśli to zrobię, będzie można zrobić coś w rodzaju DoS, blokując przedmioty na magazynie przez dłuższy czas.

jaki jest najlepszy sposób na obsłużenie tego scenariusza?

Odpowiedz

1

Co powiesz na bardziej społeczne rozwiązanie zamiast technicznego? Dlaczego nie ma absolutnie oczywiste, że bilet zostanie odblokowany, gdy zbyt długo zwlekasz?

+0

nie rozwiąże to problemu, ponieważ nawet jeśli jest to oczywiste, obaj płatnicy dokonają dwóch płatności prawnych za jeden przedmiot. – gpilotino

+0

Tak, masz rację, nie powstrzyma to jednego z dwóch klientów od zakupu biletu w opisany sposób. Można również powiedzieć, że pierwszy klient czekał długo. Może możesz uwzględnić swoją 5-minutową regułę w swoim żądaniu Paypal ...? –

+0

w tym przypadku pojawia się pytanie: czy (wszystkie) bramki płatności obsługują (konfigurowalne) limity czasu? nawet jeśli to rozwiąże tylko pierwszą połowę =) – gpilotino

6

Wszystkie bramki płatnicze wykonają odświeżenie, aby poinformować (np.) O kwocie płatności itp. Większość będzie również przekazywać informacje o autoryzacji/uwierzytelnieniu, takie jak wyniki kontroli CSC/CVV2, tak aby użytkownik (sprzedawca) miał ostateczne zdanie czy przyjąć płatność czy nie.

Po otrzymaniu odrzutu zwrotnego, powinieneś być w stanie sprawdzić, czy bilet jest nadal "zablokowany", a jeśli nie, dokonać zwrotu płatności za pośrednictwem bramki płatności, aby anulować płatność. Następnie musisz wyświetlić komunikat "przepraszamy, przekroczenie limitu czasu, spróbuj ponownie"

Jeśli bramka nie obsługuje funkcji stylu "natychmiastowego odwrócenia", to przynajmniej będzie obsługiwać jakąś funkcję "nieważną", dzięki której fundusze będą w rzeczywistości nigdy nie została pobrana z karty klienta, a wstrzymanie autoryzacji automatycznie znika (zwykle po dwóch dniach, chociaż na niektórych kartach może to potrwać dłużej). Dla (mam nadzieję, że mała) liczba transakcji, które upłynęły, może to być dopuszczalne. Warto monitorować, ile transakcji upłynął, aby można było skorygować limit czasu.

Alternatywnie, jeśli bilet nie jest już zamknięty, (i ponownie, jeśli brama go obsługuje) odeślij zwrot płatności.

+0

afaik oddzwonienie dzieje się po tym, jak płatność się zwiększyła, tak więc obaj użytkownicy znajdą nagle mniej pieniędzy na swoim cc. popraw mnie, jeśli się mylę, ale to będzie odpowiednik ręcznego przejścia do bramki płatności i sprawdzenia "nie akceptuj tej płatności" (odwrócenie płatności zazwyczaj trwa kilka dni, więc chcę uniknąć radzenia sobie z tysiącami p .r.). – gpilotino

+0

Nie mogę mówić za każdą bramkę, ale wiem, że większość brytyjskich zezwala na wysłanie wiadomości zwrotnej, aby anulować płatność. Jest to natychmiastowe odwrócenie i nie trzeba zwykle upuszczać dwóch lub więcej dni. – PaulG

+0

miło wiedzieć, powiadomię o tym dziękuję – gpilotino

1

Myślę, że nie należy blokować biletu, jeśli ktoś umieści go w swoim wózku, tak jak w tych 5 minutach. może skończyć się wyjazdem kilku innych klientów ...

Proponuję, aby każdy mógł dodać bilet do swojego koszyka, chyba że ktoś faktycznie dokona płatności i ją kupi. Teraz, gdy inni przystępują do kasy, po prostu zapisz wiadomość jako "Przepraszam za spóźnienie ... Bilet wyprzedany !!!" i bilet należy usunąć z koszyka.

W ten sposób bilet nie zostanie zablokowany przez klientów, a scenariusz dwóch osób dokonujących płatności za ten sam bilet nie zostanie zrealizowany.

+3

wiesz, czy płatność zostanie pomyślnie zakończona dopiero po sfinalizowaniu. jeśli obaj użytkownicy już korzystają z płatności (np.strona paypal), której nie kontrolujesz: obaj zapłacą (na paypal) za ostatni bilet. – gpilotino

2

Jest bardzo prawdopodobne, że nie można korzystać z zewnętrznej strony bramy płatności i robić to, co próbujesz zrobić.

Paypal i wiele innych procesorów ma bezpośrednią ścieżkę integracji usług internetowych. Oznacza to, że zbierasz informacje o płatnościach na swojej stronie, zostaje ona przesłana na Twój serwer, a Ty nawiązujesz połączenie z serwisem i otrzymujesz natychmiastową odpowiedź od procesora. (Nie pamiętam, co firma PayPal nazywa produktem, który to robi, ale kiedyś nosiła nazwę PayFlow Pro i została kupiona od Verisign.)

Nie zamykaj biletów, gdy są one umieszczone w koszyku. Twój przepływ pracy będzie następujący:

  1. Zbierz informacje o płatnościach.
  2. Po przesłaniu informacji o płatności do serwera: a. Spróbuj zablokować bilety - niepowodzenie zwrotu, jeśli nie jest dostępne b. Po pomyślnym zablokowaniu autoryzacja procesu
  3. Po pomyślnej autoryzacji bilety zostaną usunięte z dostępnej puli.
  4. Po niepomyślnej autoryzacji lub błędzie bilety są odblokowane i dostępne dla innych użytkowników.

Nie trzeba zajmować się przekroczeniem czasu blokady. Są one zablokowane tylko na czas weryfikacji prawidłowej płatności.

Nie pytałeś o rozwiązanie problemu, zapobiegając ekspozycji PCI. Ponieważ prawdopodobnie zapytasz:

Dostępne są procesory, które umożliwiają osadzenie kolekcji informacji o płatnościach na własnej stronie. Niektóre z nich umożliwiają uzyskanie "tokena", który zastąpi numer karty, aby twój serwer nigdy nie otrzymał numeru karty. Token może być następnie użyty w wywołaniu usługi WWW po stronie serwera. Dostajesz to, czego potrzebujesz i nie musisz zajmować się problemami PCI związanymi z otrzymywaniem numerów kart.