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