2023.02.28[Tue]
[シリーズ連載] Shopify Post-Purchase Checkout Extension

Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編③ 〜ディスカウント・確認〜

  • Shopify

目次

  • - 追加商品のディスカウント
  • - 現状
  • - Changeset
  • - 値引き設定の追加
  • - 購入意思確認
  • - 終わりに

この機能は既に実用可能ではありますが、執筆時点の2023年2月現在も「ベータ版」という位置付けであり、今後仕様が変更になる可能性があります。また、公式ドキュメントも随時更新されており、一部の表現やコードの内容が一致しない可能性があります。

Webエンジニアの茄子です。
前回は複数の商品を表示できるようにしました。( https://techlab.q-co.jp/articles/82/ )
今回は、Post-Purchaseページでの値引きと、購入意思確認を追加します。

追加商品のディスカウント

現状

公式サンプルの時から表示しているこのバナーの15%オフという表示ですが、今まで商品の価格は商品管理の「価格」「割引前価格」を表示していただけでした ↓

これを商品管理で設定したものとは別の割引価格にします。

Changeset

参考 :  https://shopify.dev/docs/api/checkout-extensions/extension-points/api#changeset

コードの変更の前に、チュートリアル編②( https://techlab.q-co.jp/articles/77/ )で少し触れたChangesetについて詳しく解説します。

Changeset は、元の購入時の決済情報を書き換える際に、受け入れられる処理の定義です。Changesetと後述の applyChangeset によって変更内容が検証され、決済情報が書き換えられます。現在、AddVariantChange、AddShippingLineChange、SetMetafieldChange、AddSubscriptionChangeの4つが定義されています。SetMetafieldChangeは毛色が違って、決済とは関係なく注文情報に任意の付属データを付与する変更です。

Post-Purchase Checkout Extensionでは、このChangesetのための関数が用意されていてこれらの操作が可能です。
・calculateChangeset : Changesetを反映した状態の小計・送料を算出する
・applyChangeset : Changesetを実際に決済情報に反映する

テンプレートの状態では、useEffectの中で calculateChangeset が行われ、金額が再計算されて表示されます。追加購入確定時にサーバー ( /sign-changeset エンドポイント) に送られます。そして決済の際に付与されているトークン及びAPI SECRETと共に署名され、JWT としてクライアントに返ります。
そのトークンをShopifyが用意している変更を反映するための関数 applyChangeset に渡すと、変更内容が検証され、追加購入が完了します。

値引き設定の追加

  const changes: AddVariantChange[] = [
    {
      type: 'add_variant',
      variantId,
      quantity: 1,
      discount: {
        value: 15,
        valueType: "percentage",
        title: "特別割引",
      }
    }
  ];

changes の中身にこのようにdiscountを追加します。
値引きされた価格が calculateChangeset によって返ってくるので、APIから返しているoriginalPrice, discountedPriceをやめて、コメントアウトされていた calculatedPurchase由来のものを使います。

    // originalPrice,
    // discountedPrice
  } = product as UpsellVariant;

...
...

  const discountedPrice: string = calculatedPurchase?.updatedLineItems[0].totalPriceSet.presentmentMoney.amount || ''; //
  const originalPrice: string = calculatedPurchase?.updatedLineItems[0].priceSet.presentmentMoney.amount;

AddVariantChangeの型に、discountの型を付けておきます。

type ExplicitDiscount = {
  value: number;
  valueType: "percentage" | "fixed_amount";
  title: string;
}

type AddVariantChange = {
  type: 'add_variant';
  variantId: number;
  quantity: number;
  discount?: ExplicitDiscount;
}

15%オフの値段になっていることを確認してください。

購入意思確認

現在の状態では、購入ボタンを押すとその時点で追加購入が決済に追加されます。
1クリックで購入が可能という利点はありますが、誤って購入してしまう危険もありますので、購入意思確認のチェックボックスを追加してみます。

ProceedButtonsに isCheckedというStateを追加し、Checkboxコンポーネントを追加します。

function ProceedButtons({ variantId, total }: {
  variantId: number;
  total: string;
}) {
  const { loading, acceptOffer, declineOffer } = useContext(AppContext);
  const changes: AddVariantChange[] = [{ type: 'add_variant', variantId, quantity: 1 }];

  const [isChceked, setConfirmation] = useState(false);

  return (
    <BlockStack>
      <BlockStack alignment='center'>
        <Checkbox onChange={() => setConfirmation((prev) => !prev)}>
          購入ボタンを押すと決済に商品が追加されます
        </Checkbox>
      </BlockStack>
      <Button onPress={async () => { await acceptOffer(changes) }} submit loading={loading} disabled={!isChceked}>
        Pay now · {formatCurrency(total)}
      </Button>
      <Button onPress={declineOffer} subdued loading={loading}>
        Decline this offer
      </Button>
    </BlockStack>
  )
}

初期状態でdisabledになっていると思います。
チェックして購入を確認してみてください。

終わりに

次回は仕上げとして、モバイルデバイスでの見た目を調整します。

Share

  1. 01 Shopify Post-Purchase Extensionでレジ前販売を実装する 概要編 >
  2. 02 Shopify Post-Purchase Extensionでレジ前販売を実装する チュートリアル編 ① >
  3. 03 Shopify Post-Purchase Extensionでレジ前販売を実装する チュートリアル編 ② >
  4. 04 Shopify Post-Purchase Extensionでレジ前販売を実装する コンポーネント紹介編 ① 〜見た目・入力〜 >
  5. 05 Shopify Post-Purchase Extensionでレジ前販売を実装する コンポーネント紹介編 ② 〜レイアウト〜 >
  6. 06 Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編① 〜ランダム商品〜 >
  7. 07 Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編② 〜複数商品〜 >
  8. 08 Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編③ 〜ディスカウント・確認〜
  9. 09 Shopify Post-Purchase Extensionでレジ前販売を実装する 仕上げ編 〜モバイル〜 >
Shopify Post-Purchase Extensionでレジ前販売を実装する 仕上げ編 〜モバイル〜Strapi v4のAPIをカスタムして扱いやすくする