devtech-culqi-ruby 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|