Не удалось получить токен постоянного доступа для моего приложения Shopify

Я следую инструкциям Shopify, чтобы получить постоянный токен для определенной комбинации приложения/магазина (http://api.shopify.com/authentication.html).

Я могу получить временный токен, а затем использовать простую html-форму для получения постоянного токена:

Но я получаю ответ: {"error":"invalid_request"}

Не могли бы вы мне помочь? Я искал везде (Stackoverflow, форумы поддержки Shopify и т. д.), но не могу найти подсказку, как решить эту проблему. Мое приложение находится в сети и размещено на Heroku.

Спасибо,

изображение 3изображение 2 изображение 1


person Augusto    schedule 30.06.2012    source источник
comment
Можете ли вы опубликовать необработанный запрос и ответ? Ключ API, который вы используете, также может помочь.   -  person John Duff    schedule 30.06.2012
comment
Я добавил несколько изображений, показывающих полный ответ, который я получаю. Существует также ключ API (идентификатор клиента). Спасибо за интерес!   -  person Augusto    schedule 30.06.2012


Ответы (2)


Я думаю, что у нас схожие мысли! Я столкнулся с той же проблемой, что и вы. Я думаю, что мы оба были сбиты с толку документацией!

Я создал свое приложение, используя гем shopify_app. Это создало следующий метод в login_controller.rb:

def finalize
  if response = request.env['omniauth.auth']
    sess = ShopifyAPI::Session.new(params['shop'], response['credentials']['token'])
    session[:shopify] = sess        
    flash[:notice] = "Logged in"
    redirect_to return_address
    session[:return_to] = nil
  else
    flash[:error] = "Could not log in to Shopify store."
    redirect_to :action => 'index'
  end
end

Строка 3 этого (ShopifyAPI::Session.new) выполняет для нас Шаг 2 аутентификации Shopify. Он приносит нам постоянный токен доступа.

Переменная sess теперь будет содержать две вещи:

  1. Домен магазина *.myshopify.com (url)
  2. Постоянный токен доступа, который можно сохранить для использования в будущем (token)

Как сказал Джон Дафф — у нас уже есть токен доступа! Нам не нужно отправлять в https://SHOP_NAME.myshopify.com/admin/oauth/access_token. Это обрабатывается для нас в коде, сгенерированном драгоценным камнем shopify_app.

В моем методе finalize я добавил строку:

def finalize
  if response = request.env['omniauth.auth']
    sess = ShopifyAPI::Session.new(params['shop'], response['credentials']['token'])

    Shop.find_or_create_by_myshopify_domain(sess.url, access_token: sess.token)
  ...

Это создает магазин и назначает ему токен доступа. Модель My Shop имеет атрибуты myshopify_domain и access_token.

В будущем, если я захочу использовать ShopifyAPI для этого магазина, я могу просто следовать инструкциям на домашней странице драгоценного камня shopify_api.

Я часами пытался выкрутить это. Я не уверен, как документация может быть более ясной. Надеюсь, если проблема возникнет снова, люди найдут эту страницу StackOverflow!

Надеюсь, это помогло вам.

Привет, Ник

person Nick Malcolm    schedule 07.07.2012
comment
Спасибо, Ник, я только что вернулся в офис после нескольких дней отпуска и нашел твой замечательный ответ. Большое спасибо, ваше решение сработало прекрасно. Не могу понять, почему драгоценный камень shopify не говорит об этом ясно! - person Augusto; 10.07.2012
comment
Бам. Если бы я мог проголосовать за это более одного раза, я бы это сделал. Возможно, я выпущу гем надстройки «shopify_app», который легко предоставляет возможность хранения постоянных токенов. - person Chuck Bergeron; 21.08.2012
comment
В моем тестировании токен, возвращаемый в env['omniauth.auth']['credentials']['token'], совпадает с обменным токеном. Разве это не так для других? - person Arrel; 03.02.2015

После того, как код будет использован после истечения срока его действия, вам необходимо сохранить токен или запросить новый код. В журналах один из ваших запросов был успешным, затем вы продолжали делать запросы маркера доступа с тем же кодом, который не удался, потому что срок действия кода истек.

Попробуйте снова запросить разрешение и сделать вызов токена доступа с новым кодом, который вы получили. Обязательно сохраните токен доступа, потому что код нельзя использовать снова.

person John Duff    schedule 02.07.2012
comment
Спасибо, Джон, вы правы, но мне так и не удалось получить действительный код доступа. Я пробовал с 3 разными токенами, но даже если токен новый и никогда не использовался, я получаю тот же ответ: {error:invalid_request} :( - person Augusto; 02.07.2012
comment
Это не то, что я вижу в журналах запросов, я думаю, что может быть что-то не так с любой библиотекой, которую вы используете. Вы пробовали это с cURL из командной строки? - person John Duff; 02.07.2012
comment
Спасибо, Джон, я попытался запросить новый код, а затем снова попытался получить новый код доступа с помощью этой команды командной строки cURL: curl -d client_id=xxx&client_secret=xxx&code=xxx discoverstore.myshopify.com/admin/oauth/access_token - person Augusto; 03.07.2012
comment
Я вижу 3 июля в 5:19 UTC запрос токена доступа с переданными параметрами grant_type и redirect_uri и успешно выполненным пользовательским агентом Ruby. Затем я вижу ряд запросов на токены доступа с использованием того же кода, который уже использовался, включая запрос cURL. Что бы вы ни делали изначально, вы используете код для полного обмена, а затем по какой-то причине вы пытаетесь снова использовать код, чтобы обменять его на другой токен доступа. - person John Duff; 04.07.2012
comment
Используете ли вы какую-то библиотеку, которая обрабатывает некоторые из них для вас? - person John Duff; 04.07.2012