paypal_adaptive 0.2.6 → 0.2.7
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.
- 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
|