bitpay-sdk 2.3.2 → 2.3.3
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/CHANGELOG.md +11 -0
- data/config/constants.rb +4 -4
- data/features/creating_invoices.feature +3 -3
- data/features/step_definitions/keygen_steps.rb +1 -1
- data/features/step_definitions/step_helpers.rb +1 -1
- data/lib/bitpay/client.rb +11 -121
- data/lib/bitpay/rest_connector.rb +96 -0
- data/lib/bitpay/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f17aaeed06964a9e0cb8aaa38e8e291b5135e0e2
|
4
|
+
data.tar.gz: c84ffdc47caf825006420824e3f63b61a22bc27a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66d9265331b654fa308f0ae24782fe62d9a0b113e5a470341400d329edd0e3a4b71c36964f02a9c5e0c6a793a702e8444c98357728c0efa84c6f65ae9c000117
|
7
|
+
data.tar.gz: 86f177707cbc8f8c2f71d4a4b031153935ce62e3fef1be0077f26de57dd77b9076f4d1a579a60e6266e537f8e571bdd030defb89dff6a5917b0639dae61ce927
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Change Log
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
This project adheres to [Semantic Versioning](http://semver.org/).
|
4
|
+
|
5
|
+
## [2.3.3] - 2015-03-12
|
6
|
+
### Changed
|
7
|
+
- Pull refund functionality from 2.3 spec
|
8
|
+
- Bump gem version
|
9
|
+
|
10
|
+
### Fixed
|
11
|
+
- Fix Bug: GitHub issue #40 - error on return from endpoints that do not have a "data" field
|
data/config/constants.rb
CHANGED
@@ -11,9 +11,9 @@ TEST_PASS = ENV['RCTESTPASSWORD']
|
|
11
11
|
DASHBOARD_URL = "#{ROOT_ADDRESS}/dashboard/merchant/home"
|
12
12
|
|
13
13
|
unless
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
ROOT_ADDRESS &&
|
15
|
+
TEST_USER &&
|
16
|
+
TEST_PASS
|
17
17
|
then
|
18
|
-
|
18
|
+
raise "Missing configuration options - see constants.rb"
|
19
19
|
end
|
@@ -21,8 +21,8 @@ Feature: creating an invoice
|
|
21
21
|
Then they will receive a BitPay::ArgumentError matching <message>
|
22
22
|
Examples:
|
23
23
|
| price | currency | message |
|
24
|
-
| "5,023"
|
25
|
-
| "3.21"
|
24
|
+
| "5,023" | "USD" | "Price must be formatted as a float" |
|
25
|
+
| "3.21" | "EaUR" | "Currency is invalid." |
|
26
26
|
| "" | "USD" | "Price must be formatted as a float" |
|
27
27
|
| "Ten" | "USD" | "Price must be formatted as a float" |
|
28
|
-
| "10"
|
28
|
+
| "10" | "" | "Currency is invalid." |
|
data/lib/bitpay/client.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# license Copyright 2011-
|
1
|
+
# license Copyright 2011-2015 BitPay, Inc., MIT License
|
2
2
|
# see http://opensource.org/licenses/MIT
|
3
3
|
# or https://github.com/bitpay/php-bitpay-client/blob/master/LICENSE
|
4
4
|
|
@@ -7,13 +7,14 @@ require 'net/https'
|
|
7
7
|
require 'json'
|
8
8
|
|
9
9
|
require_relative 'key_utils'
|
10
|
+
require_relative 'rest_connector'
|
10
11
|
|
11
12
|
module BitPay
|
12
13
|
# This class is used to instantiate a BitPay Client object. It is expected to be thread safe.
|
13
14
|
#
|
14
15
|
module SDK
|
15
16
|
class Client
|
16
|
-
|
17
|
+
include BitPay::RestConnector
|
17
18
|
# @return [Client]
|
18
19
|
# @example
|
19
20
|
# # Create a client with a pem file created by the bitpay client:
|
@@ -46,7 +47,8 @@ module BitPay
|
|
46
47
|
# => Pass {pairingCode: 'WfD01d2'} to claim a server-initiated pairing code
|
47
48
|
#
|
48
49
|
def pair_client(params={})
|
49
|
-
|
50
|
+
tokens = post(path: 'tokens', params: params)
|
51
|
+
return tokens["data"]
|
50
52
|
end
|
51
53
|
|
52
54
|
## Compatibility method for pos pairing
|
@@ -67,24 +69,16 @@ module BitPay
|
|
67
69
|
currency == 'BTC' && /^[[:digit:]]+(\.[[:digit:]]{1,6})?$/.match(price)
|
68
70
|
raise BitPay::ArgumentError, "Illegal Argument: Currency is invalid." unless /^[[:upper:]]{3}$/.match(currency)
|
69
71
|
params.merge!({price: price, currency: currency})
|
70
|
-
|
71
|
-
|
72
|
+
token = get_token(facade)
|
73
|
+
invoice = post(path: "invoices", token: token, params: params)
|
74
|
+
invoice["data"]
|
72
75
|
end
|
73
76
|
|
74
|
-
## Gets the privileged merchant-version of the invoice
|
75
|
-
# Requires merchant facade token
|
76
|
-
#
|
77
|
-
def get_invoice(id:)
|
78
|
-
response = send_request("GET", "invoices/#{id}", facade: 'merchant')
|
79
|
-
response["data"]
|
80
|
-
end
|
81
|
-
|
82
77
|
## Gets the public version of the invoice
|
83
78
|
#
|
84
79
|
def get_public_invoice(id:)
|
85
|
-
|
86
|
-
|
87
|
-
response["data"]
|
80
|
+
invoice = get(path: "invoices/#{id}", public: true)
|
81
|
+
invoice["data"]
|
88
82
|
end
|
89
83
|
|
90
84
|
## Checks that the passed tokens are valid by
|
@@ -98,116 +92,12 @@ module BitPay
|
|
98
92
|
tokens.each{|key, value| return false if server_tokens[key] != value}
|
99
93
|
return true
|
100
94
|
end
|
101
|
-
|
102
|
-
## Generates REST request to api endpoint
|
103
|
-
# => Defaults to merchant facade unless token or facade is explicitly provided
|
104
|
-
#
|
105
|
-
def send_request(verb, path, facade: 'merchant', params: {}, token: nil)
|
106
|
-
token ||= get_token(facade)
|
107
|
-
|
108
|
-
# Verb-specific logic
|
109
|
-
case verb.upcase
|
110
|
-
when "GET"
|
111
|
-
urlpath = '/' + path + '?token=' + token
|
112
|
-
request = Net::HTTP::Get.new urlpath
|
113
|
-
request['X-Signature'] = KeyUtils.sign(@uri.to_s + urlpath, @priv_key)
|
114
|
-
|
115
|
-
when "PUT"
|
116
|
-
|
117
|
-
when "POST" # Requires a GUID
|
118
|
-
|
119
|
-
urlpath = '/' + path
|
120
|
-
request = Net::HTTP::Post.new urlpath
|
121
|
-
params[:token] = token
|
122
|
-
params[:guid] = SecureRandom.uuid
|
123
|
-
params[:id] = @client_id
|
124
|
-
request.body = params.to_json
|
125
|
-
request['X-Signature'] = KeyUtils.sign(@uri.to_s + urlpath + request.body, @priv_key)
|
126
|
-
|
127
|
-
when "DELETE"
|
128
|
-
|
129
|
-
raise(BitPayError, "Invalid HTTP verb: #{verb.upcase}")
|
130
|
-
end
|
131
|
-
|
132
|
-
# Build request headers and submit
|
133
|
-
request['X-Identity'] = @pub_key
|
134
|
-
|
135
|
-
response = process_request(request)
|
136
|
-
end
|
137
95
|
|
138
|
-
##### PRIVATE METHODS #####
|
139
96
|
private
|
140
97
|
|
141
|
-
## Processes HTTP Request and returns parsed response
|
142
|
-
# Otherwise throws error
|
143
|
-
#
|
144
|
-
def process_request(request)
|
145
|
-
|
146
|
-
request['User-Agent'] = @user_agent
|
147
|
-
request['Content-Type'] = 'application/json'
|
148
|
-
request['X-BitPay-Plugin-Info'] = 'Rubylib' + VERSION
|
149
|
-
|
150
|
-
begin
|
151
|
-
response = @https.request request
|
152
|
-
rescue => error
|
153
|
-
raise BitPay::ConnectionError, "#{error.message}"
|
154
|
-
end
|
155
|
-
|
156
|
-
if response.kind_of? Net::HTTPSuccess
|
157
|
-
return JSON.parse(response.body)
|
158
|
-
elsif JSON.parse(response.body)["error"]
|
159
|
-
raise(BitPayError, "#{response.code}: #{JSON.parse(response.body)['error']}")
|
160
|
-
else
|
161
|
-
raise BitPayError, "#{response.code}: #{JSON.parse(response.body)}"
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
## Fetches the tokens hash from the server and
|
167
|
-
# updates @tokens
|
168
|
-
#
|
169
|
-
def refresh_tokens
|
170
|
-
urlpath = '/tokens'
|
171
|
-
|
172
|
-
request = Net::HTTP::Get.new(urlpath)
|
173
|
-
request['X-Identity'] = @pub_key
|
174
|
-
request['X-Signature'] = KeyUtils.sign(@uri.to_s + urlpath, @priv_key)
|
175
|
-
|
176
|
-
response = process_request(request)
|
177
|
-
token_array = response["data"] || {}
|
178
|
-
|
179
|
-
tokens = {}
|
180
|
-
token_array.each do |t|
|
181
|
-
tokens[t.keys.first] = t.values.first
|
182
|
-
end
|
183
|
-
|
184
|
-
@tokens = tokens
|
185
|
-
return tokens
|
186
|
-
|
187
|
-
end
|
188
|
-
|
189
|
-
## Makes a request to /tokens for pairing
|
190
|
-
# Adds passed params as post parameters
|
191
|
-
# If empty params, retrieves server-generated pairing code
|
192
|
-
# If pairingCode key/value is passed, will pair client ID to this account
|
193
|
-
# Returns response hash
|
194
|
-
#
|
195
|
-
def pairing_request(params)
|
196
|
-
urlpath = '/tokens'
|
197
|
-
request = Net::HTTP::Post.new urlpath
|
198
|
-
params[:guid] = SecureRandom.uuid
|
199
|
-
params[:id] = @client_id
|
200
|
-
request.body = params.to_json
|
201
|
-
process_request(request)
|
202
|
-
end
|
203
|
-
|
204
|
-
def get_token(facade)
|
205
|
-
token = @tokens[facade] || refresh_tokens[facade] || raise(BitPayError, "Not authorized for facade: #{facade}")
|
206
|
-
end
|
207
|
-
|
208
98
|
def verify_claim_code(claim_code)
|
209
99
|
regex = /^[[:alnum:]]{7}$/
|
210
|
-
|
100
|
+
matches = regex.match(claim_code)
|
211
101
|
!(matches.nil?)
|
212
102
|
end
|
213
103
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# license Copyright 2011-2015 BitPay, Inc., MIT License
|
2
|
+
# see http://opensource.org/licenses/MIT
|
3
|
+
# or https://github.com/bitpay/php-bitpay-client/blob/master/LICENSE
|
4
|
+
|
5
|
+
module BitPay
|
6
|
+
module RestConnector
|
7
|
+
def send_request(verb, path, facade: 'merchant', params: {}, token: nil)
|
8
|
+
token ||= get_token(facade)
|
9
|
+
case verb.upcase
|
10
|
+
when "GET"
|
11
|
+
return get(path: path, token:token)
|
12
|
+
when "POST"
|
13
|
+
return post(path: path, token: token, params: params)
|
14
|
+
else
|
15
|
+
raise(BitPayError, "Invalid HTTP verb: #{verb.upcase}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(path:, token: nil, public: false)
|
20
|
+
urlpath = '/' + path
|
21
|
+
urlpath = urlpath + '?token=' + token if token
|
22
|
+
request = Net::HTTP::Get.new urlpath
|
23
|
+
unless public
|
24
|
+
request['X-Signature'] = KeyUtils.sign(@uri.to_s + urlpath, @priv_key)
|
25
|
+
request['X-Identity'] = @pub_key
|
26
|
+
end
|
27
|
+
process_request(request)
|
28
|
+
end
|
29
|
+
|
30
|
+
def post(path:, token: nil, params:)
|
31
|
+
urlpath = '/' + path
|
32
|
+
request = Net::HTTP::Post.new urlpath
|
33
|
+
params[:token] = token if token
|
34
|
+
params[:guid] = SecureRandom.uuid
|
35
|
+
params[:id] = @client_id
|
36
|
+
request.body = params.to_json
|
37
|
+
if token
|
38
|
+
request['X-Signature'] = KeyUtils.sign(@uri.to_s + urlpath + request.body, @priv_key)
|
39
|
+
request['X-Identity'] = @pub_key
|
40
|
+
end
|
41
|
+
process_request(request)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
## Processes HTTP Request and returns parsed response
|
47
|
+
# Otherwise throws error
|
48
|
+
#
|
49
|
+
def process_request(request)
|
50
|
+
request['User-Agent'] = @user_agent
|
51
|
+
request['Content-Type'] = 'application/json'
|
52
|
+
request['X-BitPay-Plugin-Info'] = 'Rubylib' + VERSION
|
53
|
+
|
54
|
+
begin
|
55
|
+
response = @https.request request
|
56
|
+
rescue => error
|
57
|
+
raise BitPay::ConnectionError, "#{error.message}"
|
58
|
+
end
|
59
|
+
|
60
|
+
if response.kind_of? Net::HTTPSuccess
|
61
|
+
return JSON.parse(response.body)
|
62
|
+
elsif JSON.parse(response.body)["error"]
|
63
|
+
raise(BitPayError, "#{response.code}: #{JSON.parse(response.body)['error']}")
|
64
|
+
else
|
65
|
+
raise BitPayError, "#{response.code}: #{JSON.parse(response.body)}"
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
## Fetches the tokens hash from the server and
|
71
|
+
# updates @tokens
|
72
|
+
#
|
73
|
+
def refresh_tokens
|
74
|
+
response = get(path: 'tokens')["data"]
|
75
|
+
token_array = response || {}
|
76
|
+
tokens = {}
|
77
|
+
token_array.each do |t|
|
78
|
+
tokens[t.keys.first] = t.values.first
|
79
|
+
end
|
80
|
+
@tokens = tokens
|
81
|
+
return tokens
|
82
|
+
end
|
83
|
+
|
84
|
+
## Makes a request to /tokens for pairing
|
85
|
+
# Adds passed params as post parameters
|
86
|
+
# If empty params, retrieves server-generated pairing code
|
87
|
+
# If pairingCode key/value is passed, will pair client ID to this account
|
88
|
+
# Returns response hash
|
89
|
+
#
|
90
|
+
|
91
|
+
def get_token(facade)
|
92
|
+
token = @tokens[facade] || refresh_tokens[facade] || raise(BitPayError, "Not authorized for facade: #{facade}")
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
data/lib/bitpay/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitpay-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bitpay, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -215,6 +215,7 @@ extra_rdoc_files: []
|
|
215
215
|
files:
|
216
216
|
- ".gitignore"
|
217
217
|
- ".travis.yml"
|
218
|
+
- CHANGELOG.md
|
218
219
|
- GUIDE.md
|
219
220
|
- Gemfile
|
220
221
|
- LICENSE.md
|
@@ -232,6 +233,7 @@ files:
|
|
232
233
|
- lib/bitpay/cacert.pem
|
233
234
|
- lib/bitpay/client.rb
|
234
235
|
- lib/bitpay/key_utils.rb
|
236
|
+
- lib/bitpay/rest_connector.rb
|
235
237
|
- lib/bitpay/version.rb
|
236
238
|
- lib/bitpay_sdk.rb
|
237
239
|
- spec/client_spec.rb
|