creative-paypal-express 1.0.1.dev2 → 1.1.0
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.
- checksums.yaml +4 -4
- data/README.md +59 -3
- data/VERSION +1 -1
- data/lib/paypal.rb +0 -2
- data/lib/paypal/express/request.rb +8 -11
- data/lib/paypal/express/response.rb +0 -5
- data/lib/paypal/nvp/request.rb +27 -16
- data/lib/paypal/nvp/response.rb +8 -0
- data/lib/paypal/payment/recurring.rb +41 -25
- data/spec/fake_response/CreateRecurringPaymentsProfile/success.txt +1 -1
- data/spec/paypal/express/request_spec.rb +9 -6
- data/spec/paypal/nvp/response_spec.rb +15 -3
- data/spec/paypal/payment/recurring_spec.rb +69 -8
- data/spec/spec_helper.rb +77 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2623304761cdf500c82acefe85e8e626bbd306bb
|
4
|
+
data.tar.gz: ba7be3ba0b865c979e3ad4de9272c670b7a6f1b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b964a4a4906cb4ccfbd0a794e8a07e5995d2634709eda97692ba073fdbc3ef1f6b94bf4ade0a7d5f300b85d469d26397de4c5aebb4e9c7720f15cb8905f9471d
|
7
|
+
data.tar.gz: f0ce0d81a873f140d567ad79743cdeb7d0d115f97d14028ca75212e9b8dd6b5301013b2ab96bdd3e0a930a6482f3e87331ca4bdc1479c1209bc929f7794c966b
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# paypal-express
|
2
2
|
|
3
|
-
|
4
|
-
Both Instance Payment and Recurring Payment are supported.
|
5
|
-
Express Checkout for Digital Goods is also supported.
|
3
|
+
Handle PayPal Express Checkout.
|
4
|
+
Both Instance Payment and Recurring Payment are supported.
|
5
|
+
Express Checkout for Digital Goods is also supported.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -10,11 +10,67 @@ Express Checkout for Digital Goods is also supported.
|
|
10
10
|
gem "creative-paypal-express", "~> 1.0.0"
|
11
11
|
```
|
12
12
|
|
13
|
+
gem install paypal-express
|
14
|
+
|
13
15
|
## Usage
|
14
16
|
|
15
17
|
See Wiki on Github
|
16
18
|
https://github.com/nov/paypal-express/wiki
|
17
19
|
|
20
|
+
Play with Sample Rails App
|
21
|
+
https://github.com/nov/paypal-express-sample
|
22
|
+
https://paypal-express-sample.heroku.com
|
23
|
+
|
24
|
+
## v1.1.0 news (not in wiki)
|
25
|
+
### Paypal::Payment::Recurring
|
26
|
+
The helper object can be instantiated by using the :raw key.
|
27
|
+
|
28
|
+
```rb
|
29
|
+
params = {
|
30
|
+
# optional initial payment parameters
|
31
|
+
:INITAMT => "9.00",
|
32
|
+
:FAILEDINITAMTACTION => "CancelOnFailure", # or "ContinueOnFailure"
|
33
|
+
|
34
|
+
# optional trial parameters
|
35
|
+
:TRIALBILLINGPERIOD => "Day",
|
36
|
+
:TRIALBILLINGFREQUENCY => "7",
|
37
|
+
:TRIALAMT => "0.00",
|
38
|
+
:TRIALCURRENCYCODE => "EUR",
|
39
|
+
:TRIALTOTALBILLINGCYCLES => "1",
|
40
|
+
|
41
|
+
# mandatory regular recurring profile parameters
|
42
|
+
:DESC => "Funny Movie Clips Subscription",
|
43
|
+
:PROFILESTARTDATE => "2017-01-25T15:00:00Z",
|
44
|
+
:BILLINGPERIOD => "Day", # "Month", "Year"
|
45
|
+
:BILLINGFREQUENCY => "30",
|
46
|
+
:AMT => "9.00", # two-decimals for cents, whole number for whole currency, like a Euro or Dollar
|
47
|
+
:CURRENCYCODE => "EUR",
|
48
|
+
|
49
|
+
# termination
|
50
|
+
:TOTALBILLINGCYCLES => "0", # optional field, '0' value makes profile last forever
|
51
|
+
:MAXFAILEDPAYMENTS => "3",
|
52
|
+
:AUTOBILLAMT => "AddToNextBilling",
|
53
|
+
|
54
|
+
# Digital goods fields
|
55
|
+
:L_PAYMENTREQUEST_0_ITEMCATEGORY0 => "Digital",
|
56
|
+
:L_PAYMENTREQUEST_0_NAME0 => "Cat Clip Collection",
|
57
|
+
:L_PAYMENTREQUEST_0_AMT0 => "9.00",
|
58
|
+
:L_PAYMENTREQUEST_0_QTY0 => "1",
|
59
|
+
}
|
60
|
+
|
61
|
+
recurring_profile = Paypal::Payment::Recurring.new(raw: params)
|
62
|
+
```
|
63
|
+
|
64
|
+
## Note on Patches/Pull Requests
|
65
|
+
|
66
|
+
* Fork the project.
|
67
|
+
* Make your feature addition or bug fix.
|
68
|
+
* Add tests for it. This is important so I don't break it in a
|
69
|
+
future version unintentionally.
|
70
|
+
* Commit, do not mess with rakefile, version, or history.
|
71
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
72
|
+
* Send me a pull request. Bonus points for topic branches.
|
73
|
+
|
18
74
|
## Copyright
|
19
75
|
|
20
76
|
Copyright (c) 2011 nov matake. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/lib/paypal.rb
CHANGED
@@ -34,9 +34,9 @@ module Paypal
|
|
34
34
|
params.merge! payment_request.to_params(index)
|
35
35
|
end
|
36
36
|
|
37
|
-
response =
|
37
|
+
response = request(:SetExpressCheckout, params)
|
38
38
|
|
39
|
-
Response.new
|
39
|
+
Response.new response, options
|
40
40
|
end
|
41
41
|
|
42
42
|
def details(token)
|
@@ -90,11 +90,6 @@ module Paypal
|
|
90
90
|
:TOKEN => token
|
91
91
|
}
|
92
92
|
params.merge!(recurring_profile.to_params)
|
93
|
-
|
94
|
-
puts "== DEBUGGING PAYPAL Request#subscribe! =="
|
95
|
-
puts "about to make a request to PayPal with :CreateRecurringPaymentsProfile and params:\n#{params}"
|
96
|
-
puts "=========================================="
|
97
|
-
|
98
93
|
response = self.request(:CreateRecurringPaymentsProfile, params)
|
99
94
|
Response.new(response)
|
100
95
|
end
|
@@ -103,8 +98,8 @@ module Paypal
|
|
103
98
|
params = {
|
104
99
|
:PROFILEID => profile_id
|
105
100
|
}
|
106
|
-
response = self.request
|
107
|
-
Response.new
|
101
|
+
response = self.request :GetRecurringPaymentsProfileDetails, params
|
102
|
+
Response.new response
|
108
103
|
end
|
109
104
|
|
110
105
|
def renew!(profile_id, action, options = {})
|
@@ -115,7 +110,8 @@ module Paypal
|
|
115
110
|
if options[:note]
|
116
111
|
params[:NOTE] = options[:note]
|
117
112
|
end
|
118
|
-
|
113
|
+
|
114
|
+
response = request(:ManageRecurringPaymentsProfileStatus, params)
|
119
115
|
Response.new response
|
120
116
|
end
|
121
117
|
|
@@ -131,6 +127,7 @@ module Paypal
|
|
131
127
|
renew!(profile_id, :Reactivate, options)
|
132
128
|
end
|
133
129
|
|
130
|
+
|
134
131
|
# Reference Transaction Specific
|
135
132
|
|
136
133
|
def agree!(token, options = {})
|
@@ -174,8 +171,8 @@ module Paypal
|
|
174
171
|
Response.new response
|
175
172
|
end
|
176
173
|
|
177
|
-
# Refund Specific
|
178
174
|
|
175
|
+
#== Refund Specific
|
179
176
|
def refund!(transaction_id, options = {})
|
180
177
|
params = {
|
181
178
|
:TRANSACTIONID => transaction_id,
|
@@ -13,11 +13,6 @@ module Paypal
|
|
13
13
|
# :VERSION=>"66.0"
|
14
14
|
# }
|
15
15
|
def initialize(response, options = {})
|
16
|
-
puts "== DEBUGGING PAYPAL Response#initialize =="
|
17
|
-
puts "response:\n#{response}"
|
18
|
-
puts "options:\n#{options}"
|
19
|
-
puts "=========================================="
|
20
|
-
|
21
16
|
super response
|
22
17
|
@pay_on_paypal = options[:pay_on_paypal]
|
23
18
|
@mobile = options[:mobile]
|
data/lib/paypal/nvp/request.rb
CHANGED
@@ -41,25 +41,36 @@ module Paypal
|
|
41
41
|
|
42
42
|
private
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
def post(method, params)
|
45
|
+
rest_params = common_params.merge(params).merge(METHOD: method)
|
46
|
+
|
47
|
+
response = RestClient.post(self.class.endpoint, rest_params)
|
48
|
+
|
49
|
+
puts ">> Paypal::NVP Got response to POST request <<"
|
50
|
+
puts "Request arguments:\nendpoint: #{self.class.endpoint}\nparams: #{rest_params})\n"
|
51
|
+
puts "Response string:\n#{response}"
|
52
|
+
puts "=============================================="
|
48
53
|
|
49
|
-
|
50
|
-
response = yield
|
51
|
-
response = CGI.parse(response).inject({}) do |res, (k, v)|
|
52
|
-
res.merge!(k.to_sym => v.first)
|
54
|
+
return response
|
53
55
|
end
|
54
|
-
|
55
|
-
|
56
|
-
response
|
57
|
-
|
58
|
-
|
56
|
+
|
57
|
+
def handle_response
|
58
|
+
response = yield
|
59
|
+
response = CGI.parse(response).inject({}) do |res, (k, v)|
|
60
|
+
res.merge!(k.to_sym => v.first)
|
61
|
+
end
|
62
|
+
|
63
|
+
case response[:ACK]
|
64
|
+
when 'Success', 'SuccessWithWarning'
|
65
|
+
response
|
66
|
+
else
|
67
|
+
raise Exception::APIError.new(response)
|
68
|
+
end
|
69
|
+
|
70
|
+
rescue RestClient::Exception => e
|
71
|
+
raise Exception::HttpError.new(e.http_code, e.message, e.http_body)
|
59
72
|
end
|
60
|
-
|
61
|
-
raise Exception::HttpError.new(e.http_code, e.message, e.http_body)
|
62
|
-
end
|
73
|
+
|
63
74
|
end
|
64
75
|
end
|
65
76
|
end
|
data/lib/paypal/nvp/response.rb
CHANGED
@@ -2,6 +2,7 @@ module Paypal
|
|
2
2
|
module NVP
|
3
3
|
class Response < Base
|
4
4
|
cattr_reader :attribute_mapping
|
5
|
+
|
5
6
|
@@attribute_mapping = {
|
6
7
|
:ACK => :ack,
|
7
8
|
:BUILD => :build,
|
@@ -36,6 +37,7 @@ module Paypal
|
|
36
37
|
:INVNUM => :invoice_number,
|
37
38
|
:CUSTOM => :custom
|
38
39
|
}
|
40
|
+
|
39
41
|
attr_accessor *@@attribute_mapping.values
|
40
42
|
attr_accessor :shipping_options_is_default, :success_page_redirect_requested, :insurance_option_selected
|
41
43
|
attr_accessor :amount, :description, :ship_to, :bill_to, :payer, :recurring, :billing_agreement, :refund
|
@@ -43,6 +45,8 @@ module Paypal
|
|
43
45
|
alias_method :colleration_id, :correlation_id # NOTE: I made a typo :p
|
44
46
|
|
45
47
|
def initialize(attributes = {})
|
48
|
+
@raw_response = attributes
|
49
|
+
|
46
50
|
attrs = attributes.dup
|
47
51
|
@@attribute_mapping.each do |key, value|
|
48
52
|
self.send "#{value}=", attrs.delete(key)
|
@@ -228,6 +232,10 @@ module Paypal
|
|
228
232
|
Paypal.log "Ignored Parameter (#{self.class}): #{key}=#{value}", :warn
|
229
233
|
end
|
230
234
|
end
|
235
|
+
|
236
|
+
def to_s
|
237
|
+
return @raw_response.to_s
|
238
|
+
end
|
231
239
|
end
|
232
240
|
end
|
233
241
|
end
|
@@ -4,40 +4,56 @@ module Paypal
|
|
4
4
|
attr_optional :start_date, :description, :identifier, :status, :name, :reference, :max_fails, :auto_bill, :aggregate_amount, :aggregate_optional_amount, :final_payment_date
|
5
5
|
attr_accessor :activation, :billing, :regular_billing, :summary
|
6
6
|
|
7
|
+
MANDATORY_PARAMETERS = [:DESC, :PROFILESTARTDATE, :BILLINGPERIOD, :BILLINGFREQUENCY, :AMT, :CURRENCYCODE].freeze
|
8
|
+
|
7
9
|
def initialize(attributes = {})
|
8
10
|
super
|
9
|
-
@activation = Activation.new
|
10
|
-
@billing = Billing.new
|
11
|
-
@regular_billing = Billing.new
|
12
|
-
@summary = Summary.new
|
11
|
+
@activation = Activation.new(attributes[:activation]) if attributes[:activation]
|
12
|
+
@billing = Billing.new(attributes[:billing]) if attributes[:billing]
|
13
|
+
@regular_billing = Billing.new(attributes[:regular_billing]) if attributes[:regular_billing]
|
14
|
+
@summary = Summary.new(attributes[:summary]) if attributes[:summary]
|
15
|
+
@raw_parameters = attributes[:raw].presence || {}
|
16
|
+
@parameters = build_parameters_hash
|
17
|
+
|
18
|
+
# can not make this happen as profile object is used both in cretion, response verification and status checks, which vary in available parameters
|
19
|
+
# makes sure key params have been passed one way or the other
|
20
|
+
# missing_mandatory_parameters = MANDATORY_PARAMETERS.map{|param| @parameters[param].present? ? nil : param}.compact
|
21
|
+
# raise ArgumentError.new("Missing mandatory parameters #{missing_mandatory_parameters.to_s}") if missing_mandatory_parameters.any?
|
13
22
|
end
|
14
23
|
|
15
24
|
def to_params
|
16
|
-
|
17
|
-
self.billing,
|
18
|
-
self.activation
|
19
|
-
].compact.inject({}) do |params, attribute|
|
20
|
-
params.merge! attribute.to_params
|
21
|
-
end
|
22
|
-
if self.start_date.is_a?(Time)
|
23
|
-
self.start_date = self.start_date.to_s(:db)
|
24
|
-
end
|
25
|
-
params.merge!(
|
26
|
-
:DESC => self.description,
|
27
|
-
:MAXFAILEDPAYMENTS => self.max_fails,
|
28
|
-
:AUTOBILLOUTAMT => self.auto_bill,
|
29
|
-
:PROFILESTARTDATE => self.start_date,
|
30
|
-
:SUBSCRIBERNAME => self.name,
|
31
|
-
:PROFILEREFERENCE => self.reference
|
32
|
-
)
|
33
|
-
params.delete_if do |k, v|
|
34
|
-
v.blank?
|
35
|
-
end
|
25
|
+
return @parameters
|
36
26
|
end
|
37
27
|
|
38
28
|
def numeric_attribute?(key)
|
39
29
|
super || [:max_fails, :failed_count].include?(key)
|
40
30
|
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
def build_parameters_hash
|
34
|
+
params = [
|
35
|
+
self.billing,
|
36
|
+
self.activation
|
37
|
+
].compact.inject({}) do |params, attribute|
|
38
|
+
params.merge! attribute.to_params
|
39
|
+
end
|
40
|
+
|
41
|
+
params.merge!(
|
42
|
+
:DESC => self.description,
|
43
|
+
:MAXFAILEDPAYMENTS => self.max_fails,
|
44
|
+
:AUTOBILLOUTAMT => self.auto_bill,
|
45
|
+
:PROFILESTARTDATE => (start_date.is_a?(Time) ? start_date.to_s(:db) : start_date),
|
46
|
+
:SUBSCRIBERNAME => self.name,
|
47
|
+
:PROFILEREFERENCE => self.reference
|
48
|
+
)
|
49
|
+
|
50
|
+
# allows passing raw keys overriding named assignment methods
|
51
|
+
params.merge!(@raw_parameters)
|
52
|
+
|
53
|
+
return params.delete_if do |k, v|
|
54
|
+
v.blank?
|
55
|
+
end
|
56
|
+
end
|
41
57
|
end
|
42
58
|
end
|
43
|
-
end
|
59
|
+
end
|
@@ -1 +1 @@
|
|
1
|
-
PROFILEID=I%2dL8N58XFUCET3&PROFILESTATUS=ActiveProfile&TIMESTAMP=2011%2d02%2d08T07%3a17%3a51Z&CORRELATIONID=7d2e125f5ca63&ACK=Success&VERSION=66%2e0&BUILD=1704252
|
1
|
+
PROFILEID=I%2dL8N58XFUCET3&PROFILESTATUS=ActiveProfile&TIMESTAMP=2011%2d02%2d08T07%3a17%3a51Z&CORRELATIONID=7d2e125f5ca63&ACK=Success&VERSION=66%2e0&BUILD=1704252
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
2
3
|
describe Paypal::Express::Request do
|
3
4
|
class Paypal::Express::Request
|
4
5
|
attr_accessor :_sent_params_, :_method_
|
@@ -67,7 +68,8 @@ describe Paypal::Express::Request do
|
|
67
68
|
:period => :Month,
|
68
69
|
:frequency => 1,
|
69
70
|
:amount => 1000
|
70
|
-
}
|
71
|
+
},
|
72
|
+
raw: {:CURRENCYCODE => "EUR"},
|
71
73
|
)
|
72
74
|
end
|
73
75
|
|
@@ -368,20 +370,21 @@ describe Paypal::Express::Request do
|
|
368
370
|
describe '#subscribe!' do
|
369
371
|
it 'should return Paypal::Express::Response' do
|
370
372
|
fake_response 'CreateRecurringPaymentsProfile/success'
|
371
|
-
response = instance.subscribe!
|
373
|
+
response = instance.subscribe!('token', recurring_profile)
|
372
374
|
response.should be_instance_of Paypal::Express::Response
|
373
375
|
end
|
374
376
|
|
375
377
|
it 'should call CreateRecurringPaymentsProfile' do
|
376
378
|
expect do
|
377
|
-
instance.subscribe!
|
378
|
-
end.to request_to
|
379
|
+
instance.subscribe!('token', recurring_profile)
|
380
|
+
end.to request_to(nvp_endpoint, :post)
|
379
381
|
instance._method_.should == :CreateRecurringPaymentsProfile
|
380
382
|
instance._sent_params_.should == {
|
381
383
|
:DESC => 'Recurring Profile',
|
382
384
|
:TOKEN => 'token',
|
383
385
|
:SHIPPINGAMT => '0.00',
|
384
386
|
:AMT => '1000.00',
|
387
|
+
:CURRENCYCODE => "EUR",
|
385
388
|
:BILLINGFREQUENCY => 1,
|
386
389
|
:MAXFAILEDPAYMENTS => 0,
|
387
390
|
:BILLINGPERIOD => :Month,
|
@@ -432,7 +435,7 @@ describe Paypal::Express::Request do
|
|
432
435
|
describe '#cancel!' do
|
433
436
|
it 'should return Paypal::Express::Response' do
|
434
437
|
fake_response 'ManageRecurringPaymentsProfileStatus/success'
|
435
|
-
response = instance.cancel!
|
438
|
+
response = instance.cancel!('profile_id')
|
436
439
|
response.should be_instance_of(Paypal::Express::Response)
|
437
440
|
end
|
438
441
|
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# rspec spec/paypal/nvp/response_spec.rb
|
3
2
|
describe Paypal::NVP::Response do
|
4
3
|
let(:return_url) { 'http://example.com/success' }
|
5
4
|
let(:cancel_url) { 'http://example.com/cancel' }
|
@@ -143,4 +142,17 @@ describe Paypal::NVP::Response do
|
|
143
142
|
end
|
144
143
|
end
|
145
144
|
end
|
146
|
-
|
145
|
+
|
146
|
+
describe "#to_s" do
|
147
|
+
before do
|
148
|
+
fake_response 'SetExpressCheckout/success'
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should return a stringified hash of POST request response that instantiated the object" do
|
152
|
+
response = request.setup(payment_request, return_url, cancel_url)
|
153
|
+
|
154
|
+
expect(response.to_s).to eq("{:ACK=>\"Success\", :BUILD=>\"1721431\", :CORRELATIONID=>\"5549ea3a78af1\", :TIMESTAMP=>\"2011-02-02T02:02:18Z\", :TOKEN=>\"EC-5YJ90598G69065317\", :VERSION=>\"66.0\"}")
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# rspec spec/paypal/payment/recurring_spec.rb
|
3
2
|
describe Paypal::Payment::Recurring do
|
3
|
+
klass = Paypal::Payment::Recurring
|
4
|
+
|
4
5
|
let :keys do
|
5
6
|
Paypal::Payment::Recurring.optional_attributes
|
6
7
|
end
|
@@ -56,10 +57,28 @@ describe Paypal::Payment::Recurring do
|
|
56
57
|
end
|
57
58
|
|
58
59
|
let :instance do
|
59
|
-
|
60
|
+
klass.new(attributes)
|
60
61
|
end
|
61
62
|
|
62
63
|
describe '.new' do
|
64
|
+
# can not make this happen as profile object is used both in cretion, response verification and status checks, which vary in available parameters
|
65
|
+
xit "should raise if attempting to initialize with missing mandatory parameters" do
|
66
|
+
expect{klass.new({raw: {:DESC => "test description"}})}.to raise_error(ArgumentError, /\AMissing mandatory parameters \[:PROFILESTARTDATE, :BILLINGPERIOD, :BILLINGFREQUENCY, :AMT, :CURRENCYCODE\]/)
|
67
|
+
end
|
68
|
+
|
69
|
+
xit "should not raise if initializing with all mandatory parameters" do
|
70
|
+
mandatory_parameters = {
|
71
|
+
:DESC => "Funny Movie Clips Subscription",
|
72
|
+
:PROFILESTARTDATE => "2017-01-25T15:00:00Z",
|
73
|
+
:BILLINGPERIOD => "Day", # "Month", "Year"
|
74
|
+
:BILLINGFREQUENCY => "30",
|
75
|
+
:AMT => "9.00", # two-decimals for cents, whole number for whole currency, like a Euro or Dollar
|
76
|
+
:CURRENCYCODE => "EUR",
|
77
|
+
}
|
78
|
+
|
79
|
+
expect{klass.new(raw: mandatory_parameters)}.to_not raise_error(ArgumentError)
|
80
|
+
end
|
81
|
+
|
63
82
|
it 'should accept all supported attributes' do
|
64
83
|
instance.identifier.should == '12345'
|
65
84
|
instance.description.should == 'Subscription Payment Profile'
|
@@ -80,6 +99,7 @@ describe Paypal::Payment::Recurring do
|
|
80
99
|
:tax_amount => '0'
|
81
100
|
}
|
82
101
|
end
|
102
|
+
|
83
103
|
it 'should setup trial billing info' do
|
84
104
|
instance.billing.trial.should == Paypal::Payment::Recurring::Billing.new(trial_attributes)
|
85
105
|
end
|
@@ -104,11 +124,14 @@ describe Paypal::Payment::Recurring do
|
|
104
124
|
}
|
105
125
|
end
|
106
126
|
|
107
|
-
context 'when start_date is Time' do
|
108
|
-
it 'should
|
109
|
-
instance = Paypal::Payment::Recurring.new
|
110
|
-
|
127
|
+
context 'when start_date is a Time object' do
|
128
|
+
it 'should get correctly stringfied when converting to params' do
|
129
|
+
instance = Paypal::Payment::Recurring.new(
|
130
|
+
attributes.merge(
|
131
|
+
:start_date => Time.utc(2011, 2, 8, 15, 0, 0)
|
132
|
+
)
|
111
133
|
)
|
134
|
+
|
112
135
|
instance.start_date.should be_instance_of(Time)
|
113
136
|
instance.to_params[:PROFILESTARTDATE].should == '2011-02-08 15:00:00'
|
114
137
|
end
|
@@ -126,6 +149,7 @@ describe Paypal::Payment::Recurring do
|
|
126
149
|
:tax_amount => '0'
|
127
150
|
}
|
128
151
|
end
|
152
|
+
|
129
153
|
it 'should setup trial billing info' do
|
130
154
|
instance.to_params.should == {
|
131
155
|
:TRIALBILLINGPERIOD => "Month",
|
@@ -150,6 +174,43 @@ describe Paypal::Payment::Recurring do
|
|
150
174
|
}
|
151
175
|
end
|
152
176
|
end
|
177
|
+
|
178
|
+
context "when attempting to initialize a Recurring Profile with an initial payment now and same payments every month" do
|
179
|
+
it "should return correct request parameters hash" do
|
180
|
+
@attributes = expected_recurring_profile_parameters
|
181
|
+
|
182
|
+
profile = Paypal::Payment::Recurring.new(raw: @attributes)
|
183
|
+
|
184
|
+
@exp = expected_recurring_profile_parameters
|
185
|
+
|
186
|
+
expect(profile.to_params).to eq @exp
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context "when attempting to initialize a Recurring Profile with a large initial payment now and smaller payments every month" do
|
191
|
+
it "should return correct request parameters hash" do
|
192
|
+
@attributes = mandatory_profile_parameters.merge(initial_payment_profile_parameters).merge(auxilary_profile_parameters).merge(:INITAMT => "100.00", :AMT => "1.50")
|
193
|
+
|
194
|
+
profile = Paypal::Payment::Recurring.new(raw: @attributes)
|
195
|
+
|
196
|
+
@exp = mandatory_profile_parameters.merge(initial_payment_profile_parameters).merge(auxilary_profile_parameters).merge(:INITAMT => "100.00", :AMT => "1.50")
|
197
|
+
|
198
|
+
expect(profile.to_params).to eq @exp
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context "when attempting to initialize a Recurring Profile with no initial payment and recurring payments every month starting in a week" do
|
203
|
+
it "should return correct request parameters hash" do
|
204
|
+
@attributes = mandatory_profile_parameters.merge(trial_profile_parameters).merge(auxilary_profile_parameters)
|
205
|
+
|
206
|
+
profile = Paypal::Payment::Recurring.new(raw: @attributes)
|
207
|
+
|
208
|
+
@exp = mandatory_profile_parameters.merge(trial_profile_parameters).merge(auxilary_profile_parameters)
|
209
|
+
|
210
|
+
expect(profile.to_params).to eq @exp
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
153
214
|
end
|
154
215
|
|
155
216
|
describe '#numeric_attribute?' do
|
@@ -167,4 +228,4 @@ describe Paypal::Payment::Recurring do
|
|
167
228
|
end
|
168
229
|
end
|
169
230
|
end
|
170
|
-
end
|
231
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -24,3 +24,80 @@ def sandbox_mode(&block)
|
|
24
24
|
ensure
|
25
25
|
Paypal.sandbox = false
|
26
26
|
end
|
27
|
+
|
28
|
+
def expected_recurring_profile_parameters(options={})
|
29
|
+
|
30
|
+
# optional initial payment parameters
|
31
|
+
# :INITAMT => "9.00",
|
32
|
+
# :FAILEDINITAMTACTION => "CancelOnFailure", # or "ContinueOnFailure"
|
33
|
+
#
|
34
|
+
# # optional trial parameters
|
35
|
+
# :TRIALBILLINGPERIOD => "Day",
|
36
|
+
# :TRIALBILLINGFREQUENCY => "7",
|
37
|
+
# :TRIALAMT => "0.00",
|
38
|
+
# :TRIALCURRENCYCODE => "EUR",
|
39
|
+
# :TRIALTOTALBILLINGCYCLES => "1",
|
40
|
+
#
|
41
|
+
# # mandatory regular recurring profile parameters
|
42
|
+
# :DESC => "Funny Movie Clips Subscription",
|
43
|
+
# :PROFILESTARTDATE => "2017-01-25T15:00:00Z",
|
44
|
+
# :BILLINGPERIOD => "Day", # "Month", "Year"
|
45
|
+
# :BILLINGFREQUENCY => "30",
|
46
|
+
# :AMT => "9.00", # two-decimals for cents, whole number for whole currency, like a Euro or Dollar
|
47
|
+
# :CURRENCYCODE => "EUR",
|
48
|
+
#
|
49
|
+
# # termination
|
50
|
+
# :TOTALBILLINGCYCLES => "0", # optional field, '0' value makes profile last forever
|
51
|
+
# :MAXFAILEDPAYMENTS => "3",
|
52
|
+
# :AUTOBILLAMT => "AddToNextBilling",
|
53
|
+
#
|
54
|
+
# # Digital goods fields
|
55
|
+
# :L_PAYMENTREQUEST_0_ITEMCATEGORY0 => "Digital",
|
56
|
+
# :L_PAYMENTREQUEST_0_NAME0 => "Cat Clip Collection",
|
57
|
+
# :L_PAYMENTREQUEST_0_AMT0 => "9.00",
|
58
|
+
# :L_PAYMENTREQUEST_0_QTY0 => "1",
|
59
|
+
return mandatory_profile_parameters.merge(trial_profile_parameters).merge(initial_payment_profile_parameters).merge(auxilary_profile_parameters).merge(options)
|
60
|
+
end
|
61
|
+
|
62
|
+
def mandatory_profile_parameters(options={})
|
63
|
+
return {
|
64
|
+
:DESC => "Funny Movie Clips Subscription",
|
65
|
+
:PROFILESTARTDATE => "2017-01-25T15:00:00Z",
|
66
|
+
:BILLINGPERIOD => "Day", # "Month", "Year"
|
67
|
+
:BILLINGFREQUENCY => "30",
|
68
|
+
:AMT => "9.00", # two-decimals for cents, whole number for whole currency, like a Euro or Dollar
|
69
|
+
:CURRENCYCODE => "EUR",
|
70
|
+
}.merge(options)
|
71
|
+
end
|
72
|
+
|
73
|
+
def trial_profile_parameters(options={})
|
74
|
+
return {
|
75
|
+
# optional trial parameters
|
76
|
+
:TRIALBILLINGPERIOD => "Day",
|
77
|
+
:TRIALBILLINGFREQUENCY => "7",
|
78
|
+
:TRIALAMT => "0.00",
|
79
|
+
:TRIALCURRENCYCODE => "EUR",
|
80
|
+
:TRIALTOTALBILLINGCYCLES => "1",
|
81
|
+
}.merge(options)
|
82
|
+
end
|
83
|
+
|
84
|
+
def initial_payment_profile_parameters(options={})
|
85
|
+
return {
|
86
|
+
# optional initial payment parameters
|
87
|
+
:INITAMT => "9.00",
|
88
|
+
:FAILEDINITAMTACTION => "CancelOnFailure", # or "ContinueOnFailure"
|
89
|
+
}.merge(options)
|
90
|
+
end
|
91
|
+
|
92
|
+
def auxilary_profile_parameters(options={})
|
93
|
+
return {
|
94
|
+
:TOTALBILLINGCYCLES => "0", # optional field, '0' value makes profile last forever
|
95
|
+
:MAXFAILEDPAYMENTS => "3",
|
96
|
+
:AUTOBILLAMT => "AddToNextBilling",
|
97
|
+
|
98
|
+
:L_PAYMENTREQUEST_0_ITEMCATEGORY0 => "Digital",
|
99
|
+
:L_PAYMENTREQUEST_0_NAME0 => "Cat Clip Collection",
|
100
|
+
:L_PAYMENTREQUEST_0_AMT0 => "9.00",
|
101
|
+
:L_PAYMENTREQUEST_0_QTY0 => "1",
|
102
|
+
}.merge(options)
|
103
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: creative-paypal-express
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nov matake
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-01-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|