Jak zintegrować magento REST API z podmiotem zewnętrznym?

9

Właśnie próbowałem znaleźć informacje o interfejsie API REST. Istnieje kilka przykładów w zasobach magento i niektórych prywatnych blogach. Wszystkie są takie same !!

Jako podstawowe informacje znalazłem, że jeśli chcę aktualizować produkty za pośrednictwem interfejsu API REST, muszę użyć punktu końcowego autoryzacji administratora. (/ admin / oauth_authorize), a jeśli korzystam z klienta lub gościa, mogę po prostu odzyskać dane.

Próbowałem utworzyć przykładowy kod i sprawdzić, i kiedy uruchomiłem kod przez przeglądarkę, muszę najpierw zalogować się do administratora, a następnie zaakceptować dostęp, a następnie mogę użyć zasobu API.

Nie wiem, dlaczego najpierw prosi mnie o zalogowanie się w adminie. A jeśli będę musiał się zalogować, aby uzyskać do niego dostęp, to jak to będzie działać wewnętrznie między serwerem.

Próbowałem utworzyć przykładowy kod za pomocą poniższego bloga

http://inchoo.net/ecommerce/magento/consuming-magento-rest-zend_oauth_consumer/comment-page-1/#comment-66775

i działa dobrze i daje również odpowiedź.

Właściwie szukam, jak będzie działać wewnętrznie między dwoma serwerami i jak klient wywoła REST API, aby magento był uwierzytelniony i jak magento zwróci odpowiedź.

Szukam porady.

Akhilesh Patel
źródło
Interfejs API REST jest przeznaczony do dostępu OAuth, tj. Interakcji użytkownika, więc w twoim przypadku prawdopodobnie nie jest to właściwy wybór. Jeśli nie chcesz korzystać z interfejsu API SOAP, może to pytanie + odpowiedź pomoże: magento.stackexchange.com/questions/510/…
Fabian Schmengler

Odpowiedzi:

6

Dobre wyjaśnienie interfejsu API REST Magento można znaleźć tutaj . Istnieje również przykład odzyskiwania produktów jako zalogowany klient. Powtórzę to tutaj, aby odpowiedź była dłuższa.

<?php
/**
 * Example of products list retrieve using Customer account via Magento REST API. OAuth authorization is used
 */
$callbackUrl = "http://yourhost/oauth_customer.php";
$temporaryCredentialsRequestUrl = "http://magentohost/oauth/initiate?oauth_callback=" . urlencode($callbackUrl);
$adminAuthorizationUrl = 'http://magentohost/oauth/authorize';
$accessTokenRequestUrl = 'http://magentohost/oauth/token';
$apiUrl = 'http://magentohost/api/rest';
$consumerKey = 'yourconsumerkey';
$consumerSecret = 'yourconsumersecret';

session_start();
if (!isset($_GET['oauth_token']) && isset($_SESSION['state']) && $_SESSION['state'] == 1) {
    $_SESSION['state'] = 0;
}
try {
    $authType = ($_SESSION['state'] == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
    $oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
    $oauthClient->enableDebug();

    if (!isset($_GET['oauth_token']) && !$_SESSION['state']) {
        $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
        $_SESSION['secret'] = $requestToken['oauth_token_secret'];
        $_SESSION['state'] = 1;
        header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']);
        exit;
    } else if ($_SESSION['state'] == 1) {
        $oauthClient->setToken($_GET['oauth_token'], $_SESSION['secret']);
        $accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
        $_SESSION['state'] = 2;
        $_SESSION['token'] = $accessToken['oauth_token'];
        $_SESSION['secret'] = $accessToken['oauth_token_secret'];
        header('Location: ' . $callbackUrl);
        exit;
    } else {
        $oauthClient->setToken($_SESSION['token'], $_SESSION['secret']);
        $resourceUrl = "$apiUrl/products";
        $oauthClient->fetch($resourceUrl);
        $productsList = json_decode($oauthClient->getLastResponse());
        print_r($productsList);
    }
} catch (OAuthException $e) {
    print_r($e);
}
Marius
źródło
Testowałem już ten kod. kiedy używam $ adminAuthorizationUrl = ' magentohost / oauth / autoryzuj ' przekierowuje mnie najpierw do logowania klienta, a kiedy używam $ adminAuthorizationUrl = ' magentohost / admin / oauth_authorize ' przekierowuje mnie najpierw do logowania administratora, a następnie muszę najpierw go uwierzytelnij. w jaki sposób osoby trzecie mogą uzyskać dostęp do tych rzeczy. oznacza Jeśli ustawiam jednego crona od strony trzeciej do wykonania tego zadania, takiego jak utworzenie nowego produktu lub zaktualizowanie istniejącego, w jaki sposób można go uwierzytelnić.
Akhilesh Patel
@Marius, znasz jakieś rozwiązanie dla ostatniego komentarza OP do Twojej odpowiedzi? ABY używać oAuth i REST bez przekierowywania i logowania
sergio
@sergio. Przepraszam, nie wiem
Marius
Jestem całkiem nowy w tej firmie oAuth, ale jak rozumiem, chodzi o to, aby wymusić interaktywne logowanie. Zarejestrowany klient lub administrator witryny musi fizycznie autoryzować aplikację. Jeśli tego nie chcesz, możesz spróbować użyć roli „Gość”, która moim zdaniem nie wymaga kroku oAuth (sam tego nie próbowałem); lub użyj interfejsu API SOAP / XML-RPC zamiast REST.
Doug McLean
@DougMcLean lub możesz zaimplementować niestandardowy adapter uwierzytelniania snowcore.net/magento-rest-without-oauth
Roman Snitko
2

Z powyższego kodu możesz token i klucz tajny, po prostu skopiuj go:

...........
echo 'token:---'.$_SESSION['token'].'----secret----'.$_SESSION['secret'];
........

Możesz więc przygotować kod jak poniżej, aby utworzyć / edytować produkt:

<?php
$apiUrl = 'APIURL';
$consumerKey = 'CONSUMERKEY';
$consumerSecret = 'CONSUMERSECRED';
$token = 'TOCKEN';
$tokensecret = 'TOKENSCRET';

try {

    $oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1);
    $oauthClient->setToken($token, $tokensecret);
    $oauthClient->enableDebug();          

    $productData = json_encode(array(           
            'name'              => 'TEST PRODUCT',           
            'price'             => 11.11          
        ));       

    $resourceUrl = "$apiUrl/products/222";
    $oauthClient->fetch($resourceUrl, $productData , 'PUT',  array('Content-Type' => 'application/json'));
    $responseArr = json_decode($oauthClient->getLastResponse());
    print_r($responseArr);

} catch (OAuthException $e) {
    print_r($e);
}

?>
iqbalmp
źródło