paypal-express 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/paypal.rb +1 -0
- data/lib/paypal/nvp/response.rb +28 -8
- data/lib/paypal/payment/common/amount.rb +1 -1
- data/lib/paypal/payment/response.rb +17 -1
- data/lib/paypal/payment/response/item.rb +36 -0
- data/spec/fake_response/GetExpressCheckoutDetails/success.txt +1 -1
- data/spec/paypal/nvp/response_spec.rb +1 -1
- data/spec/paypal/payment/request_spec.rb +8 -16
- data/spec/paypal/payment/response/item_spec.rb +40 -0
- metadata +8 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
data/lib/paypal.rb
CHANGED
@@ -71,6 +71,7 @@ require 'paypal/payment/request'
|
|
71
71
|
require 'paypal/payment/request/item'
|
72
72
|
require 'paypal/payment/response'
|
73
73
|
require 'paypal/payment/response/info'
|
74
|
+
require 'paypal/payment/response/item'
|
74
75
|
require 'paypal/payment/response/payer'
|
75
76
|
require 'paypal/payment/response/ship_to'
|
76
77
|
require 'paypal/payment/recurring'
|
data/lib/paypal/nvp/response.rb
CHANGED
@@ -11,13 +11,15 @@ module Paypal
|
|
11
11
|
:CORRELATIONID => :colleration_id,
|
12
12
|
:COUNTRYCODE => :country_code,
|
13
13
|
:CURRENCYCODE => :currency_code,
|
14
|
+
:DESC => :description,
|
14
15
|
:TIMESTAMP => :timestamp,
|
15
16
|
:TOKEN => :token,
|
17
|
+
:NOTIFYURL => :notify_url,
|
16
18
|
:VERSION => :version
|
17
19
|
}
|
18
20
|
attr_accessor *@@attribute_mapping.values
|
19
21
|
attr_accessor :shipping_options_is_default, :success_page_redirect_requested, :insurance_option_selected
|
20
|
-
attr_accessor :amount, :ship_to, :payer, :recurring, :payment_responses, :payment_info
|
22
|
+
attr_accessor :amount, :description, :ship_to, :payer, :recurring, :payment_responses, :payment_info, :items
|
21
23
|
|
22
24
|
def initialize(attributes = {})
|
23
25
|
attrs = attributes.dup
|
@@ -29,6 +31,7 @@ module Paypal
|
|
29
31
|
@insurance_option_selected = attrs.delete(:INSURANCEOPTIONSELECTED) == 'true'
|
30
32
|
@amount = Payment::Common::Amount.new(
|
31
33
|
:total => attrs.delete(:AMT),
|
34
|
+
:item => attrs.delete(:ITEMAMT),
|
32
35
|
:handing => attrs.delete(:HANDLINGAMT),
|
33
36
|
:insurance => attrs.delete(:INSURANCEAMT),
|
34
37
|
:ship_disc => attrs.delete(:SHIPDISCAMT),
|
@@ -61,7 +64,7 @@ module Paypal
|
|
61
64
|
# NOTE:
|
62
65
|
# CreateRecurringPaymentsProfile returns PROFILESTATUS
|
63
66
|
# GetRecurringPaymentsProfileDetails returns STATUS
|
64
|
-
:description =>
|
67
|
+
:description => @description,
|
65
68
|
:status => attrs.delete(:STATUS) || attrs.delete(:PROFILESTATUS),
|
66
69
|
:start_date => attrs.delete(:PROFILESTARTDATE),
|
67
70
|
:name => attrs.delete(:SUBSCRIBERNAME),
|
@@ -107,12 +110,16 @@ module Paypal
|
|
107
110
|
|
108
111
|
# payment_responses
|
109
112
|
payment_responses = []
|
110
|
-
attrs.keys.each do |
|
111
|
-
prefix, index, key =
|
112
|
-
|
113
|
-
|
113
|
+
attrs.keys.each do |_attr_|
|
114
|
+
prefix, index, key = case _attr_.to_s
|
115
|
+
when /^PAYMENTREQUEST/, /^PAYMENTREQUESTINFO/
|
116
|
+
_attr_.to_s.split('_')
|
117
|
+
when /^L_PAYMENTREQUEST/
|
118
|
+
_attr_.to_s.split('_')[1..-1]
|
119
|
+
end
|
120
|
+
if prefix
|
114
121
|
payment_responses[index.to_i] ||= {}
|
115
|
-
payment_responses[index.to_i][key.to_sym]
|
122
|
+
payment_responses[index.to_i][key.to_sym] ||= attrs.delete(_attr_)
|
116
123
|
end
|
117
124
|
end
|
118
125
|
@payment_responses = payment_responses.collect do |_attrs_|
|
@@ -132,6 +139,19 @@ module Paypal
|
|
132
139
|
Payment::Response::Info.new _attrs_
|
133
140
|
end
|
134
141
|
|
142
|
+
# payment_info
|
143
|
+
items = []
|
144
|
+
attrs.keys.each do |_attr_|
|
145
|
+
key, index = _attr_.to_s.scan(/^L_(.+)(\d)$/).flatten
|
146
|
+
if index
|
147
|
+
items[index.to_i] ||= {}
|
148
|
+
items[index.to_i][key.to_sym] = attrs.delete(_attr_)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
@items = items.collect do |_attrs_|
|
152
|
+
Payment::Response::Item.new _attrs_
|
153
|
+
end
|
154
|
+
|
135
155
|
# remove duplicated parameters
|
136
156
|
attrs.delete(:SHIPTOCOUNTRY) # NOTE: Same with SHIPTOCOUNTRYCODE
|
137
157
|
|
@@ -142,4 +162,4 @@ module Paypal
|
|
142
162
|
end
|
143
163
|
end
|
144
164
|
end
|
145
|
-
end
|
165
|
+
end
|
@@ -2,7 +2,7 @@ module Paypal
|
|
2
2
|
module Payment
|
3
3
|
module Common
|
4
4
|
class Amount < Base
|
5
|
-
attr_optional :total, :fee, :handing, :insurance, :ship_disc, :shipping, :tax
|
5
|
+
attr_optional :total, :item, :fee, :handing, :insurance, :ship_disc, :shipping, :tax
|
6
6
|
|
7
7
|
def numeric_attribute?(key)
|
8
8
|
true
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module Paypal
|
2
2
|
module Payment
|
3
3
|
class Response < Base
|
4
|
-
attr_accessor :amount, :ship_to, :insurance_option_offered, :currency_code, :error_code
|
4
|
+
attr_accessor :amount, :ship_to, :description, :items, :notify_url, :insurance_option_offered, :currency_code, :error_code
|
5
5
|
|
6
6
|
def initialize(attributes = {})
|
7
7
|
attrs = attributes.dup
|
8
8
|
@amount = Common::Amount.new(
|
9
9
|
:total => attrs.delete(:AMT),
|
10
|
+
:item => attrs.delete(:ITEMAMT),
|
10
11
|
:handing => attrs.delete(:HANDLINGAMT),
|
11
12
|
:insurance => attrs.delete(:INSURANCEAMT),
|
12
13
|
:ship_disc => attrs.delete(:SHIPDISCAMT),
|
@@ -22,10 +23,25 @@ module Paypal
|
|
22
23
|
:country_code => attrs.delete(:SHIPTOCOUNTRYCODE),
|
23
24
|
:country_name => attrs.delete(:SHIPTOCOUNTRYNAME)
|
24
25
|
)
|
26
|
+
@description = attrs.delete(:DESC)
|
27
|
+
@notify_url = attrs.delete(:NOTIFYURL)
|
25
28
|
@insurance_option_offered = attrs.delete(:INSURANCEOPTIONOFFERED) == 'true'
|
26
29
|
@currency_code = attrs.delete(:CURRENCYCODE)
|
27
30
|
@error_code = attrs.delete(:ERRORCODE)
|
28
31
|
|
32
|
+
# items
|
33
|
+
items = []
|
34
|
+
attrs.keys.each do |_attr_|
|
35
|
+
key, index = _attr_.to_s.scan(/^(.+)(\d)$/).flatten
|
36
|
+
if index
|
37
|
+
items[index.to_i] ||= {}
|
38
|
+
items[index.to_i][key.to_sym] = attrs.delete(:"#{key}#{index}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@items = items.collect do |_attr_|
|
42
|
+
Item.new(_attr_)
|
43
|
+
end
|
44
|
+
|
29
45
|
# warn ignored params
|
30
46
|
attrs.each do |key, value|
|
31
47
|
Paypal.log "Ignored Parameter (#{self.class}): #{key}=#{value}", :warn
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Paypal
|
2
|
+
module Payment
|
3
|
+
class Response::Item < Base
|
4
|
+
cattr_reader :attribute_mapping
|
5
|
+
@@attribute_mapping = {
|
6
|
+
:NAME => :name,
|
7
|
+
:DESC => :description,
|
8
|
+
:QTY => :quantity,
|
9
|
+
:ITEMCATEGORY => :category,
|
10
|
+
:ITEMWIDTHVALUE => :width,
|
11
|
+
:ITEMHEIGHTVALUE => :height,
|
12
|
+
:ITEMLENGTHVALUE => :length,
|
13
|
+
:ITEMWEIGHTVALUE => :weight
|
14
|
+
}
|
15
|
+
attr_accessor *@@attribute_mapping.values
|
16
|
+
attr_accessor :amount
|
17
|
+
|
18
|
+
def initialize(attributes = {})
|
19
|
+
attrs = attributes.dup
|
20
|
+
@@attribute_mapping.each do |key, value|
|
21
|
+
self.send "#{value}=", attrs.delete(key)
|
22
|
+
end
|
23
|
+
@quantity = @quantity.to_i
|
24
|
+
@amount = Common::Amount.new(
|
25
|
+
:total => attrs.delete(:AMT),
|
26
|
+
:tax => attrs.delete(:TAXAMT)
|
27
|
+
)
|
28
|
+
|
29
|
+
# warn ignored params
|
30
|
+
attrs.each do |key, value|
|
31
|
+
Paypal.log "Ignored Parameter (#{self.class}): #{key}=#{value}", :warn
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1 +1 @@
|
|
1
|
-
TOKEN=EC%
|
1
|
+
TOKEN=EC%2d7HG122968U843864S&CHECKOUTSTATUS=PaymentActionNotInitiated&TIMESTAMP=2011%2d04%2d12T03%3a51%3a58Z&CORRELATIONID=6a0a92ea79ac3&ACK=Success&VERSION=69%2e0&BUILD=1824201&EMAIL=buyer_1297999636_per%40cerego%2ecom&PAYERID=9RWDTMRKKHQ8S&PAYERSTATUS=verified&FIRSTNAME=Test&LASTNAME=User&COUNTRYCODE=US&CURRENCYCODE=JPY&AMT=10&ITEMAMT=10&SHIPPINGAMT=0&HANDLINGAMT=0&TAXAMT=0&DESC=Instant%20Payment%20Request&NOTIFYURL=http%3a%2f%2fmerchant%2eexample%2ecom%2fnotify&INSURANCEAMT=0&SHIPDISCAMT=0&L_NAME0=Item1&L_QTY0=1&L_TAXAMT0=0&L_AMT0=10&L_DESC0=Item1%20Desc&L_ITEMWEIGHTVALUE0=%20%20%200%2e00000&L_ITEMLENGTHVALUE0=%20%20%200%2e00000&L_ITEMWIDTHVALUE0=%20%20%200%2e00000&L_ITEMHEIGHTVALUE0=%20%20%200%2e00000&L_ITEMCATEGORY0=Digital&PAYMENTREQUEST_0_CURRENCYCODE=JPY&PAYMENTREQUEST_0_AMT=10&PAYMENTREQUEST_0_ITEMAMT=10&PAYMENTREQUEST_0_SHIPPINGAMT=0&PAYMENTREQUEST_0_HANDLINGAMT=0&PAYMENTREQUEST_0_TAXAMT=0&PAYMENTREQUEST_0_DESC=Instant%20Payment%20Request&PAYMENTREQUEST_0_NOTIFYURL=http%3a%2f%2fmerchant%2eexample%2ecom%2fnotify&PAYMENTREQUEST_0_INSURANCEAMT=0&PAYMENTREQUEST_0_SHIPDISCAMT=0&PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED=false&L_PAYMENTREQUEST_0_NAME0=Item1&L_PAYMENTREQUEST_0_QTY0=1&L_PAYMENTREQUEST_0_TAXAMT0=0&L_PAYMENTREQUEST_0_AMT0=10&L_PAYMENTREQUEST_0_DESC0=Item1%20Desc&L_PAYMENTREQUEST_0_ITEMWEIGHTVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMLENGTHVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMWIDTHVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMHEIGHTVALUE0=%20%20%200%2e00000&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital&PAYMENTREQUESTINFO_0_ERRORCODE=0
|
@@ -62,7 +62,7 @@ describe Paypal::NVP::Response do
|
|
62
62
|
it 'should handle all attributes' do
|
63
63
|
Paypal.logger.should_not_receive(:warn)
|
64
64
|
response = request.details 'token'
|
65
|
-
response.payer.identifier.should == '
|
65
|
+
response.payer.identifier.should == '9RWDTMRKKHQ8S'
|
66
66
|
response.payment_responses.size.should == 1
|
67
67
|
response.payment_info.size.should == 0
|
68
68
|
response.payment_responses.first.should be_instance_of(Paypal::Payment::Response)
|
@@ -3,18 +3,14 @@ require 'spec_helper.rb'
|
|
3
3
|
describe Paypal::Payment::Request do
|
4
4
|
let :instant_request do
|
5
5
|
Paypal::Payment::Request.new(
|
6
|
-
:amount =>
|
6
|
+
:amount => 10.25,
|
7
7
|
:currency_code => :JPY,
|
8
8
|
:description => 'Instant Payment Request',
|
9
9
|
:notify_url => 'http://merchant.example.com/notify',
|
10
10
|
:items => [{
|
11
|
-
:name => 'Item0',
|
12
|
-
:description => 'Awesome Item!',
|
13
|
-
:amount => 10.25
|
14
|
-
}, {
|
15
11
|
:name => 'Item1',
|
16
12
|
:description => 'Awesome Item!',
|
17
|
-
:amount => 10.
|
13
|
+
:amount => 10.25
|
18
14
|
}]
|
19
15
|
)
|
20
16
|
end
|
@@ -29,7 +25,7 @@ describe Paypal::Payment::Request do
|
|
29
25
|
|
30
26
|
describe '.new' do
|
31
27
|
it 'should handle Instant Payment parameters' do
|
32
|
-
instant_request.amount.should ==
|
28
|
+
instant_request.amount.should == 10.25
|
33
29
|
instant_request.currency_code.should == :JPY
|
34
30
|
instant_request.description.should == 'Instant Payment Request'
|
35
31
|
instant_request.notify_url.should == 'http://merchant.example.com/notify'
|
@@ -45,19 +41,15 @@ describe Paypal::Payment::Request do
|
|
45
41
|
describe '#to_params' do
|
46
42
|
it 'should handle Instant Payment parameters' do
|
47
43
|
instant_request.to_params.should == {
|
48
|
-
:PAYMENTREQUEST_0_AMT => "
|
44
|
+
:PAYMENTREQUEST_0_AMT => "10.25",
|
49
45
|
:PAYMENTREQUEST_0_CURRENCYCODE => :JPY,
|
50
46
|
:PAYMENTREQUEST_0_DESC => "Instant Payment Request",
|
51
47
|
:PAYMENTREQUEST_0_NOTIFYURL => "http://merchant.example.com/notify",
|
52
|
-
:PAYMENTREQUEST_0_ITEMAMT => "
|
53
|
-
:L_PAYMENTREQUEST_0_NAME0 => "
|
48
|
+
:PAYMENTREQUEST_0_ITEMAMT => "10.25",
|
49
|
+
:L_PAYMENTREQUEST_0_NAME0 => "Item1",
|
54
50
|
:L_PAYMENTREQUEST_0_DESC0 => "Awesome Item!",
|
55
51
|
:L_PAYMENTREQUEST_0_AMT0 => "10.25",
|
56
|
-
:L_PAYMENTREQUEST_0_QTY0 => 1
|
57
|
-
:L_PAYMENTREQUEST_0_NAME1 => "Item1",
|
58
|
-
:L_PAYMENTREQUEST_0_DESC1 => "Awesome Item!",
|
59
|
-
:L_PAYMENTREQUEST_0_AMT1 => "10.05",
|
60
|
-
:L_PAYMENTREQUEST_0_QTY1 => 1
|
52
|
+
:L_PAYMENTREQUEST_0_QTY0 => 1
|
61
53
|
}
|
62
54
|
end
|
63
55
|
|
@@ -70,4 +62,4 @@ describe Paypal::Payment::Request do
|
|
70
62
|
}
|
71
63
|
end
|
72
64
|
end
|
73
|
-
end
|
65
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Response::Info do
|
4
|
+
let :attributes do
|
5
|
+
{
|
6
|
+
:NAME => 'Item Name',
|
7
|
+
:DESC => 'Item Description',
|
8
|
+
:QTY => '1',
|
9
|
+
:ITEMCATEGORY => 'Digital',
|
10
|
+
:ITEMWIDTHVALUE => '1.0',
|
11
|
+
:ITEMHEIGHTVALUE => '2.0',
|
12
|
+
:ITEMLENGTHVALUE => '3.0',
|
13
|
+
:ITEMWEIGHTVALUE => '4.0'
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.new' do
|
18
|
+
subject { Paypal::Payment::Response::Item.new(attributes) }
|
19
|
+
its(:name) { should == 'Item Name' }
|
20
|
+
its(:description) { should == 'Item Description' }
|
21
|
+
its(:quantity) { should == 1 }
|
22
|
+
its(:category) { should == 'Digital' }
|
23
|
+
its(:width) { should == '1.0' }
|
24
|
+
its(:height) { should == '2.0' }
|
25
|
+
its(:length) { should == '3.0' }
|
26
|
+
its(:weight) { should == '4.0' }
|
27
|
+
|
28
|
+
context 'when non-supported attributes are given' do
|
29
|
+
it 'should ignore them and warn' do
|
30
|
+
_attr_ = attributes.merge(
|
31
|
+
:ignored => 'Ignore me!'
|
32
|
+
)
|
33
|
+
Paypal.logger.should_receive(:warn).with(
|
34
|
+
"Ignored Parameter (Paypal::Payment::Response::Item): ignored=Ignore me!"
|
35
|
+
)
|
36
|
+
Paypal::Payment::Response::Item.new _attr_
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paypal-express
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 4
|
10
|
+
version: 0.2.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- nov matake
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-12 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -175,6 +175,7 @@ files:
|
|
175
175
|
- lib/paypal/payment/request/item.rb
|
176
176
|
- lib/paypal/payment/response.rb
|
177
177
|
- lib/paypal/payment/response/info.rb
|
178
|
+
- lib/paypal/payment/response/item.rb
|
178
179
|
- lib/paypal/payment/response/payer.rb
|
179
180
|
- lib/paypal/payment/response/ship_to.rb
|
180
181
|
- lib/paypal/util.rb
|
@@ -207,6 +208,7 @@ files:
|
|
207
208
|
- spec/paypal/payment/request/item_spec.rb
|
208
209
|
- spec/paypal/payment/request_spec.rb
|
209
210
|
- spec/paypal/payment/response/info_spec.rb
|
211
|
+
- spec/paypal/payment/response/item_spec.rb
|
210
212
|
- spec/paypal/payment/response/payer_spec.rb
|
211
213
|
- spec/paypal/payment/response/ship_to_spec.rb
|
212
214
|
- spec/paypal/payment/response_spec.rb
|
@@ -244,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
246
|
requirements: []
|
245
247
|
|
246
248
|
rubyforge_project:
|
247
|
-
rubygems_version: 1.5.
|
249
|
+
rubygems_version: 1.5.2
|
248
250
|
signing_key:
|
249
251
|
specification_version: 3
|
250
252
|
summary: PayPal Express Checkout API Client for Instance, Recurring and Digital Goods Payment.
|
@@ -277,6 +279,7 @@ test_files:
|
|
277
279
|
- spec/paypal/payment/request/item_spec.rb
|
278
280
|
- spec/paypal/payment/request_spec.rb
|
279
281
|
- spec/paypal/payment/response/info_spec.rb
|
282
|
+
- spec/paypal/payment/response/item_spec.rb
|
280
283
|
- spec/paypal/payment/response/payer_spec.rb
|
281
284
|
- spec/paypal/payment/response/ship_to_spec.rb
|
282
285
|
- spec/paypal/payment/response_spec.rb
|