Liquid、JavaScriptなどに関する質問
チェックアウトURLに有効期限はあるのでしょうか?
例えばチェックアウトURLが発行されてからユーザーがチェックアウトを完了せずに放置した場合、30分経過するとセッションタイムアウトになるなどの仕組みがあるのか知りたいです。
また、チェックアウトURLの有効期限を任意の時間で設定できるなどの情報があれば教えて欲しいです。
よろしくお願いいたします。
解決済! ベストソリューションを見る。
成功
はい、APIでチェックアウトのセッションはコントロールできず、そもそもDraft Orderは、前述のようにマーチャントが管理画面から行う注文登録に対応しているので、セッションという概念がありません。
セッションタイムアウトの様な機構はないと思います。時間を置いてリロードしたときに、
商品在庫がなくなったときなども適切に反映がされていると思います。
こちらに同様の議論がありますが、Shopify Plusでしたら対応が可能と私も思います。
kakuma-fbl さん
ご回答ありがとうございます。(別スレでのご回答もありがとうございました)
チェックアウトの対象はdraftOrderで作成したLineItemが前提(記載が漏れておりすみません)のため、Shopifyの在庫追跡機能は使えない状態です。
在庫管理は外部システムでおこなうため、ユーザーがチェックアウトを開始してからチェックアウトを完了するまでの期間、外部システムでは一時的に在庫を確保しておき、一定期間経過してもチェックアウトが完了しない場合には外部システムが確保していた在庫をリリースするような仕組みを検討しています。
セッションタイムアウトではなくても何かしら一定の条件でチェックアウトを無効化することができれば良いのですが方法が見つからず。
セッションやカート保持期間などに関するクッキーポリシーは以下に書いてありますのでご確認ください。
https://www.shopify.com/legal/cookies
ご希望のことをやるのであれば、単純に一定時間超えたらカートを空にすればチェックアウトは進めなくなると思うのですがいかがでしょうか?
Storefront APIか、Ajax APIで可能だと思います。
https://shopify-dev.shopifycloud.com/docs/storefront-api/reference/checkouts/checkoutlineitemsremove
https://shopify.dev/docs/themes/ajax-api/reference/cart#post-cart-clear-js
junichiokamura さん
ご回答いただきありがとうございます。クッキーポリシー拝見させていただきました。
チェックアウトに関するクッキーを見ましたが、checkoutの有効期限は21日間、checkout_tokenの有効期限は1年間となっており、30分放置したらチェックアウトが無効になるという状態をセッションに期待するのは厳しいということがわかりました。
もう1つ、カートを空にするというご提案をいただきましたが、私が前提の話を記載していなかったために質問の意図がお伝えできておらず、期待している回答をいただくことができませんでした。以下に今回の質問の前提を記載させていただきますのでご確認いただき再度ご回答いただけますようお願いいたします。
▼ 前提
・チェックアウトの作成にカートは用いません。
・チェックアウトの作成は自社開発したカスタムアプリからGraphQL Admin APIのdraftOrderCreateを用いておこない、返却されたInvoiceURLにリダイレクトさせることで作成します。
・下書き注文に登録する商品情報は全てCustomLineItem(カスタム商品)として登録します。(Shopifyに登録できるproductは使わない)
▼ 実現したいチェックアウト失敗時のフロー
情報のご共有ありがとうございます。
・チェックアウトの作成にカートは用いません。
・チェックアウトの作成は自社開発したカスタムアプリからGraphQL Admin APIのdraftOrderCreateを用いておこない、返却されたInvoiceURLにリダイレクトさせることで作成します。
・下書き注文に登録する商品情報は全てCustomLineItem(カスタム商品)として登録します。(Shopifyに登録できるproductは使わない)
こちらの利用方法が、そもそもShopifyの利用用途から外れているかと思います。Draft Orderは、管理画面からマーチャントが入力する注文情報ですので、ストアフロントには応用できません。(場合にはよっては規約違反の実装になるかと思います)。
カスタムストアフロントを実装される場合は、アプリをSales Channel化してStorefront APIで実装いただくことになります。
https://shopify.dev/docs/storefront-api
Storefront APIを使う場合、基本的には最終的な決済はShopifyのものを使うことになります。独自に決済のAPIを使う場合は、Payment APIの申請がSales channelの申請と同時に必要ですが、これはPrivate appでは利用できず、以下のような決済代行会社に求められるような基準があります。
https://shopify.dev/tutorials/authenticate-a-public-app-with-oauth#request-payment-processing
InvoiceURLを使われるので、Payment APIを使う必要はないと思いますが、DraftOrderをStorefront APIの回避策として使うのは、想定の利用方法ではありません。
https://shopify.dev/docs/admin-api/graphql/reference/orders/draftorder
ご回答いただきありがとうございます。
カスタムストアフロントを実装する場合は、アプリをSalesChannel化してStorefrontAPIで実装する必要があることは理解いたしました。
カスタムストアフロントの定義がドキュメントを見ただけでは理解できなかったのですが、先程共有させていただきました資料の「特定のページ≠カートページ」というのが何を指しているのかについて再度共有させていただいた上で、カスタムストアフロントの定義に当てはまるのか教えてください。
▼ 特定のページ≠カートページ
・このページはShopifyのproductページの1つを指しています。(外部サイトではない)
・このページの「今すぐ予約する」ボタンをクリックすると先程共有させていただいた一連のフローが発火します。
・このページはproductページですが、在庫や価格などの情報は外部システムで管理しているため「在庫数:0」「在庫の追跡:おこなわない」「価格:0」となっています。
※ 尚、決済はShopifyのものをそのまま使う想定です。
整理させていただくと、やりたいことは、直接的にはカスタムストアフロントではなくて、
在庫をShopify外のシステムで管理する。
宿泊施設の予約を提供する。
の2つで、これを実現するためにカスタムアプリで事前に在庫を確保して、invoice URLを送る処理をDraftOrder APIを使うので、自然と在庫をリリースするためにセッションのタイムアウトも必要になっているという理解でよろしいでしょうか?
在庫をシステム外で管理するには、下記のフルフィルメントサービスのAPIで独自に追加すれば、内部で外部システムと連携して在庫処理ができるようになります。(このAPIで作ったフィルメントサービスを商品マスターで紐づける)
https://shopify.dev/docs/admin-api/rest/reference/shipping-and-fulfillment/fulfillmentservice
なお、ブッキングや予約の機能はアプリで国内外でたくさん出されているので、まずはそういったアプリを検討して挙動を確認されるのはいかがでしょうか?
https://apps.shopify.com/booking-app-by-webkul?locale=ja
https://apps.shopify.com/shopify-application-112?locale=ja
別のご質問で、商品マスターを使わず、全てカスタム商品で賄うようなお話をされていましたが、ご提案内容が、ほとんどShopifyの主要な機能、データを使わず若干無理やりなイメージがあるので、まずはアプリで通常の予約サイトを構築されてみるのが良いかと思います。
特に、在庫と価格を0にするというには、だいぶん無理があって、運用で色々支障をきたすかと思います。。
なお、在庫は下記のようにAPIでコントロール可能なので、例えば、フルフィルメントサービスを使わずとも、外部の在庫マスターと連動して、任意のタイミングでAPIで更新可能です。
https://shopify.dev/docs/admin-api/graphql/reference/inventory
よくあるアプローチは、App proxyを使って、テーマ内からAjax通信でアプリにリクエストをしてそこでAPIで在庫を増減するやり方です。
予約から決済完了まで入荷の時間含めて間をおきたい場合は、手動決済で保有にして、商品が揃った時に請求を出すなどの運用が必要ですが、ご提案いただいているフローは実質即時決済なので、在庫の外部連携とタイミングさえ解決できれば、あとは普通に予約枠を商品管理して、通常のチェックアウトで実現できそうな気がします。
ですので、まずは他のアプリを参考に設計を全体的に見直されて、どうしても今の設計以外は無理であれば、またこちらに更新していただければと思います。
@junichiokamura さんは書きました:整理させていただくと、やりたいことは、直接的にはカスタムストアフロントではなくて、
在庫をShopify外のシステムで管理する。
宿泊施設の予約を提供する。
の2つで、これを実現するためにカスタムアプリで事前に在庫を確保して、invoice URLを送る処理をDraftOrder APIを使うので、自然と在庫をリリースするためにセッションのタイムアウトも必要になっているという理解でよろしいでしょうか?
要件の整理とご回答をいただきありがとうございます。
今回実現したかったことはjunichiokamuraさんのおっしゃった通りです。
ご提案いただいた内容を元に、StorefrontAPIを使ってやりたいことが実現可能かどうかまずは調査したいと思います。
ちなみに最初の質問へのご回答もいただきたいのですが、draftOrderAPIを使って作ったチェックアウトにセッションのタイムアウトを設定することはできないということで合っていますか?
成功
はい、APIでチェックアウトのセッションはコントロールできず、そもそもDraft Orderは、前述のようにマーチャントが管理画面から行う注文登録に対応しているので、セッションという概念がありません。
ご回答ありがとうございました。
最初の質問は解決いたしました。
今後ともよろしくお願いいたします。
サポートの選択肢が増えていく中、最適となる選択の判断が難しくなっているかと存じます。今回は問題の解決に最適となるサポートの選択方法を、紹介させて頂きます。 選択肢のご紹介...
By Mirai Oct 7, 20242023年初頭、Shopifyペイメントアカウント、及びShopifyアカウント全体のセキュリティを強化する為の変更が適用されました。ユーザーのアカウントセキュリティを強化す...
By Mirai Sep 30, 2024概要: 年末/年明けは、消費者が最もショッピングを行う時期の一つです。特に、ブラックフライデー・サイバーマンデー(BFCM)は、世界中で注目される大規模なセールイベントであ...
By JapanGuru Sep 25, 2024