will_paypal 0.1.1
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/.gitignore +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +26 -0
- data/README.rdoc +56 -0
- data/Rakefile +8 -0
- data/lib/will_paypal.rb +69 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/will_paypal_spec.rb +122 -0
- data/will_paypal-0.1.0.gem +0 -0
- data/will_paypal.gemspec +36 -0
- metadata +117 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use --create ree@nvp
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
will_paypal (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.2)
|
10
|
+
fakeweb (1.3.0)
|
11
|
+
rspec (2.6.0)
|
12
|
+
rspec-core (~> 2.6.0)
|
13
|
+
rspec-expectations (~> 2.6.0)
|
14
|
+
rspec-mocks (~> 2.6.0)
|
15
|
+
rspec-core (2.6.0)
|
16
|
+
rspec-expectations (2.6.0)
|
17
|
+
diff-lcs (~> 1.1.2)
|
18
|
+
rspec-mocks (2.6.0)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
fakeweb
|
25
|
+
rspec (~> 2.6.0)
|
26
|
+
will_paypal!
|
data/README.rdoc
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
= Paypal NVP
|
2
|
+
|
3
|
+
Will Paypal allow to connect your Ruby on Rails application to the Paypal NVP API. It's based on the Paypal NVP Gem https://github.com/solisoft/paypal_nvp but completely rewritten.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
|
7
|
+
The recommended way is that you get the gem:
|
8
|
+
|
9
|
+
$ sudo gem install will_paypal
|
10
|
+
|
11
|
+
Specify the API-Credentials within the constructor, add a logger. You can also use a 'settings.yml' to put everything there
|
12
|
+
|
13
|
+
# All those fields are mandatory
|
14
|
+
|
15
|
+
sandbox:
|
16
|
+
url: "https://api-3t.sandbox.paypal.com/nvp" (default)
|
17
|
+
user: "o.bonn_1237393081_biz_api1.solisoft.net"
|
18
|
+
password: "1237393093"
|
19
|
+
signature: "AU2Yv5COwWPCfeYLv34Z766F-gfNAzX6LaQE6VZkHMRq35Gmite-bMXu"
|
20
|
+
version: "72.0" (default)
|
21
|
+
|
22
|
+
live:
|
23
|
+
url: "https://api-3t.paypal.com/nvp" (default)
|
24
|
+
user: "o.bonn_1237393081_biz_api1.solisoft.net"
|
25
|
+
password: "1237393093"
|
26
|
+
signature: "AU2Yv5COwWPCfeYLv34Z766F-gfNAzX6LaQE6VZkHMRq35Gmite-bMXu"
|
27
|
+
version: "72.0" (default)
|
28
|
+
|
29
|
+
== Example usage
|
30
|
+
|
31
|
+
p = WillPaypal.new(:user => Settings.payment.paypal.merchant, :password => Settings.payment.paypal.pass, :sandbox => Settings.payment.paypal.sandbox, :signature => Settings.payment.paypal.cert, :version => "72.0", :logger => logger)
|
32
|
+
|
33
|
+
data = {
|
34
|
+
:method => "MyPaypalMethod",
|
35
|
+
:amt => "55"
|
36
|
+
# other params needed
|
37
|
+
}
|
38
|
+
result = p.call_paypal(data) # will return a hash
|
39
|
+
puts result[:parsed_body]["ACK"] # Success
|
40
|
+
|
41
|
+
The Result-Hash looks like that:
|
42
|
+
|
43
|
+
:parsed_body=>{
|
44
|
+
"TIMESTAMP"=>"2011-05-19T00:25:19Z",
|
45
|
+
"BUILD"=>"1882144",
|
46
|
+
"VERSION"=>"72.0",
|
47
|
+
"CORRELATIONID"=>"correlationid",
|
48
|
+
"TOKEN"=>"mytoken",
|
49
|
+
"ACK"=>"Success"
|
50
|
+
},
|
51
|
+
:status=>"200",
|
52
|
+
:body=>"TOKEN=mytoken&TIMESTAMP=2011%2d05%2d19T00%3a25%3a19Z&CORRELATIONID=correlationid&ACK=Success&VERSION=72%2e0&BUILD=1882144"
|
53
|
+
|
54
|
+
== PAYPAL API Documentation
|
55
|
+
|
56
|
+
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_api_reference
|
data/Rakefile
ADDED
data/lib/will_paypal.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require "logger"
|
2
|
+
require "net/https"
|
3
|
+
require "cgi"
|
4
|
+
|
5
|
+
class WillPaypal
|
6
|
+
|
7
|
+
attr_accessor :config, :logger
|
8
|
+
|
9
|
+
DEFAULT_OPTIONS = {
|
10
|
+
:version => "72.0",
|
11
|
+
:sandbox => false,
|
12
|
+
:params => {}
|
13
|
+
}
|
14
|
+
|
15
|
+
def initialize(config={})
|
16
|
+
self.config = DEFAULT_OPTIONS.merge(config)
|
17
|
+
self.logger = config.delete(:logger) || Logger.new(STDOUT)
|
18
|
+
self.config[:url] ||= self.config[:sandbox] ? "https://api-3t.sandbox.paypal.com/nvp" : "https://api-3t.paypal.com/nvp"
|
19
|
+
end
|
20
|
+
|
21
|
+
def query_string_for(data)
|
22
|
+
data.merge!({
|
23
|
+
"USER" => self.config[:user],
|
24
|
+
"PWD" => self.config[:password],
|
25
|
+
"SIGNATURE" => self.config[:signature],
|
26
|
+
"VERSION" => self.config[:version]
|
27
|
+
})
|
28
|
+
data.merge!(self.config[:params])
|
29
|
+
query = []
|
30
|
+
data.each do |key, value|
|
31
|
+
query << "#{key.to_s.upcase}=#{URI.escape(value.to_s)}"
|
32
|
+
end
|
33
|
+
query.join("&")
|
34
|
+
end
|
35
|
+
|
36
|
+
def hash_from_query_string(query_string)
|
37
|
+
hash = {}
|
38
|
+
query_string.split("&").each do |element|
|
39
|
+
a = element.split("=")
|
40
|
+
hash[a[0]] = CGI.unescape(a[1]) if a.size == 2
|
41
|
+
end
|
42
|
+
hash
|
43
|
+
end
|
44
|
+
|
45
|
+
def call_paypal(data)
|
46
|
+
uri = URI.parse(self.config[:url])
|
47
|
+
|
48
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
49
|
+
http.use_ssl = true
|
50
|
+
rootCA = '/etc/ssl/certs'
|
51
|
+
if File.directory? rootCA
|
52
|
+
http.ca_path = rootCA
|
53
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
54
|
+
http.verify_depth = 5
|
55
|
+
else
|
56
|
+
self.logger.warn "WARNING: no ssl certs found. Paypal communication will be insecure. DO NOT DEPLOY"
|
57
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
58
|
+
end
|
59
|
+
|
60
|
+
response = http.request_post(uri.path, self.query_string_for(data))
|
61
|
+
response_hash = { :status => response.code, :body => response.body, :parsed_body => {} }
|
62
|
+
|
63
|
+
if response.kind_of? Net::HTTPSuccess
|
64
|
+
response_hash[:parsed_body].merge! self.hash_from_query_string(response.body)
|
65
|
+
end
|
66
|
+
response_hash
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "WillPaypal" do
|
4
|
+
|
5
|
+
describe "initialize" do
|
6
|
+
|
7
|
+
context "overwriting defaults" do
|
8
|
+
subject { WillPaypal.new(:version => "1").config[:version] }
|
9
|
+
it { should == "1" }
|
10
|
+
end
|
11
|
+
|
12
|
+
context "with defaults" do
|
13
|
+
subject { WillPaypal.new }
|
14
|
+
|
15
|
+
its(:config) do
|
16
|
+
should eql({
|
17
|
+
:version => "72.0",
|
18
|
+
:sandbox => false,
|
19
|
+
:url => "https://api-3t.paypal.com/nvp",
|
20
|
+
:params => {}
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "Request to Paypal" do
|
28
|
+
|
29
|
+
describe "Query String" do
|
30
|
+
|
31
|
+
let(:paypal) { WillPaypal.new }
|
32
|
+
|
33
|
+
it "should create a valid querystring from request params" do
|
34
|
+
%w{FOO=bar BAR=foo USER= PWD= SIGNATURE=}.each do |a|
|
35
|
+
paypal.query_string_for({ :foo => "bar", :bar => "foo" }).should include (a)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
%w{user pwd signature}.each do |param|
|
40
|
+
it "should include #{param} by default" do
|
41
|
+
paypal.query_string_for({}).should include("#{param.to_s.upcase}=#{URI.escape(paypal.config[param.to_sym].to_s)}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "Paypal response" do
|
50
|
+
|
51
|
+
let(:paypal) { WillPaypal.new }
|
52
|
+
|
53
|
+
it "should convert a query string like" do
|
54
|
+
paypal.hash_from_query_string("FOO=bar&BAR=foo&SIGNATURE=123456").should eql({
|
55
|
+
"FOO" => "bar", "BAR" => "foo", "SIGNATURE" => "123456"
|
56
|
+
})
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should remove blank attributes" do
|
60
|
+
paypal.hash_from_query_string("FOO=bar&BAR=foo&USER=&PWD=&SIGNATURE=123456&VERSION=72.0").should eql({
|
61
|
+
"FOO" => "bar", "BAR" => "foo", "SIGNATURE" => "123456", "VERSION" => "72.0"
|
62
|
+
})
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "Paypal Call" do
|
68
|
+
|
69
|
+
context "success" do
|
70
|
+
let(:paypal) { WillPaypal.new(:user => "team_1220115929_biz_api1.example.com", :pass => "1240413944", :cert => "acert4qi4-AdHZBSIbxJNpN30UcsogreatcertP", :version => "72.0") }
|
71
|
+
|
72
|
+
it "should return the successful response" do
|
73
|
+
response_data = "TIMESTAMP=2011%2d05%2d18T17%3a51%3a55Z&CORRELATIONID=f45a2a3867a2b&ACK=Success&VERSION=72%2e0&BUILD=1882144&L_ERRORCODE0=10002&L_SHORTMESSAGE0=Authentication%2fAuthorization%20Failed&L_LONGMESSAGE0=You%20do%20not%20have%20permissions%20to%20make%20this%20API%20call&L_SEVERITYCODE0=Error"
|
74
|
+
FakeWeb.register_uri(:post, %r|https://api-3t.paypal.com/nvp|, :body => response_data, :times => 1)
|
75
|
+
paypal.call_paypal({}).should eql({:status => "200", :body => response_data, :parsed_body => {"L_SEVERITYCODE0"=>"Error", "TIMESTAMP"=>"2011-05-18T17:51:55Z", "L_ERRORCODE0"=>"10002", "BUILD"=>"1882144", "L_LONGMESSAGE0"=>"You do not have permissions to make this API call", "VERSION"=>"72.0", "L_SHORTMESSAGE0"=>"Authentication/Authorization Failed", "CORRELATIONID"=>"f45a2a3867a2b", "ACK"=>"Success"}})
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "ssl" do
|
80
|
+
let(:paypal) { WillPaypal.new(:user => "team_1220115929_biz_api1.example.com", :pass => "1240413944", :cert => "acert4qi4-AdHZBSIbxJNpN30UcsogreatcertP", :version => "72.0") }
|
81
|
+
|
82
|
+
it "should do an ssl call" do
|
83
|
+
response_data = "TIMESTAMP=2011%2d05%2d18T17%3a51%3a55Z&CORRELATIONID=f45a2a3867a2b&ACK=Failure&VERSION=72%2e0&BUILD=1882144&L_ERRORCODE0=10002&L_SHORTMESSAGE0=Authentication%2fAuthorization%20Failed&L_LONGMESSAGE0=You%20do%20not%20have%20permissions%20to%20make%20this%20API%20call&L_SEVERITYCODE0=Error"
|
84
|
+
FakeWeb.register_uri(:post, %r|https://api-3t.paypal.com/nvp|, :body => response_data, :times => 1)
|
85
|
+
File.should_receive(:directory?).with('/etc/ssl/certs').and_return(true)
|
86
|
+
http = double("Net::HTTP")
|
87
|
+
Net::HTTP.stub(:new).and_return(http)
|
88
|
+
http_response = double("response")
|
89
|
+
http_response.should_receive(:code)
|
90
|
+
http_response.should_receive(:body)
|
91
|
+
http.should_receive(:request_post).with("/nvp", "USER=team_1220115929_biz_api1.example.com&SIGNATURE=&VERSION=72.0&PWD=").and_return(http_response)
|
92
|
+
http.should_receive(:use_ssl=).with(true)
|
93
|
+
http.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_PEER)
|
94
|
+
http.should_receive(:ca_path=).with('/etc/ssl/certs')
|
95
|
+
http.should_receive(:verify_depth=).with(5)
|
96
|
+
paypal.call_paypal({})
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
context "without ssl" do
|
102
|
+
let(:paypal) { WillPaypal.new(:user => "team_1220115929_biz_api1.example.com", :pass => "1240413944", :cert => "acert4qi4-AdHZBSIbxJNpN30UcsogreatcertP", :version => "72.0") }
|
103
|
+
|
104
|
+
it "should do an ssl call" do
|
105
|
+
response_data = "TIMESTAMP=2011%2d05%2d18T17%3a51%3a55Z&CORRELATIONID=f45a2a3867a2b&ACK=Failure&VERSION=72%2e0&BUILD=1882144&L_ERRORCODE0=10002&L_SHORTMESSAGE0=Authentication%2fAuthorization%20Failed&L_LONGMESSAGE0=You%20do%20not%20have%20permissions%20to%20make%20this%20API%20call&L_SEVERITYCODE0=Error"
|
106
|
+
FakeWeb.register_uri(:post, %r|https://api-3t.paypal.com/nvp|, :body => response_data, :times => 1)
|
107
|
+
File.should_receive(:directory?).with('/etc/ssl/certs').and_return(false)
|
108
|
+
http = double("Net::HTTP")
|
109
|
+
Net::HTTP.stub(:new).and_return(http)
|
110
|
+
http_response = double("response")
|
111
|
+
http_response.should_receive(:code)
|
112
|
+
http_response.should_receive(:body)
|
113
|
+
http.should_receive(:use_ssl=).with(true)
|
114
|
+
http.should_receive(:request_post).with("/nvp", "USER=team_1220115929_biz_api1.example.com&SIGNATURE=&VERSION=72.0&PWD=").and_return(http_response)
|
115
|
+
http.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
|
116
|
+
paypal.call_paypal({})
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
Binary file
|
data/will_paypal.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{will_paypal}
|
5
|
+
s.version = "0.1.1"
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
9
|
+
s.authors = ["Michael Bumann - Railslove", "Jan Kus - Railslove"]
|
10
|
+
s.description = %q{Paypal NVP API Class.}
|
11
|
+
s.email = ["michael@railslove.com", "jan@railslove.com"]
|
12
|
+
s.extra_rdoc_files = ["lib/will_paypal.rb", "README.rdoc"]
|
13
|
+
s.files = ["init.rb", "lib/will_paypal.rb", "Manifest", "Rakefile", "README.rdoc", "will_paypal.gemspec"]
|
14
|
+
s.homepage = %q{https://github.com/railslove/Will-Paypal}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Will_Paypal", "--main", "README.rdoc"]
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.rubyforge_project = %q{will_paypal}
|
21
|
+
s.rubygems_version = %q{1.7.2}
|
22
|
+
s.summary = %q{Paypal NVP API Class.}
|
23
|
+
|
24
|
+
s.add_development_dependency "rspec", "~> 2.6.0"
|
25
|
+
s.add_development_dependency "fakeweb"
|
26
|
+
|
27
|
+
if s.respond_to? :specification_version then
|
28
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
29
|
+
s.specification_version = 3
|
30
|
+
|
31
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
32
|
+
else
|
33
|
+
end
|
34
|
+
else
|
35
|
+
end
|
36
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: will_paypal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Michael Bumann - Railslove
|
14
|
+
- Jan Kus - Railslove
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-05-19 00:00:00 +02:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: rspec
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 23
|
31
|
+
segments:
|
32
|
+
- 2
|
33
|
+
- 6
|
34
|
+
- 0
|
35
|
+
version: 2.6.0
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: fakeweb
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 3
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
version: "0"
|
50
|
+
type: :development
|
51
|
+
version_requirements: *id002
|
52
|
+
description: Paypal NVP API Class.
|
53
|
+
email:
|
54
|
+
- michael@railslove.com
|
55
|
+
- jan@railslove.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files:
|
61
|
+
- lib/will_paypal.rb
|
62
|
+
- README.rdoc
|
63
|
+
files:
|
64
|
+
- .gitignore
|
65
|
+
- .rvmrc
|
66
|
+
- Gemfile
|
67
|
+
- Gemfile.lock
|
68
|
+
- README.rdoc
|
69
|
+
- Rakefile
|
70
|
+
- lib/will_paypal.rb
|
71
|
+
- spec/spec_helper.rb
|
72
|
+
- spec/will_paypal_spec.rb
|
73
|
+
- will_paypal-0.1.0.gem
|
74
|
+
- will_paypal.gemspec
|
75
|
+
has_rdoc: true
|
76
|
+
homepage: https://github.com/railslove/Will-Paypal
|
77
|
+
licenses: []
|
78
|
+
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options:
|
81
|
+
- --line-numbers
|
82
|
+
- --inline-source
|
83
|
+
- --title
|
84
|
+
- Will_Paypal
|
85
|
+
- --main
|
86
|
+
- README.rdoc
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 3
|
95
|
+
segments:
|
96
|
+
- 0
|
97
|
+
version: "0"
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 11
|
104
|
+
segments:
|
105
|
+
- 1
|
106
|
+
- 2
|
107
|
+
version: "1.2"
|
108
|
+
requirements: []
|
109
|
+
|
110
|
+
rubyforge_project: will_paypal
|
111
|
+
rubygems_version: 1.5.0
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: Paypal NVP API Class.
|
115
|
+
test_files:
|
116
|
+
- spec/spec_helper.rb
|
117
|
+
- spec/will_paypal_spec.rb
|