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 +18 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +139 -0
- data/Rakefile +2 -0
- data/cert/test/kkbca.pem +21 -0
- data/cert/test/test_prv.pem +12 -0
- data/kazkom_epay.gemspec +17 -0
- data/lib/kazkom_epay/version.rb +3 -0
- data/lib/kazkom_epay.rb +122 -0
- data/spec/models/epay_spec.rb +27 -0
- data/spec/spec_helper.rb +17 -0
- metadata +61 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
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
data/cert/test/kkbca.pem
ADDED
@@ -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-----
|
data/kazkom_epay.gemspec
ADDED
@@ -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
|
data/lib/kazkom_epay.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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:
|