各 Checkout セッションのラインアイテムは、顧客が購入しようとしているものを追跡します。顧客が決済時にラインアイテムの数量を調整できるように、Checkout セッションを設定できます。
調整数量が適用された Checkout セッションを作成する
Checkout セッションを作成する際、line_items
に adjustable_quantity
を設定して、決済時に顧客が商品の数量を変更できるようにします。
adjustable_quantity.minimum
と adjustable_quantity.maximum
を設定することで、デフォルトの最小 / 最大数量をカスタマイズできます。デフォルトでは、商品の最小調整数量は 0
、最大調整数量は 99
に設定されています。adjustable_quantity.maximum
には最大 999999
の値を指定できます。
line_items[].quantity
の値が 99
(デフォルトの最大調整数量) よりも大きい調整数量を適用する場合、adjustable_quantity.maximum
をその商品の数量以上の値に設定してください。
調整数量を適用する場合は、Checkout セッションの作成時に adjustable_quantity.maximum
を使用して、line_items
の数量の代わりに在庫数量をリザーブするように設定を変更します。
Checkout に商品が 1 つしか残っていない場合、顧客はそれを削除することができません。
curl https://api.stripe.com/v1/checkout/sessions \
-u "sk_test_BQokikJOvBiI2HlWgH4olfQ2
:" \
-d "line_items[0][price_data][currency]"=usd \
-d "line_items[0][price_data][product_data][name]"=T-shirt \
-d "line_items[0][price_data][unit_amount]"=2000 \
-d "line_items[0][price_data][tax_behavior]"=exclusive \
-d "line_items[0][adjustable_quantity][enabled]"=true \
-d "line_items[0][adjustable_quantity][minimum]"=1 \
-d "line_items[0][adjustable_quantity][maximum]"=10 \
-d "line_items[0][quantity]"=1 \
-d "automatic_tax[enabled]"=true \
-d mode=payment \
--data-urlencode success_url="https://example.com/success" \
--data-urlencode cancel_url="https://example.com/cancel"
完了した取引を処理する
支払いが完了したら、確定済みの項目とその数量に対するリクエストを作成できます。顧客が項目を削除した場合、項目のレスポンスからも削除されます。完了済みの Checkout セッションを処理するイベントハンドラの作成方法については、フルフィルメントガイドをご覧ください。
Stripe.api_key = "sk_test_BQokikJOvBiI2HlWgH4olfQ2"
require 'sinatra'
endpoint_secret = 'whsec_...'
post '/webhook' do
event = nil
begin
sig_header = request.env['HTTP_STRIPE_SIGNATURE']
payload = request.body.read
event = Stripe::Webhook.construct_event(payload, sig_header, endpoint_secret)
rescue JSON::ParserError => e
return status 400
rescue Stripe::SignatureVerificationError => e
return status 400
end
if event['type'] == 'checkout.session.completed'
checkout_session = event['data']['object']
line_items = Stripe::Checkout::Session.list_line_items(checkout_session['id'], {limit: 100})
begin
fulfill_order(checkout_session, line_items)
rescue NotImplementedError => e
return status 400
end
end
status 200
end
def fulfill_order(checkout_session, line_items)
raise NotImplementedError.new(<<~MSG)
Given the Checkout Session "#{checkout_session.id}" load your internal order from the database here.
Then you can reconcile your order's quantities with the final line item quantity purchased. You can use `checkout_session.metadata` and `price.metadata` to store and later reference your internal order and item ids.
MSG
end