devtech-culqi-ruby 1.0.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 +7 -0
- data/lib/culqi/card.rb +16 -0
- data/lib/culqi/charge.rb +22 -0
- data/lib/culqi/customer.rb +17 -0
- data/lib/culqi/event.rb +14 -0
- data/lib/culqi/iins.rb +14 -0
- data/lib/culqi/order.rb +18 -0
- data/lib/culqi/plan.rb +16 -0
- data/lib/culqi/refund.rb +15 -0
- data/lib/culqi/subscription.rb +16 -0
- data/lib/culqi/token.rb +37 -0
- data/lib/culqi/transfer.rb +14 -0
- data/lib/culqi/version.rb +3 -0
- data/lib/culqi/yape.rb +13 -0
- data/lib/culqi-ruby.rb +38 -0
- data/lib/operation/confirm_type.rb +24 -0
- data/lib/operation/delete.rb +19 -0
- data/lib/operation/get.rb +57 -0
- data/lib/operation/list.rb +64 -0
- data/lib/operation/post.rb +79 -0
- data/lib/operation/update.rb +22 -0
- data/lib/util/connect.rb +54 -0
- data/lib/util/country-codes.rb +22 -0
- data/lib/util/encrypt-data.rb +49 -0
- data/lib/util/validation/card.rb +36 -0
- data/lib/util/validation/charge.rb +129 -0
- data/lib/util/validation/customer.rb +39 -0
- data/lib/util/validation/error.rb +17 -0
- data/lib/util/validation/helper.rb +40 -0
- data/lib/util/validation/order.rb +76 -0
- data/lib/util/validation/plan.rb +69 -0
- data/lib/util/validation/refund.rb +45 -0
- data/lib/util/validation/subscription.rb +24 -0
- data/lib/util/validation/token.rb +65 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1346bcb588645112bbe6080b3ebde93145a8e8c3a0b2873db89bd4e41f6bae73
|
4
|
+
data.tar.gz: c709059c9a760f8cbb914bfabcce72accf1a37192d43516f4daa6278ab33fe17
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0f284d15d5db55c33291dc6db8f75d91b53d950afd4ccf40f6da9d957922e093d439329c130c99c8f1ec80e9a21bd5a9d63a413dc15ccba3f21232831e6e680f
|
7
|
+
data.tar.gz: 53a020ded450c0db3a9deeb1d70cb8486e4115396b0a2dd26b8d416fcf21926dc4c6d43ec3132c80ef9ea43df0c0dafd59ec1c997739bf7a8dfe2da16ba07c56
|
data/lib/culqi/card.rb
ADDED
data/lib/culqi/charge.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Culqi
|
2
|
+
|
3
|
+
class Charge
|
4
|
+
|
5
|
+
extend List
|
6
|
+
extend Post
|
7
|
+
extend Get
|
8
|
+
|
9
|
+
URL = '/charges/'
|
10
|
+
|
11
|
+
@url = URL
|
12
|
+
|
13
|
+
def self.capture(id)
|
14
|
+
response, statuscode = Culqi.connect("#{@url}#{id}/capture/", Culqi.secret_key, nil, "post", Culqi::READ_TIMEOUT)
|
15
|
+
Rails.logger.info "Culqi::Charge.capture: #{response}"
|
16
|
+
Rails.logger.info "Culqi::Charge.capture: #{statuscode}"
|
17
|
+
return response, statuscode
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/culqi/event.rb
ADDED
data/lib/culqi/iins.rb
ADDED
data/lib/culqi/order.rb
ADDED
data/lib/culqi/plan.rb
ADDED
data/lib/culqi/refund.rb
ADDED
data/lib/culqi/token.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'util/validation/token'
|
2
|
+
require 'util/validation/error'
|
3
|
+
|
4
|
+
|
5
|
+
module Culqi
|
6
|
+
|
7
|
+
class Token
|
8
|
+
|
9
|
+
extend List
|
10
|
+
extend Post
|
11
|
+
extend Get
|
12
|
+
|
13
|
+
URL = '/tokens/'
|
14
|
+
|
15
|
+
@url = URL
|
16
|
+
|
17
|
+
def self.createYape(params={}, rsa_key='', rsa_id='')
|
18
|
+
begin
|
19
|
+
key = ''
|
20
|
+
puts params
|
21
|
+
if @url.include? 'token'
|
22
|
+
TokenValidation.create_token_yape_validation(params)
|
23
|
+
if(rsa_key != '')
|
24
|
+
params = Encrypt.encrypt_with_aes_rsa(params, rsa_key, true)
|
25
|
+
end
|
26
|
+
key = Culqi.public_key
|
27
|
+
response, statuscode = Culqi.connect(@url, key, params, 'post', Culqi::READ_TIMEOUT, true, rsa_id)
|
28
|
+
return response, statuscode
|
29
|
+
end
|
30
|
+
rescue CustomException => e
|
31
|
+
return e.message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/culqi/yape.rb
ADDED
data/lib/culqi-ruby.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'operation/list'
|
2
|
+
require 'operation/get'
|
3
|
+
require 'operation/post'
|
4
|
+
require 'operation/delete'
|
5
|
+
require 'operation/update'
|
6
|
+
require 'operation/confirm_type'
|
7
|
+
|
8
|
+
require 'culqi/version'
|
9
|
+
require 'culqi/iins'
|
10
|
+
require 'culqi/card'
|
11
|
+
require 'culqi/event'
|
12
|
+
require 'culqi/customer'
|
13
|
+
require 'culqi/token'
|
14
|
+
require 'culqi/charge'
|
15
|
+
require 'culqi/plan'
|
16
|
+
require 'culqi/subscription'
|
17
|
+
require 'culqi/refund'
|
18
|
+
require 'culqi/transfer'
|
19
|
+
require 'culqi/yape'
|
20
|
+
require 'culqi/order'
|
21
|
+
module Culqi
|
22
|
+
|
23
|
+
API_BASE = 'https://api.culqi.com/v2'
|
24
|
+
API_BASE_SECURE = 'https://secure.culqi.com/v2'
|
25
|
+
READ_TIMEOUT = 120
|
26
|
+
LIST_TIMEOUT = 360
|
27
|
+
X_CULQI_ENV_TEST = "test"
|
28
|
+
X_CULQI_ENV_LIVE = "live"
|
29
|
+
X_API_VERSION = "2"
|
30
|
+
X_CULQI_CLIENT = "culqi-ruby"
|
31
|
+
X_CULQI_CLIENT_VERSION = "0.1.0"
|
32
|
+
|
33
|
+
|
34
|
+
class << self
|
35
|
+
attr_accessor :public_key, :secret_key, :rsa_id, :rsa_key
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'util/connect'
|
2
|
+
require 'util/validation/helper'
|
3
|
+
|
4
|
+
module Culqi::ConfirmType
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@url = ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def confirm(params={}, rsa_key='', rsa_id='')
|
11
|
+
error = HelperValidation.validate_string_start(params[:order_id], "ord")
|
12
|
+
if error
|
13
|
+
return error
|
14
|
+
end
|
15
|
+
key = ''
|
16
|
+
if(rsa_key != '')
|
17
|
+
params = Encrypt.encrypt_with_aes_rsa(params, rsa_key, true)
|
18
|
+
end
|
19
|
+
key = Culqi.public_key
|
20
|
+
response = Culqi.connect(@url+'confirm', key, params, 'post', Culqi::READ_TIMEOUT, false, rsa_id)
|
21
|
+
return response
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'util/connect'
|
2
|
+
require 'util/validation/helper'
|
3
|
+
|
4
|
+
module Culqi::Delete
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@url = ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def delete(id)
|
11
|
+
error = verifyClassValidationGet(@url, id)
|
12
|
+
if error
|
13
|
+
return error
|
14
|
+
end
|
15
|
+
|
16
|
+
response = Culqi.connect("#{@url}#{id}/", Culqi.secret_key, nil, 'delete', Culqi::READ_TIMEOUT)
|
17
|
+
return response
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'util/connect'
|
2
|
+
require 'util/validation/helper'
|
3
|
+
|
4
|
+
module Culqi::Get
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@url = ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(id)
|
11
|
+
error = verifyClassValidationGet(@url, id)
|
12
|
+
if error
|
13
|
+
return error
|
14
|
+
end
|
15
|
+
response = Culqi.connect("#{@url}#{id}/", Culqi.secret_key, nil, 'get', Culqi::READ_TIMEOUT)
|
16
|
+
return response
|
17
|
+
end
|
18
|
+
|
19
|
+
def verifyClassValidationGet(url='', id)
|
20
|
+
begin
|
21
|
+
if @url.include? 'token'
|
22
|
+
HelperValidation.validate_string_start(id, "tkn")
|
23
|
+
end
|
24
|
+
|
25
|
+
if @url.include? 'charge'
|
26
|
+
HelperValidation.validate_string_start(id, "chr")
|
27
|
+
end
|
28
|
+
|
29
|
+
if @url.include? 'card'
|
30
|
+
HelperValidation.validate_string_start(id, "crd")
|
31
|
+
end
|
32
|
+
|
33
|
+
if @url.include? 'customer'
|
34
|
+
HelperValidation.validate_string_start(id, "cus")
|
35
|
+
end
|
36
|
+
|
37
|
+
if @url.include? 'refund'
|
38
|
+
HelperValidation.validate_string_start(id, "ref")
|
39
|
+
end
|
40
|
+
|
41
|
+
if @url.include? 'plan'
|
42
|
+
HelperValidation.validate_string_start(id, "pln")
|
43
|
+
end
|
44
|
+
|
45
|
+
if @url.include? 'subscription'
|
46
|
+
HelperValidation.validate_string_start(id, "sxn")
|
47
|
+
end
|
48
|
+
|
49
|
+
if @url.include? 'order'
|
50
|
+
HelperValidation.validate_string_start(id, "ord")
|
51
|
+
end
|
52
|
+
rescue CustomException => e
|
53
|
+
return e.message
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'util/connect'
|
2
|
+
require 'util/validation/token'
|
3
|
+
require 'util/validation/charge'
|
4
|
+
require 'util/validation/customer'
|
5
|
+
require 'util/validation/refund'
|
6
|
+
require 'util/validation/plan'
|
7
|
+
require 'util/validation/card'
|
8
|
+
require 'util/validation/subscription'
|
9
|
+
require 'util/validation/order'
|
10
|
+
|
11
|
+
module Culqi::List
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@url = ''
|
15
|
+
end
|
16
|
+
|
17
|
+
def list(params={})
|
18
|
+
error = verifyClassValidationList(@url, params)
|
19
|
+
if error
|
20
|
+
return error
|
21
|
+
end
|
22
|
+
response = Culqi.connect(@url, Culqi.secret_key, params, 'get', Culqi::LIST_TIMEOUT)
|
23
|
+
return response
|
24
|
+
end
|
25
|
+
|
26
|
+
def verifyClassValidationList(url='', params)
|
27
|
+
begin
|
28
|
+
if @url.include? 'token'
|
29
|
+
TokenValidation.list(params)
|
30
|
+
end
|
31
|
+
|
32
|
+
if @url.include? 'charge'
|
33
|
+
ChargeValidation.list(params)
|
34
|
+
end
|
35
|
+
|
36
|
+
if @url.include? 'card'
|
37
|
+
CardValidation.list(params)
|
38
|
+
end
|
39
|
+
|
40
|
+
if @url.include? 'customer'
|
41
|
+
CustomerValidation.list(params)
|
42
|
+
end
|
43
|
+
|
44
|
+
if @url.include? 'refund'
|
45
|
+
RefundValidation.list(params)
|
46
|
+
end
|
47
|
+
|
48
|
+
if @url.include? 'plan'
|
49
|
+
PlanValidation.list(params)
|
50
|
+
end
|
51
|
+
|
52
|
+
if @url.include? 'subscription'
|
53
|
+
SubscriptionValidation.list(params)
|
54
|
+
end
|
55
|
+
|
56
|
+
if @url.include? 'order'
|
57
|
+
OrderValidation.list(params)
|
58
|
+
end
|
59
|
+
rescue CustomException => e
|
60
|
+
return e.message
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'util/connect'
|
2
|
+
require 'util/encrypt-data'
|
3
|
+
require 'util/validation/token'
|
4
|
+
require 'util/validation/charge'
|
5
|
+
require 'util/validation/customer'
|
6
|
+
require 'util/validation/refund'
|
7
|
+
require 'util/validation/plan'
|
8
|
+
require 'util/validation/card'
|
9
|
+
require 'util/validation/subscription'
|
10
|
+
require 'util/validation/order'
|
11
|
+
|
12
|
+
module Culqi::Post
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@url = ''
|
16
|
+
end
|
17
|
+
|
18
|
+
def create(params={}, rsa_key='', rsa_id='')
|
19
|
+
key = ''
|
20
|
+
puts params
|
21
|
+
error = verifyClassValidation(@url, params)
|
22
|
+
if error
|
23
|
+
return error
|
24
|
+
end
|
25
|
+
|
26
|
+
if @url.include? 'token'
|
27
|
+
if(rsa_key != '')
|
28
|
+
params = Encrypt.encrypt_with_aes_rsa(params, rsa_key, true)
|
29
|
+
end
|
30
|
+
key = Culqi.public_key
|
31
|
+
response, statuscode = Culqi.connect(@url, key, params, 'post', Culqi::READ_TIMEOUT, true, rsa_id)
|
32
|
+
return response, statuscode
|
33
|
+
else
|
34
|
+
key = Culqi.secret_key
|
35
|
+
response, statuscode = Culqi.connect(@url, key, params, 'post', Culqi::READ_TIMEOUT, false, '')
|
36
|
+
return response, statuscode
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def verifyClassValidation(url='', params)
|
42
|
+
begin
|
43
|
+
if @url.include? 'token'
|
44
|
+
TokenValidation.create(params)
|
45
|
+
end
|
46
|
+
|
47
|
+
if @url.include? 'charge'
|
48
|
+
ChargeValidation.create(params)
|
49
|
+
end
|
50
|
+
|
51
|
+
if @url.include? 'card'
|
52
|
+
CardValidation.create(params)
|
53
|
+
end
|
54
|
+
|
55
|
+
if @url.include? 'customer'
|
56
|
+
CustomerValidation.create(params)
|
57
|
+
end
|
58
|
+
|
59
|
+
if @url.include? 'refund'
|
60
|
+
RefundValidation.create(params)
|
61
|
+
end
|
62
|
+
|
63
|
+
if @url.include? 'plan'
|
64
|
+
PlanValidation.create(params)
|
65
|
+
end
|
66
|
+
|
67
|
+
if @url.include? 'subscription'
|
68
|
+
SubscriptionValidation.create(params)
|
69
|
+
end
|
70
|
+
|
71
|
+
if @url.include? 'order'
|
72
|
+
OrderValidation.create(params)
|
73
|
+
end
|
74
|
+
rescue CustomException => e
|
75
|
+
return e.message
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'util/connect'
|
2
|
+
require 'util/validation/helper'
|
3
|
+
|
4
|
+
module Culqi::Update
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@url = ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def update(id, params={}, rsa_key='', rsa_id='')
|
11
|
+
error = verifyClassValidationGet(@url, id)
|
12
|
+
if error
|
13
|
+
return error
|
14
|
+
end
|
15
|
+
if(rsa_key != '')
|
16
|
+
params = Encrypt.encrypt_with_aes_rsa(params, rsa_key, true)
|
17
|
+
end
|
18
|
+
response, statusCode = Culqi.connect("#{@url}#{id}/", Culqi.secret_key, params, 'patch', Culqi::READ_TIMEOUT, rsa_id)
|
19
|
+
return response, statusCode
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/util/connect.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'excon'
|
2
|
+
require 'json'
|
3
|
+
require 'culqi-ruby'
|
4
|
+
|
5
|
+
module Culqi
|
6
|
+
def self.connect(url, api_key, data, type, time_out, secure_url = false, rsa_id='')
|
7
|
+
base_url = secure_url ? Culqi::API_BASE_SECURE : Culqi::API_BASE
|
8
|
+
full_url = "#{base_url}#{url}"
|
9
|
+
|
10
|
+
print full_url
|
11
|
+
|
12
|
+
if(api_key.include? 'test')
|
13
|
+
env = Culqi::X_CULQI_ENV_TEST
|
14
|
+
else
|
15
|
+
env = Culqi::X_CULQI_ENV_LIVE
|
16
|
+
end
|
17
|
+
|
18
|
+
headers = {
|
19
|
+
"Authorization" => "Bearer #{api_key}",
|
20
|
+
"Content-Type" => "application/json",
|
21
|
+
"x-culqi-env" => env,
|
22
|
+
"x-api-version" => Culqi::X_API_VERSION,
|
23
|
+
"x-culqi-client" => Culqi::X_CULQI_CLIENT,
|
24
|
+
"x-culqi-client-version" => Culqi::X_CULQI_CLIENT,
|
25
|
+
"x-culqi-rsa-id" => rsa_id
|
26
|
+
}
|
27
|
+
|
28
|
+
puts "Body"
|
29
|
+
puts data.to_json
|
30
|
+
|
31
|
+
response = Excon.new(full_url,
|
32
|
+
headers: headers,
|
33
|
+
read_timeout: time_out,
|
34
|
+
idempotent: true,
|
35
|
+
retry_limit: 6)
|
36
|
+
|
37
|
+
case type.upcase
|
38
|
+
when 'GET'
|
39
|
+
result = response.request(method: :get, query: data)
|
40
|
+
when 'POST'
|
41
|
+
result = response.request(method: :post, body: data.to_json)
|
42
|
+
when 'DELETE'
|
43
|
+
result = response.request(method: :delete)
|
44
|
+
when 'PATCH'
|
45
|
+
result = response.request(method: :patch, body: data.to_json)
|
46
|
+
else
|
47
|
+
raise ArgumentError, "Unsupported request type: #{type}"
|
48
|
+
end
|
49
|
+
|
50
|
+
puts result.body
|
51
|
+
|
52
|
+
return result.body, result.status
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# country_codes.rb
|
2
|
+
module CountryCodes
|
3
|
+
def self.get_country_codes
|
4
|
+
['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ',
|
5
|
+
'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS',
|
6
|
+
'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN',
|
7
|
+
'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE',
|
8
|
+
'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF',
|
9
|
+
'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM',
|
10
|
+
'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM',
|
11
|
+
'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC',
|
12
|
+
'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK',
|
13
|
+
'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA',
|
14
|
+
'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG',
|
15
|
+
'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW',
|
16
|
+
'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS',
|
17
|
+
'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO',
|
18
|
+
'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI',
|
19
|
+
'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'base64'
|
3
|
+
require 'json'
|
4
|
+
require 'openssl/oaep'
|
5
|
+
|
6
|
+
module Encrypt
|
7
|
+
def self.generate_random_bytes(length)
|
8
|
+
OpenSSL::Random.random_bytes(length)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.encrypt_with_aes_rsa(data, public_key, is_json)
|
12
|
+
key = generate_random_bytes(32) # Generate a 256-bit random key for AES encryption
|
13
|
+
iv = generate_random_bytes(12) # GCM mode requires a 96-bit (12 bytes) random initialization vector
|
14
|
+
auth_data = generate_random_bytes(16)
|
15
|
+
cipher = OpenSSL::Cipher.new('AES-256-GCM')
|
16
|
+
cipher.encrypt
|
17
|
+
cipher.key = key
|
18
|
+
cipher.iv = iv
|
19
|
+
cipher.auth_data = auth_data
|
20
|
+
|
21
|
+
# Since GCM does not require padding, we can directly pass the data to be encrypted
|
22
|
+
cipher_text = cipher.update(data.to_json) + cipher.final
|
23
|
+
|
24
|
+
# Get the auth tag
|
25
|
+
auth_tag = cipher.auth_tag
|
26
|
+
|
27
|
+
# Combine cipher text and auth tag
|
28
|
+
encrypted = cipher_text #+ auth_tag
|
29
|
+
#encrypted = encrypted.slice(0...-16)
|
30
|
+
encrypted_data = Base64.strict_encode64(encrypted)
|
31
|
+
|
32
|
+
####
|
33
|
+
rsa_public_key = OpenSSL::PKey::RSA.new(public_key)
|
34
|
+
encrypted_key = rsa_encrypt(key, rsa_public_key)
|
35
|
+
encrypted_iv = rsa_encrypt(iv, rsa_public_key)
|
36
|
+
|
37
|
+
{ encrypted_data: encrypted_data, encrypted_key: encrypted_key, encrypted_iv: encrypted_iv }
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.rsa_encrypt(data, public_key)
|
41
|
+
# Define the encryption parameters
|
42
|
+
label = ''
|
43
|
+
|
44
|
+
md = OpenSSL::Digest::SHA256
|
45
|
+
cipher_text = public_key.public_encrypt_oaep(data, label, md, md)
|
46
|
+
|
47
|
+
Base64.strict_encode64(cipher_text)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/helper'
|
5
|
+
require 'util/validation/error'
|
6
|
+
|
7
|
+
class CardValidation
|
8
|
+
def self.create(data)
|
9
|
+
HelperValidation.validate_string_start(data[:customer_id], "cus")
|
10
|
+
HelperValidation.validate_string_start(data[:token_id], "tkn")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.list(data)
|
14
|
+
# Validate card_brand
|
15
|
+
if data.key?('card_brand')
|
16
|
+
allowed_brand_values = ['Visa', 'Mastercard', 'Amex', 'Diners']
|
17
|
+
Helpers.validate_value(data[:card_brand], allowed_brand_values)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Validate card_type
|
21
|
+
if data.key?('card_type')
|
22
|
+
allowed_card_type_values = ['credito', 'debito', 'internacional']
|
23
|
+
Helpers.validate_value(data[:card_type], allowed_card_type_values)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Validate date filter
|
27
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
28
|
+
Helpers.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
29
|
+
end
|
30
|
+
|
31
|
+
# Validate country_code
|
32
|
+
if data.key?('country_code')
|
33
|
+
Helpers.validate_value(data[:country_code], get_country_codes)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/helper'
|
5
|
+
require 'util/validation/error'
|
6
|
+
|
7
|
+
class ChargeValidation
|
8
|
+
def self.create(data)
|
9
|
+
# Validate email
|
10
|
+
raise 'Invalid email.' unless HelperValidation.is_valid_email(data[:email])
|
11
|
+
|
12
|
+
# Validate amount
|
13
|
+
amount = data[:amount]
|
14
|
+
|
15
|
+
if amount.is_a?(String)
|
16
|
+
begin
|
17
|
+
amount = Integer(amount)
|
18
|
+
print amount
|
19
|
+
rescue ArgumentError
|
20
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
unless amount.is_a?(Integer)
|
25
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
26
|
+
end
|
27
|
+
|
28
|
+
HelperValidation.validate_currency_code(data[:currency_code])
|
29
|
+
source_id = data[:source_id]
|
30
|
+
|
31
|
+
if source_id.start_with?("tkn")
|
32
|
+
HelperValidation.validate_string_start(source_id, "tkn")
|
33
|
+
elsif source_id.start_with?("ype")
|
34
|
+
HelperValidation.validate_string_start(source_id, "ype")
|
35
|
+
elsif source_id.start_with?("crd")
|
36
|
+
HelperValidation.validate_string_start(source_id, "crd")
|
37
|
+
else
|
38
|
+
raise CustomException.new("Incorrect format. The format must start with tkn, ype, or crd")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.list(data)
|
43
|
+
# Validate email
|
44
|
+
if data.key?('email')
|
45
|
+
unless Helpers.is_valid_email(data[:email])
|
46
|
+
raise CustomException.new('Invalid email.')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Validate amount
|
51
|
+
if data.key?('amount')
|
52
|
+
amount = data[:amount]
|
53
|
+
|
54
|
+
if amount.is_a?(String)
|
55
|
+
begin
|
56
|
+
amount = Integer(amount)
|
57
|
+
rescue ArgumentError
|
58
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
unless amount.is_a?(Integer)
|
63
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Validate min_amount
|
68
|
+
if data.key?('min_amount')
|
69
|
+
unless data[:min_amount].is_a?(Integer)
|
70
|
+
raise CustomException.new('Invalid min amount.')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Validate max_amount
|
75
|
+
if data.key?('max_amount')
|
76
|
+
unless data[:max_amount].is_a?(Integer)
|
77
|
+
raise CustomException.new('Invalid max amount.')
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Validate installments
|
82
|
+
if data.key?('installments')
|
83
|
+
unless data[:installments].is_a?(Integer)
|
84
|
+
raise CustomException.new('Invalid installments.')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Validate min_installments
|
89
|
+
if data.key?('min_installments')
|
90
|
+
unless data[:min_installments].is_a?(Integer)
|
91
|
+
raise CustomException.new('Invalid min installments.')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Validate max_installments
|
96
|
+
if data.key?('max_installments')
|
97
|
+
unless data[:max_installments].is_a?(Integer)
|
98
|
+
raise CustomException.new('Invalid max installments.')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Validate currency_code
|
103
|
+
if data.key?('currency_code')
|
104
|
+
Helpers.validate_currency_code(data[:currency_code])
|
105
|
+
end
|
106
|
+
|
107
|
+
# Validate card_brand
|
108
|
+
if data.key?('card_brand')
|
109
|
+
allowed_brand_values = ['Visa', 'Mastercard', 'Amex', 'Diners']
|
110
|
+
Helpers.validate_value(data[:card_brand], allowed_brand_values)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Validate card_type
|
114
|
+
if data.key?('card_type')
|
115
|
+
allowed_card_type_values = ['credito', 'debito', 'internacional']
|
116
|
+
Helpers.validate_value(data[:card_type], allowed_card_type_values)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Validate date filter
|
120
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
121
|
+
Helpers.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
122
|
+
end
|
123
|
+
|
124
|
+
# Validate country_code
|
125
|
+
if data.key?('country_code')
|
126
|
+
Helpers.validate_value(data[:country_code], get_country_codes)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/country-codes'
|
5
|
+
require 'util/validation/helper'
|
6
|
+
require 'util/validation/error'
|
7
|
+
|
8
|
+
class CustomerValidation
|
9
|
+
def self.create(data)
|
10
|
+
# Validate address, firstname, and lastname
|
11
|
+
raise CustomException.new('first name is empty.') if data[:first_name].nil? || data[:first_name].empty?
|
12
|
+
raise CustomException.new('last name is empty.') if data[:last_name].nil? || data[:last_name].empty?
|
13
|
+
raise CustomException.new('address is empty.') if data[:address].nil? || data[:address].empty?
|
14
|
+
raise CustomException.new('address_city is empty.') if data[:address_city].nil? || data[:address_city].empty?
|
15
|
+
|
16
|
+
unless data[:phone_number].is_a?(String)
|
17
|
+
raise CustomException.new("Invalid 'phone_number'. It should be a string.")
|
18
|
+
end
|
19
|
+
|
20
|
+
# Validate country code
|
21
|
+
HelperValidation.validate_value(data[:country_code], CountryCodes.get_country_codes)
|
22
|
+
|
23
|
+
# Validate email
|
24
|
+
raise 'Invalid email.' unless HelperValidation.is_valid_email(data[:email])
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.list(data)
|
28
|
+
# Validate email
|
29
|
+
if data.key?('email')
|
30
|
+
unless Helpers.is_valid_email(data[:email])
|
31
|
+
raise CustomException.new('Invalid email.')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
# Validate country_code
|
35
|
+
if data.key?('country_code')
|
36
|
+
Helpers.validate_value(data[:country_code], get_country_codes)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class CustomException < StandardError
|
4
|
+
def initialize(merchant_message)
|
5
|
+
@error_data = {
|
6
|
+
"object" => "error",
|
7
|
+
"type" => "param_error",
|
8
|
+
"merchant_message" => merchant_message,
|
9
|
+
"user_message" => merchant_message
|
10
|
+
}
|
11
|
+
super("CustomException: #{@error_data}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
JSON.generate(@error_data)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/error'
|
5
|
+
|
6
|
+
class HelperValidation
|
7
|
+
|
8
|
+
def self.is_valid_card_number(number)
|
9
|
+
!number.match(/^\d{13,19}$/).nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.is_valid_email(email)
|
13
|
+
!email.match(/^\S+@\S+\.\S+$/).nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.validate_currency_code(currency_code)
|
17
|
+
raise CustomException.new('Currency code is empty.') if currency_code.nil? || currency_code.empty?
|
18
|
+
|
19
|
+
raise CustomException.new('Currency code must be a string.') unless currency_code.is_a?(String)
|
20
|
+
|
21
|
+
allowed_values = ['PEN', 'USD']
|
22
|
+
raise CustomException.new('Currency code must be either "PEN" or "USD".') unless allowed_values.include?(currency_code)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.validate_string_start(string, start)
|
26
|
+
unless string.start_with?("#{start}_test_") || string.start_with?("#{start}_live_")
|
27
|
+
raise CustomException.new("Incorrect format. The format must start with #{start}_test_ or #{start}_live_")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.validate_value(value, allowed_values)
|
32
|
+
raise CustomException.new("Invalid value. It must be #{JSON.generate(allowed_values)}.") unless allowed_values.include?(value)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.is_future_date(expiration_date)
|
36
|
+
exp_date = Time.at(expiration_date)
|
37
|
+
exp_date > Time.now
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/helper'
|
5
|
+
require 'util/validation/error'
|
6
|
+
|
7
|
+
class OrderValidation
|
8
|
+
def self.create(data)
|
9
|
+
# Validate amount
|
10
|
+
amount = data[:amount]
|
11
|
+
|
12
|
+
if amount.is_a?(String)
|
13
|
+
begin
|
14
|
+
amount = Integer(amount)
|
15
|
+
rescue ArgumentError
|
16
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
unless amount.is_a?(Integer)
|
21
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
22
|
+
end
|
23
|
+
|
24
|
+
# Validate currency
|
25
|
+
HelperValidation.validate_currency_code(data[:currency_code])
|
26
|
+
|
27
|
+
# Validate firstname, lastname, and phone
|
28
|
+
client_details = data[:client_details] || {}
|
29
|
+
raise CustomException.new('first name is empty.') if client_details[:first_name].nil? || client_details[:first_name].empty?
|
30
|
+
raise CustomException.new('last name is empty.') if client_details[:last_name].nil? || client_details[:last_name].empty?
|
31
|
+
raise CustomException.new('phone_number is empty.') if client_details[:phone_number].nil? || client_details[:phone_number].empty?
|
32
|
+
|
33
|
+
# Validate email
|
34
|
+
raise CustomException.new('Invalid email.') unless HelperValidation.is_valid_email(client_details[:email])
|
35
|
+
|
36
|
+
# Validate expiration date
|
37
|
+
raise CustomException.new('expiration_date must be a future date.') unless HelperValidation.is_future_date(data[:expiration_date])
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.list(data)
|
41
|
+
# Validate amount
|
42
|
+
if data.key?('amount')
|
43
|
+
amount = data[:amount]
|
44
|
+
|
45
|
+
if amount.is_a?(String)
|
46
|
+
begin
|
47
|
+
amount = Integer(amount)
|
48
|
+
rescue ArgumentError
|
49
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
unless amount.is_a?(Integer)
|
54
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Validate min_amount
|
59
|
+
if data.key?('min_amount')
|
60
|
+
unless data[:min_amount].is_a?(Integer)
|
61
|
+
raise CustomException.new('Invalid min amount.')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Validate max_amount
|
66
|
+
if data.key?('max_amount')
|
67
|
+
unless data[:max_amount].is_a?(Integer)
|
68
|
+
raise CustomException.new('Invalid max amount.')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
73
|
+
HelperValidation.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/helper'
|
5
|
+
require 'util/validation/error'
|
6
|
+
|
7
|
+
class PlanValidation
|
8
|
+
def self.create(data)
|
9
|
+
# Validate amount
|
10
|
+
amount = data[:amount]
|
11
|
+
|
12
|
+
if amount.is_a?(String)
|
13
|
+
begin
|
14
|
+
amount = Integer(amount)
|
15
|
+
print amount
|
16
|
+
rescue ArgumentError
|
17
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
unless amount.is_a?(Integer)
|
22
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
23
|
+
end
|
24
|
+
|
25
|
+
# Validate interval
|
26
|
+
allowed_values = ['dias', 'semanas', 'meses', 'años']
|
27
|
+
HelperValidation.validate_value(data[:interval], allowed_values)
|
28
|
+
|
29
|
+
# Validate currency
|
30
|
+
HelperValidation.validate_currency_code(data[:currency_code])
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.list(data)
|
34
|
+
# Validate amount
|
35
|
+
if data.key?('amount')
|
36
|
+
amount = data[:amount]
|
37
|
+
|
38
|
+
if amount.is_a?(String)
|
39
|
+
begin
|
40
|
+
amount = Integer(amount)
|
41
|
+
rescue ArgumentError
|
42
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
unless amount.is_a?(Integer)
|
47
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Validate min_amount
|
52
|
+
if data.key?('min_amount')
|
53
|
+
unless data[:min_amount].is_a?(Integer)
|
54
|
+
raise CustomException.new('Invalid min amount.')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Validate max_amount
|
59
|
+
if data.key?('max_amount')
|
60
|
+
unless data[:max_amount].is_a?(Integer)
|
61
|
+
raise CustomException.new('Invalid max amount.')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
66
|
+
HelperValidation.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/helper'
|
5
|
+
require 'util/validation/error'
|
6
|
+
|
7
|
+
class RefundValidation
|
8
|
+
def self.create(data)
|
9
|
+
# Validate charge format
|
10
|
+
HelperValidation.validate_string_start(data[:charge_id], "chr")
|
11
|
+
|
12
|
+
# Validate reason
|
13
|
+
allowed_values = ['duplicado', 'fraudulento', 'solicitud_comprador']
|
14
|
+
HelperValidation.validate_value(data[:reason], allowed_values)
|
15
|
+
|
16
|
+
# Validate amount
|
17
|
+
amount = data[:amount]
|
18
|
+
|
19
|
+
if amount.is_a?(String)
|
20
|
+
begin
|
21
|
+
amount = Integer(amount)
|
22
|
+
print amount
|
23
|
+
rescue ArgumentError
|
24
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
unless amount.is_a?(Integer)
|
29
|
+
raise CustomException.new("Invalid 'amount'. It should be an integer or a string representing an integer.")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.list(data)
|
34
|
+
# Validate card_brand
|
35
|
+
if data.key?('reason')
|
36
|
+
allowed_brand_values = ['duplicado', 'fraudulento', 'solicitud_comprador']
|
37
|
+
Helpers.validate_value(data[:reason], allowed_brand_values)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Validate date filter
|
41
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
42
|
+
Helpers.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/validation/helper'
|
5
|
+
require 'util/validation/error'
|
6
|
+
|
7
|
+
class SubscriptionValidation
|
8
|
+
def self.create(data)
|
9
|
+
HelperValidation.validate_string_start(data[:card_id], "crd")
|
10
|
+
HelperValidation.validate_string_start(data[:plan_id], "pln")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.list(data)
|
14
|
+
# Validate card_brand
|
15
|
+
if data.key?('plan_id')
|
16
|
+
HelperValidation.validate_string_start(data[:plan_id], "pln")
|
17
|
+
end
|
18
|
+
|
19
|
+
# Validate date filter
|
20
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
21
|
+
Helpers.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'util/country-codes'
|
5
|
+
require 'util/validation/helper'
|
6
|
+
require 'util/validation/error'
|
7
|
+
|
8
|
+
class TokenValidation
|
9
|
+
def self.create(data)
|
10
|
+
# Validate card number
|
11
|
+
raise CustomException.new('Invalid card number.') unless HelperValidation.is_valid_card_number(data[:card_number])
|
12
|
+
|
13
|
+
# Validate CVV
|
14
|
+
raise CustomException.new('Invalid CVV.') unless data[:cvv]&.match?(/^\d{3,4}$/)
|
15
|
+
|
16
|
+
# Validate email
|
17
|
+
raise CustomException.new('Invalid email.') unless HelperValidation.is_valid_email(data[:email])
|
18
|
+
|
19
|
+
# Validate expiration month
|
20
|
+
raise 'Invalid expiration month.' unless data[:expiration_month].to_s.match?(/^(0?[1-9]|1[012])$/)
|
21
|
+
|
22
|
+
# Validate expiration year
|
23
|
+
current_year = Date.today.year
|
24
|
+
if !data[:expiration_year].to_s.match?(/^\d{4}$/) || data[:expiration_year].to_s.to_i < current_year
|
25
|
+
raise 'Invalid expiration year.'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Check if the card is expired
|
29
|
+
exp_date = Date.strptime("#{data[:expiration_year]}-#{data[:expiration_month]}", '%Y-%m')
|
30
|
+
raise 'Card has expired.' if exp_date < Date.today
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.create_token_yape_validation(data)
|
34
|
+
# Validate amount
|
35
|
+
unless data[:amount].is_a?(Numeric) && data[:amount].to_i == data[:amount]
|
36
|
+
raise CustomException.new('Invalid amount.')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.list(data)
|
41
|
+
if data.key?('device_type')
|
42
|
+
allowed_device_values = ['desktop', 'mobile', 'tablet']
|
43
|
+
HelperValidation.validate_value(data[:device_type], allowed_device_values)
|
44
|
+
end
|
45
|
+
|
46
|
+
if data.key?('card_brand')
|
47
|
+
allowed_brand_values = ['Visa', 'Mastercard', 'Amex', 'Diners']
|
48
|
+
HelperValidation.validate_value(data[:card_brand], allowed_brand_values)
|
49
|
+
end
|
50
|
+
|
51
|
+
if data.key?('card_type')
|
52
|
+
allowed_card_type_values = ['credito', 'debito', 'internacional']
|
53
|
+
HelperValidation.validate_value(data[:card_type], allowed_card_type_values)
|
54
|
+
end
|
55
|
+
|
56
|
+
if data.key?('country_code')
|
57
|
+
HelperValidation.validate_value(data[:country_code], get_country_codes)
|
58
|
+
end
|
59
|
+
|
60
|
+
if data.key?('creation_date_from') && data.key?('creation_date_to')
|
61
|
+
HelperValidation.validate_date_filter(data[:creation_date_from], data[:creation_date_to])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devtech-culqi-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Culqi Team
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-08-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: |-
|
14
|
+
Biblioteca Culqi-Ruby, es compatible con la v2.0 del Culqi API, con el cual tendrás la posibilidad de realizar cobros con tarjetas de débito y crédito, Yape, PagoEfectivo, billeteras móviles y Cuotéalo con solo unos simples pasos de configuración.
|
15
|
+
</br>Nuestra biblioteca te da la posibilidad de capturar el status_code de la solicitud HTTP que se realiza al API de Culqi, así como el response que contiene el cuerpo de la respuesta obtenida.
|
16
|
+
email:
|
17
|
+
- jose.calderon@culqi.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- lib/culqi-ruby.rb
|
23
|
+
- lib/culqi/card.rb
|
24
|
+
- lib/culqi/charge.rb
|
25
|
+
- lib/culqi/customer.rb
|
26
|
+
- lib/culqi/event.rb
|
27
|
+
- lib/culqi/iins.rb
|
28
|
+
- lib/culqi/order.rb
|
29
|
+
- lib/culqi/plan.rb
|
30
|
+
- lib/culqi/refund.rb
|
31
|
+
- lib/culqi/subscription.rb
|
32
|
+
- lib/culqi/token.rb
|
33
|
+
- lib/culqi/transfer.rb
|
34
|
+
- lib/culqi/version.rb
|
35
|
+
- lib/culqi/yape.rb
|
36
|
+
- lib/operation/confirm_type.rb
|
37
|
+
- lib/operation/delete.rb
|
38
|
+
- lib/operation/get.rb
|
39
|
+
- lib/operation/list.rb
|
40
|
+
- lib/operation/post.rb
|
41
|
+
- lib/operation/update.rb
|
42
|
+
- lib/util/connect.rb
|
43
|
+
- lib/util/country-codes.rb
|
44
|
+
- lib/util/encrypt-data.rb
|
45
|
+
- lib/util/validation/card.rb
|
46
|
+
- lib/util/validation/charge.rb
|
47
|
+
- lib/util/validation/customer.rb
|
48
|
+
- lib/util/validation/error.rb
|
49
|
+
- lib/util/validation/helper.rb
|
50
|
+
- lib/util/validation/order.rb
|
51
|
+
- lib/util/validation/plan.rb
|
52
|
+
- lib/util/validation/refund.rb
|
53
|
+
- lib/util/validation/subscription.rb
|
54
|
+
- lib/util/validation/token.rb
|
55
|
+
homepage: http://rubygems.org/gems/devtech-culqi-ruby
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 3.0.0
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubygems_version: 3.2.3
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Culqi Ruby
|
78
|
+
test_files: []
|