2023年11月6日

Shopify API でデータ連携 (REST API 編)

目次

Contents

前回は「Shopifyとは何なのか?」「メリット・デメリットは?」「できること・できないことは?」など、Shopifyの概要をお話ししましたが、今回はもう少し技術的なところに踏み込んで「基幹システムとの連携」を観点に、ShopifyのAPIについて説明します。

ShopifyのREST APIとは?

Shopifyのデータを外部アプリケーションからアクセスするためのAPIです。Shopifyから商品情報、注文情報、顧客情報など、さまざまなデータを取得したり、更新したりできます。

Shopify REST APIの公式ドキュメント:
https://shopify.dev/docs/api/admin-rest/

それを使って具体的に何ができるのかと言いますと、例えば以下の通りです。

・自社のWebサイトやアプリにShopifyのデータを表示する
・Shopifyのデータを分析する(顧客分析、売上分析、など)
・Shopifyのデータを他のシステムと連携する

ShopifyのREST APIは、Shopifyの機能を拡張するために便利なツールです。ShopifyでECサイトを運営している方はぜひ活用して頂きたいのですが、3番目の「他のシステムと連携」というのがまさに今回のテーマ「基幹システムとの連携」に該当しますね。

Shopify REST APIの概要

さまざまなデータを取得・更新できる、と前述しましたが以下のAPIが用意されています。ECサイトの運営に必要な要素はほぼ揃っているのではないでしょうか。

注文情報 (Orders)
発送情報 (Fulfillment)
商品情報 (Products)
顧客情報 (Customers)
在庫情報 (Inventory)
クーポン情報 (Discounts)
支払い情報 (Payments)
マーケティング情報 (Marketing)
レポート情報 (Reports)

では、これらのデータをどうやって取得・更新するのか?
ShopifyのREST APIのエンドポイントは、以下の形式です。

https://{SHOPIFY_DOMAIN}/admin/api/2022-02/
({SHOPIFY_DOMAIN}は、Shopifyストアのドメイン名)

つまり「2022-02/」の後ろに「Orders」や「Customers」などを付加してアクセスするだけで、注文情報や顧客情報を取得・更新できます。簡単ですね! (2022-02 はAPIのバージョンなので、2023-07 や 2023-10 にどんどん変わっていきます)
そして、使用できるHTTPメソッドは以下の4つなので、これらを使い分けるだけです。

GET : データの取得
POST : データの作成
PUT : データの更新
DELETE : データの削除

パラメータを上記URLやリクエストボディに指定すると、「今日受けた注文を全件取得」、「注文番号999の支払い情報だけ取得」などといった操作も可能になり、さらに便利です。

セキュリティ面にも言及しておきますと、まず認証としてShopifyのAPIキーが必要です。これが無いとShopifyのREST APIが使えません。APIキーは、Shopifyの管理画面で取得できます。
認証OK!となっても次はアクセス制御です。ShopifyのREST APIは、ロールベースのアクセス制御によって保護されていて、APIキーに設定された権限によって、取得できるデータや更新できるデータが制限されます。
また、ShopifyのREST APIでやり取りされるデータは、SSLによって暗号化されます。

Shopify REST APIの使い方

では実際にAPIを実行してみましょう。

注文データを取得するURLは以下のようになります。

https://storedomain.myshopify.com/admin/api/2023-07/orders/5317070422241.json?fields=line_items,total_price

このURLには、以下のパラメータも含まれています。
注文番号が「5317070422241」の注文を1件だけ取得する
項目「line_items(注文内容)」と「total_price(購入合計額)」だけを取得する

リクエストヘッダにAPIキーを設定する必要はありますが、このURLにHTTPメソッド=GETでアクセスするだけです。

JSON形式で以下のようなレスポンスが返ってきます。

{
  "order": {
    "total_price": "2200",
    "line_items": [
      {
        "id": 13179368669409,
        "admin_graphql_api_id": "gid:\/\/shopify\/LineItem\/13179368669409",
        "fulfillable_quantity": 1,
        "fulfillment_service": "manual",
        "fulfillment_status": null,
        "gift_card": false,
        "grams": 30,
        "name": "アロマオイル (バニラ)",
        "price": "1000",
        "price_set": {
          "shop_money": {
            "amount": "1000",
            "currency_code": "JPY"
          },
          "presentment_money": {
            "amount": "1000",
            "currency_code": "JPY"
          }
        },
        "product_exists": true,
        "product_id": 7953038147809,
        "properties": [],
        "quantity": 1,
        "requires_shipping": true,
        "sku": "PRE00001",
        "taxable": true,
        "title": "アロマオイル (バニラ)",
        "total_discount": "0",
        "total_discount_set": {
          "shop_money": {
            "amount": "0",
            "currency_code": "JPY"
          },
          "presentment_money": {
            "amount": "0",
            "currency_code": "JPY"
          }
        },
        "variant_id": 43676867625185,
        "variant_inventory_management": null,
        "variant_title": null,
        "vendor": "test-store",
        "tax_lines": [],
        "duties": [],
        "discount_allocations": []
      },
      {
        "id": 13179368702177,
        "admin_graphql_api_id": "gid:\/\/shopify\/LineItem\/13179368702177",
        "fulfillable_quantity": 1,
        "fulfillment_service": "manual",
        "fulfillment_status": null,
        "gift_card": false,
        "grams": 35,
        "name": "マイクロファイバー バスタオル",
        "price": "1200",
        "price_set": {
          "shop_money": {
            "amount": "1200",
            "currency_code": "JPY"
          },
          "presentment_money": {
            "amount": "1200",
            "currency_code": "JPY"
          }
        },
        "product_exists": true,
        "product_id": 7953039065313,
        "properties": [],
        "quantity": 1,
        "requires_shipping": true,
        "sku": "PRE0003",
        "taxable": true,
        "title": "マイクロファイバー バスタオル",
        "total_discount": "0",
        "total_discount_set": {
          "shop_money": {
            "amount": "0",
            "currency_code": "JPY"
          },
          "presentment_money": {
            "amount": "0",
            "currency_code": "JPY"
          }
        },
        "variant_id": 43676871721185,
        "variant_inventory_management": "shopify",
        "variant_title": null,
        "vendor": "test-store",
        "tax_lines": [],
        "duties": [],
        "discount_allocations": []
      }
    ]
  }
}

注文内容といっても多くの項目が含まれています。上記の例では取得する項目を「fields=」で指定しましたが、何も指定しない場合は顧客データや発送データ、その他ありとあらゆる大量の項目が返ってきます。
これは注文データなので、顧客については「顧客ID」に相当する項目が1つだけ付いてくると思いきや、氏名のみならずデフォルトの発送先住所、マーケティング関連のメールを送ってもいいか、などなど詳細な項目まで含んでいます。
当初は、データ構造のクセが強いなと感じてしまい、どんなDBテーブルの切り方をしていて、どの項目でJOINしているのだろうか?と疑問が湧いたものです。

次に、エラーが発生した時はどうなるのか見てみましょう。
存在しない注文番号「00000」などをパラメータに指定してリクエストすると、以下のレスポンスが返ってきました。

{
"errors": "Not Found"
}

HTTPステータスコードも404だったので、エラー検出も簡単にできますね。

Shopify REST APIを使った実例

さまざまな目的で活用することができるShopify REST APIですが、ここではAPIを使った実例をいくつか紹介します。

注文データをAPIで取得しCSVファイルに出力する

Shopifyから自社基幹システムへの連携に便利ですね。作成されたCSVファイルを基幹システムのDBに登録したり、別の社内システムへ連携したりできます。

基幹システムに連携済みのデータをマーキングする

何度も同じ注文を基幹システムに連携しないように、Shopify側の注文データに「この注文は連携済み」と印を付けたい。しかし、Shopify側の注文ステータスに「連携済み」を意味するステータスは用意されていない。
→ タグを使えば解決できます。注文データには「tags」という項目が含まれていますので、そこに任意の文字列をセットできます。
注文データの項目「tags」を「連携済」などといった文字列で更新するよう、APIにリクエストしましょう。

発送情報をAPIで更新する

基幹システムからShopifyへの連携です。商品発送の段取りが完了し、基幹システム側で発送データが作成されたらShopify側へ連携して、顧客に「発送しました」と伝えたい(ShopifyのWebサイト上でのステータス表示、発送済みの通知メール送信、など)ですよね。
例えば以下のようなコードで、APIを使って注文ステータスを「出荷済み」に更新できます。

(Python)
import requests
import json

API_KEY = "XXXXXXXX"

# リクエストの送信
response = requests.put("https://storedomain.myshopify.com/admin/api/2023-07/orders/5317070422241",
headers={"Authorization": "Bearer {0}".format(API_KEY)},
data=json.dumps({"status": "shipped"}))

if response.status_code == 200:
print("ステータスの更新に成功しました。")
else:
print("エラーが発生しました。ステータスコード:{0}".format(response.status_code))

まとめ

Shopify REST APIは、Shopifyの機能を拡張するために便利なツールです。
是非この APIを使って、Shopifyのデータをフル活用しましょう。
また、Shopify REST APIはShopifyのデータを活用するためのさまざまな方法を提供しています。
Shopify REST APIの公式ドキュメントを参照して、あなたのニーズに合った方法を見つけて下さい!
実現方法が見つからない、ニーズをいまいち整理しきれていない、などお困りでしたら弊社がお力添え致します。

ShopifyのAPIには、今回紹介したREST APIの他にGraphQL APIも用意されています。
REST APIではあらゆるデータが一気にまとめて返ってくるので、データとデータの関連性や、どのような概念でデータが切り分けられて管理されているのか、などが個人的には分かりにくい印象でした。
実はGraphQL APIを使うと、その辺りが少し分かってくるのですが……。
次回はそんなGraphQL APIについてお話しさせていただきます、またお会いしましょう! Xin cảm ơn!!

記事: A.K

ShopifyによるECサイト構築支援の詳細はこちら