tinkoff_client 0.2.0 → 0.4.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: 4344b69212c472b9ce90383cd75a2b8014e6e0e1205e15d4202e738c05a61ebf
4
- data.tar.gz: b2852d7c5005bf777b558acc7557f78786d775dc595d75def9fbd1453bae9e0e
3
+ metadata.gz: 698339bbe2471eb26cf4f8ff47ad77166937379b51e4065f4f2968fbdf5ba9c9
4
+ data.tar.gz: 8c4446ca59bd200a1830f9a652722c701e0ddc395b10db788b1a1b73638041b4
5
5
  SHA512:
6
- metadata.gz: 044f02dfb943017a8df46b1c343c865abf63b64edcf8a478811006acae4d92128003cb452b297765148de0c15bd93ba8cd49222ae0804349e0bcca8aae7aa3f6
7
- data.tar.gz: 2b76a58b33b1ddf382d0c73b70999642775ca3349fbce0adf7d8295931c0d6004a4f040a8f9de0d4ff2608a965abe3549b4eaf15eeed72fc2430fedb4116d035
6
+ metadata.gz: dc1e39936a6367181d0678b6ddac6c7b8bdf093b1bb8d9a23c9bd721568752c167e881d29d7307e61cb74012dcc861499791285f6ef8e39c723219a5b18e212f
7
+ data.tar.gz: d12c9c980efcb4effffebbd743d6b80b4c7c711dfd147d99d415f775f53bb265f93e46e1bf03d556fd02ec4fd22eef80b68d9ef78867d0e3ec22de583c203fcf
@@ -6,10 +6,23 @@ require "base64"
6
6
  module TinkoffClient
7
7
  module Payment
8
8
  module EncryptCardData
9
+
10
+ # Метод реализует шифрование данных карты
11
+ #
12
+ # Используется в методе FinishAuthorize https://www.tinkoff.ru/kassa/develop/api/payments/finishAuthorize-request/
13
+ #
14
+ # Объект CardData собирается в виде списка «ключ=значение» (разделитель «;»), зашифровывается открытым ключом (X509 RSA 2048), получившееся бинарное значение кодируется в Base64. Открытый ключ генерируется Банком и выдается при регистрации терминала.
15
+ #
16
+ # Все поля обязательны.
17
+ # @param [Number] PAN
18
+ # @param [Number] ExpDate
19
+ # @param [String] CardHolder
20
+ # @param [String] CVV
21
+ # @see finish_authorize
9
22
  def encrypt_data(keys)
10
23
  card = keys[:Card]
11
24
  concatenated = card.map { |k, v| [k, v].join("=") }.join(";")
12
- public_key = OpenSSL::PKey::RSA.new TinkoffClient.configuration.payment_public_key
25
+ public_key = OpenSSL::PKey::RSA.new File.read(TinkoffClient.configuration.payment_public_key)
13
26
  card_data = Base64.encode64(public_key.public_encrypt(concatenated))
14
27
  end
15
28
  end
@@ -7,30 +7,331 @@ module TinkoffClient
7
7
  module Payment
8
8
  extend EncryptCardData
9
9
 
10
- def self.init(keys)
10
+ # Метод создает платеж: продавец получает ссылку на платежную форму и должен перенаправить по ней покупателя
11
+ #
12
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/init-request/
13
+ #
14
+ # @param [Number] Amount
15
+ # @param [String] OrderId
16
+ # @return [Hash]
17
+ # *
18
+ # {"Success"=>true,
19
+ # "ErrorCode"=>"0",
20
+ # "TerminalKey"=>"1111111111",
21
+ # "Status"=>"NEW",
22
+ # "PaymentId"=>"123456789",
23
+ # "OrderId"=>"3331",
24
+ # "Amount"=>1000,
25
+ # "PaymentURL"=>"https://securepayments.tinkoff.ru/q2wER3t0"}
26
+ # @example
27
+ # #Предположим, что у нас есть User, Product и Order
28
+ #
29
+ # #User
30
+ # {"id"=>1,
31
+ # "email"=>"a@test.ru",
32
+ # "phone"=>"+79031234567"}
33
+ #
34
+ # #Product
35
+ # {"id"=>22,
36
+ # "name"=>"Наименование товара",
37
+ # "price"=>1000,
38
+ # "quantity"=>10}
39
+ #
40
+ # #Order
41
+ # {"id"=>5,
42
+ # "user_id"=>1,
43
+ # "product_id"=>22,
44
+ # "paid"=>false,
45
+ # "payment_id"=>nil}
46
+ #
47
+ # #Простая реализация логики получения платежной ссылки
48
+ # def create
49
+ # order = order.find(params[:order_id]) #Объявляем наш order
50
+ # product = order.product #Объявляем продукт
51
+ # result = TinkoffClient::Payment.init(Amount: product.amount, OrderId: order.id) #Вызываем наш init метод
52
+ # if result["Success"] #в случае, если Success (boolean) вернет true
53
+ # order.update(:order_params)
54
+ # redirect_to result["PaymentURL"] #Отправляем пользователя по ссылке на форму оплаты
55
+ # end
56
+ # end
57
+ #
58
+ # private
59
+ # def order_params
60
+ # params.transform_keys(&:underscore).permit(:payment_id)#Трансформируем ответ из Snake в Camel и пермитим его
61
+ # end
62
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/init-request/
63
+ def self.init(keys)
11
64
  Request.request(path: "Init", keys: keys)
