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