Permalink
b675465 Oct 10, 2017
@jack-stripe @bg-stripe @ksun-stripe @mrmcduff-stripe
139 lines (124 sloc) 4.26 KB
require 'sinatra'
require 'stripe'
require 'dotenv'
require 'json'
require 'encrypted_cookie'
Dotenv.load
Stripe.api_key = ENV['STRIPE_TEST_SECRET_KEY']
use Rack::Session::EncryptedCookie,
:secret => 'replace_me_with_a_real_secret_key' # Actually use something secret here!
get '/' do
status 200
return "Great, your backend is set up. Now you can configure the Stripe example apps to point here."
end
post '/ephemeral_keys' do
authenticate!
begin
key = Stripe::EphemeralKey.create(
{customer: @customer.id},
{stripe_version: params["api_version"]}
)
rescue Stripe::StripeError => e
status 402
return "Error creating ephemeral key: #{e.message}"
end
status 200
key.to_json
end
post '/charge' do
authenticate!
# Get the credit card details submitted
payload = params
if request.content_type.include? 'application/json' and params.empty?
payload = indifferent_params(JSON.parse(request.body.read))
end
source = payload[:source]
customer = payload[:customer_id] || @customer.id
# Create the charge on Stripe's servers - this will charge the user's card
begin
charge = Stripe::Charge.create(
:amount => payload[:amount], # this number should be in cents
:currency => "usd",
:customer => customer,
:source => source,
:description => "Example Charge",
:shipping => payload[:shipping],
)
rescue Stripe::StripeError => e
status 402
return "Error creating charge: #{e.message}"
end
status 200
return "Charge successfully created"
end
def authenticate!
# This code simulates "loading the Stripe customer for your current session".
# Your own logic will likely look very different.
return @customer if @customer
if session.has_key?(:customer_id)
customer_id = session[:customer_id]
begin
@customer = Stripe::Customer.retrieve(customer_id)
rescue Stripe::InvalidRequestError
end
else
begin
@customer = Stripe::Customer.create(:description => "mobile SDK example customer")
rescue Stripe::InvalidRequestError
end
session[:customer_id] = @customer.id
end
@customer
end
# This endpoint is used by the Obj-C and Android example apps to create a charge.
post '/create_charge' do
# Create the charge on Stripe's servers
begin
charge = Stripe::Charge.create(
:amount => params[:amount], # this number should be in cents
:currency => "usd",
:source => params[:source],
:description => "Example Charge"
)
rescue Stripe::StripeError => e
status 402
return "Error creating charge: #{e.message}"
end
status 200
return "Charge successfully created"
end
# This endpoint responds to webhooks sent by Stripe. To use it, you'll need
# to add its URL (https://{your-app-name}.herokuapp.com/stripe-webhook)
# in the webhook settings section of the Dashboard.
# https://dashboard.stripe.com/account/webhooks
post '/stripe-webhook' do
json = JSON.parse(request.body.read)
# Retrieving the event from Stripe guarantees its authenticity
event = Stripe::Event.retrieve(json["id"])
source = event.data.object
# For sources that require additional user action from your customer
# (e.g. authorizing the payment with their bank), you should use webhooks
# to create a charge after the source becomes chargeable.
# For more information, see https://stripe.com/docs/sources#best-practices
WEBHOOK_CHARGE_CREATION_TYPES = ['bancontact', 'giropay', 'ideal', 'sofort', 'three_d_secure']
if event.type == 'source.chargeable' && WEBHOOK_CHARGE_CREATION_TYPES.include?(source.type)
begin
charge = Stripe::Charge.create(
:amount => source.amount,
:currency => source.currency,
:source => source.id,
:customer => source.metadata["customer"],
:description => "Example Charge"
)
rescue Stripe::StripeError => e
p "Error creating charge: #{e.message}"
return
end
# After successfully creating a charge, you should complete your customer's
# order and notify them that their order has been fulfilled (e.g. by sending
# an email). When creating the source in your app, consider storing any order
# information (e.g. order number) as metadata so that you can retrieve it
# here and use it to complete your customer's purchase.
end
status 200
end