Cart apiを外部から叩かせないようにしたい

AI-generated summary

販売開始前の商品が購入されてしまった原因として、フロント側のJavaScript制御を回避して Shopify の Cart API(/cart/add.js。商品をカートに追加する Ajax API)が直接実行された可能性が問題になっている。現在はメタフィールドとJSで特定時刻までカートボタンを無効化しているが、Chromeの検証ツールからAPIを叩くと実際にカート追加できることが確認された。

主な論点:

  • JSによる購入制御だけでは、ブラウザ上でAPIを直接呼ばれると防げないのではないか。
  • Cart API自体を「外部から叩けないようにする」方法があるか知りたい。
  • Shopifyサポートからは Launchpad 系アプリを案内されたが、商品公開タイミングの制御が主で、求める対策とは少し異なるとの認識。

代替案として、販売開始までは在庫を0にしておき、指定時刻にアプリやCSVインポートで在庫を増やす方法が提案された。API経由でも在庫がなければ購入できない、という発想。結論はまだ出ておらず、根本対策は未解決のまま。

現在私が運用しているサイトではメタフィールドとjsを用いて特定の時間までカートボタンがクリックできないようにし、カートインできないような仕組みを作っています。

https://qiita.com/br-to/items/255018403ffd437785d4

あまり具体的には話せませんが、↑とjsを組み合わせています。

しかし、最近設定していた販売開始日時よりも前に商品が購入されているという事件が起こりました。

原因は定かではないですが、恐らくshopifyのcart api(https://shopify.dev/docs/themes/ajax-api/reference/cart#post-cart-add-js)を検証ツールか何かで叩いて商品をカートインしているのではないかと考えられました。

let formData = {
 'items': [{
  'id': 38048806600855, // variant_id
  'quantity': 2
  }]
};fetch('/cart/add.js', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(formData)
})
.then(response => {
  return response.json();
})
.catch((error) => {
  console.error('Error:', error);
});

実際上のコードをchromeの検証ツールで入力したらカートインすることができました。

cart apiを外部から入力できないようにすることはできないでしょうか?

ちなみにshopifyのサポートにも連絡したところlaunchpadのようなアプリを使ってみたらどうでしょうかと言われましたが、

アプリでやっていることは特定の時間になったら商品ページを公開すると言ったものだったので少し違うなという印象でした。

知見のある方がございましたらお力添えしていただければ幸いです。

趣旨が違う上に検証していませんが、以下のような方法も考えられるかなと思いました。

  • MatrixifyなどCSVを日時指定でインポートできるアプリを使う
  • 該当の商品の在庫を0にしておき、指定日時になったら該当のアプリで在庫を増やす

APIがどうであっても在庫がなければ買えませんので、在庫自体をどうにかできないかなと考えた次第です。

実現の可否含めてお役に立たない情報でしたら申し訳ありません。

参考:
https://matrixify.app/tutorials/schedule-import-to-shopify-from-google-sheets/