You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NodeJS开发Shopify公共应用时如何获取当前登录店铺?

/test2接口ctx.session为null的原因

@shopify/koa-shopify-auth提供的verifyRequest中间件校验通过后,会把当前店铺的授权信息写入ctx.state.shopify对象,而非ctx.session,你取值的位置错误导致拿到null,修改取值路径即可正常拿到数据。

/test接口动态获取店铺信息的实现方案

你目前的/test接口没有加授权校验中间件,无法拿到当前登录店铺的上下文信息,正确实现步骤如下:

  1. 给需要调用Shopify API的后端接口都加上verifyRequest()中间件,自动校验请求的合法性,同时注入当前店铺的授权信息
  2. 从ctx.state.shopify中直接获取当前店铺域名shop和对应授权凭证accessToken,无需硬编码
  3. 优先使用Shopify官方SDK封装的请求工具调用API,不需要自己用axios拼接请求头和地址,避免出错

修改后的接口代码示例

router.get("/test2", verifyRequest(), async(ctx) => {
  // 从正确的位置取授权信息
  const { shop, accessToken } = ctx.state.shopify;
  console.log(shop);
  console.log(accessToken);
  ctx.body = { status: 'success', shop, accessToken };
})

router.get("/test", verifyRequest(), async (ctx) => {
  const { shop, accessToken } = ctx.state.shopify;
  // 用官方Rest客户端调用接口,不需要手动拼接地址和请求头
  const client = new Shopify.Clients.Rest(shop, accessToken);
  const shopInfo = await client.get({
    path: 'shop',
  });
  ctx.body = shopInfo.body;
});

前端请求方式

你使用Shopify CLI创建的嵌入式应用,前端调用后端接口时,使用官方提供的authenticatedFetch方法发送请求即可,会自动携带授权所需的参数,不需要你手动拼接店铺参数,示例如下:

import { authenticatedFetch } from "@shopify/app-bridge-utils";
import { useAppBridge } from "@shopify/app-bridge-react";

// 组件内调用
function FetchButton() {
  const app = useAppBridge();
  const fetch = authenticatedFetch(app);

  const getShopInfo = async () => {
    const res = await fetch("/test");
    const data = await res.json();
    console.log('店铺信息:', data);
  };

  return <button onClick={getShopInfo}>获取店铺数据</button>;
}
注意事项
  • 你当前使用的MemorySessionStorage仅适用于开发环境,生产环境需要替换为持久化存储方案(如Redis、MySQL等),否则服务重启后所有店铺需要重新授权
  • 不要硬编码私有应用的access token,OAuth流程中拿到的accessToken是对应当前登录店铺的专属凭证,适配所有安装你应用的店铺

内容的提问来源于stack exchange,提问作者IonicMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:12:01