fintecture 0.1.7 → 0.3.0
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/.gitignore +17 -16
- data/.rspec +3 -3
- data/.travis.yml +7 -7
- data/CODE_OF_CONDUCT.md +74 -74
- data/Gemfile +8 -6
- data/Gemfile.lock +59 -40
- data/LICENSE.txt +674 -674
- data/README.md +404 -121
- data/Rakefile +8 -6
- data/bin/console +15 -14
- data/bin/setup +8 -8
- data/exemples/ais.rb +53 -0
- data/exemples/config_ais.json +8 -0
- data/exemples/config_pis.json +6 -0
- data/exemples/pis.rb +148 -0
- data/exemples/ressources.rb +23 -0
- data/fintecture.gemspec +44 -43
- data/lib/fintecture/ais_client.rb +94 -0
- data/lib/fintecture/api/ais/account_holders.rb +61 -0
- data/lib/fintecture/api/ais/accounts.rb +63 -0
- data/lib/fintecture/api/ais/authorize.rb +72 -0
- data/lib/fintecture/api/ais/authorize_decoupled.rb +68 -0
- data/lib/fintecture/api/ais/connect.rb +65 -0
- data/lib/fintecture/api/ais/delete_customer.rb +53 -0
- data/lib/fintecture/api/ais/transactions.rb +64 -0
- data/lib/fintecture/{authentication.rb → api/auth/authentication.rb} +78 -76
- data/lib/fintecture/api/pis/connect.rb +77 -0
- data/lib/fintecture/api/pis/initiate.rb +52 -0
- data/lib/fintecture/api/pis/payments.rb +48 -0
- data/lib/fintecture/api/pis/refund.rb +67 -0
- data/lib/fintecture/api/pis/request_to_pay.rb +63 -0
- data/lib/fintecture/api/pis/settlements.rb +48 -0
- data/lib/fintecture/api/ressources/applications.rb +57 -0
- data/lib/fintecture/api/ressources/providers.rb +61 -0
- data/lib/fintecture/api/ressources/test_accounts.rb +60 -0
- data/lib/fintecture/base_url.rb +26 -0
- data/lib/fintecture/endpoints/ais.rb +17 -0
- data/lib/fintecture/{api/endpoints → endpoints}/authentication.rb +13 -13
- data/lib/fintecture/endpoints/pis.rb +16 -0
- data/lib/fintecture/endpoints/ressources.rb +13 -0
- data/lib/fintecture/exceptions.rb +72 -4
- data/lib/fintecture/faraday/authentication/connection.rb +140 -74
- data/lib/fintecture/pis_client.rb +100 -0
- data/lib/fintecture/utils/constants.rb +11 -14
- data/lib/fintecture/utils/crypto.rb +75 -76
- data/lib/fintecture/utils/date.rb +15 -15
- data/lib/fintecture/utils/validation.rb +32 -17
- data/lib/fintecture/version.rb +5 -3
- data/lib/fintecture.rb +65 -82
- metadata +35 -13
- data/lib/fintecture/api/base_url.rb +0 -28
- data/lib/fintecture/api/endpoints/pis.rb +0 -13
- data/lib/fintecture/connect.rb +0 -172
- data/lib/fintecture/pis.rb +0 -61
data/lib/fintecture/connect.rb
DELETED
@@ -1,172 +0,0 @@
|
|
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
|
-
|
28
|
-
payload = build_payload
|
29
|
-
config = build_config(payload).to_json.to_s
|
30
|
-
|
31
|
-
{
|
32
|
-
url: build_url(config),
|
33
|
-
session_id: payload[:meta][:session_id]
|
34
|
-
}
|
35
|
-
end
|
36
|
-
|
37
|
-
def verify_url_parameters(parameters = nil)
|
38
|
-
@post_payment_attrs = as_json parameters
|
39
|
-
|
40
|
-
validate_post_payment_integrity
|
41
|
-
|
42
|
-
decrypted = Fintecture::Utils::Crypto.decrypt_private @post_payment_attrs['s']
|
43
|
-
local_digest = build_local_digest @post_payment_attrs
|
44
|
-
|
45
|
-
decrypted == local_digest
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
def build_url(config)
|
51
|
-
"#{base_url}/#{@type}/#{@payment_attrs['psu_type']}/#{@payment_attrs['country']}?config=#{Base64.strict_encode64(config)}"
|
52
|
-
end
|
53
|
-
|
54
|
-
def validate_payment_integrity
|
55
|
-
Fintecture::Utils::Validation.raise_if_klass_mismatch @payment_attrs, Hash, 'payment_attrs'
|
56
|
-
|
57
|
-
raise Fintecture::ValidationException.new("access_token is a mandatory field") if @access_token.nil?
|
58
|
-
|
59
|
-
@payment_attrs['psu_type'] = 'retail' unless @payment_attrs['psu_type']
|
60
|
-
@payment_attrs['country'] = 'all' unless @payment_attrs['country']
|
61
|
-
|
62
|
-
error_msg = 'invalid payment payload parameter'
|
63
|
-
|
64
|
-
raise Fintecture::ValidationException.new("#{error_msg} type") unless Fintecture::Utils::Constants::SCOPES.include? @type
|
65
|
-
raise Fintecture::ValidationException.new("#{@payment_attrs['psu_type']} PSU type not allowed") unless Fintecture::Utils::Constants::PSU_TYPES.include? @payment_attrs['psu_type']
|
66
|
-
|
67
|
-
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]*$/))
|
68
|
-
|
69
|
-
%w[amount currency customer_full_name customer_email customer_ip redirect_uri].each do |param|
|
70
|
-
raise Fintecture::ValidationException.new("#{param} is a mandatory field") if @payment_attrs[param].nil?
|
71
|
-
end
|
72
|
-
|
73
|
-
# Check if string
|
74
|
-
%w[communication redirect_uri].each do |param|
|
75
|
-
Fintecture::Utils::Validation.raise_if_klass_mismatch(@payment_attrs[param], String, param) if(@payment_attrs[param])
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
def validate_post_payment_integrity
|
81
|
-
Fintecture::Utils::Validation.raise_if_klass_mismatch @post_payment_attrs, Hash, 'post_payment_attrs'
|
82
|
-
|
83
|
-
%w[s state status session_id customer_id provider].each do |param|
|
84
|
-
raise Fintecture::ValidationException.new("invalid post payment parameter #{param}") if @post_payment_attrs[param].nil?
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def build_payload
|
89
|
-
attributes = {
|
90
|
-
amount: @payment_attrs['amount'],
|
91
|
-
currency: @payment_attrs['currency'],
|
92
|
-
communication: @payment_attrs['communication'],
|
93
|
-
end_to_end_id: @payment_attrs['end_to_end_id']
|
94
|
-
}
|
95
|
-
|
96
|
-
meta = {
|
97
|
-
psu_name: @payment_attrs['customer_full_name'],
|
98
|
-
psu_email: @payment_attrs['customer_email'],
|
99
|
-
psu_ip: @payment_attrs['customer_ip']
|
100
|
-
}
|
101
|
-
|
102
|
-
data = {
|
103
|
-
type: 'PAYMENT',
|
104
|
-
attributes: attributes,
|
105
|
-
}
|
106
|
-
|
107
|
-
prepare_payment_response = Fintecture::Pis.prepare_payment( @access_token, {
|
108
|
-
data: data,
|
109
|
-
meta: meta
|
110
|
-
})
|
111
|
-
prepare_payment_response_body = JSON.parse(prepare_payment_response.body)
|
112
|
-
{
|
113
|
-
meta: {session_id: prepare_payment_response_body['meta']['session_id']},
|
114
|
-
data: { attributes: {amount: @payment_attrs['amount'], currency: @payment_attrs['currency']}}
|
115
|
-
}
|
116
|
-
end
|
117
|
-
|
118
|
-
def build_signature(payload, date, x_request_id)
|
119
|
-
date_string = "x-date: #{date}"
|
120
|
-
digest_string = "digest: SHA-256=#{Fintecture::Utils::Crypto.hash_base64(payload.to_json)}"
|
121
|
-
x_request_id_string = "x-request-id: #{x_request_id}"
|
122
|
-
|
123
|
-
Fintecture::Utils::Crypto.sign_payload "#{digest_string}\n#{date_string}\n#{x_request_id_string}"
|
124
|
-
end
|
125
|
-
|
126
|
-
def build_config(payload)
|
127
|
-
header_time = Fintecture::Utils::Date.header_time
|
128
|
-
x_request_id = Fintecture::Utils::Crypto.generate_uuid
|
129
|
-
{
|
130
|
-
app_id: Fintecture.app_id,
|
131
|
-
access_token: @access_token,
|
132
|
-
date: header_time,
|
133
|
-
request_id: x_request_id,
|
134
|
-
signature_type: SIGNATURE_TYPE,
|
135
|
-
signature: build_signature(payload, header_time, x_request_id),
|
136
|
-
redirect_uri: @payment_attrs['redirect_uri'] || '',
|
137
|
-
origin_uri: @payment_attrs['origin_uri'] || '',
|
138
|
-
state: @payment_attrs['state'],
|
139
|
-
payload: payload
|
140
|
-
}
|
141
|
-
end
|
142
|
-
|
143
|
-
def build_local_digest(parameters)
|
144
|
-
test_string = {
|
145
|
-
app_id: Fintecture.app_id,
|
146
|
-
app_secret: Fintecture.app_secret,
|
147
|
-
session_id: parameters['session_id'],
|
148
|
-
status: parameters['status'],
|
149
|
-
customer_id: parameters['customer_id'],
|
150
|
-
provider: parameters['provider'],
|
151
|
-
state: parameters['state']
|
152
|
-
}.map{|key, value| "#{key}=#{value}"}.join('&')
|
153
|
-
|
154
|
-
Fintecture::Utils::Crypto.hash_base64 test_string
|
155
|
-
end
|
156
|
-
|
157
|
-
def base_url
|
158
|
-
Fintecture::Api::BaseUrl::FINTECTURE_CONNECT_URL[Fintecture.environment.to_sym]
|
159
|
-
end
|
160
|
-
|
161
|
-
def as_json(element)
|
162
|
-
return JSON(element.to_json) if element.is_a? Hash
|
163
|
-
|
164
|
-
begin
|
165
|
-
element.as_json
|
166
|
-
rescue NoMethodError
|
167
|
-
raise Fintecture::ValidationException.new("invalid parameter format, the parameter should be a Hash or an Object Model instead a #{element.class.name}")
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
data/lib/fintecture/pis.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'faraday'
|
3
|
-
require 'fintecture/api/endpoints/pis'
|
4
|
-
require 'fintecture/api/base_url'
|
5
|
-
|
6
|
-
module Fintecture
|
7
|
-
class Pis
|
8
|
-
class << self
|
9
|
-
|
10
|
-
# Headers
|
11
|
-
def prepare_payment(access_token, payload)
|
12
|
-
url = prepare_payment_endpoint
|
13
|
-
|
14
|
-
Fintecture::Faraday::Authentication::Connection.post(
|
15
|
-
url: url,
|
16
|
-
req_body: payload.to_json,
|
17
|
-
custom_content_type: 'application/json',
|
18
|
-
bearer: "Bearer #{access_token}",
|
19
|
-
secure_headers: true
|
20
|
-
)
|
21
|
-
end
|
22
|
-
|
23
|
-
# This needs headers
|
24
|
-
def get_payments(access_token, session_id)
|
25
|
-
url = payment_endpoint
|
26
|
-
|
27
|
-
Fintecture::Faraday::Authentication::Connection.get(
|
28
|
-
url: "#{url}/#{session_id}",
|
29
|
-
custom_content_type: 'application/json',
|
30
|
-
bearer: "Bearer #{access_token}",
|
31
|
-
secure_headers: true
|
32
|
-
)
|
33
|
-
end
|
34
|
-
|
35
|
-
def get_access_token
|
36
|
-
response = Fintecture::Authentication.get_access_token
|
37
|
-
|
38
|
-
JSON.parse response.body
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def prepare_payment_endpoint
|
44
|
-
"#{api_base_url}/#{Fintecture::Api::Endpoints::Pis::PREPARE}"
|
45
|
-
end
|
46
|
-
|
47
|
-
def payment_endpoint
|
48
|
-
"#{api_base_url}/#{Fintecture::Api::Endpoints::Pis::PAYMENTS}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def base_url
|
52
|
-
Fintecture::Api::BaseUrl::FINTECTURE_CONNECT_URL[Fintecture.environment.to_sym]
|
53
|
-
end
|
54
|
-
|
55
|
-
def api_base_url
|
56
|
-
Fintecture::Api::BaseUrl::FINTECTURE_API_URL[Fintecture.environment.to_sym]
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|