如何让Shopify重定向到应用程序URL的子域?

时间:2012-09-18 13:05:36

标签: callback shopify

我开始开发Shopify集成。我的应用程序 尝试集成每个用户帐户都有不同的子域名,等等 将需要重定向到每个oauth的不同回调域 连接请求。到目前为止,我正在重定向到Shopify授权 允许用户授予其帐户访问权限的URL。但是,我明白了 错误回复:

{"error":"invalid_request",
 "error_description":"The redirect_uri and application url must have matching hosts"}

网址格式为:

https://SHOP_NAME.myshopify.com/admin/oauth/authorize?client_id=MY_CLIENT_ID&scope=read_order&redirect_uri=SUBDOMAIN.MYAPP.com

我已尝试设置应用程序URL(在管理页面中设置) Shopify)所有这些并收到相同的错误:

http://MYAPP.com
http://.MYAPP.com
http://*.MYAPP.com

但是,我可以使用它:

http://SUBDOMAIN.MYAPP.com

我可以创建一个只从查询中获取信息的端点 字符串,并重定向到子域,例如:

callback.MYAPP.com?subdomain=SUBDOMAIN

哪个可以解决这个问题,但我更愿意使用Shopify API 支持的子域名,因为我也想在中创建链接 将页面存储到我的应用程序中,而不必继续构建 这些间接水平。 (虽然,查看管理页面 应用程序链接,看起来我将不得不在那里做同样的事情 太。)

我正在使用非标准TLD(因为这是目前的 发展)。所以,我把MYAPP.com放在哪里,真的是哦.dev 我尝试使用.com编辑我的主机文件,使用相同的 结果

有谁知道如何让Shopify接受子域名作为 callback_url?我错过了一些明显的东西吗?

这是一些Clojure代码:

(require '[com.twinql.clojure.http :as http] '[clojure.contrib.logging :as log])

(defn consumer []
  {:key "1234567890"
   :secret "1234567890abcde"})

(defn shopify-config [shop-name]
  {:request-token-url (str "https://" shop-name ".myshopify.com/admin/oauth/authorize")
   :authorise-url (str "https://" shop-name ".myshopify.com/admin/oauth/authorize")
   :access-token-url (str "https://" shop-name ".myshopify.com/admin/oauth/access_token")
   :api-endpoint-url (str "https://" shop-name ".myshopify.com")})

(defn get-redirect-url [shop-name callback-url]
  (let [{consumer-token :key consumer-token-secret :secret} (consumer)]
    (str (-> shop-name shopify-config :request-token-url)
         "?client_id=" consumer-token
         "&scope=read_orders,read_products,read_customers"
         "&redirect_uri=" callback-url)))

(defn get-access-credentials [verifier shop-name]
  (let [{:keys [key secret]} (consumer)
        response (http/post (-> shop-name shopify-config :access-token-url)
                            :as :json
                            :query {"client_id" key
                                    "client_secret" secret
                                    "code" verifier})]
    (log/debug (str "response from getting access credentials from shopify : " response))
    {:access-token (-> response :content :access_token)
     :consumer-key key
     :consumer-secret secret}))

(def methods {:get http/get
              :post http/post
              :delete http/delete
              :put http/put})

(defn- make-request [method shop-name url token params]
  (let [response (method (str (-> shop-name shopify-config :api-endpoint-url) url)
                         :as :json
                         :query params
                         :headers {"X-Shopify-Access-Token" token})]
    (if (-> response :code (= 200))
      (:content response)
      (do
        (log/error (str "Error in shopify request : " response))
        (throw (Err. {:handle :shopify-request-error
                      :response response}))))))

(defn get-products [shop-name token page]
  (make-request (:get methods) shop-name "/admin/products.json" token {:page page :limit 200}))

此外,还有一些代码可以从商店名称中获取商品名称 用户,并将其存储在数据库中,依此类推。所以我们基本上打电话 get-redirect-url将用户重定向到shopify,并让他们去 批准权限。我们传递给Shopify的callback-url是 类似的东西:

http://customer1.oh.dev/integrations/shopify/1/callback

然后获取提供的代码并调用get-access-credentials。 周围的代码存储我们返回的访问令牌等。然后 之后会有另一个用户操作调用get-products 检索令牌&店名称

1 个答案:

答案 0 :(得分:1)

如果您将应用程序URL设置为http://myapp.com,您应该能够指定redirect_uri = http://domain.myapp.com,这是您正在做的事情吗?你可以发布用于提出oauth请求的代码吗?