Interfejs API jest zgodny z zestawem standardów interfejsów API HTTP i obsługuje mechanizm idempotentności, który ułatwia ścisłą integrację.
Adresy URL hostowane przez Google
Dokumentacja poszczególnych metod hostowanych przez Google zawiera podstawowy adres URL, który obejmuje nazwę metody i numer wersji głównej. Pełny adres URL tworzy się, dodając na końcu identyfikator konta integratora płatności elementu wywołującego. Na przykład dokumentacja hostowanej przez Google metody echa zawiera adres URL:
https://vgw.googleapis.com/gsp/refundable-one-time-payment-code-v1/echo
Jeśli identyfikator konta integratora płatności użytkownika wywołującego to INTEGRATOR_1
, należy go dodać na końcu adresu URL, by otrzymać:
https://vgw.googleapis.com/gsp/refundable-one-time-payment-code-v1/echo/INTEGRATOR_1
Adresy URL hostowane przez partnera
Dokumentacja poszczególnych metod API hostowanych przez partnerów zawiera podstawowy adres URL, który obejmuje nazwę metody i numer wersji głównej. Partner nie powinien dołączać identyfikatora konta integratora płatności (PIAID
) w adresach URL, które hostuje.
Piaskownica i środowiska produkcyjne
Google hostuje interfejs API kodu płatności jednorazowej zarówno w piaskownicy (w celach dotyczących programowania i testowania), jak i w środowisku produkcyjnym. Żądania w środowisku piaskownicy Google nie skutkują żadną rzeczywistą odpowiedzialnością finansową. Środowisko piaskownicy i środowisko produkcyjne są całkowicie oddzielone i nie współużytkują kluczy ani danych dotyczących transakcji.
Google oczekuje, że Twoja piaskownica będzie stale dostępna, ponieważ będziemy jej używać, by najpierw przetestować zmiany i nowe funkcje.
Ścieżka bazowa piaskownicy Google
https://vgw.sandbox.google.com/gsp/
Ścieżka bazowa środowiska produkcyjnego Google
https://vgw.googleapis.com/gsp/
W tym przewodniku będą używane produkcyjne punkty końcowe.
Typ treści i kodowanie
Ładunki komunikatów, w których jest używane szyfrowanie PGP, muszą korzystać z typu treściapplication/octet-stream; charset=utf-8
.
Ładunki komunikatów, w których jest używane szyfrowanie JWE, muszą korzystać z typu treści
application/jose; charset=utf-8
.
Treści żądań muszą być wysyłane przy użyciu kodowania base64url, zgodnie z definicją w dokumencie rfc4648 §5.
Kody stanów HTTP
Interfejsy API kodu płatności jednorazowej zostały zaprojektowane w taki sposób, aby zwracać kod stanu HTTP 200
w przypadku wszystkich żądań, które może przetworzyć serwer. Obejmuje to zarówno udane, jak i odrzucone żądania z punktu widzenia logiki biznesowej lub aplikacji. Żądania, których nie można przetworzyć, nie powinny zwracać kodu stanu HTTP 200
, ponieważ reprezentują błąd występujący między Google a partnerem. Zamiast tego odpowiedź interfejsu API powinna używać odpowiednich kodów stanu HTTP przedstawionych poniżej, z opcjonalnym obiektem ErrorResponse
.
Błędy HTTP i ich przyczyny | |
---|---|
400 |
BAD REQUEST
Klient podał nieprawidłowy argument. Ten kod błędu może też być zwracany, jeśli operacja została odrzucona, ponieważ system nie znajduje się w stanie wymaganym do jej wykonania. Należy go użyć, jeśli kolejne próby żądania nie mogą się powieść, dopóki stan systemu nie zostanie bezpośrednio poprawiony. Jeśli na przykład żądanie zwrotu środków kończy się niepowodzeniem, ponieważ odwołuje się do nieistniejącego zapisu, ponowne próby nie powiodą się, dopóki zapis nie pojawi się w systemie integratora.
|
401 |
UNAUTHORIZED
Żądanie nie ma prawidłowych danych uwierzytelniających dla tej operacji. Kod 401 powinien być na przykład zwracany w przypadku nieprawidłowych lub nieznanych podpisów. |
403 |
FORBIDDEN / PERMISSION DENIED
Element wywołujący nie ma uprawnień do wykonania określonej operacji. |
404 |
NOT FOUND
Nie znaleziono żądanego elementu, takiego jak płatność lub użytkownik. |
409 |
CONFLICT / ABORTED
Operacja została przerwana, najczęściej z powodu problemu równoczesności, np. w przypadku nieudanych kontroli sekwencera, przerwanych transakcji itp. |
412 |
PRECONDITION FAILED
Tego kodu należy używać w sytuacjach, gdy klucz idempotentności jest używany ponownie z innymi parametrami. |
429 |
RESOURCE EXHAUSTED / TOO MANY REQUESTS
Jeden z zasobów systemowych został wyczerpany. |
499 |
CANCELLED
Operacja została anulowana (zwykle przez element wywołujący). |
500 |
INTERNAL ERROR
Błędy wewnętrzne. Oznacza to, że pewne niezmienniki oczekiwane przez system bazowy zostały uszkodzone. |
501 |
UNIMPLEMENTED
Operacja nie jest wdrożona, obsługiwana lub włączona w tej usłudze. |
503 |
UNAVAILABLE
Usługa jest obecnie niedostępna. Jest to najczęściej stan przejściowy, który można rozwiązać, ponawiając próbę. |
504 |
GATEWAY TIMEOUT / DEADLINE EXCEEDED
Termin upłynął przed wykonaniem operacji. W przypadku operacji, które zmieniają stan systemu, ten błąd może zostać zwrócony nawet wówczas, gdy operacja zakończyła się pomyślnie. Na przykład pomyślna odpowiedź serwera mogła być tak opóźniona, że termin upłynął. |
Idempotentność żądań
Idempotentność żądań to podstawowa strategia używana w interfejsach API kodu płatności jednorazowej stosowana w celu zapewnienia niezawodności i odporności na awarie systemowych interakcji między Google a partnerami. Żądania idempotentne to żądania, które można wysyłać wielokrotnie, ale ich efekt jest taki sam jak żądania pojedynczego. Strategia ta ułatwia zachowanie spójności wynikowej między systemami przez zapewnienie bezpieczeństwa wykonywania ponownych prób, co pozwala naszym systemom osiągać zgodność co do stanu zasobu.
Nasz interfejs API wykorzystuje idempotentność do:
- ograniczania problemów związanych z uzgadnianiem dzięki ułatwianiu śledzenia i kontrolowania wszystkich działań;
- zapobiegania sytuacjom wyścigu dzięki osiągnięciu tego, że wiele identycznych żądań od tego samego klienta nie prowadzi do różnych stanów końcowych;
- minimalizacji stanu dzięki umożliwieniu rozumienia żądań w izolacji, czego efektem jest większa wydajność i przepustowość ze względu na mniejsze obciążenie serwera związane z przechowywaniem danych;
- unikania konieczności stosowania dodatkowych pól wskazujących, czy żądanie jest ponowną próbą.
Przykłady
Przykład 1. Utrata połączenia przed otrzymaniem odpowiedzi
Scenariusz:
- Google wysyła żądanie zapisu transakcji do integratora.
- Serwer integratora odbiera to żądanie i przetwarza je.
- Serwer Google traci zasilanie przed otrzymaniem odpowiedzi w kroku nr 2.
- Zasilanie serwera Google zostaje przywrócone i to samo żądanie zapisu transakcji jest wysyłane z tymi samymi parametrami (taki sam identyfikator i szczegóły żądania, ale zaktualizowany element
requestTimestamp
) do serwera integratora.
Wynik:
W tym przypadku serwer integratora musi udzielić takiej samej odpowiedzi jak w kroku nr 2, ponieważ wszystkie parametry z wyjątkiem responseTimestamp
są takie same.
Konto użytkownika zostaje obciążone tylko raz, w kroku nr 2. Zdarzenie z kroku nr 4 nie ma żadnych skutków finansowych dla użytkownika.
Przykład 2. Żądanie wysłane do serwera poddawanego konserwacji
Scenariusz:
- Baza danych na serwerze integratora nie działa z powodu konserwacji.
- Google wysyła żądanie do integratora.
- Integrator prawidłowo zwraca kod stanu
UNAVAILABLE
. - Serwer Google odbiera odpowiedź i planuje ponowienie próby.
- Baza danych na serwerze integratora zostaje przywrócona online.
- Google ponownie wysyła żądanie z kroku nr 2 (taki sam identyfikator i szczegóły żądania, ale zaktualizowany element
requestTimestamp
). Zwróć uwagę, że identyfikatory obu żądań muszą być takie same. - Serwer integratora otrzymuje żądanie i zwraca kod stanu OK wraz z pełną odpowiedzią.
Wynik:
W tym przypadku serwer integratora musi przetworzyć żądanie w kroku nr 7 i nie może zwrócić kodu HTTP 503
(UNAVAILABLE
). Zamiast tego powinien do końca przetworzyć żądanie i zwrócić kod OK z odpowiednim komunikatem. Zwróć uwagę, że gdy system jest w stanie UNAVAILABLE
, Google może wielokrotnie wysłać żądania podobne do wysłanego w kroku nr 2. Każde takie żądanie powinno skutkować zwróceniem komunikatu podobnego do zwróconego w kroku nr 3.
W konsekwencji wystąpią kroki 6 i 7.
Przykład 3. Ponawiany komunikat nie pasuje do początkowego komunikatu z powodu błędu odzyskiwania
Scenariusz:
- Google wysyła żądanie do integratora.
- Serwer integratora odbiera to żądanie i przetwarza je.
- Serwer Google traci zasilanie przed otrzymaniem odpowiedzi w kroku nr 2.
- Zasilanie serwera Google zostaje przywrócone i podejmuje on próbę wysłania tego samego żądania, ale niestety niektóre parametry są inne.
Wynik:
W tym przypadku serwer integratora powinien udzielić odpowiedzi z kodem błędu HTTP 412
(PRECONDITION FAILED
), który informuje Google, że w tym systemie występuje błąd.