fintecture 0.1.9 → 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.
@@ -1,13 +1,14 @@
1
- module Fintecture
2
- module Api
3
- module Endpoints
4
- module Pis
5
- PIS = 'pis/v1'
6
- PISPROVIDER = "#{PIS}/provider"
7
- PISCUSTOMER = "#{PIS}/customer"
8
- PREPARE = "#{PIS}/prepare"
9
- PAYMENTS = "#{PIS}/payments"
10
- end
11
- end
12
- end
1
+ module Fintecture
2
+ module Api
3
+ module Endpoints
4
+ module Pis
5
+ PIS = 'pis/v2'
6
+ PISPROVIDER = "#{PIS}/provider"
7
+ PISCUSTOMER = "#{PIS}/customer"
8
+ REQUEST_TO_PAY = "#{PIS}/request-to-pay"
9
+ PAYMENTS = "#{PIS}/payments"
10
+ CONNECT = "#{PIS}/connect"
11
+ end
12
+ end
13
+ end
13
14
  end
@@ -1,76 +1,76 @@
1
- require 'json'
2
- require 'faraday'
3
-
4
- module Fintecture
5
- class Authentication
6
- class << self
7
-
8
- def authorize(redirect_uri, state = nil)
9
- query_string = "?#{{
10
- response_type: 'code',
11
- app_id: Fintecture.app_id,
12
- redirect_uri: redirect_uri,
13
- state: state
14
- }.map{|key, value| "#{key}=#{value}"}.join('&')}"
15
-
16
- ::Faraday.get "#{token_authorize_endpoint}#{query_string}"
17
- end
18
-
19
- def get_access_token(auth_code = nil)
20
- body = access_token_data auth_code
21
-
22
- Fintecture::Faraday::Authentication::Connection.post url: access_token_url, req_body: body
23
- end
24
-
25
- def refresh_token(refresh_token)
26
- body = refresh_token_data refresh_token
27
-
28
- Fintecture::Faraday::Authentication::Connection.post url: refresh_token_url, req_body: body
29
- end
30
-
31
- private
32
-
33
- def base_url
34
- Fintecture::Api::BaseUrl::FINTECTURE_OAUTH_URL[Fintecture.environment.to_sym]
35
- end
36
-
37
- def token_authorize_endpoint
38
- "#{base_url}#{Fintecture::Api::Endpoints::Authentication::OAUTH_TOKEN_AUTHORIZE}"
39
- end
40
-
41
- def access_token_url
42
- "#{base_url}#{Fintecture::Api::Endpoints::Authentication::OAUTH_ACCESS_TOKEN}"
43
- end
44
-
45
- def refresh_token_url
46
- "#{base_url}#{Fintecture::Api::Endpoints::Authentication::OAUTH_REFRESH_TOKEN}"
47
- end
48
-
49
- def access_token_data(auth_code)
50
- data = {
51
- scope: 'PIS',
52
- app_id: Fintecture.app_id,
53
- grant_type: 'client_credentials'
54
- }
55
-
56
- if auth_code
57
- data = {
58
- scope: 'AIS',
59
- code: auth_code,
60
- grant_type: 'authorization_code'
61
- }
62
- end
63
-
64
- data
65
- end
66
-
67
- def refresh_token_data(refresh_token)
68
- {
69
- grant_type: 'refresh_token',
70
- refresh_token: refresh_token
71
- }
72
- end
73
-
74
- end
75
- end
1
+ require 'json'
2
+ require 'faraday'
3
+
4
+ module Fintecture
5
+ class Authentication
6
+ class << self
7
+
8
+ def authorize(redirect_uri, state = nil)
9
+ query_string = "?#{{
10
+ response_type: 'code',
11
+ app_id: Fintecture.app_id,
12
+ redirect_uri: redirect_uri,
13
+ state: state
14
+ }.map{|key, value| "#{key}=#{value}"}.join('&')}"
15
+
16
+ ::Faraday.get "#{token_authorize_endpoint}#{query_string}"
17
+ end
18
+
19
+ def get_access_token(auth_code = nil)
20
+ body = access_token_data auth_code
21
+
22
+ Fintecture::Faraday::Authentication::Connection.post url: access_token_url, req_body: body
23
+ end
24
+
25
+ def refresh_token(refresh_token)
26
+ body = refresh_token_data refresh_token
27
+
28
+ Fintecture::Faraday::Authentication::Connection.post url: refresh_token_url, req_body: body
29
+ end
30
+
31
+ private
32
+
33
+ def base_url
34
+ Fintecture::Api::BaseUrl::FINTECTURE_OAUTH_URL[Fintecture.environment.to_sym]
35
+ end
36
+
37
+ def token_authorize_endpoint
38
+ "#{base_url}#{Fintecture::Api::Endpoints::Authentication::OAUTH_TOKEN_AUTHORIZE}"
39
+ end
40
+
41
+ def access_token_url
42
+ "#{base_url}#{Fintecture::Api::Endpoints::Authentication::OAUTH_ACCESS_TOKEN}"
43
+ end
44
+
45
+ def refresh_token_url
46
+ "#{base_url}#{Fintecture::Api::Endpoints::Authentication::OAUTH_REFRESH_TOKEN}"
47
+ end
48
+
49
+ def access_token_data(auth_code)
50
+ data = {
51
+ scope: 'PIS',
52
+ app_id: Fintecture.app_id,
53
+ grant_type: 'client_credentials'
54
+ }
55
+
56
+ if auth_code
57
+ data = {
58
+ scope: 'AIS',
59
+ code: auth_code,
60
+ grant_type: 'authorization_code'
61
+ }
62
+ end
63
+
64
+ data
65
+ end
66
+
67
+ def refresh_token_data(refresh_token)
68
+ {
69
+ grant_type: 'refresh_token',
70
+ refresh_token: refresh_token
71
+ }
72
+ end
73
+
74
+ end
75
+ end
76
76
  end
