Shoper i REST API

0

Witam,

Muszę stworzyć aplikację integrującą SHOPER z REST API (WEB API już jest chyba niedostępne), ale kompletnie nie wiem jak się za to zabrać. Czy mogę prosić o jakąś podpowiedź lub przykład jakiejś jednej funkcji? Generowanie tokena do REST API odbywa się też przez wywołanie API?

0

Ja do zapytań do API korzystam z RestSharp. Tutaj masz jak uzyskać token Access tokens getting

Musisz się zalogować kontem, którym chcesz korzystać z API i wygenerować client_id i client_secret. Później to już ci zostaje studiować ich dokumentację i metoda prób i błędów.

0

Zrobiłem coś takiego:

RestClient client = new RestClient(@"https://mojsklep.pl");
RestRequest request = new RestRequest("/webapi/rest/auth", Method.POST);
request.AddParameter("client_id", "Test1");
request.AddParameter("client_secret", "Test1");
IRestResponse<Dictionary<string, object>> response = client.Execute<Dictionary<string, object>>(request);

Czyli zgodnie z tym co podałeś w kliencie podaję jak teraz a w request całość "webapi/rest/oauth/token?grant_type=authorization_code" i wywołuję?

1

Parameter to jest chyba to co jest w linku, a client_id i secret w header czyli

request.AddParameter("grant_type", "authorization_code");
request.AddHeader("client_id", "Test1");
request.AddHeader("client_secret", "Test1");
var response = client.Execute(request);
var content = response.Content; // <-- Tutaj masz informacje czy masz token czy zrobiłeś coś źle ;)
0

Dziękuję za podpowiedź poradziłem sobie z logowaniem i pobieraniem danych, ale mam za to problem z np. dodawaniem towarów, ich aktualizacją.

RestClient client22 = new RestClient(@"http://sklep/webapi");
RestRequest request22 = new RestRequest("rest/products", Method.PUT);
request22.AddParameter("client_id", "Test");
request22.AddParameter("client_secret", "Test1!");
request22.AddParameter("access_token", response.Data["access_token"].ToString());
request22.AddParameter("id", 41);

aaa1.Add("price", 10);
aaa1.Add("stock", 1);
asd.stock.Add("stock", aaa1);

request22.AddJsonBody(asd);

IRestResponse<Dictionary<string, object>> response22 = client22.Execute<Dictionary<string, object>>(request22);

Odpowiedź jaka mi się wyświetla to "unauthorized_client", W czym może tkwić błąd?

2

Wydaje mi się, że nie potrzebujesz wyciągać tokena za każdym razem. Wyciągnij go raz, zapisz gdzieś i korzystaj. Z dokumentacji wynika, że access_token jest ważny 90 dni, a refresh_token 180.
Lekko możesz na jednym tokenie śmigać 3 miesiące, a po 3 miesiącach robisz https://shop.url/webapi/rest/oauth/token?grant_type=refresh_token.
Błąd sugeruje, że nie jesteś zalogowany, niepoprawny token. Druga sprawa, nie czytasz dokładnie co napisałem wcześniej.

request.AddHeader("client_id", "Test1");
request.AddHeader("client_secret", "Test1");
request.AddHeader("access_token", token);

AddHeader nie AddParameter. Ja wiem, że w tabelkach, w dokumentacji jest napisane Parameter, ale parametry mogą być w url, body, header itp itd. Jeśli masz już token to wszystkie inne zapytania robisz już tylko z tokenem, nie potrzebujesz client_id ani client_secret. Przykład wyciągania listy towarów:

RestClient client = new RestClient(@"http://sklep/webapi");
RestRequest request = new RestRequest("rest/products", Method.GET);
request.AddHeader("Authorization", "Bearer " + token);
var response = client.Execute(request);
var content = response.Content;
0

Już poprawiłem tak jak podałeś i teraz działa, bardzo dziękuję. Mam jeszcze jeden problem, a dokładniej cały czas pokazuje mi komunikat "Wartość pola 'price' jest niepoprawna: Pole wymagane". Jak widać w kodzie ustawiam pole price.

0

Co to jest aaa1 asd?

