商品に対して金額を上乗せできる機能を作成したい

ShopifyでBoothのBOOST↑機能のように特定の商品に対して金額を上乗せして購入できる機能を作成したいのですが、実現可能でしょうか。

Shopifyのデフォルト機能でチップ機能がありますが、これは商品に紐づかないのと、最大でも注文の合計金額までの制限があるので、金額の制限なしに商品のバリアントに紐づけられるようにしたいです。

もし実現可能であれば方法を教えていただけるとありがたいです。

@nekonoha 以下の方法で商品に対して金額を上乗せできます。ご検討お願いします。

Shopify Functions の一部である Cart Transform を使用すると、カートのアイテムに対して動的な変更が可能になります。これを Checkout UI Extension と組み合わせることで、購入者が入力した金額を基にカートを更新し、任意のチップ金額を追加する仕組みを構築できます。

なお、shopify plusプランでないとこちらは実現できません。

※ 以下、shopify appをの知識がある前提の説明ですので一部省略しています。

詳細はBuild an extension-only appをご確認ください。

1. Checkout UI Extension のセットアップ

  1. Shopify CLI を使用して新しい Checkout UI Extension を作成します。
shopify app generate extension --template=checkout_ui
  1. 拡張機能のファイルを編集し、ユーザーがチップ金額を入力できる UI を追加します。

shopify.extension.tomlの例:

[[extensions.targeting]]
module = "./src/Checkout.tsx"
target = "purchase.checkout.cart-line-item.render-after"

src/Checkout.tsx`の例:

チップ代の上限は要件に合わせて変更してください。

import {
  reactExtension,
  Stepper,
  useCartLineTarget,
  useApplyCartLinesChange,
} from "@shopify/ui-extensions-react/checkout";

// 各line itemにチップ代を追加するコンポーネント追加
export default reactExtension(
  "purchase.checkout.cart-line-item.render-after",
  () => 

3.UI Extensionをデプロイします。

```markup
shopify app deploy
  1. チェックアウト画面に UI を追加します。
    管理画面のチェックアウト設定で、注文サマリーセクションに作成した UI Extension を追加します。
    これでチップを入力するたびに、カートの line item にチップ代が設定されます。

なお、UI ExtensionについてはCheckout Blocks アプリでも実装可能です。

  1. Cart Transform Function の実装

Cart Transform Function を使用して入力されたチップ金額を商品価格に上乗せするロジックを実装します。

  1. 新しい Function を作成します:
shopify app generate extension --type=cart_transform
  1. src/run.graphqlファイルで、チップの操作に必要な GraphQL スキーマを定義します。
    run.graphql`の例:
query RunInput {
  cart {
    lines {
      id
      cost {
        amountPerQuantity {
          amount
        }
      }
      # UI側で"_チップ代"とした場合、こちらも"_チップ代"としてください
      attribute(key: "チップ代") {
        key
        value
      }
    }
  }
}

定義したら、extension ディレクトリにて以下を実行して function が受け取るデータの型を生成します。

shopify app function generate
  1. src/run.tsにロジックを追加します。

run.tsの例:

import type {
  RunInput,
  FunctionRunResult,
  CartOperation,
} from "../generated/api";

const NO_CHANGES: FunctionRunResult = {
  operations: [],
};

export function run(input: RunInput): FunctionRunResult {
  const tipItems = input.cart.lines.filter((line) => line.attribute?.value);

  // チップが設定されていない場合は何もしない
  if (tipItems.length === 0) {
    return NO_CHANGES;
  }

  const operations: CartOperation[] = tipItems.map(
    ({ id, cost, attribute }) => {
      const price = Number(cost.amountPerQuantity.amount);
      const tip = Number(attribute?.value || 0);
      const total = price + tip;

      return {
        update: {
          cartLineId: id,
          price: {
            adjustment: {
              fixedPricePerUnit: { amount: total },
            },
          },
        },
      };
    }
  );

  return {
    operations,
  };
}
  1. Function をデプロイします。
shopify app deploy
  1. Cart Transform Function を有効化します。
    先にFunction一覧を取得し、該当のcart_transformのFunction Idをメモします
query shopifyFunctions {
  shopifyFunctions(first: 30) {
    nodes {
      app {
        title
      }
      apiType
      title
      id
    }
  }
}

Admin API を使用して、Function を有効化します。

mutation CreateCartTransform {
  cartTransformCreate(functionId: "

これで、チップ金額の変更を検知して、カートの価格に上乗せできるかと思います。

![bluetree_0-1733368994280.png|507x359](upload://9gq0hSrrj5HPwGdXhjqp7rimFWH.png)

![bluetree_1-1733369022613.png|528x351](upload://vzrjaNG4uSzhsvClPheh0YaE2jG.png)
1 Like