🛒

Rails環境でShopifyAPIを使う方法を分かりやすく紹介

2022/01/10に公開

この記事ではRails環境でShopify REST Admin APIを利用する方法をご紹介します。

下準備(プライベートアプリとAPIキーの発行)

既にshopifyのアカウントをお持ちで、自分のショップを開設している前提で進めます。

1.プライベートアプリの作成

APIを使うには、最初にプライベートアプリというものを作成しておく必要があります。

Shopify管理画面 > アプリ管理 > 新しいプライベートアプリを作成する にアクセスし、
プライベートアプリ名やメールアドレスなど必要項目を記入しアプリを作成しましょう。

プライベートアプリを詳しく知りたい方は以下の記事が参考になるかと思います。
https://www.cdatablog.jp/entry/shopifyapi

2.APIキーを入手

1でアプリが作成できたら、
・APIキー
・パスワード
・URLの例
↑の3つが表示されていると思うので、それをどこかにメモっておきましょう。

ちなみにURLの例は、

https://{APIキー}:{パスワード}@{サブドメイン}.myshopify.com

という形式になっています。

ここまでできたらShopifyの管理画面で行う下準備は完了です。

Rails環境でShopifyAPIを使えるようにする

1.Gem 「shopify_api」の導入

何はともあれ、まずはgemを入れましょう。
公式はこちら
https://github.com/Shopify/shopify_api

Gemfile
gem 'shopify_api'
# bundle install

APIを使うには、ファイルに以下の追加する必要があります。

test.rb
require 'shopify_api'

2. rails cで動作確認してみよう

$rails c

1. 下準備で入手したURLの例をShopifyAPI::Base.siteに代入します。
> ShopifyAPI::Base.site = https://{APIキー}:{パスワード}@{サブドメイン}.myshopify.com

2. APIのバージョンを指定します。私がこの記事を書いている時点では2021-10が最新です。
> ShopifyAPI::Base.api_version = "2021-10"

↑でAPIが使えるようになります。

3. shop情報を取得してみましょう。
> shop = ShopifyAPI::Shop.current
自分で開設したshopの情報が表示されたらOKです。

これでRails環境でShopifyAPIを使えるようになりました。

さらにshopify_apiの仕様理解を深めよう

ここからは、さらにshopify_apiの使い方を知りたい方向けの内容です。
商品や注文の新規登録や編集方法をご紹介します。

1. 前提知識(めんどくさいけど覚えよう)

Shopifyで注文を操作するために必要な知識をさらっと紹介します。
Shopifyで注文を作成するには以下の3つのクラスを知っておく必要があります。

Order: 注文
LineItem: どの商品をいくつ購入するかなどの情報
Product: 商品

本当はこれ以外にもたくさんあるのですが、感覚を掴むためにとりあえず上記3つだけ分かっていれば大丈夫です。色々コードを試して覚えていきましょう。

2. 注文情報を取得してみよう

試しに、Shopifyの管理画面からテスト用の商品と注文を作成してみてください。
その後、以下のコードを試してみてください。

test
# order取得 
order = ShopifyAPI::Order.first
# または
order =ShopifyAPI::Order.find(<idが入る>)

# line_items取得
order.line_items

# product(商品)取得
ShopifyAPI::Product.first

情報を取得できましたでしょうか?
できたら次に進みます。

3. 注文を登録してみよう

次は商品や注文の登録をしてみましょう。

以下のコードを実行して商品や注文が登録できたか確認してみてください。

test
# 商品登録
new_product = ShopifyAPI::Product.new
new_product.title = "Burton Custom Freestlye 151"
new_product.product_type = "Snowboard"
new_product.vendor = "Burton"
new_product.save

# 注文登録
product = ShopifyAPI::Product.first
order = ShopifyAPI::Order.new(
  :line_items => [
    ShopifyAPI::LineItem.new(
      :quantity => 1,
      :variant_id => product.variants.first.id
    )
  ]
)
order.save # 登録完了

# orderにline_itemsが1つ以上結びついていないとsaveすることができません。
# 参考 https://community.shopify.com/c/shopify-apis-and-sdks/creating-new-orders-using-ruby-gem-shopify-api-v-3-2-0/td-p/125472

注文登録できたでしょうか?
できたら次に進みましょう。

4. 注文を編集してみよう

以下のコードを実行して注文を編集してみましょう。

test
order = ShopifyAPI::Order.first
order.note = "ノートです"
order.tag = "タグです"
order.save #更新完了

