24
2012
Paczkomaty InPost cz.1 – Import danych o paczkomatach
Od 2008 roku widzimy wykładniczy rozwój systemu skrytek pocztowych w postaci „Paczkomatów”. W kolejnych krajach usługa ta jest uruchamiana (Chile, Czechy, Słowacja…). W komunikatach prasowych czytamy o kosmicznych sumach pieniędzy inwestowanych w ten system. Ma to przełożenie na klientów, którzy coraz częściej wybierają tą formę wysyłki, ze względu na całodobową możliwość odbioru zamówionego towaru. Za ciosem idą sklepy, integrując się z systemem inPostu.
Integrację z paczkomatami przedstawię w postaci kilku części.
Ten będzie opisywał pierwszy etap – Import danych o paczkomatach do bazy danych sklepu.
Nie będę opisywać tutaj API z dokumentacji technicznej. Postanowiłem napisać swój krótki skrypt do odbioru potrzebnych informacji. Pełną dokumentację techniczną środowiska API znajdziecie na dole strony: http://www.paczkomaty.pl/paczkomaty_inpost_integracja,25.html
Możecie zapytać, po co trzymać dane o paczkomatach w swojej bazie, skoro można te informacje otrzymywać w locie na bieżąco odpytując serwer inPost?
Z doświadczenia wiem, że serwery inPostu zwyczajnie czasem przez kilka/kilkanaście minut nie dają żadnej odpowiedzi, padają/konserwacje? Powoduje to problem, gdy klient w trakcie składania zamówienia zechce wybrać inny paczkomat niż ma przypisany w swoim profilu. Nie wie co się dzieje i przerywa proces zakupu.
Tyle wstępu ;) przejdźmy do konkretnego przykładu.
Lista działających paczkomatów jest dostępna pod adresem:
1 |
http://api.paczkomaty.pl/?do=listmachines_csv |
Odpalając powyższy link widzimy tekst w formacie CSV.
- W tym pliku jest lista tylko działających maszyn. Jeżeli któraś jest nieczynna, nie będzie jej na liście. Więc nie zdziwcie się, że pewnego dnia nie będzie wybranego paczkomatu. Dlatego też należy czyścić tabelę w swojej BD i uzupełniać ją na nowo danymi.
- Każda linijka opisuje jeden paczkomat.
W pliku zawarte są informacje takie jak (wg. kolejności):
- Symbol paczkomatu – Symbol ten odpowiada temu, który wpisujecie w panelu paczkomatów jako sklep w trakcie wypisywania etykiety do wysyłki. Warto to mieć w podglądzie zamówienia. Czasem klient wybiera inny paczkomat w trakcie zakupów niż ten, który ma ustawiony w systemie paczkomatów.
- Nazwa ulicy.
- Numer budynku przy którym znajduje się paczkomat.
- Kod pocztowy rejonu, w którym znajduje się paczkomat.
- Miasto.
- Szerokość geograficzna.
- Długość geograficzna.
- Możliwość odbioru paczki za pobraniem – Przyjmuje wartości t (true, można płacić za pobraniem) oraz f (false, brak płatności).
- Godziny dostępności – Jest to zwykły tekst, np: „Paczkomat: 24/7”.
- Opis lokalizacji – Opis miejsca, w którym znajduje się paczkomat. Ma to na celu ułatwienie klientowi odnalezienie maszyny. Nie zawsze jest to proste :) Już testowałem szukając wokół Stokrotki, gdzie jest paczkomat. Okazało się, że był ukryty, głęboko w środku… o_O
- Opis miejsca w przypadku płatności za pobraniem. Także tą informację należałoby wyświetlić klientowi przy potwierdzeniu zamówienia oraz w mailu.
- ID partnera (lokalizacja) – Gdy zadzwoniłem do działu technicznego z pytaniem, co to za pole, odpowiedziano: „To Pana nie interesuje”. Mają rację, nie jest to nam przydatne :)
- Obsługiwane formy płatności – Przyjmuje wartości od 0 do 3. Nie używam tego, skoro już wiem, że jest możliwość płacenia za pobraniem, z poprzednich parametrów.
Wszystkie te dane przydają się nam w momencie wyszukiwania najbliższego paczkomatu dla klienta wraz z jego dodatkowym opisem i możliwością opłaty za przesyłkę (za pobraniem).
Pobieramy go przez bibliotekę cURL i następnie parsujemy do tablicy. W międzyczasie sprawdzamy czy pobierane dane są poprawne i cały proces importu nie zawiera błędów.
Poniżej pełny skrypt importu wraz z opisem w komentarzach:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
$ch = curl_init('http://api.paczkomaty.pl/?do=listmachines_csv'); // inicjalizacja cURL wraz podaniem adresu curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // zwraca dane jako string $curl = curl_exec($ch); // wykonanie połączenia z podstawiniem danych do zmiennej $curl curl_close($ch); // // zamyka sesję cURL i zwalnia zasoby if ( $curl !== false ) { // sprawdzenie czy w ogóle coś zostało pobrane, w przypadku, gdy serwer paczkomatów padnie $t = preg_split('#[\n\r]+#', $curl); // rozdzielenie wierszy -> jeden wiersz = jeden paczkomat, oprócz pierwszej linii if ( count($t) > 300 ) { // dodatkowe sprawdzenie, w przypadku przerwania pobierania pliku CSV. Raczej nigdy nie zdarzy się, że liczba działających paczkomatów spadnie poniżej 300, dlatego też ustawiłem tą wartość. Jeżeli wartość będzie poniżej 300, wówczas skrypt informuje nas o błędnym pobraniu pliku CSV. tep_db_query("TRUNCATE TABLE paczkomaty"); // czyszczenie tabeli z paczkomatami. Ma to na wyeliminowanie paczkomatów, które mają chwilową awarię lub zostały usunięte. Pamiętamy, że w pliku CSV, są tylko działające paczkomaty. foreach ( $t as $v ) { $t2 = explode(';', $v); // dzielimy na fragmenty/pola każdy wiersz if ( count($t2) > 1 ) { // sprawdzenie, czy dana linijka/wiersz w pliku CSV zawiera informacje o paczkomacie. Wyeliminowanie pustych/śmieciowych wierszy bez znaku średnika. if ( $t2[0] != '' ) { // jeżeli jest symbol paczkomatu (jako pierwszy element tablicy) skrypt kontynuuje... $sql_array = array( 'symbol' => preg_replace('#[\s]#', '', $t2[0]), 'ulica' => trim($t2[1]), 'ulica_nr' => trim($t2[2]), 'kodpocz' => trim(preg_replace('#[\s]#', '', $t2[3])), 'miasto' => trim($t2[4]), 'geo_szer' => preg_replace('#[^0-9\.\,]#', '', $t2[5]), 'geo_dl' => preg_replace('#[^0-9\.\,]#', '', $t2[6]), 'pobranie' => preg_replace('#[^tf]#', '', $t2[7]), 'dostepny' => trim(preg_replace('##', '. ', $t2[8])), 'opis_lokal' => trim(preg_replace('##', '. ', $t2[9])), 'opis_oplat' => trim(preg_replace('##', '. ', $t2[10])), 'partner_id' => (int)$t2[11], 'platnosc_typ' => (int)$t2[12] ); // TUTAJ WSTAW własną instrukcję insert do tabeli paczkomatów dla zmiennej $sql_array } else { // jeżeli skrypt nie mógł przeparsować wiersza // twoja obsługa błędu, np: zapis błędu do pliku, wysłanie maila z info o błędzie } } // if ( count($t2) > 1 ) { } // foreach ( $t as $v ) { } // if ( count($t) > 300 ) { $q = tep_db_query("SELECT * FROM paczkomaty"); // kolejne sprawdzenie, czy ilość paczkomatów już po insercie jest mniejsza niż 300 $il_pacz = tep_db_num_rows($q); if ( $il_pacz < 300 ) { // jeżeli w bazie danych paczkomatów jest mniej niż 300, wówczas można być pewnym, że import poszedł w ... } echo 'Zaimportowano paczkomaty: ' . $il_pacz . ' | ' . date('d.m.Y / G:i:s') . " \n\n"; // można zapisać info do pliku/logów, ile paczkomatów zostało zaimportowanych } else { // wygenerowanie błędu, jeżeli nie można pobrać pliku CSV echo 'Błąd importu - Brak połączenia z serwerem Paczkomaty. Brak połączenia z serwerem API Paczkomatów.\nhttp://api.paczkomaty.pl/?do=listmachines_csv'); } } |
Na koniec dodam, iż dobrze jest pobrać sobie dokumentację techniczną z linku na górze tego wpisu. W paczce ZIP umieszczone są skrypty w PHP, które warto prześledzić od środka. Dzięki temu można stworzyć coś na własne potrzeby.
Podobne tematy
2 komentarze + Dodaj komentarz
Dodaj komentarz
O mnie
Najnowsze wpisy
- Drzewo kategorii – budowa struktury od dołu do góry
- PHPExcel – export + import pliku XLS
- WordPress + Polylang – Tworzenie klasy CSS z ID strony/wpisu w wybranym języku
- Mailing – Poprawna konstrukcja szablonu maila HTML/CSS i prawidłowy wygląd w programie pocztowym
- Szukasz programisty PHP dla e-commerce?
Wielkie dzięki za wpis, trudno coś odszukać o paczkomatach.
Przydatny wpis, sama teraz włączę z konfiguracją paczkomatów.