paypal_permissions 0.0.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 +8 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/bin/autospec +16 -0
- data/bin/erubis +16 -0
- data/bin/htmldiff +16 -0
- data/bin/ldiff +16 -0
- data/bin/rackup +16 -0
- data/bin/rails +16 -0
- data/bin/rake +16 -0
- data/bin/rake2thor +16 -0
- data/bin/rdoc +16 -0
- data/bin/ri +16 -0
- data/bin/rspec +16 -0
- data/bin/thor +16 -0
- data/bin/tilt +16 -0
- data/bin/tt +16 -0
- data/config/locales/en.yml +13 -0
- data/lib/active_merchant.rb +17 -0
- data/lib/active_merchant/billing.rb +1 -0
- data/lib/active_merchant/billing/gateways.rb +17 -0
- data/lib/active_merchant/billing/gateways/paypal_permissions.rb +246 -0
- data/lib/generators/active_record/paypal_permissions_generator.rb +50 -0
- data/lib/generators/active_record/templates/migration.rb +15 -0
- data/lib/generators/active_record/templates/migration_existing.rb +23 -0
- data/lib/generators/paypal_permissions/install_generator.rb +69 -0
- data/lib/generators/paypal_permissions/orm_helpers.rb +27 -0
- data/lib/generators/paypal_permissions/paypal_permissions_generator.rb +18 -0
- data/lib/generators/templates/README +12 -0
- data/lib/generators/templates/README.rdoc +353 -0
- data/lib/generators/templates/paypal_permissions.rb +2 -0
- data/lib/paypal_permissions.rb +6 -0
- data/lib/paypal_permissions/version.rb +3 -0
- data/paypal_permissions.gemspec +31 -0
- data/spec/gateway_spec.rb +147 -0
- data/spec/generators/paypal_permissions/install_generator_spec.rb +45 -0
- data/spec/spec_helper.rb +13 -0
- metadata +205 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/autospec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'autospec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('paypal_permissions', 'autospec')
|
data/bin/erubis
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'erubis' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('erubis', 'erubis')
|
data/bin/htmldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'htmldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('paypal_permissions', 'htmldiff')
|
data/bin/ldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'ldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('paypal_permissions', 'ldiff')
|
data/bin/rackup
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rackup' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rack', 'rackup')
|
data/bin/rails
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rails' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('railties', 'rails')
|
data/bin/rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('paypal_permissions', 'rake')
|
data/bin/rake2thor
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake2thor' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('thor', 'rake2thor')
|
data/bin/rdoc
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rdoc' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rdoc', 'rdoc')
|
data/bin/ri
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'ri' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rdoc', 'ri')
|
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('paypal_permissions', 'rspec')
|
data/bin/thor
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'thor' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('thor', 'thor')
|
data/bin/tilt
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'tilt' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('tilt', 'tilt')
|
data/bin/tt
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'tt' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('treetop', 'tt')
|
@@ -0,0 +1,13 @@
|
|
1
|
+
en:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
not_found: "not found"
|
5
|
+
already_confirmed: "was already confirmed, please try signing in"
|
6
|
+
not_locked: "was not locked"
|
7
|
+
not_saved:
|
8
|
+
one: "1 error prohibited this %{resource} from being saved:"
|
9
|
+
other: "%{count} errors prohibited this %{resource} from being saved:"
|
10
|
+
|
11
|
+
paypal_permissions:
|
12
|
+
success: 'That was a fantastic success.'
|
13
|
+
failure: 'That failed miserably.'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/string/inflections'
|
3
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
4
|
+
require 'active_support/core_ext/hash/conversions'
|
5
|
+
require 'active_support/core_ext/class/attribute'
|
6
|
+
require 'active_support/core_ext/class/attribute_accessors'
|
7
|
+
require 'active_support/core_ext/class/delegating_attributes'
|
8
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
9
|
+
require 'active_support/base64'
|
10
|
+
|
11
|
+
require 'securerandom'
|
12
|
+
require 'builder'
|
13
|
+
require 'cgi'
|
14
|
+
require 'rexml/document'
|
15
|
+
|
16
|
+
require 'active_utils'
|
17
|
+
require 'active_merchant/billing'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'active_merchant/billing/gateways'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ActiveMerchant
|
2
|
+
module Billing
|
3
|
+
autoload :Gateway, 'active_merchant/billing/gateway'
|
4
|
+
|
5
|
+
Dir[File.dirname(__FILE__) + '/gateways/**/*.rb'].each do |f|
|
6
|
+
# Get camelized class name
|
7
|
+
filename = File.basename(f, '.rb')
|
8
|
+
# Add _gateway suffix
|
9
|
+
gateway_name = filename + '_gateway'
|
10
|
+
# Camelize the string to get the class name
|
11
|
+
gateway_class = gateway_name.camelize
|
12
|
+
|
13
|
+
# Register for autoloading
|
14
|
+
autoload gateway_class, f
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,246 @@
|
|
1
|
+
require 'active_merchant'
|
2
|
+
require 'uri'
|
3
|
+
require 'cgi'
|
4
|
+
require 'openssl'
|
5
|
+
require 'base64'
|
6
|
+
|
7
|
+
|
8
|
+
module ActiveMerchant #:nodoc:
|
9
|
+
module Billing #:nodoc:
|
10
|
+
class PaypalPermissionsGateway < Gateway # :nodoc
|
11
|
+
public
|
12
|
+
def self.setup
|
13
|
+
yield self
|
14
|
+
end
|
15
|
+
|
16
|
+
public
|
17
|
+
def initialize(options = {})
|
18
|
+
requires!(options, :login, :password, :signature, :app_id)
|
19
|
+
request_permissions_headers = {
|
20
|
+
'X-PAYPAL-SECURITY-USERID' => options.delete(:login),
|
21
|
+
'X-PAYPAL-SECURITY-PASSWORD' => options.delete(:password),
|
22
|
+
'X-PAYPAL-SECURITY-SIGNATURE' => options.delete(:signature),
|
23
|
+
'X-PAYPAL-APPLICATION-ID' => options.delete(:app_id),
|
24
|
+
'X-PAYPAL-REQUEST-DATA-FORMAT' => 'NV',
|
25
|
+
'X-PAYPAL-RESPONSE-DATA-FORMAT' => 'NV',
|
26
|
+
}
|
27
|
+
request_permissions_headers = {
|
28
|
+
'X-PAYPAL-SECURITY-USERID' => options.delete(:login),
|
29
|
+
'X-PAYPAL-SECURITY-PASSWORD' => options.delete(:password),
|
30
|
+
'X-PAYPAL-SECURITY-SIGNATURE' => options.delete(:signature),
|
31
|
+
'X-PAYPAL-APPLICATION-ID' => options.delete(:app_id),
|
32
|
+
'X-PAYPAL-REQUEST-DATA-FORMAT' => 'NV',
|
33
|
+
'X-PAYPAL-RESPONSE-DATA-FORMAT' => 'NV',
|
34
|
+
}
|
35
|
+
@options = {
|
36
|
+
:request_permissions_headers => request_permissions_headers,
|
37
|
+
}.update(options)
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
public
|
42
|
+
def request_permissions(callback_url, scope)
|
43
|
+
query_string = build_request_permissions_query_string callback_url, scope
|
44
|
+
nvp_response = ssl_get "#{request_permissions_url}?#{query_string}", @options[:request_permissions_headers]
|
45
|
+
if nvp_response =~ /error\(\d+\)/
|
46
|
+
puts "request: #{request_permissions_url}?#{query_string}\n"
|
47
|
+
puts "nvp_response: #{nvp_response}\n"
|
48
|
+
end
|
49
|
+
response = parse_request_permissions_nvp(nvp_response)
|
50
|
+
end
|
51
|
+
|
52
|
+
public
|
53
|
+
def request_permissions_url
|
54
|
+
test? ? URLS[:test][:request_permissions] : URLS[:live][:request_permissions]
|
55
|
+
end
|
56
|
+
|
57
|
+
public
|
58
|
+
def get_access_token_url
|
59
|
+
test? ? URLS[:test][:get_access_token] : URLS[:live][:get_access_token]
|
60
|
+
end
|
61
|
+
|
62
|
+
public
|
63
|
+
def get_permissions_url
|
64
|
+
test? ? URLS[:test][:get_permissions] : URLS[:live][:get_permissions]
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
URLS = {
|
69
|
+
:test => {
|
70
|
+
:request_permissions => 'https://svcs.sandbox.paypal.com/Permissions/RequestPermissions',
|
71
|
+
:get_access_token => 'https://svcs.sandbox.paypal.com/Permissions/GetAccessToken',
|
72
|
+
:get_permissions => 'https://svcs.sandbox.paypal.com/Permissions/GetPermissions',
|
73
|
+
},
|
74
|
+
:live => {
|
75
|
+
:request_permissions => 'https://svcs.paypal.com/Permissions/RequestPermissions',
|
76
|
+
:get_access_token => 'https://svcs.paypal.com/Permissions/GetAccessToken',
|
77
|
+
:get_permissions => 'https://svcs.sandbox.paypal.com/Permissions/GetPermissions',
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
private
|
82
|
+
def build_request_permissions_query_string(callback_url, scope)
|
83
|
+
scopes_query = build_scopes_query_string(scope)
|
84
|
+
"requestEnvelope.errorLanguage=en_US&#{scopes_query}&callback=#{URI.encode(callback_url)}"
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
def build_scopes_query_string(scope)
|
89
|
+
if scope.is_a? String
|
90
|
+
scopes = scope.split(',')
|
91
|
+
elsif scope.is_a? Array
|
92
|
+
scopes = scope
|
93
|
+
else
|
94
|
+
scopes = []
|
95
|
+
end
|
96
|
+
scopes.collect{ |s| "scope=#{URI.encode(s.to_s.strip.upcase)}" }.join("&")
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
def setup_request_permission
|
101
|
+
callback
|
102
|
+
scope
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
def parse_request_permissions_nvp(nvp)
|
107
|
+
response = {
|
108
|
+
:errors => [
|
109
|
+
],
|
110
|
+
}
|
111
|
+
pairs = nvp.split "&"
|
112
|
+
pairs.each do |pair|
|
113
|
+
n,v = pair.split "="
|
114
|
+
n = CGI.unescape n
|
115
|
+
v = CGI.unescape v
|
116
|
+
case n
|
117
|
+
when "responseEnvelope.timestamp"
|
118
|
+
response[:timestamp] = v
|
119
|
+
when "responseEnvelope.ack"
|
120
|
+
response[:ack] = v
|
121
|
+
=begin
|
122
|
+
# Client should implement these with logging...
|
123
|
+
case v
|
124
|
+
when "Success"
|
125
|
+
when "Failure"
|
126
|
+
when "Warning"
|
127
|
+
when "SuccessWithWarning"
|
128
|
+
when "FailureWithWarning"
|
129
|
+
end
|
130
|
+
=end
|
131
|
+
when "responseEnvelope.correlationId"
|
132
|
+
response[:correlation_id] = v
|
133
|
+
when "responseEnvelope.build"
|
134
|
+
# do nothing
|
135
|
+
when "token"
|
136
|
+
response[:token] = v
|
137
|
+
when /^error\((?<error_idx>\d+)\)/
|
138
|
+
error_idx = error_idx.to_i
|
139
|
+
if response[:errors].length <= error_idx
|
140
|
+
response[:errors] << { :parameters => [] }
|
141
|
+
raise if response[:errors].length <= error_idx
|
142
|
+
end
|
143
|
+
case n
|
144
|
+
when /^error\(\d+\)\.errorId$/
|
145
|
+
response[:errors][error_idx][:error_id] = v
|
146
|
+
=begin
|
147
|
+
# Client should implement these with logging. PayPal doesn't distinguish
|
148
|
+
# between errors which can be corrected by the user and errors which need
|
149
|
+
# to be corrected by a developer or merchant, say, in configuration.
|
150
|
+
# case v
|
151
|
+
# when "520002"
|
152
|
+
# when
|
153
|
+
=end
|
154
|
+
when /^error\(\d+\)\.domain$/
|
155
|
+
response[:errors][error_idx][:domain] = v
|
156
|
+
when /^error\(\d+\)\.subdomain$/
|
157
|
+
response[:errors][error_idx][:subdomain] = v
|
158
|
+
when /^error\(\d+\)\.severity$/
|
159
|
+
response[:errors][error_idx][:severity] = v
|
160
|
+
when /^error\(\d+\)\.category$/
|
161
|
+
response[:errors][error_idx][:category] = v
|
162
|
+
when /^error\(\d+\)\.message$/
|
163
|
+
response[:errors][error_idx][:message] = v
|
164
|
+
when /^error\(\d+\)\.parameter\((?<parameter_idx>\d+)\)$/
|
165
|
+
parameter_idx = parameter_idx.to_i
|
166
|
+
if response[:errors][error_idx][:parameters].length <= parameter_idx
|
167
|
+
response[:errors][error_idx][:parameters] << {}
|
168
|
+
raise if response[:errors][error_idx][:parameters].length <= parameter_idx
|
169
|
+
end
|
170
|
+
response[:errors][error_idx][:parameters][parameter_idx] = v
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
response
|
175
|
+
end
|
176
|
+
|
177
|
+
private
|
178
|
+
def authentication_header url
|
179
|
+
timestamp = Time.now.to_i
|
180
|
+
signature = authentication_signature url, timestamp
|
181
|
+
{ 'X-PAYPAL-AUTHORIZATION' => "token=#{access_token}, signature=#{signature}, timeStamp=#{timestamp}" }
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
def authentication_signature url, timestamp
|
186
|
+
# no query params, but if there were, this is where they'd go
|
187
|
+
query_params = {}
|
188
|
+
key = [ password, verifier ].join("&")
|
189
|
+
params = query_params.dup.merge({
|
190
|
+
"oauth_consumer_key" => @options[:request_permissions_headers]['X-PAYPAL-SECURITY-USERID'],
|
191
|
+
"oauth_version" => "1.0",
|
192
|
+
"oauth_signature_method" => "HMAC-SHA1",
|
193
|
+
"oauth_token" => access_token,
|
194
|
+
"oauth_timestamp" => timestamp,
|
195
|
+
})
|
196
|
+
sorted_params = Hash[params.sort]
|
197
|
+
sorted_query_string = sorted_params.to_query
|
198
|
+
data = [ "POST", url, sorted_query_string ].join("&") # ? "https://api.sandbox.paypal.com/nvp"
|
199
|
+
digest = OpenSSL::Digest::Digest.new('sha1')
|
200
|
+
OpenSSL::HMAC.digest(digest, key, data)
|
201
|
+
enc = Base64.encode64('Send reinforcements') # encode per RFC 2045 (not 4648
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
=begin
|
206
|
+
public static Map getAuthHeader(String apiUserName, String apiPassword,
|
207
|
+
String accessToken, String tokenSecret, HTTPMethod httpMethod,
|
208
|
+
String scriptURI,Map queryParams) throws OAuthException {
|
209
|
+
|
210
|
+
Map headers=new HashMap();
|
211
|
+
String consumerKey = apiUserName;
|
212
|
+
String consumerSecretStr = apiPassword;
|
213
|
+
String time = String.valueOf(System.currentTimeMillis()/1000);
|
214
|
+
|
215
|
+
OAuthSignature oauth = new OAuthSignature(consumerKey,consumerSecretStr);
|
216
|
+
if(HTTPMethod.GET.equals(httpMethod) && queryParams != null){
|
217
|
+
Iterator itr = queryParams.entrySet().iterator();
|
218
|
+
while (itr.hasNext()) {
|
219
|
+
Map.Entry param = (Map.Entry)itr.next();
|
220
|
+
String key=(String)param.getKey();
|
221
|
+
String value=(String)param.getValue();
|
222
|
+
oauth.addParameter(key,value);
|
223
|
+
}
|
224
|
+
}
|
225
|
+
oauth.setToken(accessToken);
|
226
|
+
oauth.setTokenSecret(tokenSecret);
|
227
|
+
oauth.setHTTPMethod(httpMethod);
|
228
|
+
oauth.setTokenTimestamp(time);
|
229
|
+
oauth.setRequestURI(scriptURI);
|
230
|
+
//Compute Signature
|
231
|
+
String sig = oauth.computeV1Signature();
|
232
|
+
|
233
|
+
headers.put("Signature", sig);
|
234
|
+
headers.put("TimeStamp", time);
|
235
|
+
return headers;
|
236
|
+
|
237
|
+
}
|
238
|
+
=end
|
239
|
+
|
240
|
+
private
|
241
|
+
def setup_purchase(options)
|
242
|
+
commit('Pay', build_adaptive_payment_pay_request(options))
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|