payneteasy-payneteasyapi 0.1.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.
Files changed (87) hide show
  1. data/.gemtest +0 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +18 -0
  4. data/README.md +54 -0
  5. data/Rakefile +8 -0
  6. data/doc/00-basic-tutorial.md +254 -0
  7. data/doc/01-library-internals.md +6 -0
  8. data/doc/02-payment-scenarios.md +9 -0
  9. data/doc/library-internals/00-payment-data.md +162 -0
  10. data/doc/library-internals/01-payment-processor.md +163 -0
  11. data/doc/library-internals/02-validator.md +55 -0
  12. data/doc/library-internals/03-property-accessor.md +76 -0
  13. data/doc/payment-scenarios/00-sale-transactions.md +90 -0
  14. data/doc/payment-scenarios/01-preauth-capture-transactions.md +105 -0
  15. data/doc/payment-scenarios/02-transfer-transactions.md +89 -0
  16. data/doc/payment-scenarios/03-return-transactions.md +52 -0
  17. data/doc/payment-scenarios/04-recurrent-transactions.md +110 -0
  18. data/doc/payment-scenarios/05-payment-form-integration.md +59 -0
  19. data/doc/payment-scenarios/06-merchant-callbacks.md +29 -0
  20. data/example/capture.rb +12 -0
  21. data/example/common/functions.rb +56 -0
  22. data/lib/paynet_easy/paynet_easy_api/callback/callback_factory.rb +47 -0
  23. data/lib/paynet_easy/paynet_easy_api/callback/callback_prototype.rb +186 -0
  24. data/lib/paynet_easy/paynet_easy_api/callback/customer_return_callback.rb +28 -0
  25. data/lib/paynet_easy/paynet_easy_api/callback/paynet_easy_callback.rb +44 -0
  26. data/lib/paynet_easy/paynet_easy_api/error/paynet_error.rb +4 -0
  27. data/lib/paynet_easy/paynet_easy_api/error/request_error.rb +6 -0
  28. data/lib/paynet_easy/paynet_easy_api/error/response_error.rb +6 -0
  29. data/lib/paynet_easy/paynet_easy_api/error/validation_error.rb +6 -0
  30. data/lib/paynet_easy/paynet_easy_api/payment_data/billing_address.rb +41 -0
  31. data/lib/paynet_easy/paynet_easy_api/payment_data/credit_card.rb +32 -0
  32. data/lib/paynet_easy/paynet_easy_api/payment_data/customer.rb +35 -0
  33. data/lib/paynet_easy/paynet_easy_api/payment_data/data.rb +13 -0
  34. data/lib/paynet_easy/paynet_easy_api/payment_data/payment.rb +190 -0
  35. data/lib/paynet_easy/paynet_easy_api/payment_data/payment_transaction.rb +188 -0
  36. data/lib/paynet_easy/paynet_easy_api/payment_data/query_config.rb +95 -0
  37. data/lib/paynet_easy/paynet_easy_api/payment_data/recurrent_card.rb +40 -0
  38. data/lib/paynet_easy/paynet_easy_api/payment_processor.rb +251 -0
  39. data/lib/paynet_easy/paynet_easy_api/paynet_easy_api.rb +26 -0
  40. data/lib/paynet_easy/paynet_easy_api/query/capture_query.rb +30 -0
  41. data/lib/paynet_easy/paynet_easy_api/query/create_card_ref_query.rb +78 -0
  42. data/lib/paynet_easy/paynet_easy_api/query/get_card_info_query.rb +49 -0
  43. data/lib/paynet_easy/paynet_easy_api/query/make_rebill_query.rb +37 -0
  44. data/lib/paynet_easy/paynet_easy_api/query/preauth_form_query.rb +10 -0
  45. data/lib/paynet_easy/paynet_easy_api/query/preauth_query.rb +10 -0
  46. data/lib/paynet_easy/paynet_easy_api/query/prototype/payment_form_query.rb +69 -0
  47. data/lib/paynet_easy/paynet_easy_api/query/prototype/payment_query.rb +71 -0
  48. data/lib/paynet_easy/paynet_easy_api/query/prototype/query.rb +302 -0
  49. data/lib/paynet_easy/paynet_easy_api/query/query_factory.rb +19 -0
  50. data/lib/paynet_easy/paynet_easy_api/query/return_query.rb +46 -0
  51. data/lib/paynet_easy/paynet_easy_api/query/sale_form_query.rb +10 -0
  52. data/lib/paynet_easy/paynet_easy_api/query/sale_query.rb +53 -0
  53. data/lib/paynet_easy/paynet_easy_api/query/status_query.rb +50 -0
  54. data/lib/paynet_easy/paynet_easy_api/query/transfer_by_ref_query.rb +41 -0
  55. data/lib/paynet_easy/paynet_easy_api/query/transfer_form_query.rb +10 -0
  56. data/lib/paynet_easy/paynet_easy_api/transport/callback_response.rb +21 -0
  57. data/lib/paynet_easy/paynet_easy_api/transport/gateway_client.rb +91 -0
  58. data/lib/paynet_easy/paynet_easy_api/transport/request.rb +20 -0
  59. data/lib/paynet_easy/paynet_easy_api/transport/response.rb +136 -0
  60. data/lib/paynet_easy/paynet_easy_api/util/property_accessor.rb +60 -0
  61. data/lib/paynet_easy/paynet_easy_api/util/string.rb +9 -0
  62. data/lib/paynet_easy/paynet_easy_api/util/validator.rb +110 -0
  63. data/payneteasy-payneteasyapi.gemspec +16 -0
  64. data/test/paynet_easy/paynet_easy_api/callback/callback_factory_test.rb +22 -0
  65. data/test/paynet_easy/paynet_easy_api/callback/callback_test_prototype.rb +168 -0
  66. data/test/paynet_easy/paynet_easy_api/callback/customer_return_callback_test.rb +95 -0
  67. data/test/paynet_easy/paynet_easy_api/callback/paynet_easy_callback_test.rb +101 -0
  68. data/test/paynet_easy/paynet_easy_api/fake.rb +71 -0
  69. data/test/paynet_easy/paynet_easy_api/payment_processor_test.rb +255 -0
  70. data/test/paynet_easy/paynet_easy_api/query/capture_query_test.rb +48 -0
  71. data/test/paynet_easy/paynet_easy_api/query/create_card_ref_query_test.rb +116 -0
  72. data/test/paynet_easy/paynet_easy_api/query/get_card_info_query_test.rb +116 -0
  73. data/test/paynet_easy/paynet_easy_api/query/make_rebill_query_test.rb +59 -0
  74. data/test/paynet_easy/paynet_easy_api/query/prototype/payment_query_test_prototype.rb +117 -0
  75. data/test/paynet_easy/paynet_easy_api/query/prototype/query_test_prototype.rb +190 -0
  76. data/test/paynet_easy/paynet_easy_api/query/prototype/sync_query_test_prototype.rb +88 -0
  77. data/test/paynet_easy/paynet_easy_api/query/query_factory_test.rb +21 -0
  78. data/test/paynet_easy/paynet_easy_api/query/return_query_test.rb +58 -0
  79. data/test/paynet_easy/paynet_easy_api/query/sale_form_query_test.rb +96 -0
  80. data/test/paynet_easy/paynet_easy_api/query/sale_query_test.rb +78 -0
  81. data/test/paynet_easy/paynet_easy_api/query/status_query_test.rb +81 -0
  82. data/test/paynet_easy/paynet_easy_api/query/transfer_by_ref_query_test.rb +63 -0
  83. data/test/paynet_easy/paynet_easy_api/transport/gateway_client_test.rb +22 -0
  84. data/test/paynet_easy/paynet_easy_api/transport/response_test.rb +26 -0
  85. data/test/paynet_easy/paynet_easy_api/util/property_accessor_test.rb +52 -0
  86. data/test/paynet_easy/paynet_easy_api/util/validator_test.rb +42 -0
  87. metadata +204 -0
@@ -0,0 +1,163 @@
1
+ # Фронтенд библиотеки, PaymentProcessor
2
+
3
+ Фронтенд библиотеки представляет класс **[PaynetEasy\PaynetEasyApi\PaymentProcessor](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php)**. Класс предоставляет следующие возможности:
4
+ * **[executeQuery()](#executeQuery)**: простое выполнение запроса к PaynetEasy
5
+ * **[processCustomerReturn()](#processCustomerReturn)**: простая обработка данных, полученных от PaynetEasy при возвращении пользователя с платежного шлюза
6
+ * **[processPaynetEasyCallback()](#processPaynetEasyCallback)**: простая обработка данных, полученных от PaynetEasy при поступлении коллбэка от PaynetEasy
7
+ * **[setHandlers()](#setHandlers)**: установка обработчиков для различных событий, происходящих при обработке платежной транзакции
8
+
9
+ ### <a name="executeQuery"></a>executeQuery(): простое выполнение запроса к PaynetEasy
10
+
11
+ Некоторые сценарии обработки платежа имеют асинхронную природу и состоят из нескольких запросов. Так, некоторые запросы не возвращают результат платежа сразу и требуют многократного выполнения запроса **status**, после которого клиент может быть отправлен на шлюз PaynetEasy для проведения дополнительных шагов авторизации. После возвращения клиента на сервис мерчанта необходима обработка данных, полученных от шлюза.
12
+ <a name="async_queries_list"></a>Cписок асинхронных запросов:
13
+ * sale
14
+ * preauth
15
+ * capture
16
+ * return
17
+ * make-rebill
18
+ * transfer-by-ref
19
+
20
+ Ознакомиться с обработкой таких запросов можно в следующих файлах:
21
+ * [Пример выполнения запроса sale](../../example/sale.php)
22
+ * [Пример выполнения запроса preauth](../../example/preauth.php)
23
+ * [Пример выполнения запроса capture](../../example/capture.php)
24
+ * [Пример выполнения запроса return](../../example/return.php)
25
+ * [Пример выполнения запроса make-rebill](../../example/make-rebill.php)
26
+ * [Пример выполнения запроса transfer-by-ref](../../example/transfer-by-ref.php)
27
+
28
+ Отдельный сценарий обработки необходим и при интеграции платежной формы. Запрос к шлюзу возвращает ссылку на платежную форму, на которую должен быть отправлен клиент. После заполнения и отправки данных шлюз обрабатывает платежную форму и возвращает клиента на сервис мерчанта. После возвращения клиента на сервис мерчанта необходима обработка данных, полученных от шлюза.
29
+ <a name="form_queries_list"></a>Список запросов для интеграции платежной формы:
30
+ * sale-form
31
+ * preauth-form
32
+ * transfer-form
33
+
34
+ Ознакомиться с обработкой таких запросов можно в следующих файлах:
35
+ * [Пример выполнения запроса sale-form](../../example/sale-form.php)
36
+ * [Пример выполнения запроса preauth-form](../../example/preauth-form.php)
37
+ * [Пример выполнения запроса transfer-form](../../example/transfer-form.php)
38
+
39
+ Некоторые операции с платежами не требуют сложных сценариев обработки и выполняются с помощью одного запроса.
40
+ Список простых операций над платежом:
41
+ * create-card-ref
42
+ * get-card-info
43
+ * status
44
+
45
+ Ознакомиться с обработкой таких запросов можно в следующих файлах:
46
+ * [Пример выполнения запроса create-card-ref](../../example/create-card-ref.php)
47
+ * [Пример выполнения запроса get-card-info](../../example/get-card-info.php)
48
+ * [Пример выполнения запроса status](../../example/status.php)
49
+
50
+ Для удобного выполнения запросов к PaynetEasy в **PaymentProcessor** реализован метод **[executeQuery()](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php#L114)**.
51
+ Метод принимает два параметра:
52
+ * Название запроса
53
+ * Платежная транзакция для обработки
54
+
55
+ ### <a name="processCustomerReturn"></a>processCustomerReturn(): простая обработка данных, полученных от PaynetEasy
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** реализован метод **[executeCallback()](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php#L161)**.
58
+ Метод принимает два параметра:
59
+ * Объект с данными, полученными при возвращении пользователя от PaynetEasy
60
+ * Платежная транзакция для обработки
61
+
62
+ Ознакомиться с использованием данного метода можно в следующих файлах:
63
+ * [Базовый пример использования библиотеки](../00-basic-tutorial.md#stage_2)
64
+ * [Пример выполнения запроса sale](../../example/sale.php#L91)
65
+ * [Пример выполнения запроса preauth](../../example/preauth.php#L91)
66
+ * [Пример выполнения запроса sale-form](../../example/sale-form.php#L70)
67
+ * [Пример выполнения запроса preauth-form](../../example/preauth-form.php#70)
68
+ * [Пример выполнения запроса transfer-form](../../example/transfer-form.php#70)
69
+
70
+ ### <a name="processPaynetEasyCallback"></a>processPaynetEasyCallback(): простая обработка данных, полученных от PaynetEasy
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** реализован метод **[processPaynetEasyCallback()](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php#L176)**.
73
+ Метод принимает два параметра:
74
+ * Объект с данными, полученными при возвращении пользователя от PaynetEasy
75
+ * Платежная транзакция для обработки
76
+
77
+ Ознакомиться с использованием данного метода можно в следующих файлах:
78
+ * [Пример выполнения запроса sale](../../example/sale.php#L102)
79
+ * [Пример выполнения запроса preauth](../../example/preauth.php#L102)
80
+ * [Пример выполнения запроса sale-form](../../example/sale-form.php#L81)
81
+ * [Пример выполнения запроса preauth-form](../../example/preauth-form.php#81)
82
+ * [Пример выполнения запроса transfer-form](../../example/transfer-form.php#81)
83
+
84
+ ### <a name="setHandlers"></a> setHandlers(): установка обработчиков для различных событий, происходящих при обработке заказа
85
+
86
+ **PaymentProcessor** скрывает от конечного пользователя алгоритм обработки заказа в методах **[executeWorkflow()](#executeWorkflow)**, **[executeQuery()](#executeQuery)** и **[executeCallback()](#executeCallback)**. При этом во время обработки заказа возникают ситуации, обработка которых должна быть реализована на стороне сервиса мерчанта. Для обработки таких ситуаций в **PaymentProcessor** реализована система событий и их обработчиков. Обработчики могут быть установлены тремя разными способами:
87
+ * Передача массива обработчиков в [конструктор класса **PaymentProcessor**](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php#L101)
88
+ * Передача массива обработчиков в метод [**setHandlers()**](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php#L273)
89
+ * Установка обработчиков по одному с помощью метода **[setHandler()](../../source/PaynetEasy/PaynetEasyApi/PaymentProcessor.php#L249)**
90
+
91
+ Список обработчиков событий:
92
+ * **HANDLER_SAVE_CHANGES** - обработчик для сохранения платежной транзакции. Вызывается, если данные платежной транзакции изменены. Должен реализовывать сохранение платежной транзакции в хранилище. Принимает следующие параметры:
93
+ * Платежная транзакция
94
+ * Ответ от PaynetEasy (опционально, не доступен, если произошла ошибка на этапе формирования или выполнения запроса к PaynetEasy)
95
+ * **HANDLER_STATUS_UPDATE** - обработчик для обновления статуса платежной транзакции. Вызывается, если статус платежной транзакции не изменился с момента последней проверки. Должен реализовывать запуск проверки статуса платежной транзакции. Принимает следующие параметры:
96
+ * Ответ от PaynetEasy
97
+ * Платежная транзакция
98
+ * **HANDLER_SHOW_HTML** - обработчик для вывода HTML-кода, полученного от PaynetEasy. Вызывается, если необходима 3D-авторизация пользователя. Должен реализовывать вывод HTML-кода из ответа от PaynetEasy в браузер клиента. Принимает следующие параметры:
99
+ * Ответ от PaynetEasy
100
+ * Платежная транзакция
101
+ * **HANDLER_REDIRECT** - обработчик для перенаправления клиента на платежную форму PaynetEasy. Вызывается после выполнения запроса [sale-form, preauth-form или transfer-form](../payment-scenarios/05-payment-form-integration.md). Должен реализовывать перенаправление пользователя на URL из ответа от PaynetEasy. Принимает следующие параметры:
102
+ * Ответ от PaynetEasy
103
+ * Платежная транзакция
104
+ * **HANDLER_FINISH_PROCESSING** - обработчик для дальнейшей обработки платежной транзакции сервисом мерчанта после завершения обработки библиотекой. Вызывается, если нет необходимости в дополнительных шагах для обработки транзакции. Принимает следующие параметры:
105
+ * Платежная транзакция
106
+ * Ответ от PaynetEasy (опционально, не доступен, если обработка платежной транзакции уже была завершена ранее)
107
+ * **HANDLER_CATCH_EXCEPTION** - обработчик для исключения. Вызывается, если при обработке платежной транзакции произошло исключение. **Внимание!** Если этот обработчик не установлен, то исключение будет брошено из библиотеки выше в сервис мерчанта. Принимает следующие параметры:
108
+ * Исключение
109
+ * Платежная транзакция
110
+ * Ответ от PaynetEasy (опционально, не доступен, если произошла ошибка на этапе формирования или выполнения запроса к PaynetEasy)
111
+
112
+ Метод принимает один параметр:
113
+ * Массив с обработчиками событий. Ключами элементов массива являются названия обработчиков, заданные в константах класса, значениями - любые значения типа [callable](http://php.net/manual/en/language.types.callable.php)
114
+
115
+ Пример вызова метода с простейшими обработчиками:
116
+
117
+ ```php
118
+ use PaynetEasy\PaynetEasyApi\PaymentProcessor;
119
+ use PaynetEasy\PaynetEasyApi\PaymentData\PaymentTransaction;
120
+ use PaynetEasy\PaynetEasyApi\Transport\Response;
121
+ use Exception;
122
+
123
+ $paymentProcessor = new PaymentProcessor;
124
+ $paymentProcessor->setHandlers(array
125
+ (
126
+ PaymentProcessor::HANDLER_SAVE_CHANGES => function(PaymentTransaction $paymentTransaction)
127
+ {
128
+ start_session();
129
+ $_SESSION['payment_transaction'] = serialize($paymentTransaction);
130
+ },
131
+ PaymentProcessor::HANDLER_STATUS_UPDATE => function()
132
+ {
133
+ header("Location: http://{$_SERVER['HTTP_HOST']}/{$_SERVER['REQUEST_URI']}?stage=updateStatus");
134
+ exit;
135
+ },
136
+ PaymentProcessor::HANDLER_SHOW_HTML => function(Response $response)
137
+ {
138
+ print $response->getHtml();
139
+ exit;
140
+ },
141
+ PaymentProcessor::HANDLER_REDIRECT => function(Response $response)
142
+ {
143
+ header("Location: {$response->getRedirectUrl()}");
144
+ exit;
145
+ },
146
+ PaymentProcessor::HANDLER_FINISH_PROCESSING => function(PaymentTransaction $paymentTransaction)
147
+ {
148
+ print "<pre>";
149
+ print "Payment processing finished.\n";
150
+ print "Payment status: '{$paymentTransaction->getPayment()->getStatus()}'.\n";
151
+ print "Payment transaction status: '{$paymentTransaction->getStatus()}'.\n";
152
+ print "</pre>";
153
+ },
154
+ PaymentProcessor::HANDLER_CATCH_EXCEPTION => function(Exception $exception)
155
+ {
156
+ print "<pre>";
157
+ print "Exception catched.\n";
158
+ print "Exception message: '{$exception->getMessage()}'.\n";
159
+ print "Exception traceback: \n{$exception->getTraceAsString()}\n";
160
+ print "</pre>";
161
+ }
162
+ ));
163
+ ```
@@ -0,0 +1,55 @@
1
+ # Валидатор данных, Validator
2
+
3
+ Статический класс **[PaynetEasy\PaynetEasyApi\Util\Validator](../../source/PaynetEasy/PaynetEasyApi/Util/Validator.php)** предоставляет следующие методы для валидации данных:
4
+ * **[validateByRule()](#validateByRule)**: валидация с помощью предопределенного правила или регулярного выражения
5
+
6
+ ### <a name="validateByRule"></a>validateByRule(): валидация с помощью предопределнного правила
7
+
8
+ Для удобной валидации данных в **[Validator](../../source/PaynetEasy/PaynetEasyApi/Util/Validator.php)** реализован метод **[validateByRule()](../../source/PaynetEasy/PaynetEasyApi/Util/Validator.php#L126)** и набор констант с правилами валидации. Список доступных правил:
9
+
10
+ Константа |Правило валидации |Описание
11
+ --------------------------------|---------------------------|--------
12
+ Validator::EMAIL |[FILTER_VALIDATE_EMAIL](http://www.php.net/manual/en/filter.filters.validate.php)|Validate value as email
13
+ Validator::IP |[FILTER_VALIDATE_IP](http://www.php.net/manual/en/filter.filters.validate.php)|Validate value as IP address
14
+ Validator::URL |[FILTER_VALIDATE_URL](http://www.php.net/manual/en/filter.filters.validate.php)|Validate value as URL
15
+ Validator::MONTH |0 < month < 13 |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
+
30
+ Метод принимает три параметра:
31
+ * Значение для валидации
32
+ * Имя правила или регулярное выражение для валидации
33
+ * Флаг, определяющий поведение метода в том случае, если значение не прошло валидацию
34
+ * **true** - будет брошено исключение
35
+ * **false** - будет возвращен булевый результат проверки
36
+ Пример использования метода:
37
+
38
+ ```php
39
+ use PaynetEasy\PaynetEasyApi\Util\Validator;
40
+ use PaynetEasy\PaynetEasyApi\Exception\ValidationException;
41
+
42
+ var_dump(Validator::validateByRule('test@mail.com', Validator::EMAIL, false)); // true
43
+ var_dump(Validator::validateByRule('some string', '#\d#', false)); // false
44
+
45
+ // prints 'invalid'
46
+ try
47
+ {
48
+ Validator::validateByRule('test[at]mail.com', Validator::EMAIL);
49
+ print 'valid';
50
+ }
51
+ catch (ValidationException $e)
52
+ {
53
+ print 'invalid';
54
+ }
55
+ ```
@@ -0,0 +1,76 @@
1
+ # Класс для работы с цепочками свойств, PropertyAccessor
2
+
3
+ В процессе работы с данными платежа возникает необходимость читать и изменять свойства объектов, хранящихся в Payment. Например, для чтения email клиента необходимо вызвать `$payment->getCustomer()->getEmail()`, а для записи - `$payment->getCustomer()->setEmail()`. Для удобного выполнения этих операций в классе **[PaynetEasy\PaynetEasyApi\Util\PropertyAccessor](../../source/PaynetEasy/PaynetEasyApi/Util/PropertyAccessor.php)** реализованы следующие методы:
4
+ * **[getValue()](#getValue)**: удобное чтение данных по цепочке свойств
5
+ * **[setValue()](#setValue)**: удобная запись данных по цепочке свойств
6
+
7
+ ### <a name="getValue"></a> getValue(): удобное чтение данных по цепочке свойств
8
+
9
+ Метод предназначен для чтения данных из цепочки свойств. Цепочка свойств описывает порядок получения свойств из переданного объекта. Так, для цепочки `billingAddress.firstLine` будет получено значение свойства `firstLine` из объекта, хранящегося в свойстве `billingAddress`. Для получения свойств используются методы-геттеры, названия которых образованы добавлением префикса `get` к имени свойства. Таким образом, получение данных для цепочки `billingAddress.firstLine` приведет к вызову кода `$payment->getBillingAddress()->getFirstLine()`.
10
+ Метод принимает три параметра:
11
+ * Объект, цепочку свойств которого можно прочитать
12
+ * Цепочка свойств
13
+ * Флаг, определяющий поведение метода в том случае, если геттер для свойства не был найден или если свойство, в котором ожидался объект, пустое:
14
+ * **true** - будет брошено исключение
15
+ * **false** - будет возвращен `null`
16
+
17
+ Пример использования метода:
18
+ ```php
19
+ use PaynetEasy\PaynetEasyApi\Util\PropertyAccessor;
20
+ use PaynetEasy\PaynetEasyApi\PaymentData\Payment;
21
+ use PaynetEasy\PaynetEasyApi\PaymentData\CreditCard;
22
+ use RuntimeException;
23
+
24
+ $creditCard = (new CreditCard)->setExpireYear(2014);
25
+ $payment = (new Payment)->setCreditCard($creditCard);
26
+
27
+ var_dump(PropertyAccessor::getValue($payment, 'creditCard.expireYear')); // 2014
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)
36
+ {
37
+ print 'empty';
38
+ }
39
+ ```
40
+
41
+ ### <a name="setValue"></a> setValue(): удобное изменение данных по цепочке свойств
42
+
43
+ Метод предназначен для изменения данных по цепочке свойств. Цепочка свойств описывает порядок получения свойств из переданного объекта. Так, для цепочки `billingAddress.firstLine` будет изменено значение свойства `firstLine` из объекта, хранящегося в свойстве `billingAddress`. Для получения свойств используются методы-геттеры, названия которых образованы добавлением префикса `get` к имени свойства, для изменения - методы-сеттеры, названия которых образованы добавлением префикса `set` к имени свойства. Таким образом, изменение данных для цепочки `billingAddress.firstLine` приведет к вызову кода `$payment->getBillingAddress()->setFirstLine($firstLine)`.
44
+ Метод принимает четыре параметра:
45
+ * Объект, цепочку свойств которого можно прочитать
46
+ * Цепочка свойств
47
+ * Новое значение
48
+ * Флаг, определяющий поведение метода в том случае, если геттер или сеттер для свойства не был найден или если свойство, в котором ожидался объект, пустое:
49
+ * **true** - будет брошено исключение
50
+ * **false** - будет возвращен `null`
51
+
52
+ Пример использования метода:
53
+ ```php
54
+ use PaynetEasy\PaynetEasyApi\Util\PropertyAccessor;
55
+ use PaynetEasy\PaynetEasyApi\PaymentData\Payment;
56
+ use PaynetEasy\PaynetEasyApi\PaymentData\CreditCard;
57
+ use RuntimeException;
58
+
59
+ $creditCard = (new CreditCard)->setExpireYear(2014);
60
+ $payment = (new Payment)->setCreditCard($creditCard);
61
+
62
+ PropertyAccessor::setValue($payment, 'creditCard.expireYear', 2015);
63
+ var_dump(PropertyAccessor::getValue($payment, 'creditCard.expireYear')); // 2015
64
+
65
+ PropertyAccessor::setValue($payment, 'creditCard.nonExistentProperty', 'value', false); // nothing will happen
66
+
67
+ // prints 'nonexistent property'
68
+ try
69
+ {
70
+ PropertyAccessor::setValue($payment, 'creditCard.nonExistentProperty', 'value');
71
+ }
72
+ catch (RuntimeException $e)
73
+ {
74
+ print 'nonexistent property';
75
+ }
76
+ ```
@@ -0,0 +1,90 @@
1
+ # Sale transactions
2
+
3
+ Список запросов сценария:
4
+ * [Запрос "sale"](#sale)
5
+ * [Запрос "status"](#status)
6
+
7
+ ## Общие положения
8
+
9
+ * В данной статье описывается исключительно работа с библиотекой. Полная информация о выполнении Sale transactions расположена в [статье в wiki PaynetEasy](http://wiki.payneteasy.com/index.php/PnE:Sale_Transactions).
10
+ * Описание правил валидации можно найти в описании метода **[Validator::validateByRule()](../library-internals/02-validator.md#validateByRule)**.
11
+ * Описание работы с цепочками свойств можно найти в описании класса **[PropertyAccessor](../library-internals/03-property-accessor.md)**
12
+
13
+ ## <a name="sale"></a> Запрос "sale"
14
+
15
+ Запрос применяется для оплаты с помощью кредитной карты. При этом информация о карте вводится на стороне сервиса мерчанта и передается в запросе к PaynetEasy. После выполнения данного запроса необходимо выполнить серию запросов "**status**" для обновления статуса платежа. Для этого сервис мерчанта может вывести самообновляющуюся страницу, каждая перезагрузка которой будет выполнять запрос "**status**".
16
+
17
+ [Пример самообновляющейся страницы](../../example/common/waitPage.html)
18
+
19
+ ##### Обязательные параметры запроса
20
+
21
+ Поле запроса |Цепочка свойств платежа |Правило валидации
22
+ --------------------|-----------------------------------|-----------------
23
+ client_orderid |payment.clientId |Validator::ID
24
+ order_desc |payment.description |Validator::LONG_STRING
25
+ amount |payment.amount |Validator::AMOUNT
26
+ currency |payment.currency |Validator::CURRENCY
27
+ address1 |payment.billingAddress.firstLine |Validator::MEDIUM_STRING
28
+ city |payment.billingAddress.city |Validator::MEDIUM_STRING
29
+ zip_code |payment.billingAddress.zipCode |Validator::ZIP_CODE
30
+ country |payment.billingAddress.country |Validator::COUNTRY
31
+ phone |payment.billingAddress.phone |Validator::PHONE
32
+ ipaddress |payment.customer.ipAddress |Validator::IP
33
+ email |payment.customer.email |Validator::EMAIL
34
+ card_printed_name |payment.creditCard.cardPrintedName |Validator::LONG_STRING
35
+ credit_card_number |payment.creditCard.creditCardNumber|Validator::CREDIT_CARD_NUMBER
36
+ expire_month |payment.creditCard.expireMonth |Validator::MONTH
37
+ expire_year |payment.creditCard.expireYear |Validator::YEAR
38
+ cvv2 |payment.creditCard.cvv2 |Validator::CVV2
39
+ redirect_url |queryConfig.redirectUrl |Validator::URL
40
+
41
+ ##### Необязательные параметры запроса
42
+
43
+ Поле запроса |Цепочка свойств платежа |Правило валидации
44
+ --------------------|-----------------------------------|-----------------
45
+ first_name |payment.customer.firstName |Validator::MEDIUM_STRING
46
+ last_name |payment.customer.lastName |Validator::MEDIUM_STRING
47
+ ssn |payment.customer.ssn |Validator::SSN
48
+ birthday |payment.customer.birthday |Validator::DATE
49
+ state |payment.billingAddress.state |Validator::COUNTRY
50
+ cell_phone |payment.billingAddress.cellPhone |Validator::PHONE
51
+ destination |payment.destination |Validator::LONG_STRING
52
+ site_url |queryConfig.siteUrl |Validator::URL
53
+ server_callback_url |queryConfig.callbackUrl |Validator::URL
54
+
55
+ [Пример выполнения запроса sale](../../example/sale.php)
56
+
57
+ ## <a name="status"></a> Запрос "status"
58
+
59
+ Запрос применяется для проверки статуса платежа. Обычно требуется серия таких запросов из-за того, что обработка платежа занимает некоторое время. В зависимости от типа авторизации клиента (необходима 3D-авторизация или нет) и статуса платежа обработка результата этого запроса может происходить несколькими путями.
60
+
61
+ ##### Необходимо обновление платежа
62
+
63
+ В том случае, если статус платежа не изменился (значение поля **status** - **processing**) и нет необходимости в дополнительных шагах авторизации, то запустить проверку статуса еще раз.
64
+
65
+ ##### Необходима 3D-аторизация
66
+
67
+ В ответе на запрос будет передано поле **html**, содержимое которого необходимо вывести на экран браузера клиента. Содержимое поля представляет собой форму, которая переадресует пользователя для выполнения 3D-авторизации.
68
+
69
+ ##### Обработка платежа завершена
70
+
71
+ В ответе на запрос поле **status** содержит результат обработки платежа - **approved**, **filtered**, **declined**, **error**
72
+
73
+ ##### Обязательные параметры запроса
74
+
75
+ Поле запроса |Цепочка свойств платежа|Правило валидации
76
+ --------------------|-----------------------|-----------------
77
+ client_orderid |payment.clientId |Validator::ID
78
+ orderid |payment.paynetId |Validator::ID
79
+ login |queryConfig.login |Validator::MEDIUM_STRING
80
+
81
+ [Пример выполнения запроса status](../../example/status.php)
82
+
83
+ ## <a name="3d-redirect"> Обработка результата платежа после 3D-авторизации
84
+
85
+ Если при обработке платежа выполнялась 3D-авторизация, то при возвращении пользователя с формы авторизации на сервис мерчанта будут переданы данные с результатом обработки платежа. Обработка этих данных совпадает с обработкой данных для [sale-form, preauth-form или transfer-form](05-payment-form-integration.md) и описана в [базовом примере использования библиотеки](../00-basic-tutorial.md#stage_2).
86
+
87
+ ## <a name="callback"></a> Обработка обратного вызова
88
+
89
+ После завершения обработки платежа на стороне PaynetEasy, данные с результатом обработки передаются в сервис мерчанта с помощью обратного вызова. Это необходимо, чтобы платеж был обработан сервисом мерчанта независимо от того, выполнил пользователь корректно возврат с шлюза PaynetEasy или нет.
90
+ [Подробнее о Merchant callbacks](06-merchant-callbacks.md)
@@ -0,0 +1,105 @@
1
+ # Preauth/Capture transactions
2
+
3
+ Список запросов сценария:
4
+ * [Запрос "preauth"](#preauth)
5
+ * [Запрос "capture"](#capture)
6
+ * [Запрос "status"](#status)
7
+
8
+ ## Общие положения
9
+
10
+ * В данной статье описывается исключительно работа с библиотекой. Полная информация о выполнении Preauth/Capture transactions расположена в [статье в wiki PaynetEasy](http://wiki.payneteasy.com/index.php/PnE:Preauth/Capture_Transactions).
11
+ * Описание правил валидации можно найти в описании метода **[Validator::validateByRule()](../library-internals/02-validator.md#validateByRule)**.
12
+ * Описание работы с цепочками свойств можно найти в описании класса **[PropertyAccessor](../library-internals/03-property-accessor.md)**
13
+
14
+ ## <a name="preauth"></a> Запрос "preauth"
15
+
16
+ Запрос применяется для блокирования части средств кредитной карты клиента. При этом информация о карте вводится на стороне сервиса мерчанта и передается в запросе к PaynetEasy. После отправки данного запроса необходимо выполнить серию запросов "**status**" для обновления статуса платежа. Для этого сервис мерчанта может вывести самообновляющуюся страницу, каждая перезагрузка которой будет выполнять запрос "**status**". После успешного завершения этого запроса для списания средств с карты клиента необходимо выполнить запрос **[capture](#capture)**.
17
+
18
+ [Пример самообновляющейся страницы](../../example/common/waitPage.html)
19
+
20
+ ##### Обязательные параметры запроса
21
+
22
+ Поле запроса |Цепочка свойств платежа |Правило валидации
23
+ --------------------|-----------------------------------|-----------------
24
+ client_orderid |payment.clientId |Validator::ID
25
+ order_desc |payment.description |Validator::LONG_STRING
26
+ amount |payment.amount |Validator::AMOUNT
27
+ currency |payment.currency |Validator::CURRENCY
28
+ address1 |payment.billingAddress.firstLine |Validator::MEDIUM_STRING
29
+ city |payment.billingAddress.city |Validator::MEDIUM_STRING
30
+ zip_code |payment.billingAddress.zipCode |Validator::ZIP_CODE
31
+ country |payment.billingAddress.country |Validator::COUNTRY
32
+ phone |payment.billingAddress.phone |Validator::PHONE
33
+ ipaddress |payment.customer.ipAddress |Validator::IP
34
+ email |payment.customer.email |Validator::EMAIL
35
+ card_printed_name |payment.creditCard.cardPrintedName |Validator::LONG_STRING
36
+ credit_card_number |payment.creditCard.creditCardNumber|Validator::CREDIT_CARD_NUMBER
37
+ expire_month |payment.creditCard.expireMonth |Validator::MONTH
38
+ expire_year |payment.creditCard.expireYear |Validator::YEAR
39
+ cvv2 |payment.creditCard.cvv2 |Validator::CVV2
40
+ redirect_url |queryConfig.redirectUrl |Validator::URL
41
+
42
+ ##### Необязательные параметры запроса
43
+
44
+ Поле запроса |Цепочка свойств платежа |Правило валидации
45
+ --------------------|-----------------------------------|-----------------
46
+ first_name |payment.customer.firstName |Validator::MEDIUM_STRING
47
+ last_name |payment.customer.lastName |Validator::MEDIUM_STRING
48
+ ssn |payment.customer.ssn |Validator::SSN
49
+ birthday |payment.customer.birthday |Validator::DATE
50
+ state |payment.billingAddress.state |Validator::COUNTRY
51
+ cell_phone |payment.billingAddress.cellPhone |Validator::PHONE
52
+ destination |payment.destination |Validator::LONG_STRING
53
+ site_url |queryConfig.siteUrl |Validator::URL
54
+ server_callback_url |queryConfig.callbackUrl |Validator::URL
55
+
56
+ [Пример выполнения запроса preauth](../../example/preauth.php)
57
+
58
+ ## <a name="capture"></a> Запрос "capture"
59
+
60
+ Запрос применяется для списания средств, ранее блокированных запросом **[preauth](#preauth)**, с карты клиента. После выполнения данного запроса необходимо выполнить серию запросов "**status**" для обновления статуса платежа. Для этого сервис мерчанта может вывести самообновляющуюся страницу, каждая перезагрузка которой будет выполнять запрос "**status**". **Внимание!** Если в библиотеку будет передан платеж, созданный ранее для выполнения запроса **[preauth](#preauth)**, то его данные будут перезаписаны данными запроса **capture**. Создайте для запроса **capture** новый платеж.
61
+
62
+ ##### Обязательные параметры запроса
63
+
64
+ Поле запроса |Цепочка свойств платежа|Правило валидации
65
+ --------------------|-----------------------|-----------------
66
+ client_orderid |payment.clientId |Validator::ID
67
+ orderid |payment.paynetId |Validator::ID
68
+ login |queryConfig.login |Validator::MEDIUM_STRING
69
+
70
+ [Пример выполнения запроса capture](../../example/capture.php)
71
+
72
+ ## <a name="status"></a> Запрос "status"
73
+
74
+ Запрос применяется для проверки статуса платежа. Обычно требуется серия таких запросов из-за того, что обработка платежа занимает некоторое время. В зависимости от типа авторизации клиента (необходима 3D-авторизация или нет) и статуса платежа обработка результата этого запроса может происходить несколькими путями.
75
+
76
+ ##### Необходимо обновление платежа
77
+
78
+ В том случае, если статус платежа не изменился (значение поля **status** - **processing**) и нет необходимости в дополнительных шагах авторизации, то запустить проверку статуса еще раз.
79
+
80
+ ##### Необходима 3D-аторизация (только при выполнении запроса **[preauth](#preauth)**)
81
+
82
+ В ответе на запрос будет передано поле **html**, содержимое которого необходимо вывести на экран браузера клиента. Содержимое поля представляет собой форму, которая переадресует пользователя для выполнения 3D-авторизации.
83
+
84
+ ##### Обработка платежа завершена
85
+
86
+ В ответе на запрос поле **status** содержит результат обработки платежа - **approved**, **filtered**, **declined**, **error**
87
+
88
+ ##### Обязательные параметры запроса
89
+
90
+ Поле запроса |Цепочка свойств платежа|Правило валидации
91
+ --------------------|-----------------------|-----------------
92
+ client_orderid |payment.clientId |Validator::ID
93
+ orderid |payment.paynetId |Validator::ID
94
+ login |queryConfig.login |Validator::MEDIUM_STRING
95
+
96
+ [Пример выполнения запроса status](../../example/status.php)
97
+
98
+ ## <a name="3d-redirect"> Обработка результата платежа после 3D-авторизации (только при выполнении запроса **[preauth](#preauth)**)
99
+
100
+ Если при обработке платежа выполнялась 3D-авторизация, то при возвращении пользователя с формы авторизации на сервис мерчанта будут переданы данные с результатом обработки платежа. Обработка этих данных совпадает с обработкой данных для [sale-form, preauth-form или transfer-form](05-payment-form-integration.md) и описана в [базовом примере использования библиотеки](../00-basic-tutorial.md#stage_2).
101
+
102
+ ## <a name="callback"></a> Обработка обратного вызова
103
+
104
+ После завершения обработки платежа на стороне PaynetEasy, данные с результатом обработки передаются в сервис мерчанта с помощью обратного вызова. Это необходимо, чтобы платеж был обработан сервисом мерчанта независимо от того, выполнил пользователь корректно возврат с шлюза PaynetEasy или нет.
105
+ [Подробнее о Merchant callbacks](06-merchant-callbacks.md)
@@ -0,0 +1,89 @@
1
+ # Transfer transactions
2
+
3
+ Список запросов сценария:
4
+ * [Запрос "create-card-ref"](#create-card-ref)
5
+ * [Запрос "transfer-by-ref"](#transfer-by-ref)
6
+ * [Запрос "status"](#status)
7
+
8
+ ## Общие положения
9
+
10
+ * В данной статье описывается исключительно работа с библиотекой. Полная информация о выполнении Transfer transactions расположена в [статье в wiki PaynetEasy](http://wiki.payneteasy.com/index.php/PnE:Transfer_Transactions).
11
+ * Описание правил валидации можно найти в описании метода **[Validator::validateByRule()](../library-internals/02-validator.md#validateByRule)**.
12
+ * Описание работы с цепочками свойств можно найти в описании класса **[PropertyAccessor](../library-internals/03-property-accessor.md)**
13
+
14
+ ## <a name="create-card-ref"></a> Запрос "create-card-ref"
15
+
16
+ Запрос применяется для получения id для кредитной карты, сохраненной на стороне PaynetEasy. Этот id позволяет совершать повторные платежи без ввода данных кредитной карты как на стороне сервиса мерчанта так и на стороне PaynetEasy.
17
+ Перед выполнением этого запроса необходимо выполнить один из следующих сценариев для проверки данных, которые ввел клиент:
18
+ * [Sale Transactions](00-sale-transactions.md)
19
+ * [Preauth/Capture Transactions](01-preauth-capture-transactions.md)
20
+ * [Payment Form Integration](05-payment-form-integration.md)
21
+
22
+ ##### Обязательные параметры запроса
23
+
24
+ Поле запроса |Цепочка свойств платежа|Правило валидации
25
+ --------------------|-----------------------|-----------------
26
+ client_orderid |payment.clientId |Validator::ID
27
+ orderid |payment.paynetId |Validator::ID
28
+ login |queryConfig.login |Validator::MEDIUM_STRING
29
+
30
+ [Пример выполнения запроса create-card-ref](../../example/create-card-ref.php)
31
+
32
+ После выполнения данного запроса будет получен id сохраненной кредитной карты и создан объект **[RecurrentCard](../library-internals/00-payment-data.md#RecurrentCard)**. Получить доступ к **RecurrentCard** можно с помощью вызова
33
+ `$payment->getRecurrentCardFrom()`, а к ее id с помощью вызова `$payment->getRecurrentCardFrom()->getCardReferenceId()`
34
+
35
+ ## <a name="transfer-by-ref"></a> Запрос "transfer-by-ref"
36
+
37
+ Запрос применяется для перевода определенной суммы с одного счета на другой.
38
+ Перед выполнением этого запроса необходимо как минимум один запрос [create-card-ref](#create-card-ref), для получения id сохраненной карты, на которую производится перевод средств. Если перевод выполняется между двумя картами клиентов, то необходимо выполнить два запроса [create-card-ref](#create-card-ref), для получения id сохраненных карт, между которымы переводятся средства.
39
+ После выполнения данного запроса необходимо выполнить серию запросов "**status**" для обновления статуса платежа. Для этого сервис мерчанта может вывести самообновляющуюся страницу, каждая перезагрузка которой будет выполнять запрос "**status**".
40
+
41
+ ##### Обязательные параметры запроса
42
+
43
+ Поле запроса |Цепочка свойств платежа |Правило валидации
44
+ ------------------------|-----------------------------------|-----------------
45
+ client_orderid |payment.clientId |Validator::ID
46
+ amount |payment.amount |Validator::AMOUNT
47
+ currency |payment.currency |Validator::CURRENCY
48
+ ipaddress |payment.customer.ipAddress |Validator::IP
49
+ destination-card-ref-id |payment.recurrentCardTo.paynetId |Validator::ID
50
+ login |queryConfig.login |Validator::MEDIUM_STRING
51
+
52
+ ##### Необязательные параметры запроса
53
+
54
+ Поле запроса |Цепочка свойств платежа |Правило валидации
55
+ ------------------------|-----------------------------------|-----------------
56
+ order_desc |payment.description |Validator::LONG_STRING
57
+ source-card-ref-id |payment.recurrentCardFrom.paynetId |Validator::ID
58
+ cvv2 |payment.recurrentCardFrom.cvv2 |Validator::CVV2
59
+ redirect_url |queryConfig.redirectUrl |Validator::URL
60
+ server_callback_url |queryConfig.callbackUrl |Validator::URL
61
+
62
+ [Пример выполнения запроса transfer-by-ref](../../example/transfer-by-ref.php)
63
+
64
+ ## <a name="status"></a> Запрос "status"
65
+
66
+ Запрос применяется для проверки статуса платежа. Обычно требуется серия таких запросов из-за того, что обработка платежа занимает некоторое время. В зависимости от статуса платежа обработка результата этого запроса может происходить несколькими путями.
67
+
68
+ ##### Необходимо обновление платежа
69
+
70
+ В том случае, если статус платежа не изменился (значение поля **status** - **processing**) и нет необходимости в дополнительных шагах авторизации, то запустить проверку статуса еще раз.
71
+
72
+ ##### Обработка платежа завершена
73
+
74
+ В ответе на запрос поле **status** содержит результат обработки платежа - **approved**, **filtered**, **declined**, **error**
75
+
76
+ ##### Обязательные параметры запроса
77
+
78
+ Поле запроса |Цепочка свойств платежа|Правило валидации
79
+ --------------------|-----------------------|-----------------
80
+ client_orderid |payment.clientId |Validator::ID
81
+ orderid |payment.paynetId |Validator::ID
82
+ login |queryConfig.login |Validator::MEDIUM_STRING
83
+
84
+ [Пример выполнения запроса status](../../example/status.php)
85
+
86
+ ## <a name="callback"></a> Обработка обратного вызова
87
+
88
+ После завершения обработки платежа на стороне PaynetEasy, данные с результатом обработки передаются в сервис мерчанта с помощью обратного вызова. Это необходимо, чтобы платеж был обработан сервисом мерчанта независимо от того, выполнил пользователь корректно возврат с шлюза PaynetEasy или нет.
89
+ [Подробнее о Merchant callbacks](06-merchant-callbacks.md)