kazkom_epay 1.0.2 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 178c7ba2aa4f284b66ad9cd595a937639536c1f5
4
- data.tar.gz: 33c054747755e16eea22e55cb0a57d0b1ce293b8
3
+ metadata.gz: fa393b05a0f16735c6ed62a0d423f26231ddf254
4
+ data.tar.gz: 78b33420042950f9dbd3cca2b2ea75e3a33c208c
5
5
  SHA512:
6
- metadata.gz: 110e2e595ed27bb9791360ad17eb66b76efd01bd78a80d0fe4a475206fc95fe1bceaac1db23a5915d6e2f36cae4023b208db51b0100be97e4e9c0b7eb78c942f
7
- data.tar.gz: ea7b8e9b71e91f5307372f250ed61fed10389a70f3e5bbbcd06588efb8d55d1ac118d0de0f24a7b9bff7faa9782f31cc2384069b74d538d546e521d0e57cab55
6
+ metadata.gz: 1c718b8f7b845e4a79e3d4a833fea9e634ffbfe968145319fb2bbe87c27f3c2bd53b69e0f2d761b7cc194ba93ca2083c3ccb1382d2bd6e48fa855073e16c13cd
7
+ data.tar.gz: 782c0109d68406b457c61f2173ea7aa48077436f1a0d19891de4aa771ba0e8cd440f8265350bcaaac07f8648d45d0c730e5c7c366c6bd262cc1b8fe1f2c9e52d
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format progress
2
+ --format documentation
data/Gemfile CHANGED
@@ -3,4 +3,4 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in kazkom_epay.gemspec
4
4
  gemspec
5
5
  gem 'rspec'
6
- gem 'activesupport', '3.2.8'
6
+ gem 'activesupport', '>= 3.2.13'
data/README.md CHANGED
@@ -18,18 +18,30 @@ Gem для работы с платежным шлюзом ККБ ePay для и
18
18
 
19
19
  ## Использование (примеры с использованием Ruby On Rails)
20
20
 
21
+ ### Настройка
22
+
23
+ Для использования гема его нужно предварительно настроить. Например, можно создать файл
24
+ `config/initializers/epay.rb` с подобным содержимым:
25
+
26
+ ```ruby
27
+ KazkomEpay.configure do |c|
28
+ c.cert_id '012345'
29
+ c.merchant_name 'Some Seller'
30
+ c.merchant_id '123456'
31
+ c.private_key_path Rails.root.join("config", "cert", "too_roga_i_kopyta_prv.pem")
32
+ c.private_key_password "$ecret"
33
+ c.public_key_path Rails.root.join("config", "cert", "kkbca.pem")
34
+ end
35
+ ```
36
+
21
37
  ### Подпись XML-запроса к банку
22
38
 
23
39
  ```ruby
24
40
  # encoding: UTF-8
25
41
  class PayController < ApplicationController
26
42
  before_filter :authenticate_user!
43
+
27
44
  def epay
28
- # ...
29
- path_to_yaml = Rails.root.join('config', 'epay.yml')
30
- epay_credentials = YAML.load_file(path_to_yaml)
31
- amount = ...
32
-
33
45
  # здесь вы фиксируете Order_ID, который вы передадите банку
34
46
  # и по которому вы сможете в дальнейшем найти нужный платеж
35
47
  # и пользователя, чтобы зачислить деньги ему на счет
@@ -39,11 +51,9 @@ Gem для работы с платежным шлюзом ККБ ePay для и
39
51
  end
40
52
 
41
53
  order_id = payment_request.id
54
+ amount = ...
42
55
 
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
56
+ @base64_encoded_xml = KazkomEpay::Signer.new(amount: amount, order_id: order_id).base64_encoded_signed_xml
47
57
  # ...
48
58
  end
49
59
  # ...
@@ -59,7 +69,7 @@ Gem для работы с платежным шлюзом ККБ ePay для и
59
69
  def process_payment
60
70
  xml = params[:response]
61
71
 
62
- epay_response_is_okay = KazkomEpay::Epay.check_signed_xml xml
72
+ epay_response_is_okay = KazkomEpay.valid_xml_signature? xml
63
73
  if epay_response_is_okay
64
74
  epay_response = Hash.from_xml(xml)['document']['bank']
65
75
 
@@ -114,36 +124,6 @@ Gem для работы с платежным шлюзом ККБ ePay для и
114
124
  </form>
115
125
  ```
116
126
 
