flexpay 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,107 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
+
3
+ require 'openssl'
4
+ require 'net/https'
5
+ require 'uri'
6
+ require 'date'
7
+ require 'base64'
8
+
9
+ require 'flexpay/request'
10
+ require 'flexpay/api_module'
11
+
12
+ require 'flexpay/cobranding_api/v2009_01_09'
13
+ require 'flexpay/fps_api/v2008_09_17'
14
+
15
+ require 'flexpay/util'
16
+ require 'flexpay/exceptions'
17
+
18
+ module Flexpay
19
+ class API
20
+
21
+ API_ENDPOINT = 'https://fps.amazonaws.com/'.freeze
22
+ API_SANDBOX_ENDPOINT = 'https://fps.sandbox.amazonaws.com/'.freeze
23
+ PIPELINE_URL = 'https://authorize.payments.amazon.com/cobranded-ui/actions/start'.freeze
24
+ PIPELINE_SANDBOX_URL = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start'.freeze
25
+ API_VERSION = Date.new(2008, 9, 17).to_s.freeze
26
+ SIGNATURE_VERSION = 2.freeze
27
+
28
+ attr_reader :access_key
29
+ attr_reader :secret_key
30
+ attr_reader :fps_url
31
+ attr_reader :pipeline_url
32
+ attr_reader :cobranding_version
33
+ attr_reader :fps_version
34
+
35
+ def initialize(params)
36
+ @access_key = params[:access_key]
37
+ @secret_key = params[:secret_key]
38
+ @cobranding_version = params[:cobranding_version] || "2009-01-09"
39
+ @fps_version = params[:fps_version] || "2008-09-17"
40
+
41
+ if params[:sandbox].nil? or params[:sandbox] == true
42
+ @pipeline_url = PIPELINE_SANDBOX_URL
43
+ @fps_url = API_SANDBOX_ENDPOINT
44
+ else
45
+ @pipeline_url = PIPELINE_URL
46
+ @fps_url = API_ENDPOINT
47
+ end
48
+
49
+ end
50
+
51
+ def get_recurring_pipeline
52
+ obj = cobranding_constant_lookup(:RecurringPipeline).new
53
+ supply_defaults_for_pipeline_and_return(obj)
54
+ end
55
+
56
+ def get_verify_signature
57
+ obj = fps_constant_lookup(:VerifySignature).new
58
+ supply_defaults_for_fps_and_return(obj)
59
+ end
60
+
61
+ def get_pay
62
+ obj = fps_constant_lookup(:Pay).new
63
+ supply_defaults_for_fps_and_return(obj)
64
+ end
65
+
66
+ # def version
67
+ # raise APINotConfigured if @version.nil? || @version.empty?
68
+ # @version
69
+ # end
70
+
71
+ def access_key
72
+ raise APINotConfigured if @access_key.nil? || @access_key.empty?
73
+ @access_key
74
+ end
75
+
76
+ def secret_key
77
+ raise APINotConfigured if @secret_key.nil? || @secret_key.empty?
78
+ @secret_key
79
+ end
80
+
81
+ private
82
+
83
+ def cobranding_constant_lookup(sym)
84
+ Flexpay::CobrandingAPI.const_get("V#{@cobranding_version.gsub(/-/,'_')}".to_sym).specific_class(sym)
85
+ end
86
+
87
+ def fps_constant_lookup(sym)
88
+ Flexpay::FpsAPI.const_get("V#{@fps_version.gsub(/-/,'_')}".to_sym).specific_class(sym)
89
+ end
90
+
91
+ def supply_defaults_for_pipeline_and_return(obj)
92
+ obj.access_key = @access_key
93
+ obj.secret_key = @secret_key
94
+ obj.endpoint = @pipeline_url
95
+ obj.callerKey = @access_key # The pipeline API uses this alias
96
+ obj
97
+ end
98
+
99
+ def supply_defaults_for_fps_and_return(obj)
100
+ obj.access_key = @access_key
101
+ obj.secret_key = @secret_key
102
+ obj.endpoint = @fps_url
103
+ obj
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,18 @@
1
+ module Flexpay
2
+ module APIModule
3
+ def self.included(mod)
4
+ mod.class_eval do
5
+ self.class_variable_set(:@@included_in, {})
6
+
7
+ def self.included(mod)
8
+ class_variable_get(:@@included_in)[mod.to_s.split('::').last.to_sym] = mod
9
+ end
10
+
11
+ def self.specific_class(lookup_sym)
12
+ class_variable_get(:@@included_in)[lookup_sym]
13
+ end
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Flexpay
2
+ module CobrandingAPI
3
+ module V2009_01_09
4
+ include Flexpay::APIModule
5
+ end
6
+ end
7
+ end
8
+
9
+ require 'flexpay/cobranding_api/v2009_01_09/pipelines'
@@ -0,0 +1,19 @@
1
+ module Flexpay
2
+ module CobrandingAPI
3
+ module V2009_01_09
4
+ class RecurringPipeline
5
+ include Flexpay::CobrandingAPI::V2009_01_09
6
+ include Flexpay::AmazonFPSRequest
7
+
8
+ required_parameters "pipelineName","callerReference", "recipientToken", "transactionAmount", "recurringPeriod", "returnURL",
9
+ "version", "callerKey"
10
+
11
+ def initialize
12
+ self.pipelineName = "Recurring"
13
+ self.version = "2009-01-09"
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ class APINotConfigured < Exception
2
+
3
+ end
@@ -0,0 +1,10 @@
1
+ module Flexpay
2
+ module FpsAPI
3
+ module V2008_09_17
4
+ include Flexpay::APIModule
5
+ end
6
+ end
7
+ end
8
+
9
+ require 'flexpay/fps_api/v2008_09_17/verify_signature'
10
+ require 'flexpay/fps_api/v2008_09_17/pay'
@@ -0,0 +1,21 @@
1
+ module Flexpay
2
+ module FpsAPI
3
+ module V2008_09_17
4
+ class Pay
5
+ include Flexpay::FpsAPI::V2008_09_17
6
+ include Flexpay::AmazonFPSRequest
7
+
8
+ required_parameters "CallerReference", "SenderTokenId", "TransactionAmount_Value", "TransactionAmount_CurrencyCode", "Action", "AWSAccessKeyId", "Timestamp", "Version"
9
+
10
+ response_parameters :TransactionId => "/'PayResponse'/'PayResult'/'TransactionId'",
11
+ :TransactionStatus => "/'PayResponse'/'PayResult'/'TransactionStatus'"
12
+
13
+ def initialize
14
+ self.Action = "Pay"
15
+ self.Version = "2008-09-17"
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module Flexpay
2
+ module FpsAPI
3
+ module V2008_09_17
4
+ class VerifySignature
5
+ include Flexpay::FpsAPI::V2008_09_17
6
+ include Flexpay::AmazonFPSRequest
7
+
8
+ required_parameters "UrlEndPoint", "HttpParameters", "Action", "Version"
9
+
10
+ response_parameters :VerificationStatus => "/'VerifySignatureResponse'/'VerifySignatureResult'/'VerificationStatus'"
11
+
12
+ def initialize
13
+ self.Action = "VerifySignature"
14
+ self.Version = "2008-09-17"
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,100 @@
1
+ require 'rest_client'
2
+ require 'logger'
3
+ require 'cgi'
4
+ require 'uri'
5
+ require 'hpricot'
6
+
7
+ module Flexpay
8
+ module Flexpay::AmazonFPSRequest
9
+
10
+ def self.included(mod)
11
+ mod.class_eval do
12
+
13
+ @param_list
14
+ @response_parameters
15
+
16
+ attr_accessor :access_key
17
+ attr_accessor :secret_key
18
+ attr_accessor :endpoint
19
+
20
+ def self.required_parameters(*params)
21
+ @param_list = params
22
+ params.each do |p|
23
+ attr_accessor p.to_sym
24
+ end
25
+ end
26
+
27
+ def self.response_parameters(params)
28
+ @response_parameters = {}
29
+ params.each do |k,v|
30
+ @response_parameters[k] = v
31
+ end
32
+ end
33
+
34
+ def self.get_required_parameters
35
+ @param_list
36
+ end
37
+
38
+ def self.get_response_parameters
39
+ @response_parameters
40
+ end
41
+ end
42
+ end
43
+
44
+ def generate_url(signed_request=true)
45
+ params = generate_parameters
46
+ params = sign_parameters(params) if signed_request == true
47
+
48
+ "#{@endpoint}?#{build_query_string(params)}"
49
+ end
50
+
51
+ def go!(signed=true)
52
+ url = generate_url(signed)
53
+
54
+ RestClient.log = "stdout"
55
+ response = RestClient.get url
56
+
57
+ doc = Hpricot.XML(response)
58
+
59
+ result = {}
60
+ self.class.get_response_parameters.each do |k,v|
61
+ result[k] = eval("(doc#{v}).innerHTML")
62
+ end
63
+ result
64
+ end
65
+
66
+ private
67
+
68
+ def build_query_string(params)
69
+ params.sort.collect {|i| i.join("=") }.join("&")
70
+ end
71
+
72
+ def sign_parameters(params)
73
+ ### Horrible kludge. TODO Remove
74
+ if params.has_key?("Action")
75
+ params.merge!({"SignatureVersion" => 2.to_s, "SignatureMethod" => "HmacSHA256"})
76
+ else
77
+ params.merge!({"signatureVersion" => 2.to_s, "signatureMethod" => "HmacSHA256"})
78
+ end
79
+
80
+ u = URI.parse(URI.escape("#{@endpoint}?#{build_query_string(params)}"))
81
+ sig = Flexpay::Signature.generate_signature('GET',u.host,u.path,params, @secret_key)
82
+
83
+ if params.has_key?("Action")
84
+ params.merge({"Signature" => CGI.escape(sig)})
85
+ else
86
+ params.merge({"signature" => CGI.escape(sig)})
87
+ end
88
+ end
89
+
90
+ def generate_parameters
91
+ params = {}
92
+ self.class.get_required_parameters.each do |p|
93
+ val = self.send(p)
94
+ params[p.gsub('_','.')] = val unless val.nil? || val.empty?
95
+ end
96
+ params
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,26 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+ require 'uri'
4
+
5
+ module Flexpay
6
+ class Signature
7
+ def self.generate_signature(http_method, host, request_uri, params, secret_key)
8
+ method = http_method.to_s.upcase
9
+
10
+ #Place in canonical order and URI encode
11
+ encoded_data = params.sort.collect {|i| i.join("=") }.join("&")
12
+
13
+ data = "#{http_method}\n#{host}\n#{request_uri}\n#{modified_URL_encoding(encoded_data)}"
14
+ digest = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, secret_key, data)
15
+ Base64.encode64(digest).strip
16
+ end
17
+
18
+ private
19
+
20
+ ## These are the modified encoding rules proposed by Amazon. Not quite URL encoding
21
+ def self.modified_URL_encoding(string)
22
+ URI.escape(string).gsub(/\+/, '%20').gsub(/\*/, '%2A').gsub("%7E","~").gsub(/:/,'%3A').gsub(/\//,'%2F')
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ ACCESS_KEY = ENV['AWS_ACCESS_KEY'] || ENV['AMAZON_ACCESS_KEY_ID']
2
+ SECRET_KEY = ENV['AWS_SECRET_KEY'] || ENV['AMAZON_SECRET_ACCESS_KEY']
3
+
4
+ unless ACCESS_KEY and SECRET_KEY
5
+ raise RuntimeError, "You must set your AWS_ACCESS_KEY and AWS_SECRET_KEY environment variables to run integration tests"
6
+ end
7
+
8
+ require File.dirname(__FILE__) + '/../spec_helper'
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
4
+ require File.dirname(__FILE__) + '/../lib/flexpay'
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe Flexpay::Signature do
4
+ before(:each) do
5
+ @api = Flexpay::API.new(:access_key => ACCESS_KEY, :secret_key => SECRET_KEY)
6
+ end
7
+
8
+ it "should complain if key values aren't specified" do
9
+ @api = Flexpay::API.new(:secret_key => SECRET_KEY)
10
+ lambda { @api.access_key }.should raise_error(APINotConfigured)
11
+ @api = Flexpay::API.new(:access_key => ACCESS_KEY)
12
+ lambda { @api.secret_key }.should raise_error(APINotConfigured)
13
+ end
14
+
15
+ it "should return a recurring pipeline based on API version" do
16
+ @api.get_recurring_pipeline.should be_a(Flexpay::CobrandingAPI::V2009_01_09::RecurringPipeline)
17
+ end
18
+
19
+ it "should return a verify signature based on API version" do
20
+ @api.get_verify_signature.should be_a(Flexpay::FpsAPI::V2008_09_17::VerifySignature)
21
+ end
22
+
23
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe 'Pay' do
4
+ before(:each) do
5
+ end
6
+
7
+ it "should correctly build a request" do
8
+ pay = Flexpay::API.new(:access_key => ACCESS_KEY, :secret_key => SECRET_KEY).get_pay
9
+
10
+ body =<<HEREDOC
11
+ <PayResponse xmlns="http://fps.amazonaws.com/doc/2008-09-17/">
12
+ <PayResult>
13
+ <TransactionId>14GK6BGKA7U6OU6SUTNLBI5SBBV9PGDJ6UL</TransactionId>
14
+ <TransactionStatus>Pending</TransactionStatus>
15
+ </PayResult>
16
+ <ResponseMetadata>
17
+ <RequestId>c21e7735-9c08-4cd8-99bf-535a848c79b4:0</RequestId>
18
+ </ResponseMetadata>
19
+ </PayResponse>
20
+ HEREDOC
21
+
22
+ RestClient.stub!(:get).and_return(body)
23
+
24
+ pay.CallerReference = Time.now.to_i.to_s
25
+ pay.SenderTokenId = "U65I5X19A9HS8DD8MEIH7ASGRQMVTCPNCPKG4ML8Z8NDGGCLU265KXSILUF8SXIA"
26
+ pay.TransactionAmount_Value = "10"
27
+ pay.TransactionAmount_CurrencyCode = "USD"
28
+ pay.AWSAccessKeyId = ACCESS_KEY
29
+ pay.Timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
30
+
31
+ result = pay.go!
32
+ result.should have_key(:TransactionId)
33
+ result.should have_key(:TransactionStatus)
34
+ end
35
+
36
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe "Recurring pipeline" do
4
+ before(:each) do
5
+ end
6
+
7
+ it "should generate a pipeline" do
8
+ pipeline = Flexpay::API.new(:access_key => ACCESS_KEY, :secret_key => SECRET_KEY).get_recurring_pipeline
9
+ pipeline.should_not be_nil
10
+ end
11
+
12
+ it "should respond to all required parameters" do
13
+ pipeline = Flexpay::API.new(:access_key => ACCESS_KEY, :secret_key => SECRET_KEY).get_recurring_pipeline
14
+
15
+ Flexpay::CobrandingAPI::V2009_01_09::RecurringPipeline::get_required_parameters.each do |p|
16
+ pipeline.should respond_to(p)
17
+ end
18
+ end
19
+
20
+ it "should correctly build a parameter hash" do
21
+ pipeline = Flexpay::API.new(:access_key => ACCESS_KEY, :secret_key => SECRET_KEY).get_recurring_pipeline
22
+
23
+ pipeline.callerReference = Time.now.to_i.to_s
24
+ pipeline.transactionAmount = "10"
25
+ pipeline.recurringPeriod = "1 month"
26
+ pipeline.returnURL = "http://127.0.0.1:3000"
27
+ # pipeline.callerKey = "AKIAICO3MHOOXACSG2VQ"
28
+
29
+ url = pipeline.generate_url
30
+ url.should_not be_empty
31
+ end
32
+
33
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe Flexpay::Signature do
4
+ before(:each) do
5
+
6
+ end
7
+
8
+ it "calculate signatures" do
9
+
10
+ params = {"Action" => "Pay", "AWSAccessKeyId" => "AKIAIIFXJCFIHITREP4Q", "CallerDescription" => "MyWish",
11
+ "CallerReference" => "CallerReference02", "SenderTokenId" => "553ILMLCG6Z8J431H7BX3UMN3FFQU8VSNTSRNCTAASDJNX66LNZLKSZU3PI7TXIH",
12
+ "SignatureMethod" => "HmacSHA256", "SignatureVersion" => 2, "Timestamp" => "2009-10-06T05%3A49%3A52.843Z",
13
+ "TransactionAmount.CurrencyCode" => "USD", "TransActionAmount.Value" => 1, "Version" => "2008-09-17",}
14
+
15
+ sig = Flexpay::Signature.generate_signature('GET','fps.sandbox.amazonaws.com',
16
+ 'https://fps.sandbox.amazonaws.com',params, SECRET_KEY)
17
+
18
+ sig.should_not be_empty
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ ACCESS_KEY = 'foo'
2
+ SECRET_KEY = 'bar'
3
+ API_VERSION = "2009-01-09"
4
+
5
+ require File.dirname(__FILE__) + '/../spec_helper'
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/units_helper'
2
+
3
+ describe 'VerifySignature' do
4
+ before(:each) do
5
+ end
6
+
7
+ it "should correctly build a request" do
8
+ verify = Flexpay::API.new(:access_key => ACCESS_KEY, :secret_key => SECRET_KEY).get_verify_signature
9
+
10
+ body =<<HEREDOC
11
+ <VerifySignatureResponse xmlns="http://fps.amazonaws.com/doc/2008-09-17/">
12
+ <VerifySignatureResult>
13
+ <VerificationStatus>Success</VerificationStatus>
14
+ </VerifySignatureResult>
15
+ <ResponseMetadata>
16
+ <RequestId>197e2085-1ed7-47a2-93d8-d76b452acc74:0</RequestId>
17
+ </ResponseMetadata>
18
+ </VerifySignatureResponse>
19
+ HEREDOC
20
+
21
+ RestClient.stub!(:get).and_return(body)
22
+
23
+ verify.UrlEndPoint = "http%3A%2F%2Fvamsik.desktop.amazon.com%3A8080%2Fipn.jsp"
24
+ timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
25
+ verify.HttpParameters = "expiry%3D08%252F2015%26signature%3DynDukZ9%252FG77uSJVb5YM0cadwHVwYKPMKOO3PNvgADbv6VtymgBxeOWEhED6KGHsGSvSJnMWDN%252FZl639AkRe9Ry%252F7zmn9CmiM%252FZkp1XtshERGTqi2YL10GwQpaH17MQqOX3u1cW4LlyFoLy4celUFBPq1WM2ZJnaNZRJIEY%252FvpeVnCVK8VIPdY3HMxPAkNi5zeF2BbqH%252BL2vAWef6vfHkNcJPlOuOl6jP4E%252B58F24ni%252B9ek%252FQH18O4kw%252FUJ7ZfKwjCCI13%252BcFybpofcKqddq8CuUJj5Ii7Pdw1fje7ktzHeeNhF0r9siWcYmd4JaxTP3NmLJdHFRq2T%252FgsF3vK9m3gw%253D%253D%26signatureVersion%3D2%26signatureMethod%3DRSA-SHA1%26certificateUrl%3Dhttps%253A%252F%252Ffps.sandbox.amazonaws.com%252Fcerts%252F090909%252FPKICert.pem%26tokenID%3DA5BB3HUNAZFJ5CRXIPH72LIODZUNAUZIVP7UB74QNFQDSQ9MN4HPIKISQZWPLJXF%26status%3DSC%26callerReference%3DcallerReferenceMultiUse1&AWSAccessKeyId=AKIAJGC2KB2QP7MVBLYQ&Timestamp=#{timestamp.gsub(':','%3A')}&Version=2008-09-17&SignatureVersion=2&SignatureMethod=HmacSHA256&Signature=fKRGL42K7nduDA47g6bJCyUyF5ZvkBotXE5jVcgyHvE%3D"
26
+
27
+ result = verify.go!(false)
28
+ result.should have_key(:VerificationStatus)
29
+ result[:VerificationStatus].should == "Success"
30
+ end
31
+
32
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flexpay
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Chris Chandler
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-03-19 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: hpricot
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: rest-client
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
44
+ description:
45
+ email: chris@flatterline.com
46
+ executables: []
47
+
48
+ extensions: []
49
+
50
+ extra_rdoc_files: []
51
+
52
+ files:
53
+ - lib/flexpay.rb
54
+ - lib/flexpay/api_module.rb
55
+ - lib/flexpay/cobranding_api/v2009_01_09.rb
56
+ - lib/flexpay/cobranding_api/v2009_01_09/pipelines.rb
57
+ - lib/flexpay/exceptions.rb
58
+ - lib/flexpay/fps_api/v2008_09_17.rb
59
+ - lib/flexpay/fps_api/v2008_09_17/pay.rb
60
+ - lib/flexpay/fps_api/v2008_09_17/verify_signature.rb
61
+ - lib/flexpay/request.rb
62
+ - lib/flexpay/util.rb
63
+ has_rdoc: true
64
+ homepage: http://github.com/cchandler/flexpay
65
+ licenses: []
66
+
67
+ post_install_message:
68
+ rdoc_options:
69
+ - --charset=UTF-8
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ requirements: []
87
+
88
+ rubyforge_project:
89
+ rubygems_version: 1.3.6
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: An API for using the Amazon Flexible Payment Service (FPS).
93
+ test_files:
94
+ - spec/units/api_spec.rb
95
+ - spec/units/pay_spec.rb
96
+ - spec/units/recurring_pipeline_spec.rb
97
+ - spec/units/signature_spec.rb
98
+ - spec/units/verify_signature_spec.rb
99
+ - spec/integrations/integrations_helper.rb
100
+ - spec/spec_helper.rb
101
+ - spec/units/units_helper.rb