aaa1.Add("price", 10);
aaa1.Add("stock", 1);
asd.stock.Add("stock", aaa1);
0
Product asd = new Product();
asd.translations = new Dictionary<string, Dictionary<string, Dictionary<string, object>>>();
asd.stock = new Dictionary<string, TowaryStock>();
asd.options = new Dictionary<string, TowaryOptions>();

Dictionary<string, object> aaa1 = new Dictionary<string, object>();
Dictionary<string, object> aaa = new Dictionary<string, object>();
Dictionary<string, object> www = new Dictionary<string, object>();
Dictionary<string, Dictionary<string, object>> www1 = new Dictionary<string, Dictionary<string, object>>();

Przepraszam za nazwy, ale na razie testuję i walczę, dlatego taki bałagan.

0

WTF?! :D
O co chodzi z tymi słownikami?! Ale ty sobie życie utrudniasz...
Stwórz klasę na podstawie tego co potrzebuje request body
Products: update
Product

public class Product
{
   public int producer_id {get;set;}
   public int category_id {get;set;}
   ...
   public List<Options> options {get;set;}
}

public class Options
{
   public float price {get;set;}
}

Na tej podstawie tworzysz później obiekt i wysyłasz JSON do Shopera

0

Miałem przygotowany obiekt ale było to samo dlatego kombinowałem z tymi słownikami.

asd.category_id = 18;
asd.options.Add(new TowaryOptions { price = 10});
asd.stock.Add(new TowaryStock { price = 20, stock = 20 });
asd.translations.Add(new TowaryTranslations { });
request22.AddJsonBody(asd);

Dostaję ten sam komunikat "Wartość pola 'price' jest niepoprawna: Pole wymagane".

0

Według dokumentacji pole price jest typu float. Może spróbuj zamiast 10 puścić mu 10f

0

Niestety nie pomogło :(.

0

stock nie jest listą tylko obiektem. Musisz umieć odróżnić { } obiekt od [ ] tablica/lista. Jesteś pewien czy chodzi tylko o ten price? Obawiam się że pola w dokumentacji, które nie mają opcji null są wymagane. Tak jak w przypadku

producer_id: null|integer

Nie musisz podawać, możesz ustawić null. W przypadku price chyba musisz podać wartość

price: float,
price_wholesale: float,
price_wholesale_type: integer,
price_special: float:,
price_special_type: integer,
0

Coś się ruszyło, ale teraz cały czas.

server_error
error_description
Operation Failed

Ale już coraz bliżej :).

0

Za mało info. Nie wróżę z fusów ;-)

0

pokaz co dokldanie wysylasz jako content

0
                Product asd = new Product();
                asd.options = new List<TowaryOptions>();
                asd.stock = new TowaryStock();
                asd.translations = new Dictionary<string, TowaryTranslations>();

                asd.category_id = 18;
                asd.unit_id = 1;
                asd.code = "test23312";
                
                asd.pkwiu = "123";
                asd.currency_id = 1;
                asd.options.Add(new TowaryOptions{price = 5, active = true, stock = 5 });

                asd.stock.price = 10;
                asd.stock.stock = 10;
                asd.stock.availability_id = 8;
                asd.stock.delivery_id = 1;

                asd.translations.Add("pl_PL", new TowaryTranslations { name = "test23312", description = "", active = true });
                request.AddJsonBody(asd);

Pozostałe elementy w obiekcie mam zakomentowane, przesyłam tylko to co wyżej, ale próbowałem też puste wartości wszystkich pozostałych elementów przesyłać i było to samo.

info z response

0

mi chodzi o request.content zawartosc tego. Podepnij debuggera i zobacz dokladnie co wysylasz

wiec w tym wypadku pokaz jak wyglada json dla requesta (po wykonaniu AddJsonBody)

0

https://ibb.co/j52ndVg

{"category_id":18,"pkwiu":"123","code":"test23312","unit_id":1,"currency_id":1,"options":[{"price":5.0,"active":true,"stock":5.0}],"stock":{"price":10.0,"stock":10.0,"availability_id":8,"delivery_id":1},"translations":{"pl_PL":{"name":"test23312","description":"","active":true}}}

Czy o to chodziło?

1 użytkowników online, w tym zalogowanych: 0, gości: 1