2012-06-30 34 views
5

Tôi đang làm theo hướng dẫn Shopify để nhận mã thông báo cố định cho một kết hợp ứng dụng/cửa hàng cụ thể (http://api.shopify.com/authentication.html).Không thể nhận mã thông báo truy cập vĩnh viễn cho Shopify App

Tôi có thể có mã thông báo tạm thời và sau đó sử dụng một hình thức html đơn giản để nhận một thẻ vĩnh viễn:

Nhưng câu trả lời tôi nhận được là: { "lỗi" : "invalid_request"}

Bạn có thể giúp tôi không? Tôi đã tìm kiếm ở mọi nơi (Stackoverflow, Shopify diễn đàn hỗ trợ, v.v.) nhưng không thể tìm thấy manh mối về cách giải quyết vấn đề này. Ứng dụng của tôi trực tuyến và được lưu trữ trên Heroku.

Cảm ơn,

image 3 image 2 image 1

+0

Bạn có thể đăng yêu cầu và phản hồi thô không? Khóa API bạn đang sử dụng cũng sẽ trợ giúp. –

+0

Tôi đã thêm một số hình ảnh hiển thị phản hồi đầy đủ mà tôi nhận được. Ngoài ra còn có khóa API (id ứng dụng khách). Cảm ơn sự nhiệt tình của bạn! – Augusto

Trả lời

9

Tôi nghĩ chúng ta có tâm trí tương tự! Tôi đã gặp vấn đề tương tự như bạn. Tôi nghĩ cả hai chúng tôi lẫn lộn với tài liệu!

Tôi đã tạo ứng dụng bằng đá quý shopify_app. Điều này tạo ra các phương pháp sau đây trong 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 

Dòng 3 đó (ShopifyAPI::Session.new) đang làm Step 2 of the Shopify Authentication cho chúng ta. Nó tìm nạp cho chúng tôi một mã thông báo truy cập vĩnh viễn.

Biến sess bây giờ sẽ chứa hai thứ:

  1. Các * .myshopify.com miền của các cửa hàng (url)
  2. Một thẻ truy cập vĩnh viễn lưu để sử dụng sau (token)

Như John Duff đã nói - chúng tôi đã có mã thông báo truy cập! Chúng tôi không cần phải POST đến https://SHOP_NAME.myshopify.com/admin/oauth/access_token. Nó được xử lý cho chúng tôi trong mã được tạo bởi đá quý shopify_app.

Trong phương pháp Finalize của tôi, tôi đã thêm một dòng:

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) 
    ... 

Điều này tạo ra một cửa hàng và gán nó token truy cập. Mô hình Cửa hàng của tôi có các thuộc tính myshopify_domainaccess_token.

Trong tương lai, nếu tôi muốn sử dụng ShopifyAPI cho cửa hàng đó, tôi có thể chỉ cần làm theo các hướng dẫn được tìm thấy trên shopify_api gem homepage

Tôi đã mất nhiều giờ cố gắng để Nut này ra ngoài. Tôi không chắc cách tài liệu có thể rõ ràng hơn. Hy vọng rằng nếu vấn đề xuất hiện trở lại, mọi người sẽ tìm thấy trang StackOverflow này!

Tôi hy vọng đây là trợ giúp cho bạn.

Chúc mừng, Nick

+1

Cảm ơn bạn Nick, tôi vừa trở về văn phòng từ một vài ngày nghỉ và tìm thấy câu trả lời tuyệt vời của bạn. Cảm ơn bạn rất nhiều, giải pháp của bạn đã làm việc rất tốt. Không thể hiểu tại sao đá quý shopify không nói điều này rõ ràng! – Augusto

+0

Bam. Nếu tôi có thể upvote điều này nhiều hơn một lần tôi sẽ. Có lẽ tôi sẽ tung ra một gem add-on 'shopify_app' dễ dàng cung cấp tùy chọn lưu trữ các thẻ thông thường. –

+0

Trong thử nghiệm của tôi, mã thông báo được trả về trong env ['omniauth.auth'] ['credentials'] ['token'] giống với mã thông báo "đã trao đổi". Đó không phải là trường hợp cho những người khác? – Arrel

1

Khi mã được sử dụng khi nó hết hạn, bạn cần phải lưu trữ các thẻ hoặc yêu cầu mã mới. Trong nhật ký, một trong các yêu cầu của bạn đã thành công, sau đó bạn tiếp tục yêu cầu mã thông báo truy cập bằng cùng mã không thành công vì mã đã hết hạn.

Hãy thử yêu cầu lại quyền và thực hiện lệnh gọi mã thông báo truy cập bằng mã mới mà bạn nhận được. Đảm bảo lưu trữ mã thông báo truy cập vì không thể sử dụng lại mã.

+0

Cảm ơn John, bạn đã đúng nhưng tôi chưa bao giờ thành công khi nhận được mã truy cập hợp lệ. Tôi đã thử với 3 mã thông báo khác nhau nhưng ngay cả khi mã thông báo mới và không bao giờ được sử dụng trước khi tôi nhận được câu trả lời tương tự: {"error": "invalid_request"} :( – Augusto

+0

Đây không phải là những gì tôi thấy từ nhật ký yêu cầu, tôi nghĩ Có thể bạn đã thử nó với cURL từ dòng lệnh? –

+0

Cảm ơn John, tôi đã thử yêu cầu một mã mới và sau đó thử lại để nhận mã truy cập mới bằng lệnh dòng lệnh cURL này: curl -d "client_id = xxx & client_secret = xxx & code = xxx" https://discoverstore.myshopify.com/admin/oauth/access_token – Augusto

Các vấn đề liên quan