kazkom_epay 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.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kazkom_epay.gemspec
4
+ gemspec
5
+ gem 'rspec'
6
+ gem 'activesupport', '3.2.8'
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Semenyuk Dmitriy
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,139 @@
1
+ # gem для работы с КазКоммерцБанк ePay
2
+
3
+ Gem для работы с платежным шлюзом ККБ ePay для использования в проектах, использующих Ruby (Ruby On Rails, Sinatra и др.).
4
+
5
+ ## Установка
6
+
7
+ Добавьте эту строку в ваш Gemfile:
8
+
9
+ gem 'kazkom_epay'
10
+
11
+ Затем установите gem, используя bundler:
12
+
13
+ $ bundle
14
+
15
+ Или выполните команду:
16
+
17
+ $ gem install kazkom_epay
18
+
19
+ ## Использование (примеры с использованием Ruby On Rails)
20
+
21
+ ### Подпись XML-запроса к банку
22
+
23
+ ```ruby
24
+ # encoding: UTF-8
25
+ class PayController < ApplicationController
26
+ before_filter :authenticate_user!
27
+ def epay
28
+ # ...
29
+ path_to_yaml = Rails.root.join('config', 'epay.yml')
30
+ epay_credentials = KazkomEpay::Epay.production_credentials path_to_yaml
31
+ amount = ...
32
+
33
+ # здесь вы фиксируете Order_ID, который вы передадите банку
34
+ # и по которому вы сможете в дальнейшем найти нужный платеж
35
+ # и пользователя, чтобы зачислить деньги ему на счет
36
+ payment_request = PaymentRequest.create! do |r|
37
+ r.user = current_user
38
+ r.amount = amount
39
+ end
40
+
41
+ order_id = payment_request.id
42
+
43
+ epay_credentials.merge!({amount: amount, order_id: order_id})
44
+ epay = KazkomEpay::Epay.setup(epay_credentials)
45
+
46
+ @base64_encoded_xml = epay.base64_encoded_signed_xml
47
+ # ...
48
+ end
49
+ # ...
50
+ end
51
+ ```
52
+
53
+ ### Проверка XML-ответа от банка
54
+
55
+ ```ruby
56
+ # encoding: UTF-8
57
+ class PaymentsEpayController < PaymentsController
58
+ # ...
59
+ def process_payment
60
+ xml = params[:response]
61
+
62
+ epay_response_is_okay = KazkomEpay::Epay.check_signed_xml xml
63
+ if epay_response_is_okay
64
+ epay_response = Hash.from_xml(xml)['document']['bank']
65
+
66
+ begin
67
+ ActiveRecord::Base.transaction do
68
+ # Задача этого блока - увеличить счет пользователя
69
+
70
+ # Нужно найти Order_ID, который вы создали на этапе формировани
71
+ # XML для отправки в ePay.
72
+ # Например так (при условии, что у вас есть модель PaymentRequest):
73
+ payment_request = PaymentRequest.find epay_response['customer']['merchant']['order']['order_id']
74
+
75
+ # из него вы можете выяснить, счет какого пользователя увеличить:
76
+ user = payment_request.user
77
+ end
78
+ rescue => e
79
+ # Что-то пошло не так, зафиксируйте это в логах и сделайте все, чтобы
80
+ # вы об этом узнали (отошлите себе уведомление и пр.)
81
+ Rails.logger.fatal "Что-то пошло не так при оплате через ePay. Данные: " + params.to_json
82
+
83
+ # ...
84
+ end
85
+ else
86
+ # Подпись оказалась неверной. Возможно, вас пытаются взломать
87
+ end
88
+
89
+ # Обязательно выведите "0" и ничего больше, это требование ePay
90
+ render text: "0"
91
+ end
92
+ end
93
+ ```
94
+
95
+ ## Какой код я могу использовать для отсылки запроса на оплату в ePay?
96
+
97
+ ### Пример с использованием eRb:
98
+
99
+ #### Пояснения
100
+
101
+ Для тестирования используется 3dsecure.kkb.kz, иначе используется epay.kkb.kz, потому что при тестировании вы можете использовать тестовый закрытый ключ и тестовые данные кредитной карты.
102
+
103
+ @base64_encoded_xml - это то, что отдал метод base64_encoded_signed_xml
104
+
105
+ ```html
106
+ <% prefix_for_epay = Rails.env.development? ? '3dsecure' : 'epay' %>
107
+ <form id="pay-epay" method="post" action="https://<%= prefix_for_epay %>.kkb.kz/jsp/process/logon.jsp" target="_blank">
108
+ <input type="hidden" name="Signed_Order_B64" value="<%= @base64_encoded_xml %>">
109
+ <input type="hidden" name="email" value="<%= current_user.email %>">
110
+ <input type="hidden" name="Language" value="rus">
111
+ <input type="hidden" name="BackLink" value="<%= root_url %>">
112
+ <input type="hidden" name="PostLink" value="<%= "обработчик_ответа_банка" %>">
113
+ <input type="submit" value="Оплатить">
114
+ </form>
115
+ ```
116
+
117
+ ## Пример epay.yml
118
+
119
+ ```yaml
120
+ ---
121
+ cert_id: abcd1234
122
+ merchant_id: '1234567'
123
+ private_key_path: 'your.prv.pem' # делается предположение, что ключи находятся в app/cert
124
+ private_key_password: "s0me_p@$$w0rd"
125
+ ```
126
+
127
+ ## Пример
128
+
129
+ TODO: сделать Rails-приложение для примера
130
+
131
+ Для тестирования postlink (обработчика ответа банка) приложение должно быть доступно из интернета (имеется ввиду URL).
132
+
133
+ ## Хотите помочь?
134
+
135
+ 1. Fork'ните проект
136
+ 2. Создайте ветку для вашей функции (`git checkout -b my-new-feature`)
137
+ 3. Сделайте коммит для ваших изменений (`git commit -am 'Added some feature'`)
138
+ 4. Загрузите ветку на GitHub (`git push origin my-new-feature`)
139
+ 5. Сделайте Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDijCCAnKgAwIBAgIFAMGDJ+gwDQYJKoZIhvcNAQEEBQAwUzELMAkGA1UEBhMC
3
+ S1oxDDAKBgNVBAoTA0tLQjELMAkGA1UECxMCQ0ExDzANBgNVBAMTBktLQiBDQTEY
4
+ MBYGCSqGSIb3DQEJARYJY2FAa2tiLmt6MB4XDTA0MTAxODEwMzYwNloXDTA5MTAx
5
+ NzEwMzYwNlowgYMxCzAJBgNVBAYTAktaMQ8wDQYDVQQHEwZBbG1hdHkxHDAaBgNV
6
+ BAoTE0pTQyBLYXprb21tZXJ0c2JhbmsxEzARBgNVBAsTCkhlYWRPZmZpY2UxFDAS
7
+ BgNVBAMTC0VQQVkgU1lTVEVNMRowGAYJKoZIhvcNAQkBFgtlcGF5QGtrYi5rejCB
8
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwNtnbUr82ALmO1E0tQ8Ejp1D+9GH
9
+ EKPeqVTokLb95VhvXX3GoYCKPseFvXMD8x+P0I9x03nJnSRyP6hJ85W/jsElkuYj
10
+ LzYWFfYhCeCQgit2lbSx9FbGVJ1B7M4ZMYuub4DlgtjQ8ebbqRACZ3Yw7LhciUcS
11
+ 235c4K+zmL7p5i0CAwEAAaOBtzCBtDAdBgNVHQ4EFgQU+7GVWbXvHRDbdxFSXqc6
12
+ vd6VPQcwHwYDVR0jBBgwFoAU712nYyivxvN+d0LbneCElQZ9clMwDAYDVR0TBAUw
13
+ AwEBADAOBgNVHQ8BAf8EBAMCBPAwNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL3d3
14
+ dy5ra2Iua3ovY2VydHJvb3Qva2tiY2EuY3JsMB0GA1UdJQQWMBQGCCsGAQUFBwMC
15
+ BggrBgEFBQcDBDANBgkqhkiG9w0BAQQFAAOCAQEAB0jZpXUO9O0uWJZAJP28ATnC
16
+ PCMYa9jheM8MwKhSqe0m1IQ8mkPBzFnKqgmBdyPSp94Fy6xY2ciEnJ5oCEJGM9Nm
17
+ L1kUeg4/HqiTcEUaZWtec4SvwEhKjfoXVwx/teV9KNQoQ8YNyQflEm6DMjiZ6GDM
18
+ qLNV2ZLD5RytWKJYzqg/WScKpuGHYBlUmAi75Ew4nNx1PXi0ATZ9wc0aiXYlwAaP
19
+ pDhNvvLcVLiBjjs/o/QhBgtKewAbltVnU97gf/+yQErbfrL2z+Hg4hF0R63vkjj5
20
+ HsxOZ+pVNi0p+TzKyI1QcS4f53rxo0pMYxHn0LJQquCzbyDKcipkg9qrAFkxoA==
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,12 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ Proc-Type: 4,ENCRYPTED
3
+ DEK-Info: DES-EDE3-CBC,25E4520A4E5EE17A
4
+
5
+ r1Uz/b1FZpMJg0kh2efZoaXpLnEg9xR8rkU8nH5y5LTP7q15zldAWm0BqGax6ZHm
6
+ 5xe/zTjFcZKYjh7NeINlTKrAnbNNYZnYxqqj9GGUa1gEpvHn8TukXB83cEbvsDeS
7
+ jrbvbj5itRqqa9fNNs4rzizVdaGFpQKVhCqx4u7lE8oWdR1WCUHOywpFpkpHznDr
8
+ od/B2JSzG6OekuwCB4tnyZmJ1RYncbsM7NysOGcUZcT9ZmfzteYkVjPxZKcHzjTr
9
+ pLzhlYeAr0by9jNhtodGaYoRHEs2cqK8zEPBRMmgDydVA9Fg2NIIDaBB7ugdjaUw
10
+ XuWUo1y5JrU0hRnB7FdAEizO1g5CNG5aZ5UDcg9jbNeKEqrZy2VcBKARYxVDUIlm
11
+ INB98tXargbAgbCRwKvn76m8R0ClBMlIHiMzP3LCTfQaJnCIIDirfA==
12
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/kazkom_epay/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Dims"]
6
+ gem.email = ["mail@dims.kz"]
7
+ gem.description = %q{Модуль работы с платежным шлюзом KKB ePay}
8
+ gem.summary = %q{Модуль работы с платежным шлюзом KKB ePay}
9
+ gem.homepage = "http://dims.kz"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "kazkom_epay"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = KazkomEpay::VERSION
17
+ end
@@ -0,0 +1,3 @@
1
+ module KazkomEpay
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,122 @@
1
+ require "kazkom_epay/version"
2
+
3
+ module KazkomEpay
4
+ require 'base64'
5
+ require 'openssl'
6
+ require 'yaml'
7
+
8
+ def self.root
9
+ Pathname.new(File.expand_path '../..', __FILE__)
10
+ end
11
+
12
+ class Epay
13
+ class << self
14
+ def production_credentials yaml_file
15
+ yaml = YAML.load_file(yaml_file)
16
+ epay_credentials = {
17
+ cert_id: yaml['cert_id'],
18
+ merchant_id: yaml['merchant_id'],
19
+ private_key_path: KazkomEpay::root.join(yaml['private_key_path']),
20
+ private_key_password: yaml['private_key_password'],
21
+ }
22
+ end
23
+
24
+ def settings
25
+ @@settings ||= {
26
+ cert_id: "00C182B189", # test cert_id
27
+ currency: 398, # KZT
28
+ merchant_name: "Some Merchant",
29
+ merchant_id: 92061101, # test merchant_id
30
+
31
+ private_key_path: KazkomEpay::root.join('cert', 'test', "test_prv.pem"), # test private key path
32
+ private_key_password: "nissan", # test private key password
33
+ public_key_path: KazkomEpay::root.join('cert', 'test', "kkbca.pem")
34
+ }
35
+ end
36
+
37
+ def setup with_params
38
+ @@settings ||= settings
39
+ with_params.each_pair do |key, value|
40
+ @@settings[key.to_sym] = value
41
+ end
42
+ self
43
+ end
44
+
45
+ def key
46
+ settings[:key]
47
+ end
48
+
49
+ def xml
50
+ %Q|<merchant cert_id="#{cert_id}" name="#{merchant_name}"><order order_id="#{order_id}" amount="#{amount}" currency="#{currency}"><department merchant_id="#{merchant_id}" amount="#{amount}"/></order></merchant>|
51
+ end
52
+
53
+ def xml_sign
54
+ pkey = OpenSSL::PKey::RSA.new(File.read(settings[:private_key_path]), settings[:private_key_password])
55
+
56
+ signature = pkey.sign(OpenSSL::Digest::SHA1.new, xml)
57
+ signature.reverse! if reverse_signature
58
+
59
+ signature_base64_encoded_without_newlines = Base64.encode64(signature).gsub("\n", '')
60
+ '<merchant_sign type="RSA">' + signature_base64_encoded_without_newlines + '</merchant_sign>'
61
+ end
62
+
63
+ def signed_xml
64
+ "<document>" + xml + xml_sign + "</document>"
65
+ end
66
+
67
+ # КЛЮЧЕВОЙ МОМЕНТ при формировании запроса для банка
68
+ def base64_encoded_signed_xml
69
+ Base64.encode64(signed_xml).gsub("\n", '')
70
+ end
71
+
72
+ # КЛЮЧЕВОЙ МОМЕНТ при проверке ответа от банка
73
+ def check_signed_xml xml
74
+ # Hash.from_xml
75
+ require 'active_support/core_ext/hash/conversions'
76
+
77
+ bank_sign_raw_base64 = Hash.from_xml(xml)['document']['bank_sign']
78
+
79
+ bank_part_regexp = /\A<document>(.+)<bank_sign.*\z/
80
+ bank_sign_regexp = /(<bank_sign .+<\/bank_sign>)/
81
+
82
+ check_this = bank_part_regexp.match(xml)[1]
83
+ bank_sign_raw = Base64.decode64 bank_sign_raw_base64
84
+ bank_sign_raw.reverse! if reverse_signature
85
+
86
+ digest = OpenSSL::Digest::SHA1.new
87
+ cert = OpenSSL::X509::Certificate.new File.read(settings[:public_key_path])
88
+ public_key = cert.public_key
89
+
90
+ check_result = public_key.verify digest, bank_sign_raw, check_this
91
+ end
92
+
93
+ def cert_id
94
+ settings[:cert_id]
95
+ end
96
+
97
+ def merchant_name
98
+ settings[:merchant_name]
99
+ end
100
+
101
+ def order_id
102
+ settings[:order_id]
103
+ end
104
+
105
+ def amount
106
+ settings[:amount]
107
+ end
108
+
109
+ def currency
110
+ settings[:currency]
111
+ end
112
+
113
+ def merchant_id
114
+ settings[:merchant_id]
115
+ end
116
+
117
+ def reverse_signature
118
+ true
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require File.expand_path('lib/kazkom_epay')
3
+
4
+ describe KazkomEpay::Epay do
5
+ describe "Request to the bank" do
6
+ it "should give XML with valid signature for using as request to the bank" do
7
+ # xml = '<document><merchant cert_id="00C182B189" name="Autokupon"><order order_id="242473" amount="10" currency="398"><department merchant_id="92061101" amount="10"/></order></merchant><merchant_sign type="RSA">nU+OPJl5cwUaePrLjMt8omv9qJbnZewUarj66DWflDgkUIk+i80evth70eJ/S/td3fxItd/7EKV5tZliAYkvcA==</merchant_sign></document>'
8
+ xml_with_valid_signature = 'PGRvY3VtZW50PjxtZXJjaGFudCBjZXJ0X2lkPSIwMEMxODJCMTg5IiBuYW1lPSJBdXRva3Vwb24iPjxvcmRlciBvcmRlcl9pZD0iMjQyNDczIiBhbW91bnQ9IjEwIiBjdXJyZW5jeT0iMzk4Ij48ZGVwYXJ0bWVudCBtZXJjaGFudF9pZD0iOTIwNjExMDEiIGFtb3VudD0iMTAiLz48L29yZGVyPjwvbWVyY2hhbnQ+PG1lcmNoYW50X3NpZ24gdHlwZT0iUlNBIj5uVStPUEpsNWN3VWFlUHJMak10OG9tdjlxSmJuWmV3VWFyajY2RFdmbERna1VJaytpODBldnRoNzBlSi9TL3RkM2Z4SXRkLzdFS1Y1dFpsaUFZa3ZjQT09PC9tZXJjaGFudF9zaWduPjwvZG9jdW1lbnQ+'
9
+ @epay = KazkomEpay::Epay.setup({cert_id: '00C182B189', merchant_name: 'Autokupon', amount: 10, order_id: 242473, currency: 398, merchant_id: '92061101'})
10
+ @epay.base64_encoded_signed_xml.should eql(xml_with_valid_signature)
11
+ end
12
+ end
13
+
14
+ describe "Response from the bank" do
15
+ it "should check XML response from the bank with valid signature" do
16
+ @epay = KazkomEpay::Epay.setup({})
17
+ xml_with_valid_signature = '<document><bank name="Kazkommertsbank JSC"><customer name="YO MAN" mail="test@test.kz" phone=""><merchant cert_id="00C182B189" name="Autokupon"><order order_id="345009" amount="500" currency="398"><department merchant_id="92061101" amount="500"/></order></merchant><merchant_sign type="RSA"/></customer><customer_sign type="RSA"/><results timestamp="2012-09-07 12:47:25"><payment merchant_id="92061101" card="440564-XX-XXXX-6150" amount="500" reference="120907124725" approval_code="124725" response_code="00" Secure="Yes" card_bin="KAZ"/></results></bank><bank_sign cert_id="00C18327E8" type="SHA/RSA">A/8NoZc1y82G/Fzkciy1bPg6/2J5GGfcQ15HvfdpTnyJVW2tm+fd3sYkpTC+3mfUj2C/dux9ZLsh3K1yV6ZFKm8/0TaMztdd5+KMto2YcOrplIml/7ICT4yUiiB2kCz6NbWOa/RlqowrABPbwdhb1aeJkHtNBkH79rfDM/AAWb0=</bank_sign></document>'
18
+ @epay.check_signed_xml(xml_with_valid_signature).should be_true
19
+ end
20
+
21
+ it "should ban XML response from the bank with invalid signature" do
22
+ @epay = KazkomEpay::Epay.setup({})
23
+ xml_with_valid_signature = '<document><bank name="Hackbank JSC"><customer name="YO MAN" mail="test@test.kz" phone=""><merchant cert_id="00C182B189" name="Autokupon"><order order_id="345009" amount="500" currency="398"><department merchant_id="92061101" amount="500"/></order></merchant><merchant_sign type="RSA"/></customer><customer_sign type="RSA"/><results timestamp="2012-09-07 12:47:25"><payment merchant_id="92061101" card="440564-XX-XXXX-6150" amount="500" reference="120907124725" approval_code="124725" response_code="00" Secure="Yes" card_bin="KAZ"/></results></bank><bank_sign cert_id="00C18327E8" type="SHA/RSA">A/8NoZc1y82G/Fzkciy1bPg6/2J5GGfcQ15HvfdpTnyJVW2tm+fd3sYkpTC+3mfUj2C/dux9ZLsh3K1yV6ZFKm8/0TaMztdd5+KMto2YcOrplIml/7ICT4yUiiB2kCz6NbWOa/RlqowrABPbwdhb1aeJkHtNBkH79rfDM/AAWb0=</bank_sign></document>'
24
+ @epay.check_signed_xml(xml_with_valid_signature).should be_false
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kazkom_epay
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dims
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-08 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Модуль работы с платежным шлюзом KKB ePay
15
+ email:
16
+ - mail@dims.kz
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - .rspec
23
+ - Gemfile
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - cert/test/kkbca.pem
28
+ - cert/test/test_prv.pem
29
+ - kazkom_epay.gemspec
30
+ - lib/kazkom_epay.rb
31
+ - lib/kazkom_epay/version.rb
32
+ - spec/models/epay_spec.rb
33
+ - spec/spec_helper.rb
34
+ homepage: http://dims.kz
35
+ licenses: []
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 1.8.24
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: Модуль работы с платежным шлюзом KKB ePay
58
+ test_files:
59
+ - spec/models/epay_spec.rb
60
+ - spec/spec_helper.rb
61
+ has_rdoc: