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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 384578a3b356320f2329b987a33548ae6fa7c362f28cb0157f531482bc38460e
4
- data.tar.gz: a253c570d2e52c5accc722fa687809b17a6b0c890230970f7f1b0911daa56941
3
+ metadata.gz: 4344b69212c472b9ce90383cd75a2b8014e6e0e1205e15d4202e738c05a61ebf
4
+ data.tar.gz: b2852d7c5005bf777b558acc7557f78786d775dc595d75def9fbd1453bae9e0e
5
5
  SHA512:
6
- metadata.gz: c0ca245978d0c853e377291171051f9e753f02421598636e3faad8e0dd520f88ebd82a2c1d64fed2e14fef185b6380c1a39399e017ab1c70cd7dcc0396160a15
7
- data.tar.gz: f369c8ad05331b2a39d1b8af68d66958041480c779587af71318d353051040d321302920117698c18b89b63ef2cc755828e9e68ac2dfd5a9602c8c5f5b61bd1d
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 "../card_data"
4
+ require_relative "./encrypt_card_data"
5
5
 
6
6
  module TinkoffClient
7
7
  module Payment
8
- extend CardData
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 "../requests"
3
+ require_relative "../send_request"
4
4
 
5
5
  module TinkoffClient
6
6
  module Payment
7
7
  class Request
8
- include Requests
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TinkoffClient
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -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.1.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-15 00:00:00.000000000 Z
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/requests.rb
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