tinkoff_client 0.2.0 → 0.3.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8990bbf320ba8d5f805720fcf02f28e09c1df07a6c412be63bab21cfcc50917e
|
4
|
+
data.tar.gz: c1d6ee75bfb21c213623f835f9868c59f75ae7860234875c9dfc4fac80260b9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dac0bb925a463fa4d2ebc180048d4ba899c4aa7940abfb32a7d6193147f27763a4e4a60b0c4ae37f14b9d17bf045647da6999642636f6fa95610f7de4ec91761
|
7
|
+
data.tar.gz: 451995438000e3e794806b7a1d88413843c6244155856194e40b4ae9fcf432d2e7f6755cb5d31ffa3f9f558348a779f5574f6d08956582bd7c1d880a9d729f71
|
@@ -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
|
-
|
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
|
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.3.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-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|