tinkoff_client 0.1.0 → 0.2.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 +4 -4
- data/lib/tinkoff_client/configuration.rb +7 -1
- data/lib/tinkoff_client/generators/templates/tinkoff_client_template.rb +5 -0
- data/lib/tinkoff_client/payment/encrypt_card_data.rb +17 -0
- data/lib/tinkoff_client/payment/payment.rb +2 -2
- data/lib/tinkoff_client/payment/request.rb +13 -2
- data/lib/tinkoff_client/payout/encrypt_data.rb +27 -0
- data/lib/tinkoff_client/payout/payout.rb +43 -0
- data/lib/tinkoff_client/payout/request.rb +35 -0
- data/lib/tinkoff_client/send_request.rb +15 -0
- data/lib/tinkoff_client/version.rb +1 -1
- data/lib/tinkoff_client.rb +2 -0
- metadata +35 -6
- data/lib/tinkoff_client/card_data.rb +0 -17
- data/lib/tinkoff_client/generators/service_generator.rb +0 -25
- data/lib/tinkoff_client/generators/templates/service_template.erb +0 -16
- data/lib/tinkoff_client/requests.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4344b69212c472b9ce90383cd75a2b8014e6e0e1205e15d4202e738c05a61ebf
|
4
|
+
data.tar.gz: b2852d7c5005bf777b558acc7557f78786d775dc595d75def9fbd1453bae9e0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 044f02dfb943017a8df46b1c343c865abf63b64edcf8a478811006acae4d92128003cb452b297765148de0c15bd93ba8cd49222ae0804349e0bcca8aae7aa3f6
|
7
|
+
data.tar.gz: 2b76a58b33b1ddf382d0c73b70999642775ca3349fbce0adf7d8295931c0d6004a4f040a8f9de0d4ff2608a965abe3549b4eaf15eeed72fc2430fedb4116d035
|
@@ -2,12 +2,18 @@
|
|
2
2
|
|
3
3
|
module TinkoffClient
|
4
4
|
class Configuration
|
5
|
-
attr_accessor :payment_public_key, :payment_terminal_key, :payment_terminal_secret
|
5
|
+
attr_accessor :payment_public_key, :payment_terminal_key, :payment_terminal_secret,
|
6
|
+
:payout_terminal_key, :payout_terminal_secret, :payout_certificate, :payout_private_key
|
6
7
|
|
7
8
|
def initialize
|
8
9
|
@payment_public_key = nil
|
9
10
|
@payment_terminal_key = nil
|
10
11
|
@payment_terminal_secret = nil
|
12
|
+
|
13
|
+
@payout_terminal_key = nil
|
14
|
+
@payout_terminal_secret = nil
|
15
|
+
@payout_certificate = nil
|
16
|
+
@payout_private_key = nil
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
@@ -2,4 +2,9 @@ TinkoffClient.configure do |c|
|
|
2
2
|
#c.payment_public_key = "./public.key"
|
3
3
|
c.payment_terminal_key = ENV["TERMINAL_KEY"]
|
4
4
|
c.payment_terminal_secret = ENV["TERMINAL_SECRET"]
|
5
|
+
|
6
|
+
c.payout_terminal_key = ENV["PAYOUT_TERMINAL_KEY"]
|
7
|
+
c.payout_terminal_secret = ENV["PAYOUT_TERMINAL_SECRET"]
|
8
|
+
c.payout_certificate = "./open-api-cert.pem"
|
9
|
+
c.payout_private_key = "./private.key"
|
5
10
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "openssl"
|
4
|
+
require "base64"
|
5
|
+
|
6
|
+
module TinkoffClient
|
7
|
+
module Payment
|
8
|
+
module EncryptCardData
|
9
|
+
def encrypt_data(keys)
|
10
|
+
card = keys[:Card]
|
11
|
+
concatenated = card.map { |k, v| [k, v].join("=") }.join(";")
|
12
|
+
public_key = OpenSSL::PKey::RSA.new TinkoffClient.configuration.payment_public_key
|
13
|
+
card_data = Base64.encode64(public_key.public_encrypt(concatenated))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "./request"
|
4
|
-
require_relative "
|
4
|
+
require_relative "./encrypt_card_data"
|
5
5
|
|
6
6
|
module TinkoffClient
|
7
7
|
module Payment
|
8
|
-
extend
|
8
|
+
extend EncryptCardData
|
9
9
|
|
10
10
|
def self.init(keys)
|
11
11
|
Request.request(path: "Init", keys: keys)
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../
|
3
|
+
require_relative "../send_request"
|
4
4
|
|
5
5
|
module TinkoffClient
|
6
6
|
module Payment
|
7
7
|
class Request
|
8
|
-
include
|
8
|
+
include SendRequest
|
9
9
|
|
10
10
|
attr_reader :url
|
11
11
|
|
@@ -18,6 +18,17 @@ module TinkoffClient
|
|
18
18
|
new(*args, &block).request(path: params[:path], keys: params[:keys])
|
19
19
|
end
|
20
20
|
|
21
|
+
def init_params(keys)
|
22
|
+
payload = {
|
23
|
+
TerminalKey: TinkoffClient.configuration.payment_terminal_key,
|
24
|
+
Password: TinkoffClient.configuration.payment_terminal_secret,
|
25
|
+
**keys,
|
26
|
+
}
|
27
|
+
|
28
|
+
payload[:Token] = generate_token(payload)
|
29
|
+
payload.except(:Password)
|
30
|
+
end
|
31
|
+
|
21
32
|
def generate_token(keys)
|
22
33
|
params = keys.except(:Receipt, :Shops, :DATA).sort.transpose[1].join
|
23
34
|
digest = Digest::SHA2.new(256).hexdigest params
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "openssl"
|
4
|
+
require "base64"
|
5
|
+
|
6
|
+
module TinkoffClient
|
7
|
+
module Payout
|
8
|
+
module EncryptData
|
9
|
+
def encrypt_data(keys)
|
10
|
+
pkey = OpenSSL::PKey::RSA.new File.read(TinkoffClient.configuration.payout_private_key)
|
11
|
+
cert = OpenSSL::X509::Certificate.new File.read(TinkoffClient.configuration.payout_certificate)
|
12
|
+
x509_serial_number = cert.serial.to_s
|
13
|
+
|
14
|
+
context_keys = { :TerminalKey => TinkoffClient.configuration.payout_terminal_key, **keys }
|
15
|
+
concatenated = context_keys.sort.transpose[1].join
|
16
|
+
|
17
|
+
digest = OpenSSL::Digest::SHA256.new concatenated
|
18
|
+
signed_bytes = pkey.sign "SHA256", digest.digest
|
19
|
+
|
20
|
+
signature_value = Base64::strict_encode64 signed_bytes
|
21
|
+
digest_value = Base64::strict_encode64 digest.digest
|
22
|
+
|
23
|
+
result = { signature_value: signature_value, digest_value: digest_value, x509_serial_number: x509_serial_number }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./request"
|
4
|
+
|
5
|
+
module TinkoffClient
|
6
|
+
module Payout
|
7
|
+
def self.add_customer(keys)
|
8
|
+
Request.request(path: "AddCustomer", keys: keys)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.get_customer(keys)
|
12
|
+
Request.request(path: "GetCustomer", keys: keys)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.remove_customer(keys)
|
16
|
+
Request.request(path: "RemoveCustomer", keys: keys)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.add_card(keys)
|
20
|
+
Request.request(path: "AddCard", keys: keys)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.get_card_list(keys)
|
24
|
+
Request.request(path: "GetCardList", keys: keys)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.remove_card(keys)
|
28
|
+
Request.request(path: "RemoveCard", keys: keys)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.init(keys)
|
32
|
+
Request.request(path: "Init", keys: keys)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.payment(keys)
|
36
|
+
Request.request(path: "Payment", keys: keys)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.get_state(keys)
|
40
|
+
Request.request(path: "GetState", keys: keys)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../send_request"
|
4
|
+
require_relative "./encrypt_data"
|
5
|
+
|
6
|
+
module TinkoffClient
|
7
|
+
module Payout
|
8
|
+
class Request
|
9
|
+
include SendRequest
|
10
|
+
include EncryptData
|
11
|
+
|
12
|
+
attr_reader :url
|
13
|
+
|
14
|
+
def initialize(url)
|
15
|
+
@url = "https://securepay.tinkoff.ru/e2c/v2/".freeze
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.request(*args, &block)
|
19
|
+
params = args[0]
|
20
|
+
new(*args, &block).request(path: params[:path], keys: params[:keys])
|
21
|
+
end
|
22
|
+
|
23
|
+
def init_params(keys)
|
24
|
+
data = encrypt_data(keys)
|
25
|
+
payload = {
|
26
|
+
TerminalKey: TinkoffClient.configuration.payout_terminal_key,
|
27
|
+
SignatureValue: data[:signature_value],
|
28
|
+
DigestValue: data[:digest_value],
|
29
|
+
X509SerialNumber: data[:x509_serial_number],
|
30
|
+
**keys,
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
require "rest-client"
|
5
|
+
|
6
|
+
module TinkoffClient
|
7
|
+
module SendRequest
|
8
|
+
def request(path:, keys:)
|
9
|
+
url = @url + path
|
10
|
+
payload = init_params(keys).to_json
|
11
|
+
result = RestClient.post(url, payload, content_type: :json)
|
12
|
+
data = JSON.parse result.body
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/tinkoff_client.rb
CHANGED
@@ -3,11 +3,13 @@
|
|
3
3
|
require_relative "tinkoff_client/version"
|
4
4
|
require_relative "tinkoff_client/configuration"
|
5
5
|
require_relative "tinkoff_client/payment/payment"
|
6
|
+
require_relative "tinkoff_client/payout/payout"
|
6
7
|
|
7
8
|
module TinkoffClient
|
8
9
|
class Error < StandardError; end
|
9
10
|
|
10
11
|
include Payment
|
12
|
+
include Payout
|
11
13
|
|
12
14
|
class << self
|
13
15
|
attr_accessor :configuration
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tinkoff_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- netsky_prod
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '13.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webdrivers
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '5.0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '5.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: selenium-webdriver
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 4.6.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 4.6.1
|
97
125
|
description: Tinkoff Ruby API wrapper for payments and e2c payouts.
|
98
126
|
email:
|
99
127
|
- arenda244@ya.ru
|
@@ -102,15 +130,16 @@ extensions: []
|
|
102
130
|
extra_rdoc_files: []
|
103
131
|
files:
|
104
132
|
- lib/tinkoff_client.rb
|
105
|
-
- lib/tinkoff_client/card_data.rb
|
106
133
|
- lib/tinkoff_client/configuration.rb
|
107
|
-
- lib/tinkoff_client/generators/service_generator.rb
|
108
|
-
- lib/tinkoff_client/generators/templates/service_template.erb
|
109
134
|
- lib/tinkoff_client/generators/templates/tinkoff_client_template.rb
|
110
135
|
- lib/tinkoff_client/generators/tinkoff_client_generator.rb
|
136
|
+
- lib/tinkoff_client/payment/encrypt_card_data.rb
|
111
137
|
- lib/tinkoff_client/payment/payment.rb
|
112
138
|
- lib/tinkoff_client/payment/request.rb
|
113
|
-
- lib/tinkoff_client/
|
139
|
+
- lib/tinkoff_client/payout/encrypt_data.rb
|
140
|
+
- lib/tinkoff_client/payout/payout.rb
|
141
|
+
- lib/tinkoff_client/payout/request.rb
|
142
|
+
- lib/tinkoff_client/send_request.rb
|
114
143
|
- lib/tinkoff_client/version.rb
|
115
144
|
homepage: https://netsky.dev/opensource/tinkoff_client
|
116
145
|
licenses: []
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "json"
|
4
|
-
require "rest-client"
|
5
|
-
require "openssl"
|
6
|
-
require "base64"
|
7
|
-
|
8
|
-
module TinkoffClient
|
9
|
-
module CardData
|
10
|
-
def encrypt_data(keys)
|
11
|
-
card = keys[:Card]
|
12
|
-
concatenated = card.map { |k, v| [k, v].join("=") }.join(";")
|
13
|
-
public_key = OpenSSL::PKey::RSA.new TinkoffClient.configuration.payment_public_key
|
14
|
-
card_data = Base64.encode64(public_key.public_encrypt(concatenated))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module TinkoffClient
|
2
|
-
module Generators
|
3
|
-
|
4
|
-
class ServiceGenerator < Rails::Generators::NamedBase
|
5
|
-
source_root File.expand_path('../templates', __FILE__)
|
6
|
-
|
7
|
-
argument :methods, type: :array, default: [], banner: "method method"
|
8
|
-
class_option :module, type: :string
|
9
|
-
|
10
|
-
def create_service_file
|
11
|
-
@module_name = options[:module]
|
12
|
-
|
13
|
-
service_dir_path = "app/services"
|
14
|
-
generator_dir_path = service_dir_path + ("/#{@module_name.underscore}" if @module_name.present?).to_s
|
15
|
-
generator_path = generator_dir_path + "/#{file_name}.rb"
|
16
|
-
|
17
|
-
Dir.mkdir(service_dir_path) unless File.exist?(service_dir_path)
|
18
|
-
Dir.mkdir(generator_dir_path) unless File.exist?(generator_dir_path)
|
19
|
-
|
20
|
-
template "service.erb", generator_path
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
<% if @module_name.present? %> module <%= @module_name.camelize %> <% end %>
|
2
|
-
class <%= class_name %>
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
end
|
6
|
-
|
7
|
-
def call
|
8
|
-
end
|
9
|
-
|
10
|
-
<% if methods.present? %> private <% end %>
|
11
|
-
<% for method in methods %>
|
12
|
-
def <%= method %>
|
13
|
-
end
|
14
|
-
<% end %>
|
15
|
-
end
|
16
|
-
<% if @module_name.present? %> end <% end %>
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "json"
|
4
|
-
require "rest-client"
|
5
|
-
|
6
|
-
module TinkoffClient
|
7
|
-
module Requests
|
8
|
-
def request(path:, keys:)
|
9
|
-
url = @url + path
|
10
|
-
payload = init_params(keys).to_json
|
11
|
-
result = RestClient.post(url, payload, content_type: :json)
|
12
|
-
data = JSON.parse result.body
|
13
|
-
end
|
14
|
-
|
15
|
-
def init_params(keys)
|
16
|
-
payload = {
|
17
|
-
TerminalKey: TinkoffClient.configuration.payment_terminal_key,
|
18
|
-
Password: TinkoffClient.configuration.payment_terminal_secret,
|
19
|
-
**keys,
|
20
|
-
}
|
21
|
-
|
22
|
-
payload[:Token] = generate_token(payload)
|
23
|
-
payload.except(:Password)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|