laravel 在安装嵌入式应用程序时出现“There's no page at this address”(此地址没有页面)错误

zf9nrax1  于 2022-12-14  发布在  其他
关注(0)|答案(7)|浏览(141)

我正面临着一个奇怪的问题,当我第一次安装应用程序在测试商店,安装顺利,但重新安装后,OAuth,Shopify显示我“* 没有页面在此地址 *”错误.
我的应用程序提交被拒绝,因为这个原因。我正在使用https://github.com/osiset/laravel-shopify库。

zpf6vheq

zpf6vheq1#

@Mudasser已经回答了他自己的问题。你需要从数据库中删除旧的商店(从第一次安装),然后尝试再次安装,它会工作。
如果你已经正确地添加了应用程序卸载webhook你就不会有这个问题。

5q4ezhmt

5q4ezhmt2#

对于使用Ruby on Rails shopify_app gem的用户:
我们实际上发现了一个问题-这可能会帮助其他人。
单位:ShopifyApp::RequireKnownShop#check_shop_known
.../gems/shopify_app-18.0.2/app/controllers/concerns/shopify_app/require_known_shop.rb:24

我们发现了一个问题,基本上gem只是检查DB中的商店是否可以通过域名找到,如果可以,那么它就认为一切正常。但是应用程序没有安装。所以我们需要检查它是否可以通过现有的令牌连接到Shopify API-如果不能,然后需要重定向到/login?shop=...,以便正确安装。可能shopify_app gem不应该检查令牌是否有效/需要重新生成-但如果它检查了就更好了。

9vw9lbht

9vw9lbht3#

是的,正如Paul Odeon在用户卸载应用程序后所说,你需要从你的数据库中删除你的旧商店信息。
我只想提一下如何和Laravel一起做。
文件
在此页面上,您可以找到app/uninstalled webhook。
当用户安装应用程序时,您应该在第一个页面上创建webhook。
Laravel中是这样:

$shop = Auth::user();

    $p = $shop->api()->rest('GET', '/admin/api/2021-07/webhooks.json', []);
    $webhooks = $p['body']['container']['webhooks'];

    if(count($webhooks) === 0){
        $p = $shop->api()->rest('POST', '/admin/api/2021-07/webhooks.json', [
            "webhook" => [
                "topic" => "app/uninstalled",
                "address" => env('APP_URL') . "/api/uninstalled/" . $shop->id,
                "format" => "json"
            ]
        ]);
    }

api.php:

Route::post('/uninstalled/{user_id}', 'WebhookController@uninstallAppWebhook');

控制器:

public function uninstallAppWebhook($userId){
        \DB::table('users')->delete($userId);
    }
eyh26e7m

eyh26e7m4#

但如果情况是这样的,你不能在安装应用程序之前创建一个webhook检查这一个:https://github.com/osiset/laravel-shopify/issues/1071

t5fffqht

t5fffqht5#

如果您正在使用ruby shopify gem,并且您只在重新安装应用案例时发现此消息,则需要在收到卸载webhook后在shop.shopify_tokenshop.shopify_domain字段中设置nil。
在我的例子中,当用户卸载应用程序时,我使用现在已被弃用的字段“shop.myshopify_domain”来保存域。
如果用户重新安装(甚至几个月后),找到旧的SQL行并切换行。这样用户将找到他以前的数据。

r3i60tvu

r3i60tvu6#

我们的销售渠道也发生了这种情况,原因是shopify的**“APP_UNINSTALLED”**webhook没有被正确调用,或者发生了一些延迟,所以session_token没有被清除(这可能是你在webhook处理程序中做的)。
我们如何修复它是我们从会话存储检索保存的会话,并使用它来命中任何shopify管理API,如果失败,并出现401或403错误,那么我们假设它是一个过期的令牌,并清除它。
大概是这样的:

app.get("/", async (req, res) => {
  if (typeof req.query.shop !== "string") {
    res.status(500);
    return res.send("No shop provided");
  }

  const shop = Shopify.Utils.sanitizeShop(req.query.shop) || "";
  const sessions = await Shopify.Context.SESSION_STORAGE.findSessionsByShop(shop);

  const { AccessScope } = await import(
  `@shopify/shopify-api/dist/rest-resources/${Shopify.Context.API_VERSION}/index.js`
  );

  const scope = await AccessScope.all({
    session: sessions[0],
  }).catch(async (err) => {
    // We check for the error status code and clear our storage
    if (err.response?.code === 401 || err.response?.code === 403) {
      sessions.forEach((session) => redisClient.del(session.id));
      await AppInstallations.delete(shop);
    }
  });
  const appInstalled = await AppInstallations.includes(shop);

  if (!appInstalled) {
    return redirectToAuth(req, res, app);
  }

  if (Shopify.Context.IS_EMBEDDED_APP && req.query.embedded !== "1") {
    const embeddedUrl = Shopify.Utils.getEmbeddedAppUrl(req);

    return res.redirect(embeddedUrl + req.path);
  }

  return handle(req, res);
)};

const AppInstallations = {
  includes: async function (shopDomain: string) {
    if (Shopify.Context.SESSION_STORAGE.findSessionsByShop) {
      const shopSessions =
        await Shopify.Context.SESSION_STORAGE.findSessionsByShop(shopDomain);
      if (shopSessions.length > 0) {
        for (const session of shopSessions) {
          if (session.accessToken) return true;
        }
      }
    }
    return false;
  },

  delete: async function (shopDomain: string) {
    if (Shopify.Context.SESSION_STORAGE.findSessionsByShop) {
      const shopSessions =
        await Shopify.Context.SESSION_STORAGE.findSessionsByShop(shopDomain);
      if (shopSessions.length > 0) {
        if (Shopify.Context.SESSION_STORAGE.deleteSessions) {
          await Shopify.Context.SESSION_STORAGE.deleteSessions(
            shopSessions.map((session) => session.id)
          );
        }
      }
    }
  },
};
wz1wpwve

wz1wpwve7#

我意识到我得到这个错误是因为应用程序的名称与我以前安装的一个应用程序的名称相同。
我通过简单地将应用程序的名称从. micro-app更改为micro-app2来解决这个问题。
一旦安装了micro-app2,我就尝试再次安装micro-app,它运行良好

相关问题