Skip to content

Commit

Permalink
Added Simple Pay Standard service definition.
Browse files Browse the repository at this point in the history
Modified Simplepay module variable names to be more descriptive.
Fixed authentication signature generation algorithm.
Added convenience methods to Service to auto-set access id's and signature.
Added method and action to generated form tags.
  • Loading branch information
nbibler committed Dec 6, 2008
1 parent 3fd2e94 commit 2d7a6e3
Show file tree
Hide file tree
Showing 11 changed files with 107 additions and 28 deletions.
2 changes: 2 additions & 0 deletions Manifest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ lib/simplepay/authentication.rb
lib/simplepay/constants.rb
lib/simplepay/errors.rb
lib/simplepay/helpers/form_helper.rb
lib/simplepay/helpers/rails_helper.rb
lib/simplepay/service.rb
lib/simplepay/services/standard.rb
lib/simplepay/services/subscription.rb
lib/simplepay/support.rb
lib/simplepay/support/amount.rb
Expand Down
5 changes: 1 addition & 4 deletions README.rdoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,15 @@ http://simplepay.rubyforge.org

This gem provides a Rails interface to the Amazon Simple Pay payment service.

At the moment, this library only provides a definition for the subscription
service, but additional services will be added, shortly.

== FEATURES/PROBLEMS:

Supports the following Amazon Simple Pay services:

* Standard
* Subscription

The following services are coming someday (hopefully soon):

* Standard
* Donation
* Marketplace

Expand Down
23 changes: 9 additions & 14 deletions lib/simplepay.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,24 @@

require 'active_support'

require 'simplepay/constants'
require 'simplepay/support'
require 'simplepay/service'
require 'simplepay/services/subscription'

require 'simplepay/helpers/form_helper'

module Simplepay

VERSION = '0.0.1'

mattr_accessor :html_tag_terminator
@@html_tag_terminator = '/'
VERSION = '0.0.1' unless const_defined?(:VERSION)

mattr_accessor :access_key_id
mattr_accessor :secret_access_key
mattr_accessor :aws_access_key_id
mattr_accessor :aws_secret_access_key
mattr_accessor :account_id

mattr_accessor :use_sandbox
@@use_sandbox = true


def self.use_sandbox?
@@use_sandbox
end

end

require 'simplepay/constants'
require 'simplepay/support'
require 'simplepay/service'
require 'simplepay/helpers/form_helper'
6 changes: 3 additions & 3 deletions lib/simplepay/authentication.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ module Authentication

class << self

def generate(hash_data, secret_access_key = Simplepay.secret_access_key)
def generate(hash_data, secret_access_key = Simplepay.aws_secret_access_key)
encode(digest(convert_to_string(hash_data), secret_access_key))
end

def authentic?(hash_data, signature, secret_access_key = Simplepay.secret_access_key)
def authentic?(hash_data, signature, secret_access_key = Simplepay.aws_secret_access_key)
signature == generate(hash_data, secret_access_key)
end

Expand All @@ -46,7 +46,7 @@ def convert_to_string(hash)
raise(ArgumentError, "Expected a Hash of data") unless hash.kind_of?(Hash)
data = hash.stringify_keys
string = ''
data.keys.sort.each { |k| string += "#{k}#{data[k]}" }
data.keys.sort.each { |k| string += "#{k}#{data[k]}" unless data[k].blank? }
string
end

Expand Down
28 changes: 28 additions & 0 deletions lib/simplepay/helpers/rails_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require 'action_view/base'

module Simplepay
module Helpers

module RailsHelper

def simplepay_form_for(service_name, attributes = {})
service = get_simplepay_service(service_name)
service.form(attributes)
end


private


def get_simplepay_service(name)
service = "Simplepay::Services::#{name.to_s.camelize}".constantize
service.new
end

end

end
end

# Inject helper into Rails ActionView.
ActionView::Base.__send__(:include, Simplepay::Helpers::RailsHelper)
20 changes: 18 additions & 2 deletions lib/simplepay/service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@ def url(sandbox = Simplepay.use_sandbox?)
end

