active_paypal_adaptive_payment 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
File without changes
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Jose Pablo Barrantes
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 PURPOa AND
17
+ NONINFRINGEMENT. IN NO EVENT SaALL 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.markdown ADDED
@@ -0,0 +1,130 @@
1
+ # Active PayPal Adaptive Payment
2
+
3
+ This library is meant to interface with PayPal web services Adaptive Payment Gateway Library.
4
+
5
+ [Active Merchant]:http://www.activemerchant.org
6
+
7
+ ![Active PayPal Adaptive Payment](https://github.com/jpablobr/active_paypal_adaptive_payment/raw/master/doc/split.jpg)
8
+
9
+ ## Supported
10
+
11
+ * payments
12
+ * preapprovals
13
+ * refunds
14
+ * currency conversions
15
+ * more soon!
16
+
17
+ ## Installation
18
+
19
+ Add the following line to your app Gemfile:
20
+
21
+ gem "active_paypal_adaptive_payment", "~> 0.1.0"
22
+
23
+ ## Implementation
24
+
25
+ In your { payment/order }_controller.rb
26
+
27
+ def gateway
28
+ @gateway ||= PaypalAdaptivePaymentGateway.new(
29
+ :login => 'your_email',
30
+ :password => 'your_password',
31
+ :signature => ' your_signature',
32
+ :appid => 'your_app_id'
33
+ )
34
+ end
35
+
36
+ ## Payment process
37
+
38
+ ### Chained payments
39
+
40
+ def checkout
41
+ recipients = [{:email => 'receiver_email',
42
+ :amount => some_amount,
43
+ :primary => true},
44
+ {:email => 'receiver_email',
45
+ :amount => recipient_amount,
46
+ :primary => false}
47
+ ]
48
+ response = gateway.pay(
49
+ :return_url => url_for(:action => 'action', :only_path => false),
50
+ :cancel_url => url_for(:action => 'action', :only_path => false),
51
+ :notify_url => url_for(:action => 'notify_action', :only_path => false),
52
+ :receiver_list => recipients
53
+ )
54
+ redirect_to response.redirect_url_for
55
+ end
56
+
57
+ Set the `:primary` flag to `false` for each recipient for a split payment.
58
+
59
+ ## Debugging
60
+
61
+ Use either gateway.debug or response.debug this gives you the json
62
+ response, the xml sent and the url it was posted to.
63
+
64
+ From the Rails console it can be accessed like such:
65
+
66
+ ActiveMerchant::Billing::PaypalAdaptivePaymentGateway
67
+
68
+ ## TODO
69
+
70
+ * Better documentation
71
+
72
+ ## Contributors
73
+
74
+ * Jose Pablo Barrantes (<http://jpablobr.com/>)
75
+ * Zarne Dravitzki (<http://github.com/zarno>)
76
+
77
+ ## Other previous contributors where some code was taken from.
78
+
79
+ * [Tommy Chheng](http://tommy.chheng.com)
80
+ - [Paypal Adaptive Ruby Gem Released](http://tommy.chheng.com/2009/12/29/paypal-adaptive-ruby-gem-released/)
81
+ - [paypal_adaptive](https://github.com/tc/paypal_adaptive)
82
+
83
+ * [lamp (Matt)](https://github.com/lamp)
84
+ - [paypal_adaptive_gateway](https://github.com/lamp/paypal_adaptive_gateway)
85
+
86
+ * [sentientmonkey (Scott Windsor)](https://github.com/sentientmonkey)
87
+ - [active_merchant](https://github.com/sentientmonkey/active_merchant)
88
+
89
+ * [sijokg](https://github.com/sijokg)
90
+ - [active_merchant](https://github.com/sijokg/active_merchant)
91
+
92
+ ## Some PayPal Adaptive payment resources.
93
+
94
+ * [Adaptive Payment Fee Calculation Analysis](https://www.x.com/docs/DOC-2401)
95
+ * [ActiveMerchant paypaladaptive payments gateway](http://www.rorexperts.com/activemerchant-paypaladaptive-payments-gateway-t2245.html)
96
+ * [Trying to use with Paypal adaptive payments](http://groups.google.com/group/activemerchant/browse_thread/thread/866ad7dc5019c199/2a280b7dc396c41b?lnk=gst&q=adaptive+payment#2a280b7dc396c41b)
97
+ * [adpative payments (chained)](http://groups.google.com/group/activemerchant/browse_thread/thread/165c3e0bf4d10c02/aa8dd082b58354d9?lnk=gst&q=adaptive+payment#aa8dd082b58354d9)
98
+ * [Testing with a sandbox account without being logged on developer.paypal.com](http://groups.google.com/group/activemerchant/browse_thread/thread/ad69fc8116bfdf64/483f22071bb25e25?lnk=gst&q=adaptive+payment#483f22071bb25e25)
99
+ * [Split a transaction to distribute funds to two accounts?](http://groups.google.com/group/activemerchant/browse_thread/thread/e1f53087aee9d0c/2cd63df363861ce1?lnk=gst&q=adaptive+payment#2cd63df363861ce1)
100
+
101
+ ## Note on Patches/Pull Requests:
102
+
103
+ * Fork the project.
104
+ * Make your feature addition or bug fix.
105
+ * Send me a pull request. Bonus points for topic branches.
106
+
107
+ ## Copyright:
108
+
109
+ (The MIT License)
110
+
111
+ Copyright 2011 Jose Pablo Barrantes. MIT Licence, so go for it.
112
+
113
+ Permission is hereby granted, free of charge, to any person obtaining a
114
+ copy of this software and associated documentation files (the
115
+ 'Software'), to deal in the Software without restriction, including
116
+ without limitation the rights to use, copy, modify, merge, publish,
117
+ distribute, sublicense, an d/or sell copies of the Software, and to
118
+ permit persons to whom the Software is furnished to do so, subject to
119
+ the following conditions:
120
+
121
+ The above copyright notice and this permission notice shall be included
122
+ in all copies or substantial portions of the Software.
123
+
124
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS
125
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
126
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
127
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
128
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
129
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
130
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,310 @@
1
+ # -*- coding: utf-8 -*-
2
+ dir = File.dirname(__FILE__)
3
+ require dir + '/paypal_adaptive_payments/exceptions.rb'
4
+ require dir + '/paypal_adaptive_payments/adaptive_payment_response.rb'
5
+ require dir + '/paypal_adaptive_payments/utils.rb'
6
+
7
+ module ActiveMerchant
8
+ module Billing
9
+ class PaypalAdaptivePaymentGateway < Gateway
10
+
11
+ include AdaptivePaymentResponses
12
+ include AdaptiveUtils
13
+
14
+ TEST_URL = 'https://svcs.sandbox.paypal.com/AdaptivePayments/'
15
+ LIVE_URL = 'https://svcs.paypal.com/AdaptivePayments/'
16
+
17
+ # The countries the gateway supports merchants from as 2 digit ISO
18
+ # country codes
19
+ self.supported_countries = ['US']
20
+
21
+ # The homepage URL of the gateway
22
+ self.homepage_url = 'http://x.com/'
23
+
24
+ # The name of the gateway
25
+ self.display_name = 'Paypal Adaptive Payments'
26
+
27
+ attr_accessor :config_path
28
+ @config_path = "#{::Rails.root.to_s}/config/paypal.yml"
29
+
30
+ def initialize(options = {})
31
+ @config = {}
32
+ if options.empty?
33
+ load_config
34
+ else
35
+ @config.merge! options
36
+ end
37
+ end
38
+
39
+ def pay(options)
40
+ commit 'Pay', build_adaptive_payment_pay_request(options)
41
+ end
42
+
43
+ def execute_payment(options)
44
+ commit 'ExecutePayment', build_adaptive_payment_execute_request(options)
45
+ end
46
+
47
+ def details_for_payment options
48
+ commit 'PaymentDetails', build_adaptive_payment_details_request(options)
49
+ end
50
+
51
+ def refund options
52
+ commit 'Refund', build_adaptive_refund_details(options)
53
+ end
54
+
55
+ # Send a preapproval request to pay pal
56
+ #
57
+ # ==== Options
58
+ #
59
+ # * +:end_date+ - _xs:datetime_ The ending date
60
+ # * +:start_date+ - _xs:datetime_ The start date (defaults: current)
61
+ # * +:max_amount+ - _xs:decimal_ The preapproved maximum total amount of all payments.
62
+ # * +:currency_code+ - The currency code (defaults: USD)
63
+ # * +:cancel_url+ - URL to redirect the sender’s browser to after canceling the preapproval
64
+ # * +:return_url+ - URL to redirect the sender’s browser to after the sender has logged into PayPal and confirmed the preapproval
65
+ # * +:notify_url+ - The URL to which you want all IPN messages for this preapproval to be sent. (Optional)
66
+ #
67
+ # To get more details on fields see +Paypal PreApproval API+ at https://www.x.com/docs/DOC-1419
68
+ def preapprove_payment options
69
+ commit 'Preapproval', build_preapproval_payment(options)
70
+ end
71
+
72
+ def preapproval_details_for options
73
+ commit 'PreapprovalDetails', build_preapproval_details(options)
74
+ end
75
+
76
+ def convert_currency options
77
+ commit 'ConvertCurrency', build_currency_conversion(options)
78
+ end
79
+
80
+ #debug method, provides an easy to use debug method for the class
81
+ def debug
82
+ "Url: #{@url}\n\n JSON: #{@xml} \n\n Raw: #{@raw}"
83
+ end
84
+
85
+ private
86
+
87
+ #loads config from default file if it is not provided to the constructor
88
+ def load_config
89
+ raise ConfigDoesNotExist if !File.exists?(@config_path);
90
+ @config.merge! Yaml.load_file(@config_path)[Rails.env || RAILS_ENV].symbolize_keys!
91
+ end
92
+
93
+ def build_adaptive_payment_pay_request opts
94
+ @xml = ''
95
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
96
+ xml.instruct!
97
+ xml.PayRequest do |x|
98
+ x.requestEnvelope do |x|
99
+ x.detailLevel 'ReturnAll'
100
+ x.errorLanguage opts[:error_language] ||= 'en_US'
101
+ end
102
+ x.actionType opts[:pay_primary] ? 'PAY_PRIMARY' : 'PAY'
103
+ x.cancelUrl opts[:cancel_url]
104
+ x.returnUrl opts[:return_url]
105
+ if opts[:notify_url]
106
+ x.ipnNotificationUrl opts[:notify_url]
107
+ end
108
+ x.trackingId opts[:tracking_id] if opts[:tracking_id]
109
+ x.memo opts[:memo] if opts[:memo]
110
+ x.pin opts[:pin] if opts[:pin]
111
+ x.currencyCode opts[:currency_code] ||= 'USD'
112
+ x.senderEmail opts[:senders_email] if opts[:senders_email]
113
+ x.receiverList do |x|
114
+ opts[:receiver_list].each do |receiver|
115
+ x.receiver do |x|
116
+ x.email receiver[:email]
117
+ x.amount currency_to_two_places(receiver[:amount])
118
+ x.primary receiver[:primary] if receiver[:primary]
119
+ x.paymentType receiver[:payment_type] ||= 'GOODS'
120
+ x.invoiceId receiver[:invoice_id] if receiver[:invoice_id]
121
+ end
122
+ end
123
+ end
124
+ x.feesPayer opts[:fees_payer] ||= 'EACHRECEIVER'
125
+ end
126
+ end
127
+
128
+ def build_adaptive_payment_execute_request opts
129
+ @xml = ''
130
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
131
+ xml.instruct!
132
+ xml.ExecutePaymentRequest do |x|
133
+ x.requestEnvelope do |x|
134
+ x.detailLevel 'ReturnAll'
135
+ x.errorLanguage opts[:error_language] ||= 'en_US'
136
+ end
137
+ x.payKey opts[:paykey]
138
+ end
139
+ end
140
+
141
+ def build_adaptive_payment_details_request opts
142
+ @xml = ''
143
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
144
+ xml.instruct!
145
+ xml.PayRequest do |x|
146
+ x.requestEnvelope do |x|
147
+ x.detailLevel 'ReturnAll'
148
+ x.errorLanguage opts[:error_language] ||= 'en_US'
149
+ end
150
+ x.payKey opts[:paykey]
151
+ end
152
+ end
153
+
154
+ def build_adaptive_refund_details options
155
+ @xml = ''
156
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
157
+ xml.instruct!
158
+ xml.RefundRequest do |x|
159
+ x.requestEnvelope do |x|
160
+ x.detailLevel 'ReturnAll'
161
+ x.errorLanguage options[:error_language] ||= 'en_US'
162
+ end
163
+ x.actionType 'REFUND'
164
+ if options[:pay_key]
165
+ x.payKey options[:pay_key]
166
+ end
167
+ if options[:transaction_id]
168
+ x.payKey options[:transaction_id]
169
+ end
170
+ if options[:tracking_id]
171
+ x.trackingId options[:tracking_id]
172
+ end
173
+ x.currencyCode options[:currency_code] ||= 'USD'
174
+ x.receiverList do |x|
175
+ options[:receiver_list].each do |receiver|
176
+ x.receiver do |x|
177
+ x.amount receiver[:amount]
178
+ x.paymentType receiver[:payment_type] ||= 'GOODS'
179
+ x.invoiceId receiver[:invoice_id] if receiver[:invoice_id]
180
+ x.email receiver[:email]
181
+
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ def build_preapproval_payment options
189
+ opts = {
190
+ :currency_code => "USD",
191
+ :start_date => DateTime.current
192
+ }.update(options)
193
+
194
+ @xml = ''
195
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
196
+ xml.instruct!
197
+ xml.PreapprovalRequest do |x|
198
+ # request envelope
199
+ x.requestEnvelope do |x|
200
+ x.detailLevel 'ReturnAll'
201
+ x.errorLanguage opts[:error_language] ||= 'en_US'
202
+ end
203
+
204
+ # required preapproval fields
205
+ x.endingDate opts[:end_date].strftime("%Y-%m-%dT%H:%M:%S%Z")
206
+ x.startingDate opts[:start_date].strftime("%Y-%m-%dT%H:%M:%S%Z")
207
+ x.maxTotalAmountOfAllPayments opts[:max_amount]
208
+ x.currencyCode opts[:currency_code]
209
+ x.cancelUrl opts[:cancel_url]
210
+ x.returnUrl opts[:return_url]
211
+
212
+ #optional preapproval fields
213
+ x.maxAmountPerPayment opts[:max_amount_per_payment] unless opts[:max_amount_per_payment].blank?
214
+ x.maxNumberOfPayments opts[:max_number_of_payments] unless opts[:max_number_of_payments].blank?
215
+ x.memo opts[:memo] unless opts[:memo].blank?
216
+
217
+ # notify url
218
+ if opts[:notify_url]
219
+ x.ipnNotificationUrl opts[:notify_url]
220
+ end
221
+ end
222
+ end
223
+
224
+ def build_preapproval_details options
225
+ @xml = ''
226
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
227
+ xml.instruct!
228
+ xml.PreapprovalDetailsRequest do |x|
229
+ x.requestEnvelope do |x|
230
+ x.detailLevel 'ReturnAll'
231
+ x.errorLanguage opts[:error_language] ||= 'en_US'
232
+ end
233
+ x.preapprovalKey options[:preapproval_key]
234
+ x.getBillingAddress options[:get_billing_address] if options[:get_billing_address]
235
+ end
236
+ end
237
+
238
+ def build_currency_conversion options
239
+ @xml = ''
240
+ xml = Builder::XmlMarkup.new :target => @xml, :indent => 2
241
+ xml.instruct!
242
+ xml.ConvertCurrencyRequest do |x|
243
+ x.requestEnvelope do |x|
244
+ x.detailLevel 'ReturnAll'
245
+ x.errorLanguage opts[:error_language] ||= 'en_US'
246
+ end
247
+ x.baseAmountList do |x|
248
+ x.currency do |x|
249
+ x.amount options[:amount]
250
+ x.code options[:currency_code] ||= 'USD'
251
+ end
252
+ end
253
+ x.convertoToCurrencyList do |x|
254
+ options[:currencies].each do |currency|
255
+ x.currency currency
256
+ end
257
+ end
258
+ end
259
+ end
260
+
261
+ def parse json
262
+ @raw = json
263
+ resp = JSON.parse json
264
+ if resp['responseEnvelope']['ack'] == 'Failure'
265
+ error = AdaptivePaypalErrorResponse.new(resp)
266
+ raise PaypalAdaptivePaymentsApiError.new(error)
267
+ else
268
+ AdaptivePaypalSuccessResponse.new(resp)
269
+ end
270
+ end
271
+
272
+ def commit(action, data)
273
+ @response = parse(post_through_ssl(action, data))
274
+ end
275
+
276
+ def post_through_ssl(action, parameters = {})
277
+ headers = {
278
+ "X-PAYPAL-REQUEST-DATA-FORMAT" => "XML",
279
+ "X-PAYPAL-RESPONSE-DATA-FORMAT" => "JSON",
280
+ "X-PAYPAL-SECURITY-USERID" => @config[:login],
281
+ "X-PAYPAL-SECURITY-PASSWORD" => @config[:password],
282
+ "X-PAYPAL-SECURITY-SIGNATURE" => @config[:signature],
283
+ "X-PAYPAL-APPLICATION-ID" => @config[:appid]
284
+ }
285
+ url action
286
+ request = Net::HTTP::Post.new(@url.path)
287
+ request.body = @xml
288
+ headers.each_pair { |k,v| request[k] = v }
289
+ request.content_type = 'text/xml'
290
+ server = Net::HTTP.new(@url.host, 443)
291
+ server.use_ssl = true
292
+ server.verify_mode = OpenSSL::SSL::VERIFY_NONE
293
+ server.start { |http| http.request(request) }.body
294
+ end
295
+
296
+ def endpoint_url
297
+ test? ? TEST_URL : LIVE_URL
298
+ end
299
+
300
+ def test?
301
+ Base.gateway_mode == :test
302
+ end
303
+
304
+ def url action
305
+ @url = URI.parse(endpoint_url + action)
306
+ end
307
+
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,82 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+ module AdaptivePaymentResponses
4
+
5
+ class AdaptivePaypalSuccessResponse
6
+
7
+ BASE_REDIRECT_URL = 'https://www.paypal.com/webscr?cmd='
8
+ TEST_BASE_REDIRECT_URL = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd='
9
+ PAY_COMMAND = '_ap-payment&paykey='
10
+ PREAPPROVAL_COMMAND = '_ap-preapproval&preapprovalkey='
11
+
12
+ attr_reader :paykey, :preapprovalkey
13
+
14
+ def initialize json
15
+
16
+ @paykey = json['payKey']
17
+ @preapprovalkey = json['preapprovalKey']
18
+ @params = json
19
+ end
20
+
21
+ def redirect_url_for
22
+ (Base.gateway_mode == :test ? TEST_BASE_REDIRECT_URL : BASE_REDIRECT_URL) + PAY_COMMAND + @paykey
23
+ end
24
+
25
+ def redirect_preapproval_url_for
26
+ (Base.gateway_mode == :test ? TEST_BASE_REDIRECT_URL : BASE_REDIRECT_URL) + PREAPPROVAL_COMMAND + @preapprovalkey
27
+ end
28
+
29
+ def ack
30
+ @params['responseEnvelope']['ack']
31
+ end
32
+
33
+ def method_missing name
34
+ begin
35
+ @params[name.to_s]
36
+ rescue
37
+ raise AttributenotFound
38
+ end
39
+ end
40
+
41
+ def [](key)
42
+ return @params[key] if @params.include? key
43
+ raise AttributenotFound
44
+ end
45
+
46
+ def status
47
+ @params['status']
48
+ end
49
+
50
+ def refund_status
51
+ @params["refundInfoList"]["refundInfo"].first["refundStatus"]
52
+ end
53
+
54
+ def execute_status
55
+ @params['paymentExecStatus']
56
+ end
57
+
58
+ def refund_complete?
59
+ refund_status == 'REFUNDED' || refund_status == 'ALREADY_REVERSED_OR_REFUNDED'
60
+ end
61
+
62
+ def execute_complete?
63
+ execute_status == 'COMPLETED'
64
+ end
65
+
66
+ end
67
+
68
+ class AdaptivePaypalErrorResponse
69
+
70
+ def initialize error
71
+ @raw = error
72
+ end
73
+
74
+ def debug
75
+ @raw.inspect
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,17 @@
1
+ class ConfigDoesNotExist < StandardError; end;
2
+
3
+ class AttributenotFound < StandardError; end;
4
+
5
+ class PaypalAdaptivePaymentsApiError < StandardError
6
+
7
+ attr_reader :response
8
+
9
+ def initialize response
10
+ @response = response
11
+ end
12
+
13
+ def debug
14
+ @response.inspect
15
+ end
16
+
17
+ end
@@ -0,0 +1,14 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+
4
+ module AdaptiveUtils
5
+
6
+ def currency_to_two_places amount
7
+ return 0.01 if amount < 0.01
8
+ ("%.2f" % amount).to_f
9
+ end
10
+
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ begin
4
+ require 'active_support'
5
+ require 'active_merchant/common'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'active_support'
9
+ require 'active_merchant/common'
10
+ end
11
+
12
+ dir = File.dirname(__FILE__) + '/active_merchant/billing/gateways'
13
+ require dir + '/paypal_adaptive_payment'
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_paypal_adaptive_payment
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jose Pablo Barrantes
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-07-21 00:00:00.000000000 +10:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activemerchant
17
+ requirement: &9269640 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.5.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *9269640
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: &9266120 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 3.0.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *9266120
37
+ - !ruby/object:Gem::Dependency
38
+ name: builder
39
+ requirement: &9265100 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 2.0.0
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *9265100
48
+ description: This library is meant to interface with PayPal web services Adaptive
49
+ Payment Gateway Library.
50
+ email:
51
+ - xjpablobrx@gmail.com
52
+ executables: []
53
+ extensions: []
54
+ extra_rdoc_files: []
55
+ files:
56
+ - lib/active_paypal_adaptive_payment.rb
57
+ - lib/active_merchant/billing/gateways/paypal_adaptive_payments/exceptions.rb
58
+ - lib/active_merchant/billing/gateways/paypal_adaptive_payments/utils.rb
59
+ - lib/active_merchant/billing/gateways/paypal_adaptive_payments/adaptive_payment_response.rb
60
+ - lib/active_merchant/billing/gateways/paypal_adaptive_payment.rb
61
+ - MIT-LICENSE
62
+ - README.markdown
63
+ - CHANGELOG
64
+ has_rdoc: true
65
+ homepage: http://github.com/jpablobr/active_paypal_adaptive_payment
66
+ licenses: []
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.3.6
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 1.6.2
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: ActiveMercant PayPal Adaptive Payment Library
89
+ test_files: []