[シリーズ連載] Shopify Post-Purchase Checkout Extension
Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編③ 〜ディスカウント・確認〜
この機能は既に実用可能ではありますが、執筆時点の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になっていると思います。
チェックして購入を確認してみてください。
終わりに
次回は仕上げとして、モバイルデバイスでの見た目を調整します。
- 01 Shopify Post-Purchase Extensionでレジ前販売を実装する 概要編 >
- 02 Shopify Post-Purchase Extensionでレジ前販売を実装する チュートリアル編 ① >
- 03 Shopify Post-Purchase Extensionでレジ前販売を実装する チュートリアル編 ② >
- 04 Shopify Post-Purchase Extensionでレジ前販売を実装する コンポーネント紹介編 ① 〜見た目・入力〜 >
- 05 Shopify Post-Purchase Extensionでレジ前販売を実装する コンポーネント紹介編 ② 〜レイアウト〜 >
- 06 Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編① 〜ランダム商品〜 >
- 07 Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編② 〜複数商品〜 >
- 08 Shopify Post-Purchase Extensionでレジ前販売を実装する 機能拡張編③ 〜ディスカウント・確認〜
- 09 Shopify Post-Purchase Extensionでレジ前販売を実装する 仕上げ編 〜モバイル〜 >