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
data/.gemtest ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,18 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ payneteasy-payneteasyapi (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.1.0)
10
+ test-unit (2.5.5)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ payneteasy-payneteasyapi!
17
+ rake
18
+ test-unit
data/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # Ruby Library for PaynetEasy API integration [![Build Status](https://travis-ci.org/payneteasy/ruby-library-payneteasy-api.png?branch=master)](https://travis-ci.org/payneteasy/ruby-library-payneteasy-api)
2
+ ## Доступная функциональность
3
+
4
+ Данная библиотека позволяет производить оплату с помощью [merchant PaynetEasy API](http://wiki.payneteasy.com/index.php/PnE:Merchant_API). На текущий момент реализованы следующие платежные методы:
5
+ - [x] [Sale Transactions](http://wiki.payneteasy.com/index.php/PnE:Sale_Transactions)
6
+ - [x] [Preauth/Capture Transactions](http://wiki.payneteasy.com/index.php/PnE:Preauth/Capture_Transactions)
7
+ - [x] [Transfer Transactions](http://wiki.payneteasy.com/index.php/PnE:Transfer_Transactions)
8
+ - [x] [Return Transactions](http://wiki.payneteasy.com/index.php/PnE:Return_Transactions)
9
+ - [x] [Recurrent Transactions](http://wiki.payneteasy.com/index.php/PnE:Recurrent_Transactions)
10
+ - [x] [Payment Form Integration](http://wiki.payneteasy.com/index.php/PnE:Payment_Form_integration)
11
+ - [ ] [Buy Now Button integration](http://wiki.payneteasy.com/index.php/PnE:Buy_Now_Button_integration)
12
+ - [ ] [eCheck integration](http://wiki.payneteasy.com/index.php/PnE:eCheck_integration)
13
+ - [ ] [Western Union Integration](http://wiki.payneteasy.com/index.php/PnE:Western_Union_Integration)
14
+ - [ ] [Bitcoin Integration](http://wiki.payneteasy.com/index.php/PnE:Bitcoin_integration)
15
+ - [ ] [Loan Integration](http://wiki.payneteasy.com/index.php/PnE:Loan_integration)
16
+ - [ ] [Qiwi Integration](http://wiki.payneteasy.com/index.php/PnE:Qiwi_integration)
17
+ - [x] [Merchant Callbacks](http://wiki.payneteasy.com/index.php/PnE:Merchant_Callbacks)
18
+
19
+ ## Системные требования
20
+
21
+ * Ruby >= 1.9.3
22
+
23
+ ## Установка
24
+
25
+ 1. Установите bundler, если его еще нет: `gem install bundler`
26
+ 2. Перейдите в папку проекта: `cd my/project/directory`
27
+ 3. Создайте Gemfile проекта для bundler, если его еще нет: `bundle init`
28
+ 4. Добавьте библиотеку в зависимости проекта:
29
+ * С помощью консоли, выполнив команду `echo "gem 'payneteasy-payneteasyapi'" >> Gemfile`
30
+ * С помощью текстового редактора. добавив строку `gem 'payneteasy-payneteasyapi'` в файл Gemfile
31
+ в корневой папке проекта
32
+ 5. Установите зависимости: `bundle install`
33
+
34
+ ## Запуск тестов
35
+
36
+ 1. Перейдите в папку с библиотекой: `cd vendor/payneteasy/php-library-payneteasy-api/`
37
+ 2. Запустите тесты: `phpunit -c test/phpunit.xml test`
38
+
39
+ ## Использование
40
+
41
+ * [Простой пример использования библиотеки](doc/00-basic-tutorial.md)
42
+ * [Внутренняя структура библиотеки](doc/01-library-internals.md)
43
+ * [Семейство классов для хранения и обмена данными, PaynetEasy\PaynetEasyApi\PaymentData](doc/library-internals/00-payment-data.md)
44
+ * [Фронтенд библиотеки, PaynetEasy\PaynetEasyApi\PaymentProcessor](doc/library-internals/01-payment-processor.md)
45
+ * [Валидатор данных, PaynetEasy\PaynetEasyApi\Util\Validator](doc/library-internals/02-validator.md)
46
+ * [Класс для работы с цепочками свойств, PaynetEasy\PaynetEasyApi\Util\PropertyAccessor](doc/library-internals/03-property-accessor.md)
47
+ * [Интеграция различных платежных сценариев](doc/02-payment-scenarios.md)
48
+ * [Sale transactions](doc/payment-scenarios/00-sale-transactions.md)
49
+ * [Preauth/Capture Transactions](doc/payment-scenarios/01-preauth-capture-transactions.md)
50
+ * [Transfer Transactions](doc/payment-scenarios/02-transfer-transactions.md)
51
+ * [Return Transactions](doc/payment-scenarios/03-return-transactions.md)
52
+ * [Recurrent Transactions](doc/payment-scenarios/04-recurrent-transactions.md)
53
+ * [Payment Form Integration](doc/payment-scenarios/05-payment-form-integration.md)
54
+ * [Merchant Callbacks](doc/payment-scenarios/06-merchant-callbacks.md)
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << 'lib/paynet_easy/paynet_easy_api'
7
+ t.test_files = Dir['test/**/*_test.rb']
8
+ end
@@ -0,0 +1,254 @@
1
+ # Простой пример использования библиотеки
2
+
3
+ Разберем выполнение запросов при [интеграции платежной формы](http://wiki.payneteasy.com/index.php/PnE:Payment_Form_integration). Типовая обработка платежа происходит в три этапа. Первый и последний этапы происходят на стороне сервиса мерчанта, а второй - на стороне PaynetEasy.
4
+
5
+ 1. Инициация оплаты:
6
+ 1. [Подключение загрузчика классов и необходимых классов](#stage_1_step_1)
7
+ 2. [Создание новой платежной транзакции](#stage_1_step_2)
8
+ 3. [Создание сервиса для обработки платежей](#stage_1_step_4)
9
+ 4. [Запуск обработки платежной транзакции](#stage_1_step_6)
10
+ 1. Проверка данных платежной транзакции и формирование на ее основе запроса к PaynetEasy
11
+ 3. Изменение статуса платежа **status**
12
+ 4. Выполнение запроса для старта обработки платежной транзакции и ее первичной проверки
13
+ 5. Получение ответа от PaynetEasy
14
+ 6. Изменение статуса платежной транзакции **status** на основе данных ответа
15
+ 7. Сохранение платежной транзакции
16
+ 8. Перенаправление клиента на платежную форму
17
+
18
+ 2. Процессинг платежной формы:
19
+ 1. Заполнение клиентом платежной формы и отправка данных шлюзу PaynetEasy
20
+ 2. Обработка данных шлюзом
21
+ 3. Возврат пользователя на сервис мерчанта с передачей результата обработки платежной формы
22
+
23
+ 3. Обработка результатов:
24
+ 1. [Подключение загрузчика классов и необходимых классов](#stage_2_step_1)
25
+ 2. [Загрузка сохраненной платежной транзакции](#stage_2_step_2)
26
+ 3. [Создание сервиса для обработки платежей](#stage_2_step_4)
27
+ 4. [Запуск обработки данных, полученных при возвращении пользователя с платежной формы](#stage_2_step_6)
28
+ 1. Проверка данных, полученные по возвращении клиента с платежной формы PaynetEasy
29
+ 2. Изменение статуса платежной транзакции **status**
30
+ 3. Сохранение платежной транзакции
31
+ 4. Вывод статуса платежа **status** и статуса платежной транзакции **status** на экран
32
+
33
+ Рассмотрим примеры исходного кода для выполнения обоих этапов. Код для выполнения второго этапа должен выполняться при переходе по ссылке, заданной в настройках по ключу **redirect_url**. Например, разместите исходный код первого этапа в файле `first_stage.php`, а второго - `second_stage.php`.
34
+
35
+ ### <a name="stage_1"></a>Начало обработки платежной транзакции
36
+
37
+ 1. <a name="stage_1_step_1"></a>Подключение загрузчика классов, [предоставляемого composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading), и необходимых классов:
38
+
39
+ ```php
40
+ require_once 'project/root/dir/vendor/autoload.php';
41
+
42
+ use PaynetEasy\PaynetEasyApi\PaymentData\PaymentTransaction;
43
+ use PaynetEasy\PaynetEasyApi\PaymentData\Payment;
44
+ use PaynetEasy\PaynetEasyApi\PaymentData\QueryConfig;
45
+ use PaynetEasy\PaynetEasyApi\PaymentData\BillingAddress;
46
+ use PaynetEasy\PaynetEasyApi\PaymentData\Customer;
47
+ use PaynetEasy\PaynetEasyApi\Transport\Response;
48
+ use PaynetEasy\PaynetEasyApi\PaymentProcessor;
49
+ use Exception;
50
+ ```
51
+ 2. <a name="stage_1_step_2"></a>Создание новой платежной транзакции:
52
+ ##### С использованием массивов, переданных в конструктор:
53
+
54
+ ```php
55
+ $customer = new Customer(array
56
+ (
57
+ 'email' => 'vass.pupkin@example.com',
58
+ 'ip_address' => '127.0.0.1'
59
+ ));
60
+
61
+ $billingAddress = new BillingAddress(array
62
+ (
63
+ 'country' => 'US',
64
+ 'city' => 'Houston',
65
+ 'state' => 'TX',
66
+ 'first_line' => '2704 Colonial Drive',
67
+ 'zip_code' => '1235',
68
+ 'phone' => '660-485-6353'
69
+ ));
70
+
71
+ $queryConfig = new QueryConfig(array
72
+ (
73
+ 'end_point' => 253,
74
+ 'login' => 'rp-merchant1',
75
+ 'signing_key' => '3FD4E71A-D84E-411D-A613-40A0FB9DED3A',
76
+ 'redirect_url' => "http://{$_SERVER['HTTP_HOST']}/second_stage.php",
77
+ 'gateway_mode' => QueryConfig::GATEWAY_MODE_SANDBOX,
78
+ 'gateway_url_sandbox' => 'https://sandbox.domain.com/paynet/api/v2/',
79
+ 'gateway_url_production' => 'https://payment.domain.com/paynet/api/v2/'
80
+ ));
81
+
82
+ $payment = new Payment(array
83
+ (
84
+ 'client_id' => 'CLIENT-112244',
85
+ 'description' => 'This is test payment',
86
+ 'amount' => 9.99,
87
+ 'currency' => 'USD',
88
+ 'customer' => $customer,
89
+ 'billing_address' => $billingAddress
90
+ ));
91
+
92
+ $paymentTransaction = new PaymentTransaction(array
93
+ (
94
+ 'payment' => $payment,
95
+ 'query_config' => $queryConfig
96
+ ));
97
+ ```
98
+ ##### С использованием сеттеров:
99
+
100
+ ```php
101
+ $customer = (new Customer)
102
+ ->setEmail('vass.pupkin@example.com')
103
+ ->setIpAddress('127.0.0.1')
104
+ ;
105
+
106
+ $billingAddress = (new BillingAddress)
107
+ ->setCountry('US')
108
+ ->setState('TX')
109
+ ->setCity('Houston')
110
+ ->setFirstLine('2704 Colonial Drive')
111
+ ->setZipCode('1235')
112
+ ->setPhone('660-485-6353')
113
+ ;
114
+
115
+ $queryConfig = (new QueryConfig)
116
+ ->setEndPoint(253)
117
+ ->setLogin('rp-merchant1')
118
+ ->setSigningKey('3FD4E71A-D84E-411D-A613-40A0FB9DED3A')
119
+ ->setRedirectUrl("http://{$_SERVER['HTTP_HOST']}/second_stage.php")
120
+ ->setGatewayMode(QueryConfig::GATEWAY_MODE_SANDBOX)
121
+ ->setGatewayUrlSandbox('https://sandbox.domain.com/paynet/api/v2/')
122
+ ->setGatewayUrlProduction('https://payment.domain.com/paynet/api/v2/')
123
+ ;
124
+
125
+ $payment = (new Payment)
126
+ ->setClientId('CLIENT-112244')
127
+ ->setDescription('This is test payment')
128
+ ->setAmount(9.99)
129
+ ->setCurrency('USD')
130
+ ->setCustomer($customer)
131
+ ->setBillingAddress($billingAddress)
132
+ ;
133
+
134
+ $paymentTransaction = (new PaymentTransaction)
135
+ ->setPayment($payment)
136
+ ->setQueryConfig($queryConfig)
137
+ ;
138
+ ```
139
+
140
+ Поля конфигурации запроса **QueryConfig**:
141
+ * **[end_point](http://wiki.payneteasy.com/index.php/PnE:Introduction#Endpoint)** - точка входа для аккаунта мерчанта, выдается при подключении
142
+ * **[login](http://wiki.payneteasy.com/index.php/PnE:Introduction#PaynetEasy_Users)** - логин мерчанта для доступа к панели PaynetEasy, выдается при подключении
143
+ * **signing_key** - ключ мерчанта для подписывания запросов, выдается при подключении
144
+ * **[redirect_url](http://wiki.payneteasy.com/index.php/PnE:Payment_Form_integration#Payment_Form_final_redirect)** - URL, на который пользователь будет перенаправлен после окончания запроса
145
+ * **gateway_mode** - режим работы библиотеки: sandbox, production
146
+ * **gateway_url_sandbox** - ссылка на шлюз PaynetEasy для режима работы sandbox
147
+ * **gateway_url_production** - ссылка на шлюз PaynetEasy для режима работы production
148
+
149
+ 3. <a name="stage_1_step_4"></a>Создание сервиса для обработки платежей:
150
+ ```php
151
+ $paymentProcessor = new PaymentProcessor(array
152
+ (
153
+ PaymentProcessor::HANDLER_CATCH_EXCEPTION => function(Exception $exception)
154
+ {
155
+ print "<pre>";
156
+ print "Exception catched.\n";
157
+ print "Exception message: '{$exception->getMessage()}'.\n";
158
+ print "Exception traceback: \n{$exception->getTraceAsString()}\n";
159
+ print "</pre>";
160
+ },
161
+ PaymentProcessor::HANDLER_SAVE_CHANGES => function(PaymentTransaction $paymentTransaction)
162
+ {
163
+ start_session();
164
+ $_SESSION['payment_transaction'] = serialize($paymentTransaction);
165
+ },
166
+ PaymentProcessor::HANDLER_REDIRECT => function(Response $response)
167
+ {
168
+ header("Location: {$response->getRedirectUrl()}");
169
+ exit;
170
+ }
171
+ ));
172
+ ```
173
+
174
+ Обработчики событий для сервиса:
175
+ * **PaymentProcessor::HANDLER_CATCH_EXCEPTION** - для обработки исключения, если оно было брошено
176
+ * **PaymentProcessor::HANDLER_SAVE_CHANGES** - для сохранения платежной транзакции
177
+ * **PaymentProcessor::HANDLER_REDIRECT** - для переадресации пользователя на URL платежной формы, полученный от PaynetEasy
178
+
179
+ 4. <a name="stage_1_step_6"></a>Запуск обработки платежа:
180
+
181
+ ```php
182
+ $paymentProcessor->executeQuery('sale-form', $paymentTransaction);
183
+ ```
184
+ Будут выполнены следующие шаги:
185
+ 1. Проверка данных платежной транзакции и формирование на ее основе запроса к PaynetEasy
186
+ 3. Изменение статуса платежа **status**
187
+ 4. Выполнение запроса для старта обработки платежной транзакции и ее первичной проверки
188
+ 5. Получение ответа от PaynetEasy
189
+ 6. Изменение статуса платежной транзакции **status** на основе данных ответа
190
+ 7. Сохранение платежной транзакции обработчиком для `PaymentProcessor::HANDLER_SAVE_PAYMENT`
191
+ 8. Перенаправление клиента на платежную форму обработчиком для `PaymentProcessor::HANDLER_REDIRECT`
192
+
193
+ ### <a name="stage_2"></a>Окончание обработки платежной транзакции
194
+
195
+ 1. <a name="stage_2_step_1"></a>Подключение загрузчика классов, [предоставляемого composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading), и необходимых классов:
196
+
197
+ ```php
198
+ require_once 'project/root/dir/vendor/autoload.php';
199
+
200
+ use PaynetEasy\PaynetEasyApi\PaymentData\PaymentTransaction;
201
+ use PaynetEasy\PaynetEasyApi\Transport\CallbackResponse;
202
+ use PaynetEasy\PaynetEasyApi\PaymentProcessor;
203
+ use Exception;
204
+ ```
205
+ 2. <a name="stage_2_step_2"></a>Загрузка сохраненной платежной транзакции:
206
+
207
+ ```php
208
+ session_start();
209
+ $paymentTransaction = unserialize($_SESSION['payment_transaction']);
210
+ ```
211
+
212
+ 3. <a name="stage_2_step_4"></a>Создание сервиса для обработки платежей:
213
+
214
+ ```php
215
+ $paymentProcessor = new PaymentProcessor(array
216
+ (
217
+ PaymentProcessor::HANDLER_CATCH_EXCEPTION => function(Exception $exception)
218
+ {
219
+ print "<pre>";
220
+ print "Exception catched.\n";
221
+ print "Exception message: '{$exception->getMessage()}'.\n";
222
+ print "Exception traceback: \n{$exception->getTraceAsString()}\n";
223
+ print "</pre>";
224
+ },
225
+ PaymentProcessor::HANDLER_SAVE_CHANGES => function(PaymentTransaction $paymentTransaction)
226
+ {
227
+ $_SESSION['payment_transaction'] = serialize($paymentTransaction);
228
+ },
229
+ PaymentProcessor::HANDLER_FINISH_PROCESSING => function(PaymentTransaction $paymentTransaction)
230
+ {
231
+ print "<pre>";
232
+ print "Payment processing finished.\n";
233
+ print "Payment status: '{$paymentTransaction->getPayment()->getStatus()}'.\n";
234
+ print "Payment transaction status: '{$paymentTransaction->getStatus()}'.\n";
235
+ print "</pre>";
236
+ }
237
+ ));
238
+ ```
239
+
240
+ Обработчики событий для сервиса:
241
+ * **PaymentProcessor::HANDLER_CATCH_EXCEPTION** - для обработки исключения, если оно было брошено
242
+ * **PaymentProcessor::HANDLER_SAVE_CHANGES** - для сохранения платежа
243
+ * **PaymentProcessor::HANDLER_FINISH_PROCESSING** - для вывода информации о платеже после окончания обработки
244
+
245
+ 4. <a name="stage_2_step_6"></a>Запуск обработки данных, полученных при возвращении пользователя с платежной формы:
246
+
247
+ ```php
248
+ $paymentProcessor->processCustomerReturn(new CallbackResponse($_POST), $paymentTransaction);
249
+ ```
250
+ Будут выполнены следующие шаги:
251
+ 1. Проверка данных, полученные по возвращении клиента с платежной формы PaynetEasy (суперглобальный массив $_POST)
252
+ 2. Изменение статуса платежной транзакции **status** на основе проверенных данных
253
+ 3. Сохранение платежной транзакции обработчиком для `PaymentProcessor::HANDLER_SAVE_PAYMENT`
254
+ 4. Вывод статуса платежа **status** и статуса платежной транзакции **status** на экран обработчиком для `PaymentProcessor::HANDLER_FINISH_PROCESSING`
@@ -0,0 +1,6 @@
1
+ # Внутренняя структура библиотеки
2
+
3
+ * [Семейство классов для хранения и обмена данными, PaynetEasy\PaynetEasyApi\PaymentData](library-internals/00-payment-data.md)
4
+ * [Фронтенд библиотеки, PaynetEasy\PaynetEasyApi\PaymentProcessor](library-internals/01-payment-processor.md)
5
+ * [Валидатор данных, PaynetEasy\PaynetEasyApi\Util\Validator](library-internals/02-validator.md)
6
+ * [Класс для работы с цепочками свойств, PaynetEasy\PaynetEasyApi\Util\PropertyAccessor](library-internals/03-property-accessor.md)
@@ -0,0 +1,9 @@
1
+ # Интеграция различных платежных сценариев
2
+
3
+ * [Sale Transactions](payment-scenarios/00-sale-transactions.md)
4
+ * [Preauth/Capture Transactions](payment-scenarios/01-preauth-capture-transactions.md)
5
+ * [Transfer Transactions](payment-scenarios/02-transfer-transactions.md)
6
+ * [Return Transactions](payment-scenarios/03-return-transactions.md)
7
+ * [Recurrent Transactions](payment-scenarios/04-recurrent-transactions.md)
8
+ * [Payment Form Integration](payment-scenarios/05-payment-form-integration.md)
9
+ * [Merchant Callbacks](payment-scenarios/06-merchant-callbacks.md)
@@ -0,0 +1,162 @@
1
+ # Классы для хранения и передачи данных
2
+
3
+ Семейство классов для хранения данных и обмена данными между библиотекой и CMS мерчанта. Расположены в пространстве имен **[PaynetEasy\PaynetEasyApi\PaymentData](../../source/PaynetEasy/PaynetEasyApi/PaymentData)**. Представлены следующими классами объектов:
4
+ * [PaymentTransaction](#PaymentTransaction)
5
+ * [Payment](#Payment)
6
+ * [QueryConfig](#QueryConfig)
7
+ * [Customer](#Customer)
8
+ * [BillingAddress](#BillingAddress)
9
+ * [CreditCard](#CreditCard)
10
+ * [RecurrentCard](#RecurrentCard)
11
+
12
+ Каждый из классов позволяет наполнять объект данными как с помощью массива, переданного в конструктор, так и с помощью сеттеров. При использовании массива в качестве ключа для данных необходимо использовать underscored название свойства класса.
13
+
14
+ ##### Использование массива и underscored названий свойств класса
15
+
16
+ ```php
17
+ $payment = new Payment(array
18
+ (
19
+ 'client_id' => 'CLIENT-112233',
20
+ 'paynet_id' => 'PAYNET-112233',
21
+ 'description' => 'test payment'
22
+ ));
23
+ ```
24
+ ##### Использование сеттеров
25
+
26
+ ```php
27
+ $payment = (new Payment)
28
+ ->setClientId('CLIENT-112233')
29
+ ->setPaynetId('PAYNET-112233')
30
+ ->setDescription('test payment')
31
+ ;
32
+ ```
33
+
34
+ ### <a name="PaymentTransaction"></a> PaymentTransaction
35
+
36
+ Центральным объектом для хранения и передачи данных является объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\PaymentTransaction](../../source/PaynetEasy/PaynetEasyApi/PaymentData/PaymentTransaction.php)**. Именно он передается из CMS в библиотеку при выполнении любого запроса. Хранит следующие данные:
37
+
38
+ Свойство класса |Тип |Поле запроса |Назначение
39
+ --------------------|---------------------------|---------------|-------------------------------------------------------
40
+ processorType |string | |Transaction processor type (query, callback)
41
+ processorName |string | |Transaction processor name (query or callback name)
42
+ status |string | |Transaction status (new, processing, approved, filtered, declined, error)
43
+ payment |[Payment](#Payment) | |Платеж, для которого создана транзакция
44
+ queryConfig |[QueryConfig](#QueryConfig)| |Payment query config
45
+ errors |array | |Transaction processing errors
46
+
47
+ Поля **processorType** и **processorName** заполняются обработчиком транзакции после формирования платежного запроса. Поле **status** изменяется на основе данных ответа от сервера PaynetEasy.
48
+
49
+ ### <a name="Payment"></a> Payment
50
+
51
+ Объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\Payment](../../source/PaynetEasy/PaynetEasyApi/PaymentData/Payment.php)**. Используется при выполнении всех запросов. Хранит следующие данные:
52
+
53
+ Свойство класса |Тип |Поле запроса |Назначение
54
+ --------------------|-----------------------------------|---------------|-------------------------------------------------------
55
+ clientId |string |client_orderid |Merchant payment identifier
56
+ paynetId |string |orderid |Unique identifier of transaction assigned by PaynetEasy
57
+ description |string |order_desc |Brief payment description
58
+ destination |string |destination |Destination to where the payment goes
59
+ amount |float |amount |Amount to be charged
60
+ currency |string |currency |Three-letter currency code
61
+ comment |string |comment |A short comment for payment
62
+ status |string | |Payment status (new, preauth, capture, return)
63
+ customer |[Customer](#Customer) | |Payment customer
64
+ billingAddress |[BillingAddress](#BillingAddress) | |Payment billing address
65
+ creditCard |[CreditCard](#CreditCard) | |Payment credit card
66
+ recurrentCardFrom |[RecurrentCard](#RecurrentCard) | |Payment source recurrent card
67
+ recurrentCardTo |[RecurrentCard](#RecurrentCard) | |Payment destination recurrent card
68
+
69
+ Поле **status** заполняется обработчиком транзакции после формирования платежного запроса в зависимости от того, какую платежную операцию реализует обработчик.
70
+
71
+ ### <a name="QueryConfig"></a> QueryConfig
72
+
73
+ Объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\QueryConfig](../../source/PaynetEasy/PaynetEasyApi/PaymentData/QueryConfig.php)**. Используется при выполнении всех запросов. Хранит следующие данные:
74
+
75
+ Свойство класса |Тип |Поле запроса |Назначение
76
+ --------------------|-------|-------------------|-------------------------------------------------------
77
+ login |string |login |Merchant login
78
+ siteUrl |string |site_url |URL the original payment is made from
79
+ redirectUrl |string |redirect_url |URL the customer will be redirected to upon completion of the transaction
80
+ callbackUrl |string |server_callback_url|URL the transaction result will be sent to
81
+ endPoint |integer| |Merchant end point
82
+ signingKey |string | |Merchant key for payment signing
83
+ gatewayMode |string | |Gateway mode (sandbox, production)
84
+ gatewayUrlSandbox |string | |Sandbox gateway url
85
+ gatewayUrlProduction|string | |Production gateway url
86
+
87
+ Значение свойства endPoint участвует в формировании URL для вызова платежного метода шлюза PaynetEasy, а свойства signingKey - в формировании подписи для данных платежа. Значения свойств **gatewayUrlSandbox** и **gatewayUrlProduction** содержат ссылки на sandbox и production гейты. Выбор между этими url осуществляется на основе значения поля **gatewayMode**, если значение поля `QueryConfig::GATEWAY_MODE_SANDBOX`, то будет выбран url **gatewayUrlSandbox**, если `QueryConfig::GATEWAY_MODE_PRODUCTION` - то url **gatewayUrlProduction**.
88
+
89
+ ### <a name="Customer"></a> Customer
90
+
91
+ Объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\Customer](../../source/PaynetEasy/PaynetEasyApi/PaymentData/Customer.php)**. Используется при выполнении следующих запросов:
92
+ * [sale](../payment-scenarios/00-sale-transactions.md#sale)
93
+ * [preauth](../payment-scenarios/01-preauth-capture-transactions.md#preauth)
94
+ * [sale-form, preauth-form, transfer-form](../payment-scenarios/05-payment-form-integration.md#form)
95
+ * [make-rebill](../payment-scenarios/04-recurrent-transactions.md#make-rebill)
96
+ * [transfer-by-ref](../payment-scenarios/02-transfer-transactions.md#transfer-by-ref)
97
+
98
+ Объект хранит следующие данные:
99
+
100
+ Свойство класса |Тип |Поле запроса |Назначение
101
+ --------------------|-------|---------------|-------------------------------------------------------
102
+ firstName |string |first_name |Customer’s first name
103
+ lastName |string |last_name |Customer’s last name
104
+ email |string |email |Customer’s email address
105
+ ipAddress |string |ipaddress |Customer’s IP address
106
+ birthday |string |birthday |Customer’s date of birth, in the format MMDDYY
107
+ ssn |string |ssn |Last four digits of the customer’s social security number
108
+
109
+ ### <a name="BillingAddress"></a> BillingAddress
110
+
111
+ Объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\BillingAddress](../../source/PaynetEasy/PaynetEasyApi/PaymentData/BillingAddress.php)**. Используется при выполнении следующих запросов:
112
+ * [sale](../payment-scenarios/00-sale-transactions.md#sale)
113
+ * [preauth](../payment-scenarios/01-preauth-capture-transactions.md#preauth)
114
+ * [sale-form, preauth-form, transfer-form](../payment-scenarios/05-payment-form-integration.md#form)
115
+
116
+ Объект хранит следующие данные:
117
+
118
+ Свойство класса |Тип |Поле запроса |Назначение
119
+ --------------------|-------|---------------|-------------------------------------------------------
120
+ country |string |country |Customer’s two-letter country code
121
+ state |string |state |Customer’s two-letter state code
122
+ city |string |city |Customer’s city
123
+ firstLine |string |address1 |Customer’s address line 1
124
+ zipCode |string |zip_code |Customer’s ZIP code
125
+ phone |string |phone |Customer’s full international phone number, including country code
126
+ cellPhone |string |cell_phone |Customer’s full international cell phone number, including country code
127
+
128
+ ### <a name="CreditCard"></a> CreditCard
129
+
130
+ Объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\CreditCard](../../source/PaynetEasy/PaynetEasyApi/PaymentData/CreditCard.php)**. Используется при выполнении следующих запросов:
131
+ * [sale](../payment-scenarios/00-sale-transactions.md#sale)
132
+ * [preauth](../payment-scenarios/01-preauth-capture-transactions.md#preauth)
133
+
134
+ Объект хранит следующие данные:
135
+
136
+ Свойство класса |Тип |Поле запроса |Назначение
137
+ --------------------|-------|-------------------|-------------------------------------------------------
138
+ cvv2 |integer|cvv2 |RecurrentCard CVV2
139
+ cardPrintedName |string |card_printed_name |Card holder name
140
+ creditCardNumber |string |credit_card_number |Credit card number
141
+ expireYear |integer|expire_year |Card expiration year
142
+ expireMonth |integer|expire_month |Card expiration month
143
+
144
+ ### <a name="RecurrentCard"></a> RecurrentCard
145
+
146
+ Объект класса **[PaynetEasy\PaynetEasyApi\PaymentData\RecurrentCard](../../source/PaynetEasy/PaynetEasyApi/PaymentData/RecurrentCard.php)**. Используется при выполнении следующих запросов:
147
+ * [create-card-ref](../payment-scenarios/04-recurrent-transactions.md#create-card-ref)
148
+ * [get-card-info](../payment-scenarios/04-recurrent-transactions.md#get-card-info)
149
+ * [make-rebill](../payment-scenarios/04-recurrent-transactions.md#make-rebill)
150
+ * [transfer-by-ref](../payment-scenarios/02-transfer-transactions.md#transfer-by-ref)
151
+
152
+ Объект хранит следующие данные:
153
+
154
+ Свойство класса |Тип |Поле запроса |Назначение
155
+ --------------------|-------|-------------------|-------------------------------------------------------
156
+ paynetId |integer|cardrefid |RecurrentCard PaynetEasy ID
157
+ cvv2 |integer|cvv2 |RecurrentCard CVV2
158
+ cardPrintedName |string | |Card holder name
159
+ expireYear |integer| |Card expiration year
160
+ expireMonth |integer| |Card expiration month
161
+ bin |integer| |Bank Identification Number
162
+ lastFourDigits |integer| |The last four digits of PAN (card number)