def form(attributes = {}, submit = nil)
set_accessor_fields
set_fields(attributes)
set_signature
content = generate_input_fields + generate_submit_field(submit)
Simplepay::Helpers::FormHelper.content_tag(:form, content)
Simplepay::Helpers::FormHelper.content_tag(:form, content, {:method => 'post', :action => url})
end


Expand All @@ -95,12 +97,26 @@ def generate_submit_field(submit)
submit ? submit.to_s : Simplepay::Helpers::FormHelper.tag(:input, options)
end

def set_accessor_fields
self.access_key = Simplepay.aws_access_key_id if self.respond_to?(:access_key=)
self.account_id = Simplepay.account_id if self.respond_to?(:account_id=)
end

def set_fields(hash)
hash.each_pair do |key, value|
self.send("#{key}=", value) if self.respond_to?("#{key}=")
end
end

def set_signature
fields = {}
self.fields.each { |f| fields[f.service_name] = f.value unless f.service_name == 'signature' }
self.signature = Authentication.generate(fields) if self.respond_to?(:signature=)
end

end

end
end

require 'simplepay/services/subscription'
require 'simplepay/services/standard'
39 changes: 39 additions & 0 deletions lib/simplepay/services/standard.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
module Simplepay
module Services

##
# The Amazon Simple Pay Standard service is used for one-time payments.
#
class Standard < Service

ENDPOINT_URL = 'https://authorize.payments-sandbox.amazon.com/pba/paypipeline'
SANDBOX_URL = 'https://authorize.payments-sandbox.amazon.com/pba/paypipeline'

required_field :access_key
required_field :signature
required_field :account_id, :as => :amazon_payments_account_id

required_field :description
required_field :amount, :class => Support::Amount
required_field :cobranding_style, :value => 'logo'

field :reference_id
field :immediate_return, :class => Support::Boolean
field :collect_shipping_address, :class => Support::Boolean
field :process_immediately, :class => Support::Boolean,
:as => :process_immediate

field :return_url
field :ipn_url
field :abandon_url

# These fields are not currently utilized by the service
field :variable_marketplace_fee, :value => ''
field :donation_widget, :as => :is_donation_widget,
:value => '0'
field :fixed_marketplace_fee, :value => ''

end

end
end
3 changes: 1 addition & 2 deletions lib/simplepay/services/subscription.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ class Subscription < Service

# These fields are not currently utilized by the service
field :variable_marketplace_fee, :value => ''
field :donation_widget, :class => Support::Boolean,
:as => :is_donation_widget,
field :donation_widget, :as => :is_donation_widget,
:value => '0'
field :fixed_marketplace_fee, :value => ''

Expand Down
2 changes: 1 addition & 1 deletion lib/simplepay/support/field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def required?
#
def to_input
raise(RequiredFieldMissing, "Missing Required Field value for #{name}") if required? && value.blank?
value ? html_input_tag : ''
value.blank? ? '' : html_input_tag
end

def delegated? #:nodoc:
Expand Down
3 changes: 1 addition & 2 deletions test/simplepay/services/test_subscription.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@ def self.model_class; Simplepay::Services::Subscription; end

should_have_service_field :donation_widget,
:as => 'isDonationWidget',
:required => false,
:class => Simplepay::Support::Boolean
:required => false

should_have_service_field :fixed_marketplace_fee,
:as => 'fixedMarketplaceFee',
Expand Down
4 changes: 4 additions & 0 deletions test/simplepay/test_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ class Simplepay::TestService < Test::Unit::TestCase
assert_match /<\/form>\Z/i, @service.form
end

should 'post the form to the endpoint' do
assert_match /<form action="#{Regexp.escape('http://test.host.url/sandbox')}" method="post"/, @service.form({:required => 'set'})
end

should 'generate HIDDEN HTML INPUTs for each non-empty field' do
@service.required = 'Test Field'
@service.field_1 = 'Testing'
Expand Down

0 comments on commit 2d7a6e3

Please sign in to comment.