117
- ## Пример epay.yml
118
-
119
- ```yaml
120
- ---
121
- cert_id: abcd1234
122
- merchant_id: '1234567'
123
- private_key_path: 'your.prv.pem'
124
- private_key_password: "s0me_p@$$w0rd"
125
- ```
126
-
127
- *Важное замечание*
128
- В _private_key_path_ нужно указать либо полный путь к файлу ключа, либо обернуть Yaml в Erb:
129
-
130
- epay.yml.erb
131
- ```yaml
132
- ---
133
- # ...
134
- private_key_path: <%= Rails.root.join('app', 'cert', 'your.prv.pem') %>
135
- ```
136
-
137
- и в коде использовать
138
-
139
- epay_credentials = YAML.load(ERB.new(File.read(path_to_yaml)).result)
140
-
141
- вместо
142
-
143
- epay_credentials = YAML.load_file(path_to_yaml)
144
-
145
-
146
-
147
127
  ## Пример
148
128
 
149
129
  TODO: сделать Rails-приложение для примера
@@ -151,10 +131,10 @@ TODO: сделать Rails-приложение для примера
151
131
  Для тестирования postlink (обработчика ответа банка) приложение должно быть доступно из интернета (имеется ввиду URL).
152
132
 
153
133
 
154
- ## Хотите нарушить инкапсуляцию и посмотреть на данные, с которыми работает gem?
134
+ ## Хотите посмотреть на данные, с которыми работает gem?
155
135
 
156
136
  ```ruby
157
- KazkomEpay::Epay.setup(epay_credentials).class_variable_get(:'@@settings').to_yaml
137
+ KazkomEpay.configure(epay_credentials).settings.to_yaml
158
138
  ```
159
139
 
160
140
  ## Хотите помочь?
@@ -2,15 +2,15 @@
2
2
  require File.expand_path('../lib/kazkom_epay/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Dims"]
6
- gem.email = ["mail@dims.kz"]
5
+ gem.authors = ["Semenyuk Dmitriy"]
6
+ gem.email = ["mail@semenyukdmitriy.com"]
7
7
  gem.description = %q{Модуль работы с платежным шлюзом KKB ePay}
8
8
  gem.summary = %q{Модуль работы с платежным шлюзом KKB ePay}
9
- gem.homepage = "http://dims.kz"
9
+ gem.homepage = "http://semenyukdmitriy.com"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
+ gem.test_files = gem.files.grep(%r{^(spec|features)/})
14
14
  gem.name = "kazkom_epay"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = KazkomEpay::VERSION
@@ -1,114 +1,154 @@
1
1
  require "kazkom_epay/version"
2
+ require "base64"
3
+ require "openssl"
2
4
 
3
5
  module KazkomEpay
4
- require 'base64'
5
- require 'openssl'
6
- require 'yaml'
6
+ CONFIGURABLE_ATTRIBUTES = [:cert_id, :merchant_id, :merchant_name,
7
+ :private_key_path, :private_key_password,
8
+ :public_key_path]
7
9
 
8
- def self.root
10
+ def self.gem_root_path
9
11
  Pathname.new(File.expand_path '../..', __FILE__)
10
12
  end
11
13
 
12
- class Epay
13
- class << self
14
- def settings
15
- @@settings ||= {
16
- cert_id: "00C182B189", # test cert_id
17
- currency: 398, # KZT
18
- merchant_name: "Some Merchant",
19
- merchant_id: 92061101, # test merchant_id
20
-
21
- private_key_path: KazkomEpay::root.join('cert', 'test', "test_prv.pem"), # test private key path
22
- private_key_password: "nissan", # test private key password
23
- public_key_path: KazkomEpay::root.join('cert', 'test', "kkbca.pem")
24
- }
25
- end
14
+ DEFAULTS = {
15
+ # test data
16
+ cert_id: "00C182B189",
17
+ merchant_name: "Some Merchant",
18
+ merchant_id: 92061101,
19
+
20
+ private_key_path: KazkomEpay.gem_root_path.join('cert', 'test', "test_prv.pem"),
21
+ private_key_password: "nissan",
22
+ public_key_path: KazkomEpay.gem_root_path.join('cert', 'test', "kkbca.pem")
23
+ }
24
+
25
+ # Выдача готового подписанного XML-документа для банка
26
+ #
27
+ # Пример использования:
28
+ #
29
+ # signer = KazkomEpay::Signer.new(amount: 10, order_id: 242473)
30
+ #
31
+ # # уже Base64-кодированного
32
+ # signer.base64_encoded_signed_xml
33
+ #
34
+ # # сырого (сам XML)
35
+ # signer.signed_xml
36
+ #
37
+ class Signer
38
+ def initialize(options = {})
39
+ @amount, @order_id = options.fetch(:amount), options.fetch(:order_id)
40
+ end
26
41
 
27
- def setup with_params
28
- @@settings ||= settings
29
- with_params.each_pair do |key, value|
30
- @@settings[key.to_sym] = value
31
- end
32
- self
33
- end
42
+ def base64_encoded_signed_xml
43
+ Base64.encode64(signed_xml).gsub("\n", '')
44
+ end
34
45
 
35
- def key
36
- settings[:key]
37
- end
46
+ def signed_xml
47
+ ["<document>", xml, xml_signature, "</document>"].join
48
+ end
49
+
50
+ private
38
51
 
39
52
  def xml
40
- %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>|
53
+ %Q|<merchant cert_id="#{KazkomEpay.cert_id}" name="#{KazkomEpay.merchant_name}"><order order_id="#{@order_id}" amount="#{@amount}" currency="#{KazkomEpay.currency}"><department merchant_id="#{KazkomEpay.merchant_id}" amount="#{@amount}"/></order></merchant>|
41
54
  end
42
55
 
43
- def xml_sign
44
- pkey = OpenSSL::PKey::RSA.new(File.read(settings[:private_key_path]), settings[:private_key_password])
56
+ def xml_signature
57
+ pkey = OpenSSL::PKey::RSA.new(File.read(KazkomEpay.send(:settings)[:private_key_path]), KazkomEpay.send(:settings)[:private_key_password])
45
58
 
46
59
  signature = pkey.sign(OpenSSL::Digest::SHA1.new, xml)
47
- signature.reverse! if reverse_signature
60
+ signature.reverse! if KazkomEpay.send(:reverse_signature)
48
61
 
49
62
  signature_base64_encoded_without_newlines = Base64.encode64(signature).gsub("\n", '')
50
- '<merchant_sign type="RSA">' + signature_base64_encoded_without_newlines + '</merchant_sign>'
51
- end
52
63
 
53
- def signed_xml
54
- "<document>" + xml + xml_sign + "</document>"
64
+ ['<merchant_sign type="RSA">', signature_base64_encoded_without_newlines, '</merchant_sign>'].join
55
65
  end
66
+ end
56
67
 
57
- # КЛЮЧЕВОЙ МОМЕНТ при формировании запроса для банка
58
- def base64_encoded_signed_xml
59
- Base64.encode64(signed_xml).gsub("\n", '')
60
- end
61
68
 
62
- # КЛЮЧЕВОЙ МОМЕНТ при проверке ответа от банка
63
- def check_signed_xml xml
64
- # Hash.from_xml
65
- require 'active_support/core_ext/hash/conversions'
69
+ # Проверка аутентичности XML-документа, пришедшего от банка
70
+ #
71
+ # Пример использования:
72
+ #
73
+ # unless KazkomEpay.valid_xml_signature? some_xml_string
74
+ # raise "Hack attempt!"
75
+ # end
76
+ #
77
+ def valid_xml_signature?(xml)
78
+ # for `Hash.from_xml`
79
+ require 'active_support/core_ext/hash/conversions'
66
80
 
67
- bank_sign_raw_base64 = Hash.from_xml(xml)['document']['bank_sign']
81
+ bank_sign_raw_base64 = Hash.from_xml(xml)['document']['bank_sign']
68
82
 
69
- bank_part_regexp = /\A<document>(.+)<bank_sign.*\z/
70
- bank_sign_regexp = /(<bank_sign .+<\/bank_sign>)/
83
+ bank_part_regexp = /\A<document>(.+)<bank_sign.*\z/
71
84
 
72
- check_this = bank_part_regexp.match(xml)[1]
73
- bank_sign_raw = Base64.decode64 bank_sign_raw_base64
74
- bank_sign_raw.reverse! if reverse_signature
85
+ data_to_validate = bank_part_regexp.match(xml)[1]
86
+ bank_sign_raw = Base64.decode64 bank_sign_raw_base64
87
+ bank_sign_raw.reverse! if reverse_signature
75
88
 
76
- digest = OpenSSL::Digest::SHA1.new
77
- cert = OpenSSL::X509::Certificate.new File.read(settings[:public_key_path])
78
- public_key = cert.public_key
89
+ digest = OpenSSL::Digest::SHA1.new
90
+ cert = OpenSSL::X509::Certificate.new File.read(settings[:public_key_path])
79
91
 
80
- check_result = public_key.verify digest, bank_sign_raw, check_this
81
- end
92
+ cert.public_key.verify digest, bank_sign_raw, data_to_validate
93
+ end
82
94
 
83
- alias_method :xml_correctly_signed?, :check_signed_xml
95
+ private
84
96
 
85
- def cert_id
86
- settings[:cert_id]
87
- end
97
+ def settings
98
+ {
99
+ cert_id: cert_id,
100
+ currency: currency, # KZT
101
+ merchant_name: merchant_name,
102
+ merchant_id: merchant_id,
88
103
 
89
- def merchant_name
90
- settings[:merchant_name]
91
- end
104
+ private_key_path: private_key[:path],
105
+ private_key_password: private_key[:password],
106
+ public_key_path: public_key[:path]
107
+ }
108
+ end
92
109
 
93
- def order_id
94
- settings[:order_id]
95
- end
110
+ def reverse_signature
111
+ true
112
+ end
96
113
 
97
- def amount
98
- settings[:amount]
99
- end
114
+ # Memoizers
115
+ def private_key
116
+ @private_key ||= {path: private_key_path, password: private_key_password}
117
+ end
118
+ def public_key
119
+ @public_key ||= {path: public_key_path}
120
+ end
100
121
 
101
- def currency
102
- settings[:currency]
122
+ module Configurator
123
+ require 'active_support/core_ext/module/attribute_accessors'
124
+
125
+ def configure_for_test
126
+ configure(DEFAULTS)
103
127
  end
128
+
129
+ def configure(attrs = {})
130
+ attrs.each do |k, v|
131
+ self.send(:"#{k}=", v) if CONFIGURABLE_ATTRIBUTES.include?(k.to_sym)
132
+ end
133
+ yield self if block_given?
104
134
 
105
- def merchant_id
106
- settings[:merchant_id]
135
+ if (blank = CONFIGURABLE_ATTRIBUTES.map { |att| [att, self.send(att)] }.select{|_, val| val.nil?}).count > 0
136
+ blank_attribute_names = blank.map { |attr, _| attr }.join(", ")
137
+ raise "Some required attributes left blank: #{blank_attribute_names}"
138
+ end
139
+
140
+ self
107
141
  end
108
142
 
109
- def reverse_signature
110
- true
143
+ CONFIGURABLE_ATTRIBUTES.each do |att|
144
+ mattr_accessor att
111
145
  end
146
+
147
+ mattr_accessor :currency
148
+ @@currency = 398
112
149
  end
113
- end
150
+
151
+
152
+ extend Configurator
153
+ extend self
114
154
  end
@@ -1,3 +1,3 @@
1
1
  module KazkomEpay
2
- VERSION = "1.0.2"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -1,27 +1,40 @@
1
1
  require 'spec_helper'
2
2
  require File.expand_path('lib/kazkom_epay')
3
3
 
4
- describe KazkomEpay::Epay do
4
+ describe KazkomEpay do
5
5
  describe "Request to the bank" do
6
+ before(:all) do
7
+ KazkomEpay.configure(
8
+ cert_id: '00C182B189',
9
+ merchant_name: 'Autokupon',
10
+ merchant_id: '92061101',
11
+ # test keys:
12
+ private_key_path: KazkomEpay::DEFAULTS[:private_key_path],
13
+ private_key_password: KazkomEpay::DEFAULTS[:private_key_password],
14
+ public_key_path: KazkomEpay::DEFAULTS[:public_key_path]
15
+ )
16
+ end
17
+ let(:epay) { KazkomEpay::Signer.new(amount: 10, order_id: 242473) }
18
+
6
19
  it "should give XML with valid signature for using as request to the bank" do
7
20
  # 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
21
  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)
