Ashmont is a set of classes that make it easier to use Braintree payment processing in a Rails application.
Ashmont attempts to make the following tasks easier:
- Processing error messages from Braintree and using them in the ActiveModel API
- Delegating and caching relevant information in a model backed by a Braintree recurring subscription
- Delegating and caching relevant information in a model backed by a Braintree customer with a credit card
- Determining what actions are necessary to handle a form update, such as updating a credit card, switching subscription plans, or retrying failed subscription transactions
Ashmont is still an early work in progress and the API may change dramatically with each release.
In your Gemfile:
If you have an account with Braintree with multiple merchant accounts you'll want to configure the merchant account for this application:
Ashmont.merchant_account_id = 'your merchant account id'
Ashmont converts billing dates from Braintree into TimeWithZone instances to avoid time zone mishaps. You'll want to configure Ashmont with the correct timezone so that billing dates end up on the correct day.
Ashmont.merchant_account_time_zone = 'Eastern Time (US & Canada)'
In order to process payments with Braintree, you'll want to store customer and subscription tokens locally. You'll also need to store the billing status next billing date in order to synchronize account status with Braintree.
create_table "users" do |t| t.string "customer_token" t.string "subscription_token" t.datetime "next_billing_date" t.string "subscription_status" end
Here's a simple example for creating and updating a subscribed customer:
class User < ActiveRecord::Base before_create :create_customer after_destroy :destroy_customer memoize :customer def past_due? customer.past_due? end def save_customer(attributes) customer.save(attributes) end private def create_customer save_customer(:email => email) if customer.save(:email => email) self.customer_token = customer.token self.subscription_token = customer.subscription_token self.next_billing_date = customer.next_billing_date self.subscription_status = customer.status true else copy_errors customer.errors false end end def destroy_customer customer.delete end def copy_errors(source_errors) source_errors.to_hash.each do |attribute, messages| errors.set(attribute, messages) end end def customer Ashmont::SubscribedCustomer.new( Ashmont::Customer.new(customer_token), Ashmont::Subscription.new(subscription_token, :status => subscription_status) ) end end user = User.new(params[:user]) user.save_customer(params[:customer])
save_customer method will accept attributes related to
subscriptions, customrers, and credit cards.
We recommend testing your applications using the fake_braintree library, which allows applications to use the real Braintree API without actually hitting Braintree's servers during automated tests.
Ashmont is Copyright © 2011 thoughtbot. It is free software, and may be redistributed under the terms specified in the LICENSE file.