【问题标题】:Create product with Shopify Admin API使用 Shopify Admin API 创建产品
【发布时间】:2020-07-14 21:54:43
【问题描述】:

我第一次开始使用 React 和 Node.js 构建私有 Shopify 应用程序。该应用程序的目的是侦听添加到购物车按钮,单击时应使用 Shopify 产品 API 在 Shopify 后端创建自定义产品。我在基本的 JavaScript 方面做了很多工作,并且在 jQuery 方面有丰富的经验,可以处理这个项目的更多基础知识。最重要的部分是将 POST 事件绑定到添加到购物车点击,创建产品并将其添加到购物车。

我正在尝试使用以下解决方案在后端创建产品。这是正确的做法,还是有更好的解决方案?

如何将此 Fetch 函数绑定到点击事件?

    let new_product = {
        product: {
            title: Custom,
            body_html: test,
            vendor: Custom,
            product_type: customproduct,
            tags: Customproduct
        }
    };


fetch('/admin/api/2020-07/products.json', {
  method: 'post',
  body: JSON.stringify(new_product),

  headers: {
    'X-Shopify-Access-Token': process.env.SHOPIFY_API_SECRET_KEY,
    'Accept': 'application/json'
  },

})

我在我的项目中使用 Isomorphic Fetch,它应该可以在服务器端和客户端工作。

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: javascript node.js reactjs shopify shopify-app


    【解决方案1】:

    你有几个问题。在回答之前,重要的是要清除我从您的措辞和示例代码中假设的一些误解。 Shopify Apps 有 3 种类型。

    1. 公开
    2. 自定义
    3. 私人

    因此,如果您正在构建私有应用程序,那么提供的代码将无法用于创建产品,因为私有应用程序使用基本身份验证,而公共和自定义应用程序使用 OAuth 2.0 管理身份验证。

    我在我的项目中使用 Isomorphic Fetch,它应该可以在服务器和 客户端。

    即使它适用于服务器端和客户端,也不要从客户端调用 Shopify API,因为这会暴露您的私有应用凭据。

    要实现你想要做的事情,你需要修改 React App 以及后端代码。

    1. 为 Button 添加事件监听器
    2. 向后端服务器发送 POST 请求
    3. 通过 API 在 Shopify 上创建产品
    4. 使用上一步返回的 ID 将产品添加到购物车
    5. 返回购物车 URL 作为响应

    React 中的示例代码如下所示

    function Product() {
      const addProduct = async () => {
        const cart = await fetch("/your-end-point", {
          method: "post",
          body: JSON.stringify({
            // add product params
          }),
        });
      };
    
      return <button onClick={addProduct}>Add Product</button>;
    }
    
    ReactDOM.render(<Product />, document.getElementById("root"));
    

    然后在您的 Node.js 应用程序中,处理 Shopify API 部分。我建议不要使用 fetch,而是使用 Official Node.js module for Shopify。

    示例代码如下所示

    const Shopify = require("shopify-api-node");
    router.post("/your-end-point", async (req, res) => {
      try {
        const shopify = new Shopify({
          shopName: "your-shop-name",
          apiKey: "your-api-key",
          password: "your-app-password",
        });
        const product = await shopify.product.create(req.body);
        // use product ID from previous request
        const checkout = await shopify.checkout.create({
          /*checkout params */
        });
        res.status(200).send(checkout);
      } catch (ex) {
        console.log(ex);
      }
    });
    

    【讨论】:

    • 嗨 @Bilal Akbar 感谢您的出色回应。它很有帮助,并且明确地澄清了大多数关于此的问题。谢谢你。我可以看到您正在使用路由,它返回:ReferenceError:路由器未定义当搜索路由器时,我不断看到人们提到 App Proxies。这是我们需要为这个功能实现的东西吗?
    • 这条路线来自 Express 框架。这只是一个例子。这不是对您有用的代码。使用您正在使用的任何框架在您的 Node.js 应用程序中实现路由侦听器。应用代理用于在 Shopify 客户端商店中呈现您的页面。你不需要那个。
    • 我明白了。我在这个项目中使用了 Koa,现在安装了一个 Koa 路由器中间件。没有错误。我想知道 const checkout 部分。这里需要哪些参数,这样做的主要目的是什么?添加到购物车功能是否需要此参数?我想反应模块中的 const cart 会发布到shopify cart api吗?谢谢。
    • 嗨@Bilal Akbar,再次感谢您。我还有一个额外的后续问题,因为我正在努力理解它是如何工作的。我有一个 index.js 和 _app.js 用于扩展 - 用于应用程序的嵌入式部分(在这种情况下,它不是嵌入式的,因为它是一个私有应用程序)。我已经安装了该应用程序并尝试制作一个简单的日志记录功能,然后在我的模板中创建一个按钮,并通过 onclick 调用该功能。它说该功能不存在。怎么会?
    • @MagnusPilegaard 我不确定我是否理解你的问题。请提出一个带有相关信息的新问题,以便任何人都可以回答。此外,我对嵌入式应用程序没有任何经验。
    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 2012-06-11
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多