amazon_flex_pay 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
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