Shopify卸载随机触发的Webhook

Shopify卸载随机触发的Webhook,shopify,webhooks,shopify-app,Shopify,Webhooks,Shopify App,背景 我正在构建一个Shopify嵌入式应用程序,并依靠app/uninstall webhook在用户卸载应用程序后撤销其访问权限。我通过从我的数据库中删除他们的访问令牌并将其添加到卸载列表中来撤销他们的访问权限 问题 Shopify应用程序/卸载webhook启动多次,有时非常随机(即凌晨3点)。这会造成问题,因为偶尔如果用户重新安装应用程序,我会随机启动卸载webhook并删除他们的访问权限 问题 什么是处理Shopify Webhook及其潜在的随机性/重复性的负责任的方法,以便我在处理

背景

我正在构建一个Shopify嵌入式应用程序,并依靠app/uninstall webhook在用户卸载应用程序后撤销其访问权限。我通过从我的数据库中删除他们的访问令牌并将其添加到卸载列表中来撤销他们的访问权限

问题

Shopify应用程序/卸载webhook启动多次,有时非常随机(即凌晨3点)。这会造成问题,因为偶尔如果用户重新安装应用程序,我会随机启动卸载webhook并删除他们的访问权限

问题


什么是处理Shopify Webhook及其潜在的随机性/重复性的负责任的方法,以便我在处理卸载时有信心?

经过大量的测试和论坛研究,我找到了一个很好的针对Shopify Webhook随机性的防御编码策略

解决方案

防御代码!不要仅仅依靠Webhook来触发数据库操作。下面是我的防御性编码实践

  • 当您收到卸载webhook时,将以状态200快速响应它。Shopify要求您在5秒内做出响应。因此,请快速验证webhook,将其有效负载添加到队列中,然后以状态200进行响应。我添加的负载只是卸载的商店的名称。请求正文中发送的数据只是有关商店的信息。它没有包含任何关于webhook的独特之处,这些webhook是为了区别于其他可能为同一商店启动的卸载webhook
  • 队列应该是一个列表,一旦添加了新节点,它就会触发另一个函数运行。通过使用队列执行繁重的工作,您可以花更多的时间执行db操作,而不用担心5s的响应时间。我正在使用Firestore作为数据库和数据库。队列处理的后端设置非常有效。我的函数只在一个新的商店卸载节点的onCreate()上运行,所以即使多个卸载Webhook背对背地启动,我的函数也只运行一次
  • 将新卸载添加到队列时运行的函数首先检查我是否可以使用我已保存在数据库中users节点其他位置的shops access令牌。如果我被阻止使用访问令牌,那么这实际上是一个真正的卸载,应该进行处理。如果我仍然可以使用访问令牌,则应忽略卸载
  • 当用户重新安装应用程序时,我会将它们从卸载队列中删除,并再次通过身份验证过程发送它们以获取新的访问令牌

  • 经过相当多的测试和论坛研究,我已经找到了一个很好的防御编码策略来应对Shopify Webhook的随机性

    解决方案

    防御代码!不要仅仅依靠Webhook来触发数据库操作。下面是我的防御性编码实践

  • 当您收到卸载webhook时,将以状态200快速响应它。Shopify要求您在5秒内做出响应。因此,请快速验证webhook,将其有效负载添加到队列中,然后以状态200进行响应。我添加的负载只是卸载的商店的名称。请求正文中发送的数据只是有关商店的信息。它没有包含任何关于webhook的独特之处,这些webhook是为了区别于其他可能为同一商店启动的卸载webhook
  • 队列应该是一个列表,一旦添加了新节点,它就会触发另一个函数运行。通过使用队列执行繁重的工作,您可以花更多的时间执行db操作,而不用担心5s的响应时间。我正在使用Firestore作为数据库和数据库。队列处理的后端设置非常有效。我的函数只在一个新的商店卸载节点的onCreate()上运行,所以即使多个卸载Webhook背对背地启动,我的函数也只运行一次
  • 将新卸载添加到队列时运行的函数首先检查我是否可以使用我已保存在数据库中users节点其他位置的shops access令牌。如果我被阻止使用访问令牌,那么这实际上是一个真正的卸载,应该进行处理。如果我仍然可以使用访问令牌,则应忽略卸载
  • 当用户重新安装应用程序时,我会将它们从卸载队列中删除,并再次通过身份验证过程发送它们以获取新的访问令牌