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.
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 +59 -40
  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 -172
  55. data/lib/fintecture/pis.rb +0 -61
@@ -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
@@ -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