Versions Compared
Key
- This line was added.
- This line was removed.
- Formatting was changed.
Artykuł zawiera opis metody wykorzystywanej do powiązania koszyka wraz z przykładem implementacji metody w języku PHP.
Na tej stronie:
Table of Contents | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Opis metody
Metoda służąca do inicjalizacji procesu wiązania koszyka z wykorzystaniem jednej z dwóch metod: qrCode lub numer telefonu oraz przekazująca informacje o przeglądarce w celu dodanie przeglądarki do zaufanych.
Info |
---|
W danej metodzie wymagamy implementacji wszystkich pól wymienionych w tabeli, ponieważ składają się na całość usługi InPost Pay. Część poniższych pól w kolumnie 'Wymagalność' jest oznaczona jako 'O' tj. opcjonalna ze względu na to, że nie wszystkie produkty/koszyki w sklepach internetowych mają przypisane wszystkie parametry, więc koszyk może zostać utworzony, a zamówienie złożone bez nich. Jednak implementacja/wdrożenie wszystkich pól jest biznesowo WYMAGANE. |
Parameters
Nazwa pola | Opis | Typ | Wymagalność | Dodatkowe uwagi |
| Unikalny identyfikator koszyka nadawany przez merchanta | string | Y |
|
Request
Nazwa pola | Opis | Typ | Wymagalność | Dodatkowe uwagi |
| Wybrana forma wiązania koszyka dostępne dwie metody [ PHONE, DEEP_LINK ]. PHONE – przekazujemy, jeśli widget w metodzie iziGetPayData przekazał parametry prefix- prefiks numeru telefonu; phoneNumber- numer telefonu DEEP_LINK – przekazujemy, jeśli widget w metodzie iziGetPayData nie przekazał prefix i phoneNumber w iziGetPayData | string | O |
|
| Miejsce wiązania koszyka w sklepie merchanta (miejsce osadzenia widget). Dostępne miejsca: PRODUCT_CARD, BASKET_SUMMARY, ORDER_CREATE, BASKET_POPUP, THANK_YOU_PAGE, LOGIN_PAGE, CHECKOUT_PAGE, REGISTERFORM_PAGE, MINICART_PAGE. Przekazujemy wartość otrzymaną z widget z pola bindingPlace w iziGetPayData. PRODUCT_CARD - karta produktu BASKET_SUMMARY - podsumowanie koszyka ORDER_CREATE - etap tworzenia zamówienia BASKET_POPUP - panel boczny koszyka THANK_YOU_PAGE* - nie jest to miejsce bindowania, ale osadzenia widgetu, który powinien przyjąć dedykowaną formę Thank You Page po złożeniu zamówienia LOGIN_PAGE – strona logowania. CHECKOUT_PAGE – stona checkout REGISTERFORM_PAGE – strona rejestracji MINICART_PAGE - minikarta. | string | O |
|
| Obiekt służący do przekazania numeru telefonu, z którym ma być powiązany koszyk. Obiekt obligatoryjny tylko jeśli binding_method= PHONE. Dane pobierane z metody iziGetPayData | object | O |
|
| Prefix. Pobierane z prefix iziGetPayData i przekazywane w formacie z symbolem “+”. | string | Y | |
| Numer telefonu pobierany z phoneNumber iziGetPayData | string | Y | |
| Obiekt służący do przekazania informacji o przeglądarce, z której klient aktualnie korzysta i wykonuje wiązanie koszyka w celu dodania przeglądarki do zaufanych. | object | Y |
|
| User agent | string | Y | |
| Nazwa przeglądarki | string | O | |
| Platforma | string | Y | |
| Architektura | string | Y | |
| Data | string($date-time) | Y | |
| Lokalizacja | string | Y | |
| IP klienta | string | Y | |
| Port | string | Y |
Response
202 – pusty response w przypadku, gdy wiązanie następuje z wykorzystaniem numeru telefonu (binding_method= PHONE)
200
Response
Nazwa pola | Opis | Typ | Wymagalność | Dodatkowe uwagi |
| Wygenerowany qrCode | string | O |
|
| Deep link na systemy Android/iOs | String | O |
|
| Deep link na system HMS – obecnie nie wykorzystywany | String | O |
|
Status | ||||
---|---|---|---|---|
|
/v1/izi/basket/{basket_id}/binding
Przykładowy request
Code Block | ||
---|---|---|
| ||
{ "binding_method": "PHONE", "binding_place": "PRODUCT_CARD", "phone_number": { "country_prefix": "+48", "phone": "5xxxxxxxx" }, "browser": { "user_agent": "Testzilla 1.0", "description": "Test agent", "platform": "Ino Linux 2.0", "architecture": "x86-646", "data_time": "2023-08-24T08:52:01.113Z", "location": "-", "customer_ip": "127.0.0.1", "port": "8080" } } |
Przykład implementacji w języku PHP
Podanie kodu -
View file name implementacjaKlienta.txt
Info |
---|
W pliku implementacjaKlienta.txt została dodana tylko funkcja postBasketBinding. |
Code Block | ||
---|---|---|
| ||
/** * Client symfony implementation used for communication between Merchant and InPost Pay application. * * @param InpostPayBearerServiceInterface $inpostPayBearerService <p> Bearer service interface, * with contains creating bearer token which is required for communication with Inpost Pay </p> * */ final class InpostPayClient implements InpostPayClientInterface { private ClientInterface $client; private InpostPayURLCreatorInterface $URLCreator; private InpostPayBearerServiceInterface $bearerService; public function __construct( ClientInterface $client, InpostPayURLCreatorInterface $URLCreator, InpostPayBearerServiceInterface $bearerService ) { $this->client = $client; $this->URLCreator = $URLCreator; $this->bearerService = $bearerService; } public function postBasketBinding(string $basketId, BasketBindingRequest $requestBody): ?QrCodeData { if (BindingMethod::PHONE()->equals($requestBody->getBindingMethod()) && !$requestBody->getPhoneNumber()) { throw InpostPayPostBasketBindingException::createNoPhoneForPhoneBindingMethodException(); } $path = sprintf('basket/%s/binding', $basketId); $uri = new Uri($this->buildUri($path)); /** @var string $body */ $body = json_encode($requestBody); $request = new Request( 'POST', $uri, $this->provideDefaultClientHeaders(), $body ); try { $response = $this->client->sendRequest($request); $statusCode = $response->getStatusCode(); $content = $response->getBody()->getContents(); if (HttpResponseStatus::ACCEPTED()->getValue() === $statusCode) { return null; } if (HttpResponseStatus::OK()->getValue() === $statusCode) { /** * @var QrCodeDataArray $data */ $data = json_decode($content, true, 512, JSON_THROW_ON_ERROR); return QrCodeData::fromArray($data); } } catch (\Throwable $throwable) { throw InpostPayPostBasketBindingException::createResponseException($throwable); } throw InpostPayPostBasketBindingException::createBadStatusCodeException($statusCode, $content); } public function putBasket(string $basketId, Basket $basket): InpostBasketId { $path = sprintf('basket/%s', $basketId); $uri = new Uri($this->buildUri($path)); /** @var string $body */ $body = json_encode($basket); $request = new Request( 'PUT', $uri, $this->provideDefaultClientHeaders(), $body ); try { $response = $this->client->sendRequest($request); $content = $response->getBody()->getContents(); /** * @var array{inpost_basket_id: string} $responseData */ $responseData = json_decode($content, true, 512, JSON_THROW_ON_ERROR); return InpostBasketId::fromArray($responseData); } catch (\Throwable $throwable) { throw InpostPayPutBasketException::createResponseException($throwable); } } public function deleteBasketBinding(string $basketId, bool $ifBasketRealized = null): void { $path = sprintf('basket/%s/binding', $basketId); $uri = (new Uri($this->buildUri($path))) ->withQuery(Psr7\Query::build(['if_basket_realized' => $ifBasketRealized])); $request = new Request( 'DELETE', $uri, $this->provideDefaultClientHeaders() ); try { $response = $this->client->sendRequest($request); $statusCode = $response->getStatusCode(); $content = $response->getBody()->getContents(); } catch (\Throwable $throwable) { throw InpostPayDeleteBasketBindingException::createResponseException($throwable); } if (HttpResponseStatus::NO_CONTENT()->getValue() === $statusCode) { return; } throw InpostPayDeleteBasketBindingException::createBadStatusCodeException($statusCode, $content); } public function deleteBrowserBinding(string $browserId): void { $path = sprintf('browser/%s/binding', $browserId); $uri = new Uri($this->buildUri($path)); $request = new Request( 'DELETE', $uri, $this->provideDefaultClientHeaders() ); try { $response = $this->client->sendRequest($request); $statusCode = $response->getStatusCode(); $content = $response->getBody()->getContents(); } catch (\Throwable $throwable) { throw InpostPayDeleteBrowserBindingException::createResponseException($throwable); } if (HttpResponseStatus::NO_CONTENT()->getValue() === $statusCode) { return; } throw InpostPayDeleteBrowserBindingException::createBadStatusCodeException($statusCode, $content); } public function getSigningKey(string $version): SigningKeyResponse { $path = sprintf('signing-keys/public/%s', $version); $uri = new Uri($this->buildUri($path)); $request = new Request( 'GET', $uri, $this->provideDefaultClientHeaders() ); try { $response = $this->client->sendRequest($request); $statusCode = $response->getStatusCode(); $content = $response->getBody()->getContents(); if (HttpResponseStatus::OK()->getValue() === $statusCode) { /** * @var SigningKeyResponseArray $data */ $data = json_decode($content, true, 512, JSON_THROW_ON_ERROR); return SigningKeyResponse::fromArray($data); } } catch (\Throwable $throwable) { throw InpostPayGetSigningKeyException::createResponseException($throwable); } throw InpostPayGetSigningKeyException::createBadStatusCodeException($statusCode, $content); } public function getSigningKeys(): SigningKeysResponse { $path = 'signing-keys/public'; $uri = new Uri($this->buildUri($path)); $request = new Request( 'GET', $uri, $this->provideDefaultClientHeaders() ); try { $response = $this->client->sendRequest($request); $statusCode = $response->getStatusCode(); $content = $response->getBody()->getContents(); if (HttpResponseStatus::OK()->getValue() === $statusCode) { /** * @var SigningKeysResponseArray $data */ $data = json_decode($content, true, 512, JSON_THROW_ON_ERROR); return SigningKeysResponse::fromArray($data); } } catch (\Throwable $throwable) { throw InpostPayGetSigningKeysException::createResponseException($throwable); } throw InpostPayGetSigningKeysException::createBadStatusCodeException($statusCode, $content); } /** * @return array{ * Authorization: string, * Content-Type: string * } * * @throws InpostPayEndpointException */ private function provideDefaultClientHeaders(): array { return [ 'Authorization' => sprintf('Bearer %s', $this->bearerService->getBearerToken()), 'Content-Type' => 'application/json', ]; } private function buildUri(string $path): string { return sprintf( '%s%s', $this->URLCreator->create()->getUrl(), $path ); } } |
W SDK.zip zawiera się kod zawierający obiekt requestu oraz response endpointu.
View file | ||
---|---|---|
|