# 参考: https://shopify.dev/api/admin-rest/2021-10/resources/order#[put]/admin/api/2021-10/orders/{order_id}.json

ただし、更新できるカラムはbuyer_accepts_marketing, email, phone, note, tags, metafields shipping_address_attributesと公式に書いてあります。
line_itemの更新などはできず、新しく注文を作り直す必要があります。

5. 決済ステータスの管理

ここからはshopify_apiを使ってどうやって決済ステータスを管理していくかを書いていきます。
ガッツリ調べたのですが、これが中々難しいです。私も100%の理解には程遠いですが、分かった部分を紹介していきます。

まず、決済ステータスを変更するには、ShopifyAPI::Transactionを知る必要があります。
ShopifyAPIではこのTransactionを追加していくことで、決済ステータスを変更していきます。

なんとなく私の感覚では「1つの注文は1つの決済ステータスを持つ」と思っていましたが、そうではありません。1つのorder(注文)は複数のtransaction(決済ステータス)を持ちます。

実際にコードを試して決済ステータスを変更してみましょう。

新規で作成したテスト注文に以下のコードを実行することで、注文の決済ステータスがオーソリ済みに変更されます。(必ずテスト注文でやってください)

test
ShopifyAPI::Transaction.create({:amount=> <金額>, :currency=> "JPY", :order_id=> <orderのid>, "kind"=> "authorization", "source" => "external"})

管理画面から決済ステータスが変更されたのを確認してください。

次に先ほど作成した注文の決済ステータスを今度はrefund(返金)に変更してみましょう。

test
ShopifyAPI::Transaction.create({:amount=> <金額>, :currency=> "JPY", :order_id=> <orderのid>, "kind"=> "refund", "source" => "external"})

注文ステータスが変わったでしょうか。
このように、1つの注文に複数のtransactionを紐付けていくことで、決済ステータスを管理していくようです。
その他にも決済ステータスがあるので是非公式を見てみてください。

公式↓
https://shopify.dev/api/liquid/objects/transaction

Webhookを使ってみよう

ShopifyにはWebhook機能があります。Webhookを使うことで、「注文が作成されたタイミングで自動でAPIからデータを更新する」などの機能を実装できるようになります。ここではその使い方を紹介します。

「webhookとは何だ?!」って思った方は是非以下の記事を読んでみてください。とても分かりやすくまとまっています。
https://kintone-blog.cybozu.co.jp/developer/000283.html

では、早速Webhookを試していきましょう。

1. webhookが叩くurlを用意する

まずはRailsプロジェクトにルーティングの設定します。

routes.rb
#route.rb
namespace :admin do
  match "shopify_webhook", controller: :hoge, action: :shopify_webhook,  via: [:post] #追加
end

コントローラにアクションを追加します。

hoge_controller.rb
#以下を追加
def shopify_webhook
  p "Webhookが実行されました"
end

これでRails側でやることは完了です。

2. ngrokでhttpsでアクセス可能にする

ShopifyのWebhookに設定できるエンドポイントはSSL化されている必要があります。
それだけのためにデプロイするのは面倒くさいですよね。
そのため、今回はngrokを使うことでhttpsでローカル環境にアクセスできるようにします。

rails s
ngrok http localhost:3000

→ https://<ngrokのURL>でローカル環境と同じ画面が表示されます。

ngrokのインストールやアカウント作成ができてない場合は事前にしておきましょう。

3. Webhookを設定する

Shopifyの管理画面からwebhookを設定します。
管理画面の「設定」>「通知」画面に移動し、一番下にある「Webhookを作成」ボタンを押下します。

イベントは「注文作成」
フォーマットは「JSON」
URLには、https://<ngrokのURL>/admin/shopify_webhookと入力します。
APIバージョンは最新のものを選択しました。

ちなみに、イベントとはWebhookが実行される(設定したngrokのURLを叩いてくれる)タイミングのことです。
「注文作成」を選択すれば、注文が作成されるごとにngrokのURLが叩かれます。

Webhookの設定は以上で完了です。

4. 注文を作成して実際にWebhookが動くか確認

ショップのフロントや管理画面から新しくテスト注文を作成してみてください。
Webhookの設定に問題なければ、ログに「Webhookが実行されました」と表示されているはずです。

最後に

ここまでお読みくださりありがとうございます。
ShopifyAPIって日本語のドキュメントが少なく、結構苦戦した方も多いのではないでしょうか。
また新たに得た情報があったら随時更新していく予定です。

Discussion