22
+
23
+ epay.base64_encoded_signed_xml.should eql xml_with_valid_signature
11
24
  end
12
25
  end
13
26
 
14
27
  describe "Response from the bank" do
28
+ let(:epay) { KazkomEpay.configure_for_test }
29
+
15
30
  it "should check XML response from the bank with valid signature" do
16
- @epay = KazkomEpay::Epay.setup({})
17
31
  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
32
+ epay.valid_xml_signature?(xml_with_valid_signature).should be true
19
33
  end
20
34
 
21
35
  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
36
+ xml_with_invalid_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>'
37
+ epay.valid_xml_signature?(xml_with_invalid_signature).should be false
25
38
  end
26
39
  end
27
40
  end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kazkom_epay
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
- - Dims
7
+ - Semenyuk Dmitriy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-06 00:00:00.000000000 Z
11
+ date: 2013-05-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Модуль работы с платежным шлюзом KKB ePay
14
14
  email:
15
- - mail@dims.kz
15
+ - mail@semenyukdmitriy.com
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
@@ -30,7 +30,7 @@ files:
30
30
  - lib/kazkom_epay/version.rb
31
31
  - spec/models/epay_spec.rb
32
32
  - spec/spec_helper.rb
33
- homepage: http://dims.kz
33
+ homepage: http://semenyukdmitriy.com
34
34
  licenses: []
35
35
  metadata: {}
36
36
  post_install_message:
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  version: '0'
50
50
  requirements: []
51
51
  rubyforge_project:
52
- rubygems_version: 2.0.0
52
+ rubygems_version: 2.0.3
53
53
  signing_key:
54
54
  specification_version: 4
55
55
  summary: Модуль работы с платежным шлюзом KKB ePay