@@ -1,220 +1,38 @@
1
- require 'base64'
2
- require 'json'
3
- require 'faraday'
4
- require 'fintecture/pis'
5
- require 'fintecture/utils/validation'
6
- require 'fintecture/exceptions'
7
- require 'fintecture/utils/date'
8
- require 'fintecture/utils/constants'
9
-
10
- module Fintecture
11
- class Connect
12
- class << self
13
- SIGNATURE_TYPE = 'rsa-sha256'.freeze
14
-
15
- def get_pis_connect(access_token = nil, payment_attrs = nil)
16
- connect_url(access_token, payment_attrs, type: 'pis')
17
- end
18
-
19
- def connect_url(access_token = nil, payment_attrs = nil, type: nil)
20
- @access_token = access_token
21
- @payment_attrs = as_json payment_attrs
22
- @type = type
23
-
24
- validate_payment_integrity
25
-
26
- @payment_attrs['end_to_end_id'] ||= Fintecture::Utils::Crypto.generate_uuid_only_chars
27
- @payment_attrs['amount'] = @payment_attrs['amount'].to_s
28
-
29
- payload = build_payload
30
- config = build_config(payload).to_json.to_s
31
-
32
- {
33
- url: build_url(config),
34
- session_id: payload[:meta][:session_id]
35
- }
36
- end
37
-
38
- def verify_url_parameters(parameters = nil)
39
- @post_payment_attrs = as_json parameters
40
-
41
- validate_post_payment_integrity
42
-
43
- decrypted = Fintecture::Utils::Crypto.decrypt_private @post_payment_attrs['s']
44
- local_digest = build_local_digest @post_payment_attrs
45
-
46
- decrypted == local_digest
47
- end
48
-
49
- private
50
-
51
- def build_url(config)
52
- "#{base_url}/#{@type}/#{@payment_attrs['psu_type']}/#{@payment_attrs['country']}?config=#{Base64.strict_encode64(config)}"
53
- end
54
-
55
- def validate_payment_integrity
56
- Fintecture::Utils::Validation.raise_if_klass_mismatch @payment_attrs, Hash, 'payment_attrs'
57
-
58
- raise Fintecture::ValidationException.new("access_token is a mandatory field") if @access_token.nil?
59
-
60
- @payment_attrs['psu_type'] = 'retail' unless @payment_attrs['psu_type']
61
- @payment_attrs['country'] = 'all' unless @payment_attrs['country']
62
-
63
- error_msg = 'invalid payment payload parameter'
64
-
65
- raise Fintecture::ValidationException.new("#{error_msg} type") unless Fintecture::Utils::Constants::SCOPES.include? @type
66
- raise Fintecture::ValidationException.new("#{@payment_attrs['psu_type']} PSU type not allowed") unless Fintecture::Utils::Constants::PSU_TYPES.include? @payment_attrs['psu_type']
67
-
68
- raise Fintecture::ValidationException.new('end_to_end_id must be an alphanumeric string') if(@payment_attrs['end_to_end_id'] && !@payment_attrs['end_to_end_id'].match(/^[0-9a-zA-Z]*$/))
69
- Fintecture::Utils::Validation.raise_if_invalid_date_format(@payment_attrs['execution_date']) if(@payment_attrs['execution_date'])
70
-
71
- %w[amount currency customer_full_name customer_email customer_ip redirect_uri].each do |param|
72
- raise Fintecture::ValidationException.new("#{param} is a mandatory field") if @payment_attrs[param].nil?
73
- end
74
-
75
- # Check if string
76
- %w[communication redirect_uri provider customer_phone].each do |param|
77
- Fintecture::Utils::Validation.raise_if_klass_mismatch(@payment_attrs[param], String, param) if(@payment_attrs[param])
78
- end
79
-
80
- # Check customer_address structure
81
- Fintecture::Utils::Validation.raise_if_klass_mismatch(@payment_attrs['customer_address'], Hash) if(@payment_attrs['customer_address'])
82
-
83
- raise Fintecture::ValidationException.new('customer_address country must be a 2 letters string') if(@payment_attrs['customer_address'] && @payment_attrs['customer_address']['country'] && !@payment_attrs['customer_address']['country'].match(/^[a-zA-Z]{2}$/))
84
-
85
- %w[street number complement zip city country].each do |param|
86
- Fintecture::Utils::Validation.raise_if_klass_mismatch(@payment_attrs['customer_address'][param], String, param) if(@payment_attrs['customer_address'] && @payment_attrs['customer_address'][param])
87
- end
88
-
89
- # Check beneficiary structure
90
-
91
- Fintecture::Utils::Validation.raise_if_klass_mismatch(@payment_attrs['beneficiary'], Hash) if(@payment_attrs['beneficiary'])
92
-
93
- %w[name street city iban swift_bic].each do |param|
94
- raise Fintecture::ValidationException.new("beneficiary #{param} is a mandatory field") if @payment_attrs['beneficiary'] && @payment_attrs['beneficiary'][param].nil?
95
- end
96
-
97
- raise Fintecture::ValidationException.new('beneficiary country must be a 2 letters string') if(@payment_attrs['beneficiary'] && @payment_attrs['beneficiary']['country'] && !@payment_attrs['beneficiary']['country'].match(/^[a-zA-Z]{2}$/))
98
-
99
- %w[name street number complement zip city country iban swift_bic bank_name].each do |param|
100
- Fintecture::Utils::Validation.raise_if_klass_mismatch(@payment_attrs['beneficiary'][param], String, param) if(@payment_attrs['beneficiary'] && @payment_attrs['beneficiary'][param])
101
- end
102
- end
103
-
104
- def validate_post_payment_integrity
105
- Fintecture::Utils::Validation.raise_if_klass_mismatch @post_payment_attrs, Hash, 'post_payment_attrs'
106
-
107
- %w[s state status session_id customer_id provider].each do |param|
108
- raise Fintecture::ValidationException.new("invalid post payment parameter #{param}") if @post_payment_attrs[param].nil?
109
- end
110
- end
111
-
112
- def build_payload
113
- attributes = {
114
- amount: @payment_attrs['amount'],
115
- currency: @payment_attrs['currency'],
116
- communication: @payment_attrs['communication'],
117
- end_to_end_id: @payment_attrs['end_to_end_id'],
118
- execution_date: @payment_attrs['execution_date'],
119
- provider: @payment_attrs['provider']
120
- }
121
-
122
- if @payment_attrs['beneficiary']
123
- attributes['beneficiary'] = {
124
- name: @payment_attrs['beneficiary']['name'],
125
- street: @payment_attrs['beneficiary']['street'],
126
- number: @payment_attrs['beneficiary']['number'],
127
- complement: @payment_attrs['beneficiary']['complement'],
128
- zip: @payment_attrs['beneficiary']['zip'],
129
- city: @payment_attrs['beneficiary']['city'],
130
- country: @payment_attrs['beneficiary']['country'],
131
- iban: @payment_attrs['beneficiary']['iban'],
132
- swift_bic: @payment_attrs['beneficiary']['swift_bic'],
133
- bank_name: @payment_attrs['beneficiary']['bank_name']
134
- }
135
- end
136
-
137
- meta = {
138
- psu_name: @payment_attrs['customer_full_name'],
139
- psu_email: @payment_attrs['customer_email'],
140
- psu_ip: @payment_attrs['customer_ip'],
141
- psu_phone: @payment_attrs['customer_phone'],
142
- psu_address: @payment_attrs['customer_address']
143
- }
144
-
145
- data = {
146
- type: 'PAYMENT',
147
- attributes: attributes,
148
- }
149
-
150
- prepare_payment_response = Fintecture::Pis.prepare_payment( @access_token, {
151
- data: data,
152
- meta: meta
153
- })
154
- prepare_payment_response_body = JSON.parse(prepare_payment_response.body)
155
- data_attributes = {amount: @payment_attrs['amount'], currency: @payment_attrs['currency']}
156
- data_attributes[:execution_date] = @payment_attrs['execution_date'] if @payment_attrs['execution_date']
157
- data_attributes[:beneficiary] = { name: @payment_attrs['beneficiary']['name'] } if @payment_attrs['beneficiary'] && @payment_attrs['beneficiary']['name']
158
- {
159
- meta: {session_id: prepare_payment_response_body['meta']['session_id']},
160
- data: { attributes: data_attributes}
161
- }
162
- end
163
-
164
- def build_signature(payload, date, x_request_id)
165
- date_string = "x-date: #{date}"
166
- digest_string = "digest: SHA-256=#{Fintecture::Utils::Crypto.hash_base64(payload.to_json)}"
167
- x_request_id_string = "x-request-id: #{x_request_id}"
168
-
169
- Fintecture::Utils::Crypto.sign_payload "#{digest_string}\n#{date_string}\n#{x_request_id_string}"
170
- end
171
-
172
- def build_config(payload)
173
- header_time = Fintecture::Utils::Date.header_time
174
- x_request_id = Fintecture::Utils::Crypto.generate_uuid
175
- config = {
176
- app_id: Fintecture.app_id,
177
- access_token: @access_token,
178
- date: header_time,
179
- request_id: x_request_id,
180
- signature_type: SIGNATURE_TYPE,
181
- signature: build_signature(payload, header_time, x_request_id),
182
- redirect_uri: @payment_attrs['redirect_uri'] || '',
183
- origin_uri: @payment_attrs['origin_uri'] || '',
184
- state: @payment_attrs['state'],
185
- payload: payload
186
- }
187
- config[:provider] = @payment_attrs['provider'] if @payment_attrs['provider']
188
- config
189
- end
190
-
191
- def build_local_digest(parameters)
192
- test_string = {
193
- app_id: Fintecture.app_id,
194
- app_secret: Fintecture.app_secret,
195
- session_id: parameters['session_id'],
196
- status: parameters['status'],
197
- customer_id: parameters['customer_id'],
198
- provider: parameters['provider'],
199
- state: parameters['state']
200
- }.map{|key, value| "#{key}=#{value}"}.join('&')
201
-
202
- Fintecture::Utils::Crypto.hash_base64 test_string
203
- end
204
-
205
- def base_url
206
- Fintecture::Api::BaseUrl::FINTECTURE_CONNECT_URL[Fintecture.environment.to_sym]
207
- end
208
-
209
- def as_json(element)
210
- return JSON(element.to_json) if element.is_a? Hash
211
-
212
- begin
213
- element.as_json
214
- rescue NoMethodError
215
- raise Fintecture::ValidationException.new("invalid parameter format, the parameter should be a Hash or an Object Model instead a #{element.class.name}")
216
- end
217
- end
218
- end
219
- end
1
+ require 'base64'
2
+ require 'json'
3
+ require 'faraday'
4
+ require 'fintecture/pis'
5
+ require 'fintecture/utils/validation'
6
+ require 'fintecture/exceptions'
7
+ require 'fintecture/utils/date'
8
+ require 'fintecture/utils/constants'
9
+
10
+ module Fintecture
11
+ class Connect
12
+ class << self
13
+
14
+
15
+
16
+ # Build the base of url
17
+ def api_base_url
18
+ Fintecture::Api::BaseUrl::FINTECTURE_API_URL[Fintecture.environment.to_sym]
19
+ end
20
+
21
+
22
+ private
23
+
24
+
25
+
26
+
27
+ def as_json(element)
28
+ return JSON(element.to_json) if element.is_a? Hash
29
+
30
+ begin
31
+ element.as_json
32
+ rescue NoMethodError
33
+ raise Fintecture::ValidationException.new("invalid parameter format, the parameter should be a Hash or an Object Model instead a #{element.class.name}")
34
+ end
35
+ end
36
+ end
37
+ end
220
38
  end
@@ -1,4 +1,33 @@
1
- module Fintecture
2
- class ValidationException < Exception; end
3
- class CryptoException < Exception; end
1
+ module Fintecture
2
+ class ValidationException < Exception; end
3
+ class CryptoException < Exception; end
4
+ class ApiException
5
+ class << self
6
+
7
+ def error(res)
8
+ body = JSON.parse res.body
9
+
10
+ code = body['code']
11
+ log_id = body['log_id']
12
+ errors = body['errors']
13
+
14
+ raise Exception.new(_construct_message(res.status, code, log_id, errors))
15
+ end
16
+
17
+
18
+ private
19
+ def _construct_message(status, code, log_id, errors_array)
20
+ error_string = "\nFintecture server errors : "
21
+ error_string += "\n status: #{status} "
22
+ error_string += "\n code: #{code}"
23
+ error_string += "\n id : #{log_id}"
24
+ errors_array.each do |error|
25
+ formated_error = error.map {|key,value| " #{key}: #{value}"}.join("\n")
26
+ error_string += "\n\n#{formated_error}"
27
+ end
28
+ error_string += "\n\n"
29
+ error_string
30
+ end
31
+ end
32
+ end
4
33
  end
@@ -1,74 +1,120 @@
1
- require 'base64'
2
- require 'faraday'
3
- require 'uri'
4
- require 'fintecture/utils/crypto'
5
- require 'fintecture/utils/date'
6
-
7
- module Fintecture
8
- module Faraday
9
- module Authentication
10
- class Connection
11
- class << self
12
-
13
- def connection(url)
14
- ::Faraday.new(url: url) do |faraday|
15
- faraday.request :url_encoded
16
- faraday.adapter ::Faraday.default_adapter
17
- end
18
- end
19
-
20
- def post(url:, req_body: nil, custom_content_type: nil, bearer: nil, secure_headers: false)
21
- conn = connection(url)
22
-
23
- conn.post do |req|
24
- req.headers = req_headers(custom_content_type, bearer, secure_headers, method: 'post', body: req_body, url: url)
25
- req.body = req_body
26
- end
27
- end
28
-
29
- def get(url:, req_body: nil, custom_content_type: nil, bearer: nil, secure_headers: false)
30
- conn = connection(url)
31
-
32
- conn.get do |req|
33
- req.headers = req_headers(custom_content_type, bearer, secure_headers, method: 'get', url: url)
34
- req.body = req_body
35
- end
36
- end
37
-
38
- def req_headers(custom_content_type, bearer, secure_headers, method: '', body: {}, url:)
39
- client_token = Base64.strict_encode64("#{Fintecture.app_id}:#{Fintecture.app_secret}")
40
-
41
- {
42
- 'Accept' => 'application/json',
43
- 'User-Agent' => "Fintecture Ruby SDK v #{Fintecture::VERSION}",
44
- 'Authorization' => bearer ? bearer : "Basic #{client_token}",
45
- 'Content-Type' => custom_content_type ? custom_content_type : 'application/x-www-form-urlencoded',
46
- }.merge(secure_headers ? req_secure_headers(body: body, url: url, method: method) : {})
47
-
48
- end
49
-
50
- def req_secure_headers(body: {}, url: '', method: '')
51
- payload = ( body.class.name == 'String' ? body : body.to_s )
52
- path_name = URI(url).path
53
- search_params = URI(url).query
54
-
55
- headers = {
56
- 'Date' => Fintecture::Utils::Date.header_time.to_s,
57
- 'X-Request-ID' => Fintecture::Utils::Crypto.generate_uuid
58
- }.merge(payload ? load_digest(payload) : {})
59
-
60
- request_target = search_params ? "#{method.downcase} #{path_name}?#{search_params}" : "#{method.downcase} #{path_name}"
61
-
62
- headers['Signature'] = Fintecture::Utils::Crypto.create_signature_header({'(request-target)' => request_target}.merge(headers))
63
- headers
64
- end
65
-
66
- def load_digest(payload)
67
- {'Digest' => "SHA-256=#{Fintecture::Utils::Crypto.hash_base64(payload)}"}
68
- end
69
-
70
- end
71
- end
72
- end
73
- end
74
- end
1
+ require 'base64'
2
+ require 'faraday'
3
+ require 'uri'
4
+ require 'fintecture/utils/crypto'
5
+ require 'fintecture/utils/date'
6
+
7
+ module Fintecture
8
+ module Faraday
9
+ module Authentication
10
+ class Connection
11
+ class << self
12
+
13
+ def connection(url)
14
+ ::Faraday.new(url: url) do |faraday|
15
+ faraday.request :url_encoded
16
+ faraday.adapter ::Faraday.default_adapter
17
+ end
18
+ end
19
+
20
+ def post(url:, req_body: nil, custom_content_type: nil, bearer: nil, secure_headers: false, additional_headers: nil)
21
+ conn = connection(url)
22
+
23
+ res = conn.post do |req|
24
+ req.options.params_encoder = Faraday::DisabledEncoder
25
+ req.headers = req_headers(custom_content_type, bearer, secure_headers, additional_headers, method: 'post', body: req_body, url: url)
26
+ req.body = req_body
27
+ end
28
+
29
+ !res.success? ? Fintecture::ApiException.error(res) : res
30
+ end
31
+
32
+ def get(url:, req_body: nil, custom_content_type: nil, bearer: nil, secure_headers: false, additional_headers: nil)
33
+ conn = connection(url)
34
+
35
+ res = conn.get do |req|
36
+ req.options.params_encoder = Faraday::DisabledEncoder
37
+ req.headers = req_headers(custom_content_type, bearer, secure_headers, additional_headers, method: 'get', url: url)
38
+ req.body = req_body
39
+ end
40
+
41
+ !res.success? ? Fintecture::ApiException.error(res) : res
42
+ end
43
+
44
+ def req_headers(custom_content_type, bearer, secure_headers, additional_headers, method: '', body: {}, url:)
45
+
46
+ client_token = Base64.strict_encode64("#{Fintecture.app_id}:#{Fintecture.app_secret}")
47
+
48
+ {
49
+ 'Accept' => 'application/json',
50
+ 'User-Agent' => "Fintecture Ruby SDK v #{Fintecture::VERSION}",
51
+ 'Authorization' => bearer ? bearer : "Basic #{client_token}",
52
+ 'Content-Type' => custom_content_type ? custom_content_type : 'application/x-www-form-urlencoded',
53
+ }.merge(secure_headers ? req_secure_headers(additional_headers, body: body, url: url, method: method) : {})
54
+
55
+ end
56
+
57
+ def req_secure_headers(additional_headers, body: {}, url: '', method: '')
58
+ raise Fintecture::ValidationException.new('additional_headers must be an object') if additional_headers != nil && !additional_headers.is_a?(Hash)
59
+
60
+ payload = ( body.class.name == 'String' ? body : body.to_s )
61
+ path_name = URI(url).path
62
+ search_params = URI(url).query
63
+
64
+
65
+ request_target = search_params ? "#{method.downcase} #{path_name}?#{search_params}" : "#{method.downcase} #{path_name}"
66
+ date = Fintecture::Utils::Date.header_time.to_s
67
+ digest = load_digest(payload)
68
+ x_request_id = Fintecture::Utils::Crypto.generate_uuid
69
+
70
+
71
+ headers = {
72
+ 'Date' => date,
73
+ 'X-Request-ID' => x_request_id
74
+ }.merge(payload ? digest : {})
75
+
76
+ # Add additional_headers if exists
77
+ headers = headers.merge(additional_headers) if additional_headers != nil
78
+
79
+
80
+ headers['Signature'] = Fintecture::Utils::Crypto.create_signature_header({'(request-target)' => request_target}.merge(headers))
81
+ headers
82
+ end
83
+
84
+ def load_digest(payload)
85
+ {'Digest' => "SHA-256=#{Fintecture::Utils::Crypto.hash_base64(payload)}"}
86
+ end
87
+
88
+ end
89
+ end
90
+ end
91
+
92
+
93
+ module DisabledEncoder
94
+ class << self
95
+ extend Forwardable
96
+ def_delegators :'Faraday::Utils', :escape, :unescape
97
+ end
98
+
99
+
100
+ def self.encode(params)
101
+ return nil if params.nil?
102
+
103
+ query_string = "#{params.map{|key, value| "#{key}=#{value}"}.join('&')}"
104
+
105
+ end
106
+
107
+
108
+
109
+ class << self
110
+ attr_accessor :sort_params
111
+ end
112
+
113
+ # Useful default for OAuth and caching.
114
+ @sort_params = true
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+