Make line item quantities adjustable
source link: https://stripe.com/docs/payments/checkout/adjustable-quantity
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Make line item quantities adjustable
Only Checkout payment
mode is supported at this time.
Create a Checkout Session with adjustable_quantity
enabled
Set adjustable_quantity
on your line_items
when creating a Checkout Session to enable your customers to update the quantity of an item during checkout.
You can customize the default settings for the minimum and maximum quantities allowed by setting adjustable_quantity.minimum
and adjustable_quantity.maximum
. By default, an item’s minimum quantity is 0
and the maximum quantity is 99
.
If you use adjustable quantities, change your configuration so that it uses adjustable_quantity.maximum
when creating the Checkout Session to reserve inventory quantity instead of the line_items
quantity.
Checkout prevents the customer from removing an item if it is the only item remaining.
# Set your secret key. Remember to switch to your live secret key in production!
# See your keys here: https://dashboard.stripe.com/account/apikeys
Stripe.api_key =
"sk_test_4eC39HqLyjWDarjtT1zdp7dc"
require 'json'
require 'sinatra'
post '/create-checkout-session' do
session = Stripe::Checkout::Session.create({
payment_method_types: ['card'],
line_items: [{
price: '{{PRICE_ID}}',
adjustable_quantity: {
enabled: true,
minimum: 1,
maximum: 10,
},
quantity: 1,
}],
mode: 'payment',
success_url: 'https://example.com/success',
cancel_url: 'https://example.com/cancel',
})
{ id: session.id }.to_json
end
Handling completed transactions
After the payment completes, you can make a request for the finalized line items and their quantities. If your customer removes a line item, it is also removed from the line items response. See the Fulfillment guide to learn how to create an event handler to handle completed Checkout Sessions.
To test your event handler, install the Stripe CLI and use stripe listen --forward-to localhost:4242/webhook
to forward events to your local server.
# Set your secret key. Remember to switch to your live secret key in production!
# See your keys here: https://dashboard.stripe.com/account/apikeys
Stripe.api_key =
"sk_test_4eC39HqLyjWDarjtT1zdp7dc"
require 'sinatra'
# You can find your endpoint's secret in your webhook settings
endpoint_secret = 'whsec_...'
post '/webhook' do
event = nil
# Verify webhook signature and extract the event
# See https://stripe.com/docs/webhooks/signatures for more information.
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
# Invalid payload
return status 400
rescue Stripe::SignatureVerificationError => e
# Invalid signature
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})
# Fulfill the purchase...
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)
# TODO: Remove error and implement...
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
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK