payneteasy-payneteasyapi 0.1.0 → 0.1.1
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.
- data/README.md +6 -6
- data/doc/00-basic-tutorial.md +150 -154
- data/doc/01-library-internals.md +4 -4
- data/doc/library-internals/00-payment-data.md +62 -60
- data/doc/library-internals/01-payment-processor.md +87 -85
- data/doc/library-internals/02-validator.md +37 -38
- data/doc/library-internals/03-property-accessor.md +58 -46
- data/doc/payment-scenarios/00-sale-transactions.md +33 -33
- data/doc/payment-scenarios/01-preauth-capture-transactions.md +36 -36
- data/doc/payment-scenarios/02-transfer-transactions.md +22 -23
- data/doc/payment-scenarios/03-return-transactions.md +9 -9
- data/doc/payment-scenarios/04-recurrent-transactions.md +36 -37
- data/doc/payment-scenarios/05-payment-form-integration.md +19 -19
- data/doc/payment-scenarios/06-merchant-callbacks.md +8 -8
- data/example/capture.rb +38 -1
- data/example/common/functions.rb +40 -6
- data/lib/paynet_easy/paynet_easy_api/util/validator.rb +1 -1
- data/payneteasy-payneteasyapi.gemspec +6 -4
- metadata +4 -20
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Фронтенд библиотеки, PaymentProcessor
|
|
2
2
|
|
|
3
|
-
Фронтенд библиотеки
|
|
4
|
-
* **[
|
|
5
|
-
* **[
|
|
6
|
-
* **[
|
|
7
|
-
* **[
|
|
3
|
+
Фронтенд библиотеки представлен классом **[PaynetEasy::PaynetEasyApi::PaymentProcessor](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb)**. Класс предоставляет следующие методы:
|
|
4
|
+
* **[execute_query()](#execute_query)**: выполнение запроса к PaynetEasy
|
|
5
|
+
* **[process_customer_return()](#process_customer_return)**: обработка данных, полученных от PaynetEasy при возвращении пользователя с платежного шлюза
|
|
6
|
+
* **[process_paynet_easy_callback()](#process_paynet_easy_callback)**: обработка данных, полученных от PaynetEasy при поступлении коллбэка от PaynetEasy
|
|
7
|
+
* **[set_handlers()](#set_handlers)**: установка обработчиков для различных событий, происходящих при обработке платежной транзакции
|
|
8
8
|
|
|
9
|
-
### <a name="
|
|
9
|
+
### <a name="execute_query"></a>execute_query(): выполнение запроса к PaynetEasy
|
|
10
10
|
|
|
11
11
|
Некоторые сценарии обработки платежа имеют асинхронную природу и состоят из нескольких запросов. Так, некоторые запросы не возвращают результат платежа сразу и требуют многократного выполнения запроса **status**, после которого клиент может быть отправлен на шлюз PaynetEasy для проведения дополнительных шагов авторизации. После возвращения клиента на сервис мерчанта необходима обработка данных, полученных от шлюза.
|
|
12
12
|
<a name="async_queries_list"></a>Cписок асинхронных запросов:
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
* transfer-by-ref
|
|
19
19
|
|
|
20
20
|
Ознакомиться с обработкой таких запросов можно в следующих файлах:
|
|
21
|
-
* [Пример выполнения запроса sale](../../example/sale.
|
|
22
|
-
* [Пример выполнения запроса preauth](../../example/preauth.
|
|
23
|
-
* [Пример выполнения запроса capture](../../example/capture.
|
|
24
|
-
* [Пример выполнения запроса return](../../example/return.
|
|
25
|
-
* [Пример выполнения запроса make-rebill](../../example/make-rebill.
|
|
26
|
-
* [Пример выполнения запроса transfer-by-ref](../../example/transfer-by-ref.
|
|
21
|
+
* [Пример выполнения запроса sale](../../example/sale.rb)
|
|
22
|
+
* [Пример выполнения запроса preauth](../../example/preauth.rb)
|
|
23
|
+
* [Пример выполнения запроса capture](../../example/capture.rb)
|
|
24
|
+
* [Пример выполнения запроса return](../../example/return.rb)
|
|
25
|
+
* [Пример выполнения запроса make-rebill](../../example/make-rebill.rb)
|
|
26
|
+
* [Пример выполнения запроса transfer-by-ref](../../example/transfer-by-ref.rb)
|
|
27
27
|
|
|
28
28
|
Отдельный сценарий обработки необходим и при интеграции платежной формы. Запрос к шлюзу возвращает ссылку на платежную форму, на которую должен быть отправлен клиент. После заполнения и отправки данных шлюз обрабатывает платежную форму и возвращает клиента на сервис мерчанта. После возвращения клиента на сервис мерчанта необходима обработка данных, полученных от шлюза.
|
|
29
29
|
<a name="form_queries_list"></a>Список запросов для интеграции платежной формы:
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
* transfer-form
|
|
33
33
|
|
|
34
34
|
Ознакомиться с обработкой таких запросов можно в следующих файлах:
|
|
35
|
-
* [Пример выполнения запроса sale-form](../../example/sale-form.
|
|
36
|
-
* [Пример выполнения запроса preauth-form](../../example/preauth-form.
|
|
37
|
-
* [Пример выполнения запроса transfer-form](../../example/transfer-form.
|
|
35
|
+
* [Пример выполнения запроса sale-form](../../example/sale-form.rb)
|
|
36
|
+
* [Пример выполнения запроса preauth-form](../../example/preauth-form.rb)
|
|
37
|
+
* [Пример выполнения запроса transfer-form](../../example/transfer-form.rb)
|
|
38
38
|
|
|
39
39
|
Некоторые операции с платежами не требуют сложных сценариев обработки и выполняются с помощью одного запроса.
|
|
40
40
|
Список простых операций над платежом:
|
|
@@ -43,50 +43,50 @@
|
|
|
43
43
|
* status
|
|
44
44
|
|
|
45
45
|
Ознакомиться с обработкой таких запросов можно в следующих файлах:
|
|
46
|
-
* [Пример выполнения запроса create-card-ref](../../example/create-card-ref.
|
|
47
|
-
* [Пример выполнения запроса get-card-info](../../example/get-card-info.
|
|
48
|
-
* [Пример выполнения запроса status](../../example/status.
|
|
46
|
+
* [Пример выполнения запроса create-card-ref](../../example/create-card-ref.rb)
|
|
47
|
+
* [Пример выполнения запроса get-card-info](../../example/get-card-info.rb)
|
|
48
|
+
* [Пример выполнения запроса status](../../example/status.rb)
|
|
49
49
|
|
|
50
|
-
Для удобного выполнения запросов к PaynetEasy в **PaymentProcessor** реализован метод **[
|
|
50
|
+
Для удобного выполнения запросов к PaynetEasy в **PaymentProcessor** реализован метод **[execute_query()](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb#L62)**.
|
|
51
51
|
Метод принимает два параметра:
|
|
52
52
|
* Название запроса
|
|
53
53
|
* Платежная транзакция для обработки
|
|
54
54
|
|
|
55
|
-
### <a name="
|
|
55
|
+
### <a name="process_customer_return"></a>process_customer_return(): обработка данных, полученных от PaynetEasy при возвращении клиента
|
|
56
56
|
|
|
57
|
-
Каждый [асинхронный запрос](#async_queries_list) может завершиться перенаправлением пользователя на платежный шлюз для выполнения дополнительных действий, а каждый [запрос для интеграции платежной формы](#form_queries_list) обязательно содержит такое перенаправление. Каждый раз при возвращении пользователя на сервис мерчанта передаются данные с результатом обработки платежа. Также, если в [конфигурации стартового запроса](../00-basic-tutorial.md#stage_1_step_3) был задан ключ **server_callback_url**, то через некоторое время PaynetEasy вызовет этот url и передаст ему данные, описанные в wiki PaynetEasy в разделе [Merchant Callbacks](http://wiki.payneteasy.com/index.php/PnE:Merchant_Callbacks). Для удобной обработки этих данных в **PaymentProcessor** реализован метод **[
|
|
57
|
+
Каждый [асинхронный запрос](#async_queries_list) может завершиться перенаправлением пользователя на платежный шлюз для выполнения дополнительных действий, а каждый [запрос для интеграции платежной формы](#form_queries_list) обязательно содержит такое перенаправление. Каждый раз при возвращении пользователя на сервис мерчанта передаются данные с результатом обработки платежа. Также, если в [конфигурации стартового запроса](../00-basic-tutorial.md#stage_1_step_3) был задан ключ **server_callback_url**, то через некоторое время PaynetEasy вызовет этот url и передаст ему данные, описанные в wiki PaynetEasy в разделе [Merchant Callbacks](http://wiki.payneteasy.com/index.php/PnE:Merchant_Callbacks). Для удобной обработки этих данных в **PaymentProcessor** реализован метод **[process_customer_return()](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb#L85)**.
|
|
58
58
|
Метод принимает два параметра:
|
|
59
59
|
* Объект с данными, полученными при возвращении пользователя от PaynetEasy
|
|
60
60
|
* Платежная транзакция для обработки
|
|
61
61
|
|
|
62
62
|
Ознакомиться с использованием данного метода можно в следующих файлах:
|
|
63
63
|
* [Базовый пример использования библиотеки](../00-basic-tutorial.md#stage_2)
|
|
64
|
-
* [Пример выполнения запроса sale](../../example/sale.
|
|
65
|
-
* [Пример выполнения запроса preauth](../../example/preauth.
|
|
66
|
-
* [Пример выполнения запроса sale-form](../../example/sale-form.
|
|
67
|
-
* [Пример выполнения запроса preauth-form](../../example/preauth-form.
|
|
68
|
-
* [Пример выполнения запроса transfer-form](../../example/transfer-form.
|
|
64
|
+
* [Пример выполнения запроса sale](../../example/sale.rb#L91)
|
|
65
|
+
* [Пример выполнения запроса preauth](../../example/preauth.rb#L91)
|
|
66
|
+
* [Пример выполнения запроса sale-form](../../example/sale-form.rb#L70)
|
|
67
|
+
* [Пример выполнения запроса preauth-form](../../example/preauth-form.rb#70)
|
|
68
|
+
* [Пример выполнения запроса transfer-form](../../example/transfer-form.rb#70)
|
|
69
69
|
|
|
70
|
-
### <a name="
|
|
70
|
+
### <a name="process_paynet_easy_callback"></a>process_paynet_easy_callback(): обработка удаленного вызова от PaynetEasy
|
|
71
71
|
|
|
72
|
-
После выполнения [асинхронного запроса](#async_queries_list) или [запроса для интеграции платежной формы](#form_queries_list), если в [конфигурации стартового запроса](../00-basic-tutorial.md#stage_1_step_3) был задан ключ **server_callback_url**, то через некоторое время PaynetEasy вызовет этот url и передаст ему данные, описанные в wiki PaynetEasy в разделе [Merchant Callbacks](http://wiki.payneteasy.com/index.php/PnE:Merchant_Callbacks). Для удобной обработки этих данных в **PaymentProcessor** реализован метод **[
|
|
72
|
+
После выполнения [асинхронного запроса](#async_queries_list) или [запроса для интеграции платежной формы](#form_queries_list), если в [конфигурации стартового запроса](../00-basic-tutorial.md#stage_1_step_3) был задан ключ **server_callback_url**, то через некоторое время PaynetEasy вызовет этот url и передаст ему данные, описанные в wiki PaynetEasy в разделе [Merchant Callbacks](http://wiki.payneteasy.com/index.php/PnE:Merchant_Callbacks). Для удобной обработки этих данных в **PaymentProcessor** реализован метод **[process_paynet_easy_callback()](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb#L96)**.
|
|
73
73
|
Метод принимает два параметра:
|
|
74
74
|
* Объект с данными, полученными при возвращении пользователя от PaynetEasy
|
|
75
75
|
* Платежная транзакция для обработки
|
|
76
76
|
|
|
77
77
|
Ознакомиться с использованием данного метода можно в следующих файлах:
|
|
78
|
-
* [Пример выполнения запроса sale](../../example/sale.
|
|
79
|
-
* [Пример выполнения запроса preauth](../../example/preauth.
|
|
80
|
-
* [Пример выполнения запроса sale-form](../../example/sale-form.
|
|
81
|
-
* [Пример выполнения запроса preauth-form](../../example/preauth-form.
|
|
82
|
-
* [Пример выполнения запроса transfer-form](../../example/transfer-form.
|
|
78
|
+
* [Пример выполнения запроса sale](../../example/sale.rb#L102)
|
|
79
|
+
* [Пример выполнения запроса preauth](../../example/preauth.rb#L102)
|
|
80
|
+
* [Пример выполнения запроса sale-form](../../example/sale-form.rb#L81)
|
|
81
|
+
* [Пример выполнения запроса preauth-form](../../example/preauth-form.rb#81)
|
|
82
|
+
* [Пример выполнения запроса transfer-form](../../example/transfer-form.rb#81)
|
|
83
83
|
|
|
84
|
-
### <a name="
|
|
84
|
+
### <a name="set_handlers"></a> set_handlers(): установка обработчиков для различных событий, происходящих при обработке заказа
|
|
85
85
|
|
|
86
|
-
**PaymentProcessor** скрывает от конечного пользователя алгоритм обработки заказа в методах **[
|
|
87
|
-
* Передача
|
|
88
|
-
* Передача
|
|
89
|
-
* Установка обработчиков по одному с помощью метода **[
|
|
86
|
+
**PaymentProcessor** скрывает от конечного пользователя алгоритм обработки заказа в методах **[execute_query()](#execute_query)**, **[process_customer_return()](#process_customer_return)** и **[process_paynet_easy_callback()](process_paynet_easy_callback)**. При этом во время обработки заказа возникают ситуации, обработка которых должна быть реализована на стороне сервиса мерчанта. Для обработки таких ситуаций в **PaymentProcessor** реализована система событий и их обработчиков. Обработчики могут быть установлены тремя разными способами:
|
|
87
|
+
* Передача хэша с обработчиками в [конструктор класса **PaymentProcessor**](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb#L51)
|
|
88
|
+
* Передача хэша с обработчиками в метод [**set_handlers()**](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb#L150)
|
|
89
|
+
* Установка обработчиков по одному с помощью метода **[set_handler()](../../lib/paynet_easy/paynet_easy_api/payment_processor.rb#L140)**
|
|
90
90
|
|
|
91
91
|
Список обработчиков событий:
|
|
92
92
|
* **HANDLER_SAVE_CHANGES** - обработчик для сохранения платежной транзакции. Вызывается, если данные платежной транзакции изменены. Должен реализовывать сохранение платежной транзакции в хранилище. Принимает следующие параметры:
|
|
@@ -110,54 +110,56 @@
|
|
|
110
110
|
* Ответ от PaynetEasy (опционально, не доступен, если произошла ошибка на этапе формирования или выполнения запроса к PaynetEasy)
|
|
111
111
|
|
|
112
112
|
Метод принимает один параметр:
|
|
113
|
-
*
|
|
113
|
+
* Хэш с обработчиками событий. Ключами элементов хэша являются названия обработчиков, заданные в константах класса, значениями - любые значения типа [Proc](http://www.ruby-doc.org/core-2.0.0/Proc.html)
|
|
114
114
|
|
|
115
115
|
Пример вызова метода с простейшими обработчиками:
|
|
116
116
|
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
$
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
PaymentProcessor::HANDLER_STATUS_UPDATE =>
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
117
|
+
```ruby
|
|
118
|
+
require 'paynet_easy_api'
|
|
119
|
+
require 'cgi'
|
|
120
|
+
require 'cgi/session'
|
|
121
|
+
|
|
122
|
+
$_CGI = CGI.new('html5')
|
|
123
|
+
$_SESSION = CGI::Session.new $_CGI
|
|
124
|
+
|
|
125
|
+
paymentProcessor = PaymentProcessor.new
|
|
126
|
+
paymentProcessor.set_handlers(
|
|
127
|
+
{
|
|
128
|
+
PaymentProcessor::HANDLER_SAVE_CHANGES => ->(payment_transaction, response) do
|
|
129
|
+
$_SESSION['payment_transaction'] = Marshal.dump payment_transaction
|
|
130
|
+
end,
|
|
131
|
+
PaymentProcessor::HANDLER_STATUS_UPDATE => ->(response, payment_transaction) do
|
|
132
|
+
current_location = "http://#{ENV['HTTP_HOST']}/#{ENV['REQUEST_URI']}?stage=updateStatus"
|
|
133
|
+
puts $_CGI.header('status' => 'REDIRECT', 'location' => current_location)
|
|
134
|
+
end,
|
|
135
|
+
PaymentProcessor::HANDLER_SHOW_HTML => ->(response, payment_transaction) do
|
|
136
|
+
puts $_CGI.header
|
|
137
|
+
puts response.html
|
|
138
|
+
end,
|
|
139
|
+
PaymentProcessor::HANDLER_REDIRECT => ->(response, payment_transaction) do
|
|
140
|
+
puts $_CGI.header('status' => 'REDIRECT', 'location' => response.redirect_url)
|
|
141
|
+
exit
|
|
142
|
+
end,
|
|
143
|
+
PaymentProcessor::HANDLER_FINISH_PROCESSING => ->(payment_transaction, response = nil) do
|
|
144
|
+
puts $_CGI.header
|
|
145
|
+
puts <<HTML
|
|
146
|
+
<pre>
|
|
147
|
+
Payment processing finished.
|
|
148
|
+
Payment status: '#{payment_transaction.payment.status}'
|
|
149
|
+
Payment transaction status: '#{payment_transaction.status}'
|
|
150
|
+
</pre>
|
|
151
|
+
HTML
|
|
152
|
+
end,
|
|
153
|
+
PaymentProcessor::HANDLER_CATCH_EXCEPTION => ->(exception, payment_transaction, response = nil) do
|
|
154
|
+
puts $_CGI.header
|
|
155
|
+
puts <<HTML
|
|
156
|
+
<pre>
|
|
157
|
+
Exception catched.
|
|
158
|
+
Exception message: '#{exception.message}'
|
|
159
|
+
Exception backtrace:
|
|
160
|
+
#{exception.backtrace}
|
|
161
|
+
</pre>
|
|
162
|
+
HTML
|
|
163
|
+
end
|
|
164
|
+
})
|
|
163
165
|
```
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
# Валидатор данных, Validator
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
* **[
|
|
3
|
+
Модуль **[PaynetEasy::PaynetEasyApi::Util::Validator](../../lib/paynet_easy/paynet_easy_api/util/validator.rb)** предоставляет следующие методы для валидации данных:
|
|
4
|
+
* **[validate_by_rule()](#validate_by_rule)**: валидация с помощью предопределенного правила или регулярного выражения
|
|
5
5
|
|
|
6
|
-
### <a name="
|
|
6
|
+
### <a name="validate_by_rule"></a>validate_by_rule(): валидация с помощью предопределнного правила
|
|
7
7
|
|
|
8
|
-
Для удобной валидации данных в **[Validator](../../
|
|
8
|
+
Для удобной валидации данных в **[Validator](../../lib/paynet_easy/paynet_easy_api/util/validator.rb)** реализован метод **[validate_by_rule()](../../lib/paynet_easy/paynet_easy_api/util/validator.rb#L87)** и набор констант с правилами валидации. Список доступных правил:
|
|
9
9
|
|
|
10
10
|
Константа |Правило валидации |Описание
|
|
11
11
|
--------------------------------|---------------------------|--------
|
|
12
|
-
Validator::EMAIL |
|
|
13
|
-
Validator::IP |
|
|
14
|
-
Validator::URL
|
|
15
|
-
Validator::MONTH |
|
|
16
|
-
Validator::YEAR
|
|
17
|
-
Validator::PHONE
|
|
18
|
-
Validator::AMOUNT
|
|
19
|
-
Validator::CURRENCY
|
|
20
|
-
Validator::CVV2
|
|
21
|
-
Validator::ZIP_CODE
|
|
22
|
-
Validator::COUNTRY
|
|
23
|
-
Validator::DATE
|
|
24
|
-
Validator::SSN
|
|
25
|
-
Validator::CREDIT_CARD_NUMBER
|
|
26
|
-
Validator::ID
|
|
27
|
-
Validator::LONG_STRING
|
|
28
|
-
Validator::MEDIUM_STRING
|
|
12
|
+
Validator::EMAIL |/@+/ |Validate value as email
|
|
13
|
+
Validator::IP |URI::ABS_URI === ip |Validate value as IP address
|
|
14
|
+
Validator::URL |!!IPAddr.new(url) |Validate value as URL
|
|
15
|
+
Validator::MONTH |(1..12).include? month.to_i|Validate value as month
|
|
16
|
+
Validator::YEAR |/^[0-9]{1,2}$/i |Validate value as year
|
|
17
|
+
Validator::PHONE |/^[0-9\-\+\(\)\s]{6,15}$/i |Validate value as phone number
|
|
18
|
+
Validator::AMOUNT |/^[0-9\.]{1,11}$/i |Validate value as payment amount
|
|
19
|
+
Validator::CURRENCY |/^[A-Z]{1,3}$/i |Validate value as currency
|
|
20
|
+
Validator::CVV2 |/^[\S\s]{3,4}$/i |Validate value as card verification value
|
|
21
|
+
Validator::ZIP_CODE |/^[\S\s]{1,10}$/i |Validate value as zip code
|
|
22
|
+
Validator::COUNTRY |/^[A-Z]{1,2}$/i |Validate value as two-letter country or state code
|
|
23
|
+
Validator::DATE |/^[0-9]{6}$/i |Validate value as date in format MMDDYY
|
|
24
|
+
Validator::SSN |/^[0-9]{1,4}$/i |Validate value as last four digits of social security number
|
|
25
|
+
Validator::CREDIT_CARD_NUMBER |/^[0-9]{1,20}$/i |Validate value as credit card number
|
|
26
|
+
Validator::ID |/^[\S\s]{1,20}$/i |Validate value as ID (client, paynet, card-ref, etc.)
|
|
27
|
+
Validator::LONG_STRING |/^[\S\s]{1,128}$/i |Validate value as long string
|
|
28
|
+
Validator::MEDIUM_STRING |/^[\S\s]{1,50}$/i |Validate value as medium string
|
|
29
29
|
|
|
30
30
|
Метод принимает три параметра:
|
|
31
31
|
* Значение для валидации
|
|
@@ -35,21 +35,20 @@ Validator::MEDIUM_STRING |#^[\S\s]{1,50}$#i |Validate value as m
|
|
|
35
35
|
* **false** - будет возвращен булевый результат проверки
|
|
36
36
|
Пример использования метода:
|
|
37
37
|
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
38
|
+
```ruby
|
|
39
|
+
require 'paynet_easy_api'
|
|
40
|
+
require 'util/validator'
|
|
41
|
+
|
|
42
|
+
include PaynetEasy::PaynetEasyApi::Util
|
|
43
|
+
|
|
44
|
+
p Validator.validate_by_rule('test@mail.com', Validator::EMAIL, false) # true
|
|
45
|
+
p Validator.validate_by_rule('some string', '#\d#', false) # false
|
|
46
|
+
|
|
47
|
+
# prints 'invalid'
|
|
48
|
+
begin
|
|
49
|
+
Validator.validate_by_rule('test[at]mail.com', Validator::EMAIL)
|
|
50
|
+
puts 'valid'
|
|
51
|
+
rescue ValidationError
|
|
52
|
+
puts 'invalid'
|
|
53
|
+
end
|
|
55
54
|
```
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Модуль для работы с цепочками свойств, PropertyAccessor
|
|
2
2
|
|
|
3
|
-
В процессе работы с данными платежа возникает необходимость читать и изменять свойства объектов, хранящихся в
|
|
4
|
-
* **[
|
|
5
|
-
* **[
|
|
3
|
+
В процессе работы с данными платежа возникает необходимость читать и изменять свойства объектов, хранящихся в PaymentTransaction. Например, для чтения email клиента необходимо вызвать `payment_transaction.payment.customer.email`, а для записи - `payment_transaction.payment.customer.email = ''`. Для удобного выполнения этих операций в модуле **[PaynetEasy::PaynetEasyApi::Util::PropertyAccessor](../../lib/paynet_easy/paynet_easy_api/util/property_accessor.rb)** реализованы следующие методы:
|
|
4
|
+
* **[get_value()](#get_value)**: удобное чтение данных по цепочке свойств
|
|
5
|
+
* **[set_value()](#set_value)**: удобная запись данных по цепочке свойств
|
|
6
6
|
|
|
7
|
-
### <a name="
|
|
7
|
+
### <a name="get_value"></a> get_value(): удобное чтение данных по цепочке свойств
|
|
8
8
|
|
|
9
|
-
Метод предназначен для чтения данных из цепочки свойств. Цепочка свойств описывает порядок получения свойств из переданного объекта. Так, для цепочки `
|
|
9
|
+
Метод предназначен для чтения данных из цепочки свойств. Цепочка свойств описывает порядок получения свойств из переданного объекта. Так, для цепочки `payment.billing_address.first_line` будет получено значение свойства `first_line` из объекта, хранящегося в свойстве `billing_address`, хранящегося в свойстве `payment`. Для получения свойств используются методы-геттеры полей объекта.
|
|
10
10
|
Метод принимает три параметра:
|
|
11
11
|
* Объект, цепочку свойств которого можно прочитать
|
|
12
12
|
* Цепочка свойств
|
|
@@ -15,62 +15,74 @@
|
|
|
15
15
|
* **false** - будет возвращен `null`
|
|
16
16
|
|
|
17
17
|
Пример использования метода:
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
use PaynetEasy\PaynetEasyApi\PaymentData\CreditCard;
|
|
22
|
-
use RuntimeException;
|
|
18
|
+
```ruby
|
|
19
|
+
require 'paynet_easy_api'
|
|
20
|
+
require 'util/property_accessor'
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
include PaynetEasy::PaynetEasyApi::PaymentData
|
|
23
|
+
include PaynetEasy::PaynetEasyApi::Util
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
var_dump(PropertyAccessor::getValue($payment, 'creditCard.expireMonth', false)); // null
|
|
29
|
-
|
|
30
|
-
// prints 'empty'
|
|
31
|
-
try
|
|
32
|
-
{
|
|
33
|
-
PropertyAccessor::getValue($payment, 'creditCard.expireMonth');
|
|
34
|
-
}
|
|
35
|
-
catch (RuntimeException $e)
|
|
25
|
+
payment_transaction = PaymentTransaction.new(
|
|
36
26
|
{
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
'payment' => Payment.new(
|
|
28
|
+
{
|
|
29
|
+
'credit_card' => CreditCard.new(
|
|
30
|
+
{
|
|
31
|
+
'expire_year' => '14'
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
p PropertyAccessor.get_value(payment_transaction, 'payment.credit_card.expire_year') # 2014
|
|
37
|
+
p PropertyAccessor.get_value(payment_transaction, 'payment.credit_card.expire_month', false) # nil
|
|
38
|
+
|
|
39
|
+
# prints 'empty'
|
|
40
|
+
begin
|
|
41
|
+
PropertyAccessor.get_value(payment_transactions, 'payment.creditCard.expireMonth')
|
|
42
|
+
rescue RuntimeError
|
|
43
|
+
puts 'empty'
|
|
44
|
+
end
|
|
39
45
|
```
|
|
40
46
|
|
|
41
|
-
### <a name="
|
|
47
|
+
### <a name="set_value"></a> set_value(): удобное изменение данных по цепочке свойств
|
|
42
48
|
|
|
43
|
-
Метод предназначен для изменения данных по цепочке свойств. Цепочка свойств описывает порядок получения свойств из переданного объекта. Так, для цепочки `
|
|
49
|
+
Метод предназначен для изменения данных по цепочке свойств. Цепочка свойств описывает порядок получения свойств из переданного объекта. Так, для цепочки `payment.billing_address.first_line` будет изменено значение свойства `first_line` из объекта, хранящегося в свойстве `billing_address`, хранящегося в свойстве `payment`. Для получения свойств используются методы-геттеры для полей объекта, для изменения - методы-сеттеры, названия которых образованы добавлением префикса `set` к имени свойства. Таким образом, изменение данных для цепочки `payment.billingAddress.
|
|
44
50
|
Метод принимает четыре параметра:
|
|
45
51
|
* Объект, цепочку свойств которого можно прочитать
|
|
46
52
|
* Цепочка свойств
|
|
47
53
|
* Новое значение
|
|
48
54
|
* Флаг, определяющий поведение метода в том случае, если геттер или сеттер для свойства не был найден или если свойство, в котором ожидался объект, пустое:
|
|
49
55
|
* **true** - будет брошено исключение
|
|
50
|
-
* **false** - будет возвращен `
|
|
56
|
+
* **false** - будет возвращен `nil`
|
|
51
57
|
|
|
52
58
|
Пример использования метода:
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
use PaynetEasy\PaynetEasyApi\PaymentData\CreditCard;
|
|
57
|
-
use RuntimeException;
|
|
59
|
+
```ruby
|
|
60
|
+
require 'paynet_easy_api'
|
|
61
|
+
require 'util/property_accessor'
|
|
58
62
|
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
include PaynetEasy::PaynetEasyApi::PaymentData
|
|
64
|
+
include PaynetEasy::PaynetEasyApi::Util
|
|
61
65
|
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
payment_transaction = PaymentTransaction.new(
|
|
67
|
+
{
|
|
68
|
+
'payment' => Payment.new(
|
|
69
|
+
{
|
|
70
|
+
'credit_card' => CreditCard.new(
|
|
71
|
+
{
|
|
72
|
+
'expire_year' => '14'
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
})
|
|
64
76
|
|
|
65
|
-
PropertyAccessor
|
|
77
|
+
PropertyAccessor.set_value(payment_transaction, 'payment.credit_card.expire_year', 15)
|
|
78
|
+
p PropertyAccessor.get_value(payment_transaction, 'payment.credit_card.expire_year') # 15
|
|
66
79
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
80
|
+
PropertyAccessor.set_value(payment_transaction, 'payment.credit_card.non_existent_property', 'value', false) # nothing will happen
|
|
81
|
+
|
|
82
|
+
# prints 'nonexistent property'
|
|
83
|
+
begin
|
|
84
|
+
PropertyAccessor.set_value(payment_transaction, 'payment.credit_card.non_existent_property', 'value')
|
|
85
|
+
rescue RuntimeError
|
|
86
|
+
puts 'nonexistent property'
|
|
87
|
+
end
|
|
76
88
|
```
|