paypal_adaptive 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +3 -0
- data/lib/paypal_adaptive/config.rb +28 -17
- data/lib/paypal_adaptive/ipn_notification.rb +8 -9
- data/lib/paypal_adaptive/request.rb +12 -12
- data/lib/paypal_adaptive/response.rb +11 -13
- data/lib/paypal_adaptive/version.rb +1 -1
- data/test/data/invalid_preapproval_payment.json +22 -0
- data/test/unit/pay_request_test.rb +6 -6
- data/test/unit/preapproval_test.rb +12 -0
- metadata +10 -8
data/README.markdown
CHANGED
@@ -92,6 +92,9 @@ If you don't set ssl_cert_file then paypal_adaptive will check for certificates
|
|
92
92
|
this location exists, otherwise falling back to the cacert.pem file included with paypal_adaptive.
|
93
93
|
|
94
94
|
## Changelog
|
95
|
+
0.2.7
|
96
|
+
Refactored config file handling for better non-Rails support, thanks mreinsch and dave-thompson.
|
97
|
+
|
95
98
|
0.2.6
|
96
99
|
Fix for using correct status field in pre-approval, thanks nbibler. Fix for ruby 1.9.3, thanks deepj.
|
97
100
|
|
@@ -15,23 +15,12 @@ module PaypalAdaptive
|
|
15
15
|
:beta_sandbox => "https://svcs.beta-sandbox.paypal.com"
|
16
16
|
} unless defined? API_BASE_URL_MAPPING
|
17
17
|
|
18
|
-
attr_accessor :
|
18
|
+
attr_accessor :paypal_base_url, :api_base_url, :headers, :ssl_cert_path, :ssl_cert_file
|
19
19
|
|
20
|
-
def initialize(env=nil, config_override=
|
21
|
-
|
22
|
-
#non-rails env
|
23
|
-
@config_filepath = File.join(File.dirname(__FILE__), "..", "..", "config", "paypal_adaptive.yml")
|
24
|
-
load(env, config_override)
|
25
|
-
else
|
26
|
-
@config_filepath = File.join(Rails.root, "config", "paypal_adaptive.yml")
|
27
|
-
load(Rails.env, config_override)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def load(environment, config_override)
|
32
|
-
config = YAML.load(ERB.new(File.new(@config_filepath).read).result)[environment]
|
33
|
-
config.merge!(config_override) unless config_override.nil?
|
20
|
+
def initialize(env=nil, config_override={})
|
21
|
+
config = YAML.load(ERB.new(File.new(config_filepath).read).result)[env]
|
34
22
|
raise "Could not load settings from config file" unless config
|
23
|
+
config.merge!(config_override) unless config_override.nil?
|
35
24
|
|
36
25
|
if config["retain_requests_for_test"] == true
|
37
26
|
@retain_requests_for_test = true
|
@@ -42,6 +31,9 @@ module PaypalAdaptive
|
|
42
31
|
@ssl_cert_file = nil
|
43
32
|
@paypal_base_url = PAYPAL_BASE_URL_MAPPING[pp_env]
|
44
33
|
@api_base_url = API_BASE_URL_MAPPING[pp_env]
|
34
|
+
|
35
|
+
# http.rb requires headers to be strings. Protect against ints in paypal_adaptive.yml
|
36
|
+
config.update(config){ |key,v| v.to_s }
|
45
37
|
@headers = {
|
46
38
|
"X-PAYPAL-SECURITY-USERID" => config['username'],
|
47
39
|
"X-PAYPAL-SECURITY-PASSWORD" => config['password'],
|
@@ -53,17 +45,36 @@ module PaypalAdaptive
|
|
53
45
|
|
54
46
|
if config['ssl_cert_file'] && config['ssl_cert_file'].length > 0
|
55
47
|
@ssl_cert_file = config['ssl_cert_file']
|
56
|
-
elsif File.exists?("/etc/ssl/certs")
|
57
|
-
@ssl_cert_path = "/etc/ssl/certs"
|
58
48
|
else
|
59
49
|
@ssl_cert_file = File.join(File.dirname(__FILE__), "..", "..", "cacert.pem")
|
60
50
|
end
|
51
|
+
puts "warning: coulf not find file: #{@ssl_cert_file}" unless File.exists?(@ssl_cert_file.to_s)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def config_filepath
|
56
|
+
if defined?(Rails)
|
57
|
+
Rails.root.join("config", "paypal_adaptive.yml")
|
58
|
+
else
|
59
|
+
File.join(File.dirname(__FILE__), "..", "..", "config", "paypal_adaptive.yml")
|
61
60
|
end
|
62
61
|
end
|
63
62
|
|
64
63
|
def retain_requests_for_test?
|
65
64
|
!!@retain_requests_for_test
|
66
65
|
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.config(env = nil)
|
69
|
+
env ||= default_env_for_config
|
70
|
+
raise "Please provide an environment" unless env
|
71
|
+
@configs ||= Hash.new
|
72
|
+
@configs[env] ||= Config.new(env)
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
67
76
|
|
77
|
+
def self.default_env_for_config
|
78
|
+
defined?(Rails) ? Rails.env : nil
|
68
79
|
end
|
69
80
|
end
|
@@ -6,23 +6,22 @@ module PaypalAdaptive
|
|
6
6
|
class IpnNotification
|
7
7
|
|
8
8
|
def initialize(env=nil)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@@ssl_cert_file ||= @@config.ssl_cert_file
|
9
|
+
config = PaypalAdaptive.config(env)
|
10
|
+
@paypal_base_url = config.paypal_base_url
|
11
|
+
@ssl_cert_path = config.ssl_cert_path
|
12
|
+
@ssl_cert_file = config.ssl_cert_file
|
14
13
|
end
|
15
14
|
|
16
15
|
def send_back(data)
|
17
16
|
data = "cmd=_notify-validate&#{data}"
|
18
|
-
url = URI.parse
|
17
|
+
url = URI.parse @paypal_base_url
|
19
18
|
http = Net::HTTP.new(url.host, 443)
|
20
19
|
http.use_ssl = true
|
21
20
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
22
|
-
http.ca_path =
|
23
|
-
http.ca_file =
|
21
|
+
http.ca_path = @ssl_cert_path unless @ssl_cert_path.nil?
|
22
|
+
http.ca_file = @ssl_cert_file unless @ssl_cert_file.nil?
|
24
23
|
|
25
|
-
path = "#{
|
24
|
+
path = "#{@paypal_base_url}/cgi-bin/webscr"
|
26
25
|
response_data = http.post(path, data).body
|
27
26
|
|
28
27
|
@verified = response_data == "VERIFIED"
|
@@ -9,20 +9,20 @@ module PaypalAdaptive
|
|
9
9
|
class Request
|
10
10
|
def initialize(env = nil)
|
11
11
|
@env = env
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
config = PaypalAdaptive.config(env)
|
13
|
+
@api_base_url = config.api_base_url
|
14
|
+
@headers = config.headers
|
15
|
+
@ssl_cert_path = config.ssl_cert_path
|
16
|
+
@ssl_cert_file = config.ssl_cert_file
|
17
17
|
end
|
18
18
|
|
19
19
|
def validate
|
20
20
|
#TODO the receiverList field not validating properly
|
21
21
|
|
22
|
-
#
|
23
|
-
#
|
22
|
+
# @schema_filepath = "../lib/pay_request_schema.json"
|
23
|
+
# @schema = File.open(@schema_filepath, "rb"){|f| JSON.parse(f.read)}
|
24
24
|
# see page 42 of PP Adaptive Payments PDF for explanation of all fields.
|
25
|
-
#JSON::Schema.validate(@data,
|
25
|
+
#JSON::Schema.validate(@data, @schema)
|
26
26
|
end
|
27
27
|
|
28
28
|
def pay(data)
|
@@ -78,14 +78,14 @@ module PaypalAdaptive
|
|
78
78
|
def post(data, path)
|
79
79
|
#hack fix: JSON.unparse doesn't work in Rails 2.3.5; only {}.to_json does..
|
80
80
|
api_request_data = JSON.unparse(data) rescue data.to_json
|
81
|
-
url = URI.parse
|
81
|
+
url = URI.parse @api_base_url
|
82
82
|
http = Net::HTTP.new(url.host, 443)
|
83
83
|
http.use_ssl = true
|
84
84
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
85
|
-
http.ca_path =
|
86
|
-
http.ca_file =
|
85
|
+
http.ca_path = @ssl_cert_path unless @ssl_cert_path.nil?
|
86
|
+
http.ca_file = @ssl_cert_file unless @ssl_cert_file.nil?
|
87
87
|
|
88
|
-
response_data = http.post(path, api_request_data,
|
88
|
+
response_data = http.post(path, api_request_data, @headers).body
|
89
89
|
|
90
90
|
JSON.parse(response_data)
|
91
91
|
end
|
@@ -1,45 +1,43 @@
|
|
1
1
|
module PaypalAdaptive
|
2
2
|
class Response < Hash
|
3
3
|
def initialize(response, env=nil)
|
4
|
-
|
5
|
-
|
4
|
+
config = PaypalAdaptive.config(env)
|
5
|
+
@paypal_base_url = config.paypal_base_url
|
6
6
|
|
7
7
|
self.merge!(response)
|
8
8
|
end
|
9
9
|
|
10
10
|
def success?
|
11
|
-
self['responseEnvelope']['ack'].to_s =~ /^Success$/i &&
|
12
|
-
!(self['paymentExecStatus'].to_s =~ /^ERROR$/i)
|
11
|
+
!! (self['responseEnvelope']['ack'].to_s =~ /^Success$/i &&
|
12
|
+
!(self['paymentExecStatus'].to_s =~ /^ERROR$/i))
|
13
13
|
end
|
14
14
|
|
15
15
|
def errors
|
16
16
|
if success?
|
17
17
|
return []
|
18
18
|
else
|
19
|
-
self['error']
|
19
|
+
errors = self['error']
|
20
|
+
errors ||= self['payErrorList']['payError'].collect { |e| e['error'] } rescue nil
|
21
|
+
errors
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
25
|
def error_message
|
24
|
-
|
25
|
-
return nil
|
26
|
-
else
|
27
|
-
self['error'].first['message'] rescue nil
|
28
|
-
end
|
26
|
+
message = errors.first['message'] rescue nil
|
29
27
|
end
|
30
28
|
|
31
29
|
def approve_paypal_payment_url(type=nil)
|
32
30
|
if self['payKey'].nil?
|
33
31
|
return nil
|
34
32
|
elsif ['mini', 'light'].include?(type.to_s)
|
35
|
-
return "#{
|
33
|
+
return "#{@paypal_base_url}/webapps/adaptivepayment/flow/pay?expType=#{type.to_s}&paykey=#{self['payKey']}"
|
36
34
|
end
|
37
35
|
|
38
|
-
"#{
|
36
|
+
"#{@paypal_base_url}/webscr?cmd=_ap-payment&paykey=#{self['payKey']}"
|
39
37
|
end
|
40
38
|
|
41
39
|
def preapproval_paypal_payment_url
|
42
|
-
self['preapprovalKey'].nil? ? nil : "#{
|
40
|
+
self['preapprovalKey'].nil? ? nil : "#{@paypal_base_url}/webscr?cmd=_ap-preapproval&preapprovalkey=#{self['preapprovalKey']}"
|
43
41
|
end
|
44
42
|
|
45
43
|
# workaround for rails 3.1.1, see https://github.com/tc/paypal_adaptive/issues/23
|
@@ -0,0 +1,22 @@
|
|
1
|
+
{
|
2
|
+
"responseEnvelope":{
|
3
|
+
"timestamp":"2011-11-28T08:02:09.070-08:00",
|
4
|
+
"ack":"Success",
|
5
|
+
"correlationId":"XXXXXXXXXXXXX",
|
6
|
+
"build":"2279004"},
|
7
|
+
"payKey":"XX-XXXXXXXXXXXXXXXXX",
|
8
|
+
"paymentExecStatus":"ERROR",
|
9
|
+
"payErrorList":{
|
10
|
+
"payError":[{
|
11
|
+
"receiver":{
|
12
|
+
"amount":"25.0",
|
13
|
+
"email":"test@test.test"},
|
14
|
+
"error":{
|
15
|
+
"errorId":"580036",
|
16
|
+
"domain":"PLATFORM",
|
17
|
+
"severity":"Error",
|
18
|
+
"category":"Application",
|
19
|
+
"message":"This transaction cannot be processed. Please enter a valid credit card number and type"}
|
20
|
+
}]
|
21
|
+
}
|
22
|
+
}
|
@@ -15,7 +15,7 @@ class PayRequestTest < Test::Unit::TestCase
|
|
15
15
|
pp_response = @pay_request.pay(data)
|
16
16
|
|
17
17
|
puts "redirect url to\n #{pp_response.approve_paypal_payment_url}"
|
18
|
-
|
18
|
+
assert_equal true, pp_response.success?
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_invalid_simple_pay
|
@@ -24,7 +24,7 @@ class PayRequestTest < Test::Unit::TestCase
|
|
24
24
|
data = read_json_file(data_filepath)
|
25
25
|
pp_response = @pay_request.pay(data)
|
26
26
|
puts pp_response.errors
|
27
|
-
|
27
|
+
assert_equal false, pp_response.success?
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_valid_chain_pay
|
@@ -40,7 +40,7 @@ class PayRequestTest < Test::Unit::TestCase
|
|
40
40
|
puts pp_response.errors
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
assert_equal true, pp_response.success?
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_invalid_chain_pay
|
@@ -49,7 +49,7 @@ class PayRequestTest < Test::Unit::TestCase
|
|
49
49
|
data = read_json_file(data_filepath)
|
50
50
|
pp_response = @pay_request.pay(data)
|
51
51
|
puts pp_response.errors
|
52
|
-
|
52
|
+
assert_equal false, pp_response.success?
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_valid_parallel_pay
|
@@ -61,7 +61,7 @@ class PayRequestTest < Test::Unit::TestCase
|
|
61
61
|
data = read_json_file(data_filepath)
|
62
62
|
pp_response = @pay_request.pay(data)
|
63
63
|
puts "redirect url to\n #{pp_response.approve_paypal_payment_url}"
|
64
|
-
|
64
|
+
assert_equal true, pp_response.success?
|
65
65
|
end
|
66
66
|
|
67
67
|
def test_invalid_parallel_pay
|
@@ -70,7 +70,7 @@ class PayRequestTest < Test::Unit::TestCase
|
|
70
70
|
data = read_json_file(data_filepath)
|
71
71
|
pp_response = @pay_request.pay(data)
|
72
72
|
puts pp_response.errors
|
73
|
-
|
73
|
+
assert_equal false, pp_response.success?
|
74
74
|
end
|
75
75
|
|
76
76
|
def test_preapproval
|
@@ -48,6 +48,18 @@ class PreapprovalTest < Test::Unit::TestCase
|
|
48
48
|
assert pp_response.success? == false
|
49
49
|
end
|
50
50
|
|
51
|
+
def test_erred_preapproval_payment_message
|
52
|
+
puts "-------"
|
53
|
+
puts "invalid"
|
54
|
+
data_filepath = File.join(File.dirname(__FILE__),"..", "data","invalid_preapproval_payment.json")
|
55
|
+
|
56
|
+
data = read_json_file(data_filepath)
|
57
|
+
pp_response = @preapproval_request.preapproval(data)
|
58
|
+
puts "error message is #{pp_response.error_message}"
|
59
|
+
|
60
|
+
assert pp_response.error_message == "This transaction cannot be processed. Please enter a valid credit card number and type"
|
61
|
+
end
|
62
|
+
|
51
63
|
def read_json_file(filepath)
|
52
64
|
File.open(filepath, "rb"){|f| JSON.parse(f.read)}
|
53
65
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paypal_adaptive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70239312828620 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.6.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70239312828620
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: jsonschema
|
27
|
-
requirement: &
|
27
|
+
requirement: &70239312840100 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.0.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70239312840100
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70239312838340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0.8'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70239312838340
|
47
47
|
description: Lightweight wrapper for Paypal's Adaptive Payments API
|
48
48
|
email:
|
49
49
|
- tommy.chheng@gmail.com
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- test/data/invalid_parallel_pay_request.json
|
72
72
|
- test/data/invalid_preapproval.json
|
73
73
|
- test/data/invalid_preapproval_error_execstatus.json
|
74
|
+
- test/data/invalid_preapproval_payment.json
|
74
75
|
- test/data/invalid_simple_pay_request_1.json
|
75
76
|
- test/data/valid_chain_pay_request.json
|
76
77
|
- test/data/valid_get_payment_options_request.json
|
@@ -117,6 +118,7 @@ test_files:
|
|
117
118
|
- test/data/invalid_parallel_pay_request.json
|
118
119
|
- test/data/invalid_preapproval.json
|
119
120
|
- test/data/invalid_preapproval_error_execstatus.json
|
121
|
+
- test/data/invalid_preapproval_payment.json
|
120
122
|
- test/data/invalid_simple_pay_request_1.json
|
121
123
|
- test/data/valid_chain_pay_request.json
|
122
124
|
- test/data/valid_get_payment_options_request.json
|