12
65
  end
13
66
 
67
+ # Метод подтверждает платеж передачей реквизитов, а также списывает средства с карты покупателя при одностадийной оплате и блокирует указанную сумму при двухстадийной.
68
+ # Используется, если у площадки есть сертификация PCI DSS и собственная платежная форма.
69
+ #
70
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/confirm-request/
71
+ #
72
+ # @param [Number] PaymentId
73
+ # @return [Hash]
74
+ # *
75
+ # {"Success"=>true,
76
+ # "ErrorCode"=>"0",
77
+ # "TerminalKey"=>"1111111111",
78
+ # "Status"=>"CONFIRMED",
79
+ # "PaymentId"=>"123456789",
80
+ # "OrderId"=>"3331"}
81
+ # @example
82
+ #
83
+ # #Order
84
+ # {"id"=>5,
85
+ # "user_id"=>1,
86
+ # "product_id"=>22,
87
+ # "paid"=>false,
88
+ # "payment_id"=>"123456789"} #Payment id получен в методе init
89
+ #
90
+ # def create
91
+ # order = order.find(params[:order_id]) #Объявляем наш order
92
+ # result = TinkoffClient::Payment.confirm(PaymentId: order.payment_id) #Вызываем наш confirm
93
+ # end
94
+ #
95
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/confirm-description/
96
+ # @see init
14
97
  def self.confirm(keys)
15
98
  Request.request(path: "Confirm", keys: keys)
16
99
  end
17
100
 
101
+
102
+ # Метод возвращает текущий статус платежа.
103
+ #
104
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/getstate-description/
105
+ #
106
+ # @param [Number] PaymentId
107
+ # @return [Hash]
108
+ # *
109
+ # {
110
+ # "Success"=>true,
111
+ # "ErrorCode"=>"0",
112
+ # "Message"=>"OK",
113
+ # "TerminalKey"=>"TinkoffBankTest",
114
+ # "Status"=>"CONFIRMED",
115
+ # "PaymentId"=>"2304882",
116
+ # "OrderId"=>"#419",
117
+ # "Amount"=>1000
118
+ # }
119
+ # @example
120
+ #
121
+ # #Order
122
+ # {"id"=>5,
123
+ # "user_id"=>1,
124
+ # "product_id"=>22,
125
+ # "paid"=>false,
126
+ # "payment_id"=>"123456789"} #Payment id получен в методе init
127
+ #
128
+ # def create
129
+ # order = order.find(params[:order_id]) #Объявляем наш order
130
+ # result = TinkoffClient::Payment.get_state(PaymentId: order.payment_id) #Вызываем наш get_state
131
+ # end
132
+ #
133
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/getstate-description/
134
+ # @see init
18
135
  def self.get_state(keys)
19
136
  Request.request(path: "GetState", keys: keys)
20
137
  end
21
138
 
139
+ # Метод отменяет платеж.
140
+ #
141
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/cancel-description/
142
+ #
143
+ # @param [Number] PaymentId
144
+ # @return [Hash]
145
+ # *
146
+ # {
147
+ # "Success"=>true,
148
+ # "ErrorCode"=>"0",
149
+ # "Message"=>"OK",
150
+ # "TerminalKey"=>"TinkoffBankTest",
151
+ # "Status"=>"REFUNDED",
152
+ # "PaymentId"=>"2304882",
153
+ # "OrderId"=>"#419",
154
+ # "Amount"=>1000
155
+ # }
156
+ # @example
157
+ #
158
+ # #Order
159
+ # {"id"=>5,
160
+ # "user_id"=>1,
161
+ # "product_id"=>22,
162
+ # "paid"=>false,
163
+ # "payment_id"=>"123456789"} #Payment id получен в методе init
164
+ #
165
+ # def create
166
+ # order = order.find(params[:order_id]) #Объявляем наш order
167
+ # result = TinkoffClient::Payment.cancel(PaymentId: order.payment_id) #Вызываем наш cancel
168
+ # end
169
+ #
170
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/cancel-description/
171
+ # @see init
22
172
  def self.cancel(keys)
23
173
  Request.request(path: "Cancel", keys: keys)
24
174
  end
25
175
 
176
+ # Метод возвращает статус заказа.
177
+ #
178
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/checkorder-description/
179
+ #
180
+ # @param [Number] OrderId
181
+ # @return [Hash]
182
+ # *
183
+ # {
184
+ # "Success": true,
185
+ # "ErrorCode": "0",
186
+ # "Message": "OK",
187
+ # "OrderId": "21057",
188
+ # "TerminalKey": "TinkoffBankTest",
189
+ # "Payments": [
190
+ # {
191
+ # "Status": "REJECTED",
192
+ # "PaymentId": 10063,
193
+ # "Rrn": 1234567,
194
+ # "Amount": 555,
195
+ # "Success": false,
196
+ # "ErrorCode": "1051",
197
+ # "Message": "Недостаточно средств на карте"
198
+ # },
199
+ # {
200
+ # "Status": "AUTH_FAIL",
201
+ # "PaymentId": 1005563,
202
+ # "Rrn": 1234567,
203
+ # "Amount": 555,
204
+ # "Success": false,
205
+ # "ErrorCode": "76",
206
+ # "Message": "Операция по иностранной карте недоступна."
207
+ # },
208
+ # {
209
+ # "Status": "NEW",
210
+ # "PaymentId": 100553363,
211
+ # "Rrn": 1234567,
212
+ # "Amount": 555,
213
+ # "Success": true,
214
+ # "ErrorCode": "0",
215
+ # "Message": "ok"
216
+ # }
217
+ # ]
218
+ # }
219
+ # @example
220
+ #
221
+ # #Order
222
+ # {"id"=>5,
223
+ # "user_id"=>1,
224
+ # "product_id"=>22,
225
+ # "paid"=>false,
226
+ # "payment_id"=>"123456789"}
227
+ #
228
+ # def create
229
+ # order = order.find(params[:order_id]) #Объявляем наш order
230
+ # result = TinkoffClient::Payment.check_order(OrderId: order.id) #Вызываем наш check_order
231
+ # end
232
+ #
233
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/checkorder-description/
234
+ # @see init
26
235
  def self.check_order(keys)
27
236
  Request.request(path: "CheckOrder", keys: keys)
28
237
  end
29
238
 
239
+ # Метод позволяет отправить закрывающий чек в кассу.
240
+ # Условия работы метода:
241
+ # Закрывающий чек может быть отправлен если платежная сессия по первому чеку находится в статусе CONFIRMED.
242
+ # В платежной сессии был передан объект Receipt.
243
+ # В объекте Receipt был передан хотя бы один объект Receipt.Items.PaymentMethod = "full_prepayment" или "prepayment" или "advance"
244
+ #
245
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/SendClosingReceipt-description/
246
+ #
247
+ # @param [Number] PaymentId
248
+ # @param [Hash] Receipt
249
+ # @param [Hash] Items
250
+ # @return [Hash]
251
+ # *
252
+ # {
253
+ # "Success"=>true,
254
+ # "ErrorCode"=>"0",
255
+ # "Message"=>"null",
256
+ # }
257
+ # @example
258
+ #
259
+ # #User
260
+ # {"id"=>1,
261
+ # "email"=>"a@test.ru",
262
+ # "phone"=>"+79031234567"}
263
+ #
264
+ # #Product
265
+ # {"id"=>22,
266
+ # "name"=>"Наименование товара",
267
+ # "price"=>1000,
268
+ # "quantity"=>10}
269
+ #
270
+ # #Order
271
+ # {"id"=>5,
272
+ # "user_id"=>1,
273
+ # "product_id"=>22,
274
+ # "paid"=>false,
275
+ # "payment_id"=>"123456789"} #Payment id получен в методе init
276
+ #
277
+ # def create
278
+ # order = order.find(params[:order_id]) #Объявляем наш order
279
+ # params = {
280
+ # PaymentId: order.payment_id,
281
+ # Receipt: { Email: order.user.email, Taxation: "osn",
282
+ # Items: [{ Name: order.product.title, Quantity: "1",
283
+ # Amount: order.product.price, Price: order.product.price,
284
+ # Tax: "vat20", PaymentMethod: "full_payment",
285
+ # PaymentObject: "lottery_prize" }] }
286
+ # }
287
+ # result = TinkoffClient::Payment.send_closing_receipt(params) #Вызываем наш send_closing_receipt
288
+ # end
289
+ #
290
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/SendClosingReceipt-description/
291
+ # @see init
30
292
  def self.send_closing_receipt(keys)
31
293
  Request.request(path: "SendClosingReceipt", keys: keys)
32
294
  end
33
295
 
296
+ # Метод подтверждает платеж передачей реквизитов, а также списывает средства с карты покупателя при одностадийной оплате и блокирует указанную сумму при двухстадийной.
297
+ #
298
+ # Используется, если у площадки есть сертификация PCI DSS и собственная платежная форма.
299
+ #
300
+ # Полный список параметров https://www.tinkoff.ru/kassa/develop/api/payments/finish-authorize/
301
+ #
302
+ # @param [Number] PaymentId
303
+ # @param [Hash] Card
304
+ # @param [Number] PAN (Card)
305
+ # @param [Number] ExpDate (Card)
306
+ # @param [String] CardHolder (Card)
307
+ # @param [CVV] CardHolder (Card)
308
+ # @return [Hash]
309
+ # *
310
+ # {
311
+ # "Success"=>true,
312
+ # "ErrorCode"=>"0",
313
+ # "Message"=>"null",
314
+ # }
315
+ # @example
316
+ #
317
+ # #Order
318
+ # {"id"=>5,
319
+ # "user_id"=>1,
320
+ # "product_id"=>22,
321
+ # "paid"=>false,
322
+ # "payment_id"=>"123456789"} #Payment id получен в методе init
323
+ #
324
+ # def create
325
+ # order = order.find(params[:order_id]) #Объявляем наш order
326
+ # params = {
327
+ # PaymentId: order.payment_id,
328
+ # Card: { PAN: 5545454545454545, ExpDate: 4545, CardHolder: "IVAN PETROV", CVV: "111"}
329
+ # }
330
+ # result = TinkoffClient::Payment.finish_authorize(params) #Вызываем наш finish_authorize
331
+ # end
332
+ #
333
+ # @see https://www.tinkoff.ru/kassa/develop/api/payments/finish-authorize/
334
+ # @see encrypt_data
34
335
  def self.finish_authorize(keys)
35
336
  card_data = encrypt_data(keys)
36
337
  keys[:CardData] = card_data
@@ -29,6 +29,7 @@ module TinkoffClient
29
29
  X509SerialNumber: data[:x509_serial_number],
30
30
  **keys,
31
31
  }
32
+
32
33
  end
33
34
  end
34
35
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TinkoffClient
4
- VERSION = "0.2.0"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tinkoff_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.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-16 00:00:00.000000000 Z
11
+ date: 2024-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rspec
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: pry
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 0.14.1
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 0.14.1
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: openssl
43
15
  requirement: !ruby/object:Gem::Requirement
@@ -94,34 +66,6 @@ dependencies:
94
66
  - - "~>"
95
67
  - !ruby/object:Gem::Version
96
68
  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
125
69
  description: Tinkoff Ruby API wrapper for payments and e2c payouts.
126
70
  email:
127
71
  - arenda244@ya.ru
@@ -141,7 +85,7 @@ files:
141
85
  - lib/tinkoff_client/payout/request.rb
142
86
  - lib/tinkoff_client/send_request.rb
143
87
  - lib/tinkoff_client/version.rb
144
- homepage: https://netsky.dev/opensource/tinkoff_client
88
+ homepage: https://rubygems.org/gems/tinkoff_client/
145
89
  licenses: []
146
90
  metadata:
147
91
  source_code_uri: https://github.com/netsky-dev/tinkoff_client