Integrate Stripe Payment Intent API in Ruby
- Ensure you have installed the Stripe gem in your Ruby application. You can add this to your Gemfile:
gem 'stripe'
- Configure your Stripe API keys. This is typically done in an initializer file, where you set your Stripe secret key:
Stripe.api_key = 'your_secret_key'
- To create a Payment Intent, initiate a request to Stripe's API. Payment Intents represent a payment lifecycle:
intent = Stripe::PaymentIntent.create(
amount: 1099, # Amount in cents
currency: 'usd',
payment_method_types: ['card'],
)
- Send the client secret to your front-end application to complete the payment process client-side:
intent.client_secret
- In your client-side application, use the Stripe.js library to confirm the payment, using the client secret:
const stripe = Stripe('your_publishable_key');
stripe.confirmCardPayment(clientSecret, {
payment_method: {
card: cardElement,
billing_details: {
name: 'customer name',
},
}
}).then(function(result) {
if (result.error) {
// Display error.message in your UI.
} else {
// The payment has been processed!
if (result.paymentIntent.status === 'succeeded') {
// Show success message or handle post-payment logic
}
}
});
- After receiving a successful payment confirmation, handle post-payment actions (e.g., updating order status, sending confirmation emails) in your server-side Ruby application.
- For security, implement Stripe webhooks to confirm the payment's completion server-side. You receive an event when a Payment Intent changes state:
require 'sinatra'
require 'stripe'
Stripe.api_key = 'your_secret_key'
post '/webhook' do
payload = request.body.read
sig_header = request.env['HTTP_STRIPE_SIGNATURE']
event = nil
begin
event = Stripe::Webhook.construct_event(
payload, sig_header, YOUR_ENDPOINT_SECRET
)
rescue JSON::ParserError => e
status 400
return
rescue Stripe::SignatureVerificationError => e
status 400
return
end
# Handle the event
case event.type
when 'payment_intent.succeeded'
payment_intent = event.data.object
# Fulfill the purchase, update your database etc.
end
content_type 'application/json'
{status: 'success'}.to_json
end
- Test the integration thoroughly with Stripe's test mode to ensure payment workflows function smoothly, before switching to live keys.