amazon_flex_pay 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +41 -0
  3. data/Rakefile +23 -0
  4. data/lib/amazon_flex_pay/api/base.rb +86 -0
  5. data/lib/amazon_flex_pay/api/cancel.rb +11 -0
  6. data/lib/amazon_flex_pay/api/cancel_token.rb +9 -0
  7. data/lib/amazon_flex_pay/api/get_account_activity.rb +21 -0
  8. data/lib/amazon_flex_pay/api/get_account_balance.rb +8 -0
  9. data/lib/amazon_flex_pay/api/get_recipient_verification_status.rb +9 -0
  10. data/lib/amazon_flex_pay/api/get_token_by_caller.rb +10 -0
  11. data/lib/amazon_flex_pay/api/get_token_usage.rb +9 -0
  12. data/lib/amazon_flex_pay/api/get_tokens.rb +13 -0
  13. data/lib/amazon_flex_pay/api/get_transaction.rb +9 -0
  14. data/lib/amazon_flex_pay/api/get_transaction_status.rb +13 -0
  15. data/lib/amazon_flex_pay/api/pay.rb +20 -0
  16. data/lib/amazon_flex_pay/api/refund.rb +14 -0
  17. data/lib/amazon_flex_pay/api/reserve.rb +20 -0
  18. data/lib/amazon_flex_pay/api/settle.rb +11 -0
  19. data/lib/amazon_flex_pay/api/verify_signature.rb +14 -0
  20. data/lib/amazon_flex_pay/api.rb +162 -0
  21. data/lib/amazon_flex_pay/data_types.rb +138 -0
  22. data/lib/amazon_flex_pay/enumerations.rb +23 -0
  23. data/lib/amazon_flex_pay/model.rb +130 -0
  24. data/lib/amazon_flex_pay/pipelines/base.rb +40 -0
  25. data/lib/amazon_flex_pay/pipelines/edit_token.rb +6 -0
  26. data/lib/amazon_flex_pay/pipelines/multi_use.rb +28 -0
  27. data/lib/amazon_flex_pay/pipelines/recipient.rb +10 -0
  28. data/lib/amazon_flex_pay/pipelines/single_use.rb +24 -0
  29. data/lib/amazon_flex_pay/pipelines.rb +41 -0
  30. data/lib/amazon_flex_pay/signing.rb +42 -0
  31. data/lib/amazon_flex_pay.rb +53 -0
  32. data/test/amazon_flex_pay_test.rb +117 -0
  33. data/test/api_test.rb +310 -0
  34. data/test/pipelines_test.rb +46 -0
  35. data/test/response_samples.rb +588 -0
  36. data/test/test_helper.rb +22 -0
  37. metadata +167 -0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Lance Ivy
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,41 @@
1
+ = AmazonFlexPay
2
+
3
+ Library for Amazon's Flexible Payment Service.
4
+
5
+ == CONFIGURE
6
+
7
+ In config/initializers/amazon_flex_pay.rb, do the following:
8
+
9
+ AmazonFlexPay.access_key = 'your access key'
10
+ AmazonFlexPay.secret_key = 'your secret key'
11
+ AmazonFlexPay.go_live! # if you're done with the sandbox
12
+
13
+ == EXAMPLES
14
+
15
+ Note that while the examples are shown using Rails methods, the only Rails requirement is ActiveSupport's inflector.
16
+
17
+ 1. Construct a single-use pipeline for the user. This is where the user will agree to pay a certain amount to a specific recipient.
18
+
19
+ pipeline = AmazonFlexPay.single_use_pipeline('mypipeline3292', :recipient_token => 'RTOKEN', :transaction_amount => '12.99')
20
+ redirect_to pipeline.url('http://example.com/return')
21
+
22
+ 2. Then on the return page, take the sender token and run a Pay request:
23
+
24
+ response = AmazonFlexPay.pay('12.99', 'USD', 'STOKEN', 'myrequest3292')
25
+ if response.error?
26
+ flash[:error] = "Sorry, something went wrong."
27
+ response.errors.each do |error|
28
+ # notify yourself about error.code and error.message
29
+ end
30
+ else
31
+ flash[:notice] = "Thanks! Your payment is processing."
32
+ end
33
+ redirect_to product_path
34
+
35
+ 3. Then wait for a IPN to your registered listening URL and check that it's successful.
36
+
37
+ == LEARN MORE
38
+
39
+ All methods required for integrating API calls and Pipeline requests are found in the AmazonFlexPay module.
40
+
41
+ Copyright (c) 2011 Lance Ivy, released under the MIT license.
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the AmazonFlexPay plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the AmazonFlexPay plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'AmazonFlexPay'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README.rdoc')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
@@ -0,0 +1,86 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class Base < AmazonFlexPay::Model
3
+ # This compiles an API request object into a URL, sends it to Amazon, and processes
4
+ # the response.
5
+ def submit
6
+ url = AmazonFlexPay.api_endpoint + '?' + AmazonFlexPay.query_string(self.to_params)
7
+ response = begin
8
+ self.class::Response.from_xml(RestClient.get(url).body)
9
+ rescue RestClient::BadRequest, RestClient::Unauthorized, RestClient::Forbidden => e
10
+ ErrorResponse.from_xml(e.response.body)
11
+ end
12
+ response.request = self
13
+ response
14
+ end
15
+
16
+ # Converts the API request object into parameters and signs them.
17
+ def to_params
18
+ params = self.to_hash.merge(
19
+ 'Action' => action_name,
20
+ 'AWSAccessKeyId' => AmazonFlexPay.access_key,
21
+ 'Version' => AmazonFlexPay::API_VERSION,
22
+ 'Timestamp' => format_value(Time.now)
23
+ )
24
+
25
+ params['SignatureVersion'] = 2
26
+ params['SignatureMethod'] = 'HmacSHA256'
27
+ params['Signature'] = AmazonFlexPay.signature(AmazonFlexPay.api_endpoint, params)
28
+
29
+ params
30
+ end
31
+
32
+ class BaseResponse < AmazonFlexPay::Model
33
+ attribute :request
34
+ attribute :request_id
35
+
36
+ # Check response.error? to determine whether it's an ErrorResponse or not.
37
+ def error?
38
+ false
39
+ end
40
+
41
+ # Parses Amazon's XML response to REST requests and instantiates the response.
42
+ def self.from_xml(xml)
43
+ response = MultiXml.parse(xml)
44
+
45
+ response_key = response.keys.find{|k| k.match(/Response$/)}
46
+ hash = response[response_key]['ResponseMetadata']
47
+
48
+ result_key = response[response_key].keys.find{|k| k.match(/Result$/)}
49
+ hash.merge!(response[response_key][result_key]) if response[response_key][result_key] # not all APIs have a result object
50
+
51
+ new(hash)
52
+ end
53
+ end
54
+
55
+ class ErrorResponse < AmazonFlexPay::Model #:nodoc:
56
+ # Re-implements the XML parsing because ErrorResponse does not inherit from BaseResponse.
57
+ def self.from_xml(xml)
58
+ new(MultiXml.parse(xml)['Response'])
59
+ end
60
+
61
+ # Check response.error? to determine whether Amazon accepted the request.
62
+ def error?
63
+ true
64
+ end
65
+
66
+ attribute :request
67
+ attribute :request_id
68
+
69
+ attr_reader :errors
70
+ def errors=(val)
71
+ @errors = [val['Error']].flatten.map{|e| Error.new(e)}
72
+ end
73
+
74
+ class Error < AmazonFlexPay::Model #:nodoc:
75
+ attribute :code
76
+ attribute :message
77
+ end
78
+ end
79
+
80
+ protected
81
+
82
+ def action_name #:nodoc:
83
+ self.class.to_s.split('::').last
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,11 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class Cancel < Base #:nodoc:
3
+ attribute :transaction_id
4
+ attribute :description
5
+
6
+ class Response < BaseResponse #:nodoc:
7
+ attribute :transaction_id
8
+ attribute :transaction_status, :enumeration => :transaction_status
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class CancelToken < Base #:nodoc:
3
+ attribute :token_id
4
+ attribute :reason_text
5
+
6
+ class Response < BaseResponse #:nodoc:
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetAccountActivity < Base #:nodoc:
3
+ attribute :start_date # required
4
+ attribute :end_date
5
+ attribute :'FPSOperation', :enumeration => :fps_operation
6
+ attribute :max_batch_size
7
+ attribute :payment_method, :enumeration => :payment_method
8
+ attribute :response_group
9
+ attribute :role, :enumeration => :transactional_role
10
+ attribute :sort_order_by_date, :enumeration => :sort_order_by_date
11
+ attribute :status, :type => :transaction_status
12
+
13
+ class Response < BaseResponse #:nodoc:
14
+ attribute :batch_size
15
+ attribute :start_time_for_next_transaction
16
+ attribute :transaction, :collection => :transaction
17
+
18
+ alias_method :transactions, :transaction
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetAccountBalance < Base #:nodoc:
3
+
4
+ class Response < BaseResponse #:nodoc:
5
+ attribute :account_balance, :type => :account_balance
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetRecipientVerificationStatus < Base #:nodoc:
3
+ attribute :recipient_token_id
4
+
5
+ class Response < BaseResponse #:nodoc:
6
+ attribute :recipient_verification_status, :enumeration => :recipient_verification_status
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetTokenByCaller < Base #:nodoc:
3
+ attribute :token_id
4
+ attribute :caller_reference
5
+
6
+ class Response < BaseResponse #:nodoc:
7
+ attribute :token, :type => :token
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetTokenUsage < Base #:nodoc:
3
+ attribute :token_id
4
+
5
+ class Response < BaseResponse #:nodoc:
6
+ attribute :token_usage_limits, :collection => :token_usage_limit
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetTokens < Base #:nodoc:
3
+ attribute :caller_reference
4
+ attribute :token_status
5
+ attribute :token_type
6
+
7
+ class Response < BaseResponse #:nodoc:
8
+ attribute :token, :collection => :token
9
+
10
+ alias_method :tokens, :token
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetTransaction < Base #:nodoc:
3
+ attribute :transaction_id
4
+
5
+ class Response < BaseResponse #:nodoc:
6
+ attribute :transaction, :type => :transaction_detail
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class GetTransactionStatus < Base #:nodoc:
3
+ attribute :transaction_id
4
+
5
+ class Response < BaseResponse #:nodoc:
6
+ attribute :caller_reference
7
+ attribute :status_code
8
+ attribute :status_message
9
+ attribute :transaction_id
10
+ attribute :transaction_status, :enumeration => :transaction_status
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class Pay < Base #:nodoc:
3
+ attribute :caller_description
4
+ attribute :caller_reference # required
5
+ attribute :charge_fee_to, :enumeration => :charge_fee_to
6
+ attribute :descriptor_policy, :type => :descriptor_policy
7
+ attribute :marketplace_fixed_fee, :type => :amount
8
+ attribute :marketplace_variable_fee
9
+ attribute :recipient_token_id
10
+ attribute :sender_description
11
+ attribute :sender_token_id # required
12
+ attribute :transaction_amount, :type => :amount # required
13
+ attribute :transaction_timeout_in_mins
14
+
15
+ class Response < BaseResponse #:nodoc:
16
+ attribute :transaction_id
17
+ attribute :transaction_status, :enumeration => :transaction_status
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class Refund < Base #:nodoc:
3
+ attribute :caller_description
4
+ attribute :caller_reference # required
5
+ attribute :refund_amount, :type => :amount
6
+ attribute :transaction_id # required
7
+ attribute :marketplace_refund_policy, :enumeration => :marketplace_refund_policy
8
+
9
+ class Response < BaseResponse #:nodoc:
10
+ attribute :transaction_id
11
+ attribute :transaction_status, :enumeration => :transaction_status
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class Reserve < Base #:nodoc:
3
+ attribute :caller_description
4
+ attribute :caller_reference # required
5
+ attribute :charge_fee_to, :enumeration => :charge_fee_to
6
+ attribute :descriptor_policy, :type => :descriptor_policy
7
+ attribute :marketplace_fixed_fee, :type => :amount
8
+ attribute :marketplace_variable_fee
9
+ attribute :recipient_token_id
10
+ attribute :sender_description
11
+ attribute :sender_token_id # required
12
+ attribute :transaction_amount, :type => :amount # required
13
+ attribute :transaction_timeout_in_mins
14
+
15
+ class Response < BaseResponse #:nodoc:
16
+ attribute :transaction_id
17
+ attribute :transaction_status, :enumeration => :transaction_status
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class Settle < Base #:nodoc:
3
+ attribute :reserve_transaction_id
4
+ attribute :transaction_amount, :type => :amount
5
+
6
+ class Response < BaseResponse #:nodoc:
7
+ attribute :transaction_id
8
+ attribute :transaction_status, :enumeration => :transaction_status
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module AmazonFlexPay::API #:nodoc:
2
+ class VerifySignature < Base #:nodoc:
3
+ attribute :url_end_point
4
+ attribute :http_parameters
5
+
6
+ class Response < BaseResponse #:nodoc:
7
+ attribute :verification_status
8
+
9
+ def verified?
10
+ verification_status == 'Success'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,162 @@
1
+ # load all api classes
2
+ require 'amazon_flex_pay/api/base'
3
+ Dir[File.dirname(__FILE__) + '/api/*'].each do |p| require "amazon_flex_pay/api/#{File.basename(p)}" end
4
+
5
+ module AmazonFlexPay
6
+ class << self
7
+ # Cancels a transaction.
8
+ #
9
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/Cancel.html
10
+ def cancel(transaction_id, options = {})
11
+ API::Cancel.new(options.merge(:transaction_id => transaction_id)).submit
12
+ end
13
+
14
+ # Cancels a token.
15
+ #
16
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/CancelToken.html
17
+ def cancel_token(token_id, options = {})
18
+ API::CancelToken.new(options.merge(:token_id => token_id)).submit
19
+ end
20
+
21
+ # Searches through transactions on your account. Helpful if you want to compare vs your own records,
22
+ # or print an admin report.
23
+ #
24
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/GetAccountActivity.html
25
+ def get_account_activity(start_date, end_date, options = {})
26
+ API::GetAccountActivity.new(options.merge(:start_date => start_date, :end_date => end_date)).submit
27
+ end
28
+
29
+ # Gets your Amazon Payments account balance.
30
+ #
31
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/GetAccountBalance.html
32
+ def get_account_balance
33
+ API::GetAccountBalance.new.submit
34
+ end
35
+
36
+ # Returns the status of a recipient's Amazon account. This is a high-level status indicating whether
37
+ # the recipient can receive up to $10k per month (VerificationComplete) or has no receiving limitations
38
+ # at all (VerificationCompleteNoLimits).
39
+ #
40
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/GetRecipientVerificationStatus.html
41
+ def get_recipient_verification_status(recipient_token_id)
42
+ API::GetRecipientVerificationStatus.new(:recipient_token_id => recipient_token_id).submit
43
+ end
44
+
45
+ # Returns information about a token's state from a caller reference.
46
+ #
47
+ # This is the closest thing that Amazon's API has to getting the status of a pipeline. Provide the caller
48
+ # reference for your pipeline (you are saving caller references, right?), and if this returns a token you
49
+ # can assume the pipeline finished successfully.
50
+ #
51
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/GetTokensByCaller.html
52
+ def get_token_by_caller_reference(ref)
53
+ API::GetTokenByCaller.new(:caller_reference => ref).submit
54
+ end
55
+
56
+ # Returns information about a token's state from a token id.
57
+ #
58
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/GetTokensByCaller.html
59
+ def get_token_by_id(id)
60
+ API::GetTokenByCaller.new(:token_id => id).submit
61
+ end
62
+
63
+ # Returns information about how much of the token has been used, and what remains.
64
+ #
65
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/GetTokenUsage.html
66
+ def get_token_usage(id)
67
+ API::GetTokenUsage.new(:token_id => id).submit
68
+ end
69
+
70
+ # Returns all of your tokens. Note that when you send someone through a recipient pipeline, that registers
71
+ # a recipient token on _their_ account, not yours. And when you send someone through a single use pipeline,
72
+ # that registers a sender token on _their_account, not yours.
73
+ #
74
+ # So basically this will only return recipient tokens where _you_ are the recipient, or sender tokens where
75
+ # _you_ are the sender.
76
+ #
77
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/GetTokens.html
78
+ def get_tokens(options = {})
79
+ API::GetTokens.new(options).submit
80
+ end
81
+
82
+ # Returns all of Amazon's details about a transaction, such as its status and when it began and finished
83
+ # processing.
84
+ #
85
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/GetTransaction.html
86
+ def get_transaction(id)
87
+ API::GetTransaction.new(:transaction_id => id).submit
88
+ end
89
+
90
+ # Returns the current status of the transaction. Note that this information is also available from
91
+ # <tt>get_transaction</tt>.
92
+ #
93
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAccountManagementGuide/GetTransactionStatus.html
94
+ def get_transaction_status(id)
95
+ API::GetTransactionStatus.new(:transaction_id => id).submit
96
+ end
97
+
98
+ # Begins a Pay request for a sender token. If you are not also the recipient (this is a three-party marketplace
99
+ # transaction) then you must also specify the recipient token.
100
+ #
101
+ # Sign up for Instant Payment Notifications to be told when this has finished.
102
+ #
103
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/Pay.html
104
+ def pay(value, currency, sender_token_id, caller_reference, options = {})
105
+ API::Pay.new(options.merge(
106
+ :transaction_amount => {:value => value, :currency_code => currency},
107
+ :sender_token_id => sender_token_id,
108
+ :caller_reference => caller_reference
109
+ )).submit
110
+ end
111
+
112
+ # Begins a Reserve request for the sender token. Very similar to <tt>pay</tt>.
113
+ #
114
+ # Sign up for Instant Payment Notifications to be told when this has finished.
115
+ #
116
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/Reserve.html
117
+ def reserve(value, currency, sender_token_id, caller_reference, options = {})
118
+ API::Reserve.new(options.merge(
119
+ :transaction_amount => {:value => value, :currency_code => currency},
120
+ :sender_token_id => sender_token_id,
121
+ :caller_reference => caller_reference
122
+ )).submit
123
+ end
124
+
125
+ # Refunds a transaction. By default it will refund the entire transaction, but you can
126
+ # provide an amount for partial refunds.
127
+ #
128
+ # Sign up for Instant Payment Notifications to be told when this has finished.
129
+ #
130
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/Refund.html
131
+ def refund(transaction_id, caller_reference, options = {})
132
+ API::Refund.new(options.merge(:transaction_id => transaction_id, :caller_reference => caller_reference)).submit
133
+ end
134
+
135
+ # If you have a Reserve transaction, use this to Settle (capture) it.
136
+ #
137
+ # Sign up for Instant Payment Notifications to be told when this has finished.
138
+ #
139
+ # See http://docs.amazonwebservices.com/AmazonFPS/latest/FPSAdvancedGuide/Settle.html
140
+ def settle(transaction_id, options = {})
141
+ API::Settle.new(options.merge(:reserve_transaction_id => transaction_id)).submit
142
+ end
143
+
144
+ # This is how you verify IPNs and pipeline responses.
145
+ # Pass the entire request object.
146
+ def verify_request(request)
147
+ verify_signature(
148
+ # url without query string
149
+ request.protocol + request.host_with_port + request.path,
150
+ # raw parameters
151
+ request.get? ? request.query_string : request.raw_post
152
+ )
153
+ end
154
+
155
+ # Verifies the signature embedded in the params string for the given url.
156
+ #
157
+ # Please use <tt>verify_request</tt> instead to make sure the URL and params remain properly formatted.
158
+ def verify_signature(url, params)
159
+ API::VerifySignature.new(:url_end_point => url, :http_parameters => params).submit
160
+ end
161
+ end
162
+ end