paypal-rest-api 0.1.1 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +33 -4
- data/VERSION +1 -1
- data/lib/paypal-api/api_collections/authentication.rb +1 -1
- data/lib/paypal-api/client.rb +42 -12
- data/lib/paypal-api/config.rb +7 -46
- data/lib/paypal-api/environment.rb +75 -0
- data/lib/paypal-api/request.rb +1 -1
- data/lib/paypal-api.rb +25 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d478a936d84b05a9f4a6eb98491649648250cc49dcb3f524381404d9ded0084f
|
4
|
+
data.tar.gz: 5ec4bc0bbf68f3be84ce5cd1cd31e85f6fec5c9bc6ce795fd3b64eea902d033f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15d2abe1866d6724c00520b43dfec0ac4b9e8383039e3580b78c182bbd184fd2499c0beaa1328500453e85868622fc0e1e49a4dbdc4f58e6401258021f04dd69
|
7
|
+
data.tar.gz: c51693b8445126a269f7d356baa4cba3ca40ffc0a19e80bc1278b69061146e723589237ac85a5940381309868f2af2e619cbdc4bc76295f0420d7606ab010d45
|
data/README.md
CHANGED
@@ -35,7 +35,11 @@ PaypalAPI.client = PaypalAPI::Client.new(
|
|
35
35
|
)
|
36
36
|
|
37
37
|
# in your business logic
|
38
|
-
|
38
|
+
PaypalAPI.live? # => false
|
39
|
+
PaypalAPI.api_url # => "https://api-m.sandbox.paypal.com"
|
40
|
+
PaypalAPI.web_url # => "https://sandbox.paypal.com"
|
41
|
+
|
42
|
+
response = between redeploys::Orders.show(order_id)
|
39
43
|
response = PaypalAPI::Orders.create(body: body)
|
40
44
|
```
|
41
45
|
|
@@ -49,6 +53,10 @@ client = PaypalAPI::Client.new(
|
|
49
53
|
live: false
|
50
54
|
)
|
51
55
|
|
56
|
+
client.live? # => false
|
57
|
+
client.api_url # => "https://api-m.sandbox.paypal.com"
|
58
|
+
client.web_url # => "https://sandbox.paypal.com"
|
59
|
+
|
52
60
|
response = client.orders.show(order_id)
|
53
61
|
response = client.orders.create(body: body)
|
54
62
|
```
|
@@ -91,7 +99,12 @@ response.request # Request that generates this response
|
|
91
99
|
|
92
100
|
## Configuration options
|
93
101
|
|
94
|
-
PaypalAPI client accepts this additional options:
|
102
|
+
PaypalAPI client accepts this additional options:
|
103
|
+
|
104
|
+
- `:live`
|
105
|
+
- `:retries`,
|
106
|
+
- `:http_opts`
|
107
|
+
- `:cache`
|
95
108
|
|
96
109
|
### Option `:live`
|
97
110
|
|
@@ -108,8 +121,8 @@ client = PaypalAPI::Client.new(
|
|
108
121
|
### Option `:retries`
|
109
122
|
|
110
123
|
This is a Hash with retries configuration.
|
111
|
-
By default retries are enabled,
|
112
|
-
Default config: `{enabled: true, count:
|
124
|
+
By default retries are enabled, 4 retries with 0, 0.25, 0.75, 1.5 seconds delay.
|
125
|
+
Default config: `{enabled: true, count: 4, sleep: [0, 0.25, 0.75, 1.5]}`.
|
113
126
|
New options are merged with defaults.
|
114
127
|
Please keep `sleep` array same size as `count`.
|
115
128
|
|
@@ -139,6 +152,22 @@ client = PaypalAPI::Client.new(
|
|
139
152
|
)
|
140
153
|
```
|
141
154
|
|
155
|
+
### Option `:cache`
|
156
|
+
|
157
|
+
This option can be added to save certificates to between redeploys to validate
|
158
|
+
webhooks offline. By default this gem has only in-memory caching.
|
159
|
+
Cache object must response to standard caching `#fetch(key, &block)` method.
|
160
|
+
|
161
|
+
By default it is `nil`, so downloaded certificates will be downloaded again after
|
162
|
+
redeploys.
|
163
|
+
|
164
|
+
```ruby
|
165
|
+
client = PaypalAPI::Client.new(
|
166
|
+
cache: Rails.cache
|
167
|
+
# ...
|
168
|
+
)
|
169
|
+
```
|
170
|
+
|
142
171
|
## Webhoooks verification
|
143
172
|
|
144
173
|
Webhooks can be verified [offline](https://developer.paypal.com/api/rest/webhooks/rest/#link-selfverificationmethod)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.1
|
@@ -43,7 +43,7 @@ module PaypalAPI
|
|
43
43
|
|
44
44
|
default_headers = {
|
45
45
|
"content-type" => "application/x-www-form-urlencoded",
|
46
|
-
"authorization" => "Basic #{["#{client.
|
46
|
+
"authorization" => "Basic #{["#{client.env.client_id}:#{client.env.client_secret}"].pack("m0")}"
|
47
47
|
}
|
48
48
|
|
49
49
|
client.post(PATH, query: query, body: body, headers: merge_headers!(default_headers, headers))
|
data/lib/paypal-api/client.rb
CHANGED
@@ -5,7 +5,18 @@ module PaypalAPI
|
|
5
5
|
# PaypalAPI Client
|
6
6
|
#
|
7
7
|
class Client
|
8
|
-
|
8
|
+
# Paypal environment
|
9
|
+
attr_reader :env
|
10
|
+
|
11
|
+
# Gem Configuration
|
12
|
+
#
|
13
|
+
# @return [Config] Gem Configuration
|
14
|
+
attr_reader :config
|
15
|
+
|
16
|
+
# Registered callbacks
|
17
|
+
#
|
18
|
+
# @return [Hash] Registered callbacks
|
19
|
+
attr_reader :callbacks
|
9
20
|
|
10
21
|
# Initializes Client
|
11
22
|
# @api public
|
@@ -18,15 +29,9 @@ module PaypalAPI
|
|
18
29
|
#
|
19
30
|
# @return [Client] Initialized client
|
20
31
|
#
|
21
|
-
def initialize(client_id:, client_secret:, live:
|
22
|
-
@
|
23
|
-
|
24
|
-
client_secret: client_secret,
|
25
|
-
live: live,
|
26
|
-
http_opts: http_opts,
|
27
|
-
retries: retries,
|
28
|
-
cache: cache
|
29
|
-
)
|
32
|
+
def initialize(client_id:, client_secret:, live: false, http_opts: nil, retries: nil, cache: nil)
|
33
|
+
@env = PaypalAPI::Environment.new(client_id: client_id, client_secret: client_secret, live: live)
|
34
|
+
@config = PaypalAPI::Config.new(http_opts: http_opts, retries: retries, cache: cache)
|
30
35
|
|
31
36
|
@callbacks = {
|
32
37
|
before: [],
|
@@ -38,10 +43,34 @@ module PaypalAPI
|
|
38
43
|
@access_token = nil
|
39
44
|
end
|
40
45
|
|
46
|
+
# Checks if PayPal LIVE environment enabled
|
47
|
+
# @return [Boolean] Checks if PayPal LIVE environment enabled
|
48
|
+
def live?
|
49
|
+
env.live?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Checks if PayPal SANDBOX environment enabled
|
53
|
+
# @return [Boolean] Checks if PayPal SANDBOX environment enabled
|
54
|
+
def sandbox?
|
55
|
+
env.sandbox?
|
56
|
+
end
|
57
|
+
|
58
|
+
# Base API URL
|
59
|
+
# @return [String] Base API URL
|
60
|
+
def api_url
|
61
|
+
env.api_url
|
62
|
+
end
|
63
|
+
|
64
|
+
# Base WEB URL
|
65
|
+
# @return [String] Base WEB URL
|
66
|
+
def web_url
|
67
|
+
env.web_url
|
68
|
+
end
|
69
|
+
|
41
70
|
# Registers callback
|
42
71
|
#
|
43
72
|
# @param callback_name [Symbol] Callback name.
|
44
|
-
# Allowed values: :before, :after_success, :
|
73
|
+
# Allowed values: :before, :after_success, :after_fail, :after_network_error
|
45
74
|
#
|
46
75
|
# @param block [Proc] Block that must be call
|
47
76
|
# For `:before` callback proc should accept 2 params -
|
@@ -89,6 +118,7 @@ module PaypalAPI
|
|
89
118
|
|
90
119
|
#
|
91
120
|
# Verifies Webhook
|
121
|
+
#
|
92
122
|
# It requires one-time request to download and cache certificate.
|
93
123
|
# If local verification returns false it tries to verify webhook online.
|
94
124
|
#
|
@@ -98,7 +128,7 @@ module PaypalAPI
|
|
98
128
|
# class Webhooks::PaypalController < ApplicationController
|
99
129
|
# def create
|
100
130
|
# webhook_id = ENV['PAYPAL_WEBHOOK_ID'] # PayPal registered webhook ID for current URL
|
101
|
-
# headers = request.headers # must
|
131
|
+
# headers = request.headers # must respond to #[] to get headers
|
102
132
|
# body = request.raw_post # must be a raw String body
|
103
133
|
#
|
104
134
|
# webhook_is_valid = PaypalAPI.verify_webhook(webhook_id: webhook_id, headers: headers, body: body)
|
data/lib/paypal-api/config.rb
CHANGED
@@ -2,71 +2,32 @@
|
|
2
2
|
|
3
3
|
module PaypalAPI
|
4
4
|
#
|
5
|
-
# Stores
|
5
|
+
# Stores client requests configuration
|
6
6
|
#
|
7
7
|
class Config
|
8
|
-
# Live PayPal URL
|
9
|
-
LIVE_URL = "https://api-m.paypal.com"
|
10
|
-
|
11
|
-
# Sandbox PayPal URL
|
12
|
-
SANDBOX_URL = "https://api-m.sandbox.paypal.com"
|
13
|
-
|
14
8
|
# Default config options
|
15
9
|
DEFAULTS = {
|
16
|
-
live: false,
|
17
10
|
http_opts: {}.freeze,
|
18
|
-
retries: {enabled: true, count:
|
11
|
+
retries: {enabled: true, count: 4, sleep: [0, 0.25, 0.75, 1.5].freeze}.freeze
|
19
12
|
}.freeze
|
20
13
|
|
21
|
-
attr_reader :
|
14
|
+
attr_reader :http_opts, :retries, :certs_cache
|
22
15
|
|
23
16
|
# Initializes Config
|
24
17
|
#
|
25
|
-
# @param client_id [String] PayPal client id
|
26
|
-
# @param client_secret [String] PayPal client secret
|
27
|
-
# @param live [Boolean] PayPal live/sandbox mode
|
28
18
|
# @param http_opts [Hash] Net::Http opts for all requests
|
29
19
|
# @param retries [Hash] Retries configuration
|
30
20
|
# @param cache [#read, nil] Application cache to store certificates to validate webhook events locally.
|
31
|
-
# Must respond to #
|
21
|
+
# Must respond to #fetch(key, &block)
|
32
22
|
#
|
33
23
|
# @return [Client] Initialized config object
|
34
24
|
#
|
35
|
-
def initialize(
|
36
|
-
@
|
37
|
-
@
|
38
|
-
@live = with_default(:live, live)
|
39
|
-
@http_opts = with_default(:http_opts, http_opts)
|
40
|
-
@retries = with_default(:retries, retries)
|
25
|
+
def initialize(http_opts: nil, retries: {}, cache: nil)
|
26
|
+
@http_opts = http_opts || DEFAULTS[:http_opts]
|
27
|
+
@retries = DEFAULTS[:retries].merge(retries || {})
|
41
28
|
@certs_cache = WebhookVerifier::CertsCache.new(cache)
|
42
29
|
|
43
30
|
freeze
|
44
31
|
end
|
45
|
-
|
46
|
-
# @return [String] PayPal live or sandbox URL
|
47
|
-
def url
|
48
|
-
live ? LIVE_URL : SANDBOX_URL
|
49
|
-
end
|
50
|
-
|
51
|
-
#
|
52
|
-
# Instance representation string. Default was overwritten to hide secrets
|
53
|
-
#
|
54
|
-
def inspect
|
55
|
-
"#<#{self.class.name} live: #{live}>"
|
56
|
-
end
|
57
|
-
|
58
|
-
alias_method :to_s, :inspect
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
def with_default(option_name, value)
|
63
|
-
default = DEFAULTS.fetch(option_name)
|
64
|
-
|
65
|
-
case value
|
66
|
-
when NilClass then default
|
67
|
-
when Hash then default.merge(value)
|
68
|
-
else value
|
69
|
-
end
|
70
|
-
end
|
71
32
|
end
|
72
33
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PaypalAPI
|
4
|
+
# Sandbox API PayPal URL
|
5
|
+
SANDBOX_API_URL = "https://api-m.sandbox.paypal.com"
|
6
|
+
|
7
|
+
# Live API PayPal URL
|
8
|
+
LIVE_API_URL = "https://api-m.paypal.com"
|
9
|
+
|
10
|
+
# Sandbox PayPal Web URL
|
11
|
+
SANDBOX_WEB_URL = "https://sandbox.paypal.com"
|
12
|
+
|
13
|
+
# Live PayPal Web URL
|
14
|
+
LIVE_WEB_URL = "https://paypal.com"
|
15
|
+
|
16
|
+
#
|
17
|
+
# PayPal environment info
|
18
|
+
#
|
19
|
+
class Environment
|
20
|
+
# PayPal client_id
|
21
|
+
attr_accessor :client_id
|
22
|
+
|
23
|
+
# PayPal client_secret
|
24
|
+
attr_reader :client_secret
|
25
|
+
|
26
|
+
# PayPal API base URL
|
27
|
+
attr_reader :api_url
|
28
|
+
|
29
|
+
# PayPal web URL
|
30
|
+
attr_reader :web_url
|
31
|
+
|
32
|
+
# Initializes Environment
|
33
|
+
#
|
34
|
+
# @param client_id [String] PayPal client id
|
35
|
+
# @param client_secret [String] PayPal client secret
|
36
|
+
# @param live [Boolean] PayPal live/sandbox mode
|
37
|
+
#
|
38
|
+
# @return [Client] Initialized config object
|
39
|
+
#
|
40
|
+
def initialize(client_id:, client_secret:, live: false)
|
41
|
+
@live = live || false
|
42
|
+
@api_url = live ? LIVE_API_URL : SANDBOX_API_URL
|
43
|
+
@web_url = live ? LIVE_WEB_URL : SANDBOX_WEB_URL
|
44
|
+
@client_id = client_id
|
45
|
+
@client_secret = client_secret
|
46
|
+
freeze
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Instance representation string. Default was overwritten to hide secrets
|
51
|
+
# @return [String]
|
52
|
+
#
|
53
|
+
def inspect
|
54
|
+
"#<#{self.class.name} live: #{@live}>"
|
55
|
+
end
|
56
|
+
|
57
|
+
alias_method :to_s, :inspect
|
58
|
+
|
59
|
+
#
|
60
|
+
# Checks if live environment enabled
|
61
|
+
# @return [Boolean]
|
62
|
+
#
|
63
|
+
def live?
|
64
|
+
@live
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# Checks if sandbox environment enabled
|
69
|
+
# @return [Boolean]
|
70
|
+
#
|
71
|
+
def sandbox?
|
72
|
+
!live?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/paypal-api/request.rb
CHANGED
data/lib/paypal-api.rb
CHANGED
@@ -18,6 +18,30 @@ module PaypalAPI
|
|
18
18
|
# @return [Client] PaypalAPI client
|
19
19
|
attr_writer :client
|
20
20
|
|
21
|
+
# Checks if PayPal LIVE environment enabled
|
22
|
+
# @return [Boolean] Checks if PayPal LIVE environment enabled
|
23
|
+
def live?
|
24
|
+
client.live?
|
25
|
+
end
|
26
|
+
|
27
|
+
# Checks if PayPal SANDBOX environment enabled
|
28
|
+
# @return [Boolean] Checks if PayPal SANDBOX environment enabled
|
29
|
+
def sandbox?
|
30
|
+
client.sandbox?
|
31
|
+
end
|
32
|
+
|
33
|
+
# Base API URL
|
34
|
+
# @return [String] Base API URL
|
35
|
+
def api_url
|
36
|
+
client.api_url
|
37
|
+
end
|
38
|
+
|
39
|
+
# Base WEB URL
|
40
|
+
# @return [String] Base WEB URL
|
41
|
+
def web_url
|
42
|
+
client.web_url
|
43
|
+
end
|
44
|
+
|
21
45
|
# @!macro [new] request
|
22
46
|
#
|
23
47
|
# @api public
|
@@ -210,6 +234,7 @@ end
|
|
210
234
|
|
211
235
|
require_relative "paypal-api/access_token"
|
212
236
|
require_relative "paypal-api/api_collection"
|
237
|
+
require_relative "paypal-api/environment"
|
213
238
|
require_relative "paypal-api/client"
|
214
239
|
require_relative "paypal-api/config"
|
215
240
|
require_relative "paypal-api/error"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paypal-rest-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Glushkov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
11
|
+
date: 2024-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: PayPal REST API with no dependencies.
|
14
14
|
email:
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- lib/paypal-api/api_collections/webhooks.rb
|
46
46
|
- lib/paypal-api/client.rb
|
47
47
|
- lib/paypal-api/config.rb
|
48
|
+
- lib/paypal-api/environment.rb
|
48
49
|
- lib/paypal-api/error.rb
|
49
50
|
- lib/paypal-api/failed_request_error_builder.rb
|
50
51
|
- lib/paypal-api/network_error_builder.rb
|