Created
August 5, 2014 19:46
-
-
Save MisinformedDNA/3a78b2aa448532b3a543 to your computer and use it in GitHub Desktop.
Spree Checkout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative '../base' | |
module Examples | |
module Checkout | |
class Walkthrough | |
def self.run(client) | |
# Create the order step by step: | |
# You may also choose to start it off with some line items | |
# See checkout/creating_with_line_items.rb | |
response = client.post('/api/orders?order[user_id]=1') | |
if response.status == 201 | |
client.succeeded "Created new checkout." | |
order = JSON.parse(response.body) | |
if order['email'] == '[email protected]' | |
# Email addresses are necessary for orders to transition to address. | |
# This just makes really sure that the email is already set. | |
# You will not have to do this in your own API unless you've customized it. | |
client.succeeded 'Email set automatically on order successfully.' | |
else | |
client.failed %Q{ | |
Email address was not automatically set on order.' | |
-> This may lead to problems transitioning to the address step. | |
} | |
end | |
else | |
client.failed 'Failed to create a new blank checkout.' | |
end | |
# Assign a line item to the order we just created. | |
response = client.post("/api/orders/#{order['number']}/line_items", | |
{ | |
line_item: { | |
variant_id: 1, | |
quantity: 1 | |
} | |
} | |
) | |
if response.status == 201 | |
client.succeeded "Added a line item." | |
else | |
client.failed "Failed to add a line item." | |
end | |
# Transition the order to the 'address' state | |
response = client.put("/api/checkouts/#{order['number']}/next") | |
if response.status == 200 | |
order = JSON.parse(response.body) | |
client.succeeded "Transitioned order into address state." | |
else | |
client.failed "Could not transition order to address state." | |
end | |
# Add address information to the order | |
address = { | |
first_name: 'Test', | |
last_name: 'User', | |
address1: 'Unit 1', | |
address2: '1 Test Lane', | |
country_id: 49, | |
state_id: 1, | |
city: 'Bethesda', | |
zipcode: '20814', | |
phone: '(555) 555-5555' | |
} | |
response = client.put("/api/checkouts/#{order['number']}", | |
{ | |
order: { | |
bill_address_attributes: address, | |
ship_address_attributes: address | |
} | |
} | |
) | |
if response.status == 200 | |
client.succeeded "Address details added." | |
order = JSON.parse(response.body) | |
if order['state'] == 'delivery' | |
client.succeeded "Order automatically transitioned to 'delivery'." | |
else | |
client.failed "Order failed to automatically transition to 'delivery'." | |
end | |
else | |
client.failed "Could not add address details to order." | |
end | |
# Next step: delivery! | |
first_shipment = order['shipments'].first | |
response = client.put("/api/checkouts/#{order['number']}", | |
{ | |
order: { | |
shipments_attributes: [ | |
id: first_shipment['id'], | |
selected_shipping_rate_id: first_shipment['shipping_rates'].first['id'] | |
] | |
} | |
} | |
) | |
if response.status == 200 | |
client.succeeded "Delivery options selected." | |
order = JSON.parse(response.body) | |
if order['state'] == 'payment' | |
client.succeeded "Order automatically transitioned to 'payment'." | |
else | |
client.failed "Order failed to automatically transition to 'payment'." | |
end | |
else | |
client.failed "The store was not happy with the selected delivery options." | |
end | |
# Next step: payment! | |
# First up: a credit card payment | |
credit_card_payment_method = order['payment_methods'].detect { |pm| pm['name'] == "Braintree" } | |
response = client.put("/api/checkouts/#{order['number']}", | |
{ | |
order: { | |
payments_attributes: [{ | |
payment_method_id: credit_card_payment_method['id'] | |
}], | |
}, | |
payment_source: { | |
credit_card_payment_method['id'] => { | |
number: '4111111111111111', # just a nonsense one. Will work with dummy CC gateway | |
month: '1', | |
year: '2017', | |
verification_value: '123', | |
name: 'John Smith', | |
} | |
} | |
}) | |
if response.status == 200 | |
order = JSON.parse(response.body) | |
client.succeeded "Payment details provided for the order." | |
# Order will transition to the confirm state only if the selected payment | |
# method allows for payment profiles. | |
# The dummy Credit Card gateway in Spree does, so confirm is shown for this order. | |
if order['state'] == 'confirm' | |
client.succeeded "Order automatically transitioned to 'confirm'." | |
else | |
client.failed "Order did not transition automatically to 'confirm'." | |
end | |
else | |
client.failed "Payment details were not accepted for the order." | |
end | |
# This is the final point where the user gets to view their order's final information. | |
# All that's required at this point is that we complete the order, which is as easy as: | |
response = client.put("/api/checkouts/#{order['number']}/next") | |
if response.status == 200 | |
order = JSON.parse(response.body) | |
if order['state'] == 'complete' | |
client.succeeded "Order complete!" | |
else | |
client.failed "Order did not complete." | |
end | |
else | |
client.failed "Order could not transition to 'complete'." | |
end | |
end | |
end | |
end | |
end | |
Examples.run(Examples::Checkout::Walkthrough) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment