rubyqrpay 0.2.4 → 0.4.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 +5 -5
- data/Gemfile.lock +2 -2
- data/lib/rubyqrpay.rb +1 -0
- data/lib/rubyqrpay/constants.rb +54 -56
- data/lib/rubyqrpay/generator.rb +9 -5
- data/lib/rubyqrpay/parser.rb +36 -0
- data/lib/rubyqrpay/validator.rb +3 -3
- data/lib/rubyqrpay/version.rb +2 -1
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6568b667fea703ecbd844f2ec00efb3669f90d51ff8ef84d8bc0d1c4099ccb62
|
4
|
+
data.tar.gz: fe647c46f76488729a7136fbb4fd424e1ff56764bae2a84210c514a82130df6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e075989dba20913f357190935e9575ea13bd631a430c17e174a2140f8e75d0552e83a676067b7036be3ee600bd2799d61aec7562cda0d6ea116b7d62e0c0ce3e
|
7
|
+
data.tar.gz: 45a43146bdeb637b15fa354d44800fed9c60e1a45ba310c06274a43a37156f1065dd9b2466f9bd869d7fe37745469a17abc02f990d6391a684673eed7b8d398b
|
data/Gemfile.lock
CHANGED
data/lib/rubyqrpay.rb
CHANGED
data/lib/rubyqrpay/constants.rb
CHANGED
@@ -1,61 +1,59 @@
|
|
1
1
|
module Rubyqrpay
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
ID_CRC = '63'
|
2
|
+
ID_PAYLOAD_FORMAT = '00'
|
3
|
+
ID_POI_METHOD = '01'
|
4
|
+
ID_MERCHANT_INFORMATION_32 = '32'
|
5
|
+
ID_MERCHANT_INFORMATION_33 = '33'
|
6
|
+
ID_MERCHANT_CATEGORY_CODE = '52'
|
7
|
+
ID_TRANSACTION_CURRENCY = '53'
|
8
|
+
ID_TRANSACTION_AMOUNT = '54'
|
9
|
+
ID_TIP_OF_CONVENIENCE_INDICATOR = '55'
|
10
|
+
ID_VALUE_OF_CONVENIENCE_FEE_FIXED = '56'
|
11
|
+
ID_VALUE_OF_CONVENIENCE_FEE_PERCENTAGE = '57'
|
12
|
+
ID_COUNTRY = '58'
|
13
|
+
ID_MERCHANT_NAME = '59'
|
14
|
+
ID_MERCHANT_CITY = '60'
|
15
|
+
ID_POSTAL_CODE = '61'
|
16
|
+
ID_ADDITIONAL_DATA_FIELD = '62'
|
17
|
+
ID_MERCHANT_INFORMATION_LANGUAGE = '64'
|
18
|
+
ID_CRC = '63'
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
20
|
+
PAYLOAD_FORMAT_EMV_QRCPS_MERCHANT_PRESENTED_MODE = '01'
|
21
|
+
POI_METHOD_STATIC = '11'
|
22
|
+
POI_METHOD_DYNAMIC = '12'
|
23
|
+
CONVENIENCE_INDICATOR_FIXED = '02'
|
24
|
+
CONVENIENCE_INDICATOR_PERCENTAGE = '03'
|
25
|
+
MERCHANT_INFORMATION_TEMPLATE_ID_GUID = '00'
|
26
|
+
# ID_MERCHANT_INFORMATION_32
|
27
|
+
ID_SERVICE_CODE_ERIP = '01'
|
28
|
+
ID_PAYER_UNIQUE = '10'
|
29
|
+
ID_PAYER_NUMBER = '11'
|
30
|
+
ID_AMOUNT_EDIT_POSSIBILITY = '12'
|
31
|
+
# ID_MERCHANT_INFORMATION_33
|
32
|
+
ID_SERVICE_PRODUCER_CODE = '03'
|
33
|
+
ID_SERVICE_CODE = '04'
|
34
|
+
ID_OUTLET = '05'
|
35
|
+
ID_ORDER_CODE = '06'
|
36
|
+
# ID_ADDITIONAL_DATA_FIELD
|
37
|
+
ID_BILL_NUMBER = '01'
|
38
|
+
ID_MOBILE_NUMBER = '02'
|
39
|
+
ID_STORE_LABEL = '03'
|
40
|
+
ID_LOYALTY_NUMBER = '04'
|
41
|
+
ID_REFERENCE_LABEL = '05'
|
42
|
+
ID_CUSTOMER_LABEL = '06'
|
43
|
+
ID_TERMINAL_LABEL = '07'
|
44
|
+
ID_PURPOSE_OF_TRANSACTION = '08'
|
45
|
+
ID_CONSUMER_DATA_REQUEST = '09'
|
46
|
+
# ID_MERCHANT_INFORMATION_LANGUAGE
|
47
|
+
ID_LANGUAGE_REFERENCE = '00'
|
48
|
+
ID_MERCHANT_NAME_ALTERNATE = '01'
|
49
|
+
ID_MERCHANT_CITY_ALTERNATE = '02'
|
51
50
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
GUID_PROMPTPAY_32 = 'by.raschet'
|
52
|
+
GUID_PROMPTPAY_33 = 'by.epos.'
|
53
|
+
CRC_SYMBOL_SIZE = '04'
|
54
|
+
AEP_DEFAULT = '11'
|
55
|
+
AEP_FALSE = '12'
|
57
56
|
|
58
|
-
|
59
|
-
|
60
|
-
end
|
57
|
+
K_SIZE_FUNC = 0.15
|
58
|
+
B_SIZE_FUNC = 140
|
61
59
|
end
|
data/lib/rubyqrpay/generator.rb
CHANGED
@@ -50,7 +50,7 @@ module Rubyqrpay
|
|
50
50
|
ID_MERCHANT_CATEGORY_CODE => mcc_format(opts[:merchant_category_code]),
|
51
51
|
ID_TRANSACTION_CURRENCY => opts[:currency],
|
52
52
|
ID_TRANSACTION_AMOUNT => format_amount(opts[:amount]),
|
53
|
-
ID_TIP_OF_CONVENIENCE_INDICATOR => opts[:convenience_indicator],
|
53
|
+
ID_TIP_OF_CONVENIENCE_INDICATOR => format_indicator(opts[:convenience_indicator]),
|
54
54
|
ID_COUNTRY => opts[:country],
|
55
55
|
ID_MERCHANT_NAME => opts[:merchant_name],
|
56
56
|
ID_MERCHANT_CITY => opts[:merchant_city],
|
@@ -156,10 +156,14 @@ module Rubyqrpay
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def self.crc(data)
|
159
|
-
|
160
|
-
|
161
|
-
x.
|
162
|
-
|
159
|
+
# === old algorithm
|
160
|
+
# data += ID_CRC + CRC_SYMBOL_SIZE
|
161
|
+
# x = Digest::CRC16CCITT.new
|
162
|
+
# x.update(data)
|
163
|
+
# ID_CRC + CRC_SYMBOL_SIZE + x.hexdigest.upcase
|
164
|
+
|
165
|
+
# === updated algorithm
|
166
|
+
ID_CRC + CRC_SYMBOL_SIZE + Digest::SHA256.hexdigest(data).slice(-4..-1).upcase
|
163
167
|
end
|
164
168
|
|
165
169
|
def self.mcc_format(mcc)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Rubyqrpay
|
2
|
+
class Parser
|
3
|
+
NESTED_DATA_IDS = [ID_MERCHANT_INFORMATION_32,
|
4
|
+
ID_MERCHANT_INFORMATION_33,
|
5
|
+
ID_ADDITIONAL_DATA_FIELD,
|
6
|
+
ID_MERCHANT_INFORMATION_LANGUAGE]
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def parse_payload(payload)
|
10
|
+
parse_to_params(URI.unescape payload)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def parse_to_params(payload)
|
16
|
+
{}.tap do |params|
|
17
|
+
index = 0
|
18
|
+
|
19
|
+
until payload[index + 4].nil?
|
20
|
+
key = payload[index, 2]
|
21
|
+
size = payload[index + 2, 2].to_i
|
22
|
+
value = payload[index + 4, size]
|
23
|
+
|
24
|
+
params[key] = if NESTED_DATA_IDS.include? key
|
25
|
+
parse_to_params value
|
26
|
+
else
|
27
|
+
value
|
28
|
+
end
|
29
|
+
|
30
|
+
index += 4 + size
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/rubyqrpay/validator.rb
CHANGED
@@ -6,7 +6,7 @@ require 'iso639'
|
|
6
6
|
module Rubyqrpay
|
7
7
|
class Validator
|
8
8
|
CONSUMER_DATA_REQUEST_PATTERN = /^(A?E?M|E?M?A|M?A?E|A?M?E|E?M?A|M?E?A)$/
|
9
|
-
ANS_PATTERN = /^[
|
9
|
+
ANS_PATTERN = /^[[:ascii:]]*$/
|
10
10
|
MIN_MCC = 0
|
11
11
|
MAX_MCC = 10_000
|
12
12
|
MIN_FIXED = 0.01
|
@@ -87,8 +87,8 @@ module Rubyqrpay
|
|
87
87
|
optional(:percentage_fee).maybe(:float?, gteq?: MIN_PERCENT, lteq?: MAX_PERCENT)
|
88
88
|
optional(:merchant_category_code).maybe(:int?, gteq?: MIN_MCC, lt?: MAX_MCC)
|
89
89
|
optional(:amount).maybe(:float?, gteq?: MIN_FIXED, lteq?: MAX_FIXED)
|
90
|
-
|
91
|
-
|
90
|
+
required(:country).filled(:str?)
|
91
|
+
required(:merchant_name).filled(:str?, max_size?: 25, format?: ANS_PATTERN)
|
92
92
|
optional(:merchant_city).maybe(:str?, max_size?: 15, format?: ANS_PATTERN)
|
93
93
|
optional(:postal_code).maybe(:str?, max_size?: 10, format?: ANS_PATTERN)
|
94
94
|
|
data/lib/rubyqrpay/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyqrpay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Egor Shpalov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- lib/rubyqrpay.rb
|
158
158
|
- lib/rubyqrpay/constants.rb
|
159
159
|
- lib/rubyqrpay/generator.rb
|
160
|
+
- lib/rubyqrpay/parser.rb
|
160
161
|
- lib/rubyqrpay/validator.rb
|
161
162
|
- lib/rubyqrpay/version.rb
|
162
163
|
- rubyqrpay.gemspec
|
@@ -179,10 +180,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
180
|
- !ruby/object:Gem::Version
|
180
181
|
version: '0'
|
181
182
|
requirements: []
|
182
|
-
|
183
|
-
rubygems_version: 2.6.14
|
183
|
+
rubygems_version: 3.0.8
|
184
184
|
signing_key:
|
185
185
|
specification_version: 4
|
186
186
|
summary: Ruby prompt pay QR-code generator
|
187
187
|
test_files: []
|
188
|
-
has_rdoc:
|