[RUBY] Configurer un webhook dans l'application personnalisée de Shopify

introduction

Cet article utilise certains événements qui se produisent dans la boutique Shopify pour fonctionner avec des applications personnalisées créées avec des rails. Je vais parler des paramètres du webhook. Afin de recevoir des notifications de webhook, vous pouvez également définir manuellement depuis Paramètres → Notifications sur l'écran de gestion, mais il n'est pas possible de le mettre dans l'écran de gestion de tous les magasins qui ont fait l'application, pour ceux qui veulent l'exploiter comme une application publique De plus, cette fois, nous ne procéderons pas à des réglages à partir de l'écran de gestion.

environnement

Ruby 2.6.6 Rails 6.0.2

1. Configurez l'étendue d'accès requise

shopify_app.rb

ShopifyApp.configure do |config|
  ...
  config.scope = "read_products, read_orders" 
  ]
  ...
end

2. Spécifiez le webhook dont vous souhaitez être informé et l'URL de la destination de la demande.

Spécifiez ce qui suit sur la ligne de commande en supposant que gem'shopify_app ' est installé.

rails g shopify_app:add_webhook -t orders/create -a https://example.com/webhooks/orders_create

Après cela, les éléments suivants seront ajoutés à shopify_app.rb

ShopifyApp.configure do |config|
  ...
  config.webhooks = [
    {topic: 'orders/create', address: 'https://example.com/webhooks/orders_create'},
  ]
  ...
end

3. Paramètres de la tâche

Créer une tâche avec chaque webhook app/jobs/orders_create_job.rb

class OrdersCreateJob < ActiveJob::Base
  def perform(shop_domain:, webhook:)
    shop = Shop.find_by(shopify_domain: shop_domain)

    shop.with_shopify_session do
      #Ajoutez la fonction que vous souhaitez implémenter ici
    end
  end
end

Si vous utilisez une bibliothèque qui effectue un traitement asynchrone tel que sidekiq, le travail ci-dessus sera traité en arrière-plan.

4. Créez un contrôleur personnalisé pour le webhook

Il n'y a pas de problème même si cette partie n'est pas incluse, mais elle sera décrite car elle est nécessaire lorsque des fonctions au-delà de ce qui est fait par travail via le webhook sont requises. routes.rb

...
post 'webhooks/orders_create', :to => 'custom_webhooks#orders_create'
...

app/controllers/custom_webhooks_controller.rb

class CustomWebhooksController < ApplicationController
  
  def orders_create
  end
  ...

  private

  def webhook_params
    params.except(:controller, :action, :type)
  end

end
class CustomWebhooksController < ApplicationController
  include ShopifyApp::WebhookVerification
  ...
end

--Créez la méthode requise

def orders_create
  params.permit!
  OrdersCreateJob.perform_later(shop_domain: shop_domain, webhook: webhook_params.to_h)
  head :no_content
end

Après avoir effectué un appel POST via un webhook, vous devez renvoyer un statut de série 200 du côté Shopify. (Selon la Documentation officielle, si vous renvoyez une réponse autre que 200 OK, il effectuera 19 appels dans les 48 heures) En définissant head: no_content, la réponse est "204 no content" = aucune donnée ne répond = il est jugé que les données du webhook ont été reçues.

point important

Même si la notification du webhook était d'abord définie sur l'écran de gestion, elle ne semblait même pas faire de requête http à moins que l'accès requis à l'étendue ne soit autorisé sur la configuration. Si votre application est déjà installée dans le magasin, veuillez vous assurer que l'autorisation d'étendue est accordée sur l'écran ci-dessous lorsque l'application est réinstallée avec cet ajout d'étendue. image.png

Si vous souhaitez vérifier si le webhook est défini sur le magasin

header
Content-Type: application/json
X-Shopify-Access-Token:Boutique applicable.shopify_token
GET https://Nom du magasin.myshopify.com/admin/api/2020-07/webhooks.json

Vous pouvez également vérifier avec.

Recommended Posts

Configurer un webhook dans l'application personnalisée de Shopify
Comment configurer un proxy avec authentification dans Feign
Configurer le routage de pré-connexion dans Devise
Créer une nouvelle application avec Rails
Créer une application TODO dans Java 7 Créer un en-tête
Créons une application de calcul avec Java
Configurez une interface graphique Java dans un thread séparé pour conserver le
Créer un onglet personnalisé avec SwiftUI 2.0
Dessinez un ensemble de Mandelbrot trop beau avec Processing
Configuration de Docker Engine dans un environnement de connexion non Internet
Configurer un serveur virtuel Cent OS avec Vagrant
[Android / Java] Configurer un bouton pour revenir à Fragment
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
Configurer un conteneur DB2 DB et insérer un peu de données