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.
- data/.gemtest +0 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +18 -0
- data/README.md +54 -0
- data/Rakefile +8 -0
- data/doc/00-basic-tutorial.md +254 -0
- data/doc/01-library-internals.md +6 -0
- data/doc/02-payment-scenarios.md +9 -0
- data/doc/library-internals/00-payment-data.md +162 -0
- data/doc/library-internals/01-payment-processor.md +163 -0
- data/doc/library-internals/02-validator.md +55 -0
- data/doc/library-internals/03-property-accessor.md +76 -0
- data/doc/payment-scenarios/00-sale-transactions.md +90 -0
- data/doc/payment-scenarios/01-preauth-capture-transactions.md +105 -0
- data/doc/payment-scenarios/02-transfer-transactions.md +89 -0
- data/doc/payment-scenarios/03-return-transactions.md +52 -0
- data/doc/payment-scenarios/04-recurrent-transactions.md +110 -0
- data/doc/payment-scenarios/05-payment-form-integration.md +59 -0
- data/doc/payment-scenarios/06-merchant-callbacks.md +29 -0
- data/example/capture.rb +12 -0
- data/example/common/functions.rb +56 -0
- data/lib/paynet_easy/paynet_easy_api/callback/callback_factory.rb +47 -0
- data/lib/paynet_easy/paynet_easy_api/callback/callback_prototype.rb +186 -0
- data/lib/paynet_easy/paynet_easy_api/callback/customer_return_callback.rb +28 -0
- data/lib/paynet_easy/paynet_easy_api/callback/paynet_easy_callback.rb +44 -0
- data/lib/paynet_easy/paynet_easy_api/error/paynet_error.rb +4 -0
- data/lib/paynet_easy/paynet_easy_api/error/request_error.rb +6 -0
- data/lib/paynet_easy/paynet_easy_api/error/response_error.rb +6 -0
- data/lib/paynet_easy/paynet_easy_api/error/validation_error.rb +6 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/billing_address.rb +41 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/credit_card.rb +32 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/customer.rb +35 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/data.rb +13 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/payment.rb +190 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/payment_transaction.rb +188 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/query_config.rb +95 -0
- data/lib/paynet_easy/paynet_easy_api/payment_data/recurrent_card.rb +40 -0
- data/lib/paynet_easy/paynet_easy_api/payment_processor.rb +251 -0
- data/lib/paynet_easy/paynet_easy_api/paynet_easy_api.rb +26 -0
- data/lib/paynet_easy/paynet_easy_api/query/capture_query.rb +30 -0
- data/lib/paynet_easy/paynet_easy_api/query/create_card_ref_query.rb +78 -0
- data/lib/paynet_easy/paynet_easy_api/query/get_card_info_query.rb +49 -0
- data/lib/paynet_easy/paynet_easy_api/query/make_rebill_query.rb +37 -0
- data/lib/paynet_easy/paynet_easy_api/query/preauth_form_query.rb +10 -0
- data/lib/paynet_easy/paynet_easy_api/query/preauth_query.rb +10 -0
- data/lib/paynet_easy/paynet_easy_api/query/prototype/payment_form_query.rb +69 -0
- data/lib/paynet_easy/paynet_easy_api/query/prototype/payment_query.rb +71 -0
- data/lib/paynet_easy/paynet_easy_api/query/prototype/query.rb +302 -0
- data/lib/paynet_easy/paynet_easy_api/query/query_factory.rb +19 -0
- data/lib/paynet_easy/paynet_easy_api/query/return_query.rb +46 -0
- data/lib/paynet_easy/paynet_easy_api/query/sale_form_query.rb +10 -0
- data/lib/paynet_easy/paynet_easy_api/query/sale_query.rb +53 -0
- data/lib/paynet_easy/paynet_easy_api/query/status_query.rb +50 -0
- data/lib/paynet_easy/paynet_easy_api/query/transfer_by_ref_query.rb +41 -0
- data/lib/paynet_easy/paynet_easy_api/query/transfer_form_query.rb +10 -0
- data/lib/paynet_easy/paynet_easy_api/transport/callback_response.rb +21 -0
- data/lib/paynet_easy/paynet_easy_api/transport/gateway_client.rb +91 -0
- data/lib/paynet_easy/paynet_easy_api/transport/request.rb +20 -0
- data/lib/paynet_easy/paynet_easy_api/transport/response.rb +136 -0
- data/lib/paynet_easy/paynet_easy_api/util/property_accessor.rb +60 -0
- data/lib/paynet_easy/paynet_easy_api/util/string.rb +9 -0
- data/lib/paynet_easy/paynet_easy_api/util/validator.rb +110 -0
- data/payneteasy-payneteasyapi.gemspec +16 -0
- data/test/paynet_easy/paynet_easy_api/callback/callback_factory_test.rb +22 -0
- data/test/paynet_easy/paynet_easy_api/callback/callback_test_prototype.rb +168 -0
- data/test/paynet_easy/paynet_easy_api/callback/customer_return_callback_test.rb +95 -0
- data/test/paynet_easy/paynet_easy_api/callback/paynet_easy_callback_test.rb +101 -0
- data/test/paynet_easy/paynet_easy_api/fake.rb +71 -0
- data/test/paynet_easy/paynet_easy_api/payment_processor_test.rb +255 -0
- data/test/paynet_easy/paynet_easy_api/query/capture_query_test.rb +48 -0
- data/test/paynet_easy/paynet_easy_api/query/create_card_ref_query_test.rb +116 -0
- data/test/paynet_easy/paynet_easy_api/query/get_card_info_query_test.rb +116 -0
- data/test/paynet_easy/paynet_easy_api/query/make_rebill_query_test.rb +59 -0
- data/test/paynet_easy/paynet_easy_api/query/prototype/payment_query_test_prototype.rb +117 -0
- data/test/paynet_easy/paynet_easy_api/query/prototype/query_test_prototype.rb +190 -0
- data/test/paynet_easy/paynet_easy_api/query/prototype/sync_query_test_prototype.rb +88 -0
- data/test/paynet_easy/paynet_easy_api/query/query_factory_test.rb +21 -0
- data/test/paynet_easy/paynet_easy_api/query/return_query_test.rb +58 -0
- data/test/paynet_easy/paynet_easy_api/query/sale_form_query_test.rb +96 -0
- data/test/paynet_easy/paynet_easy_api/query/sale_query_test.rb +78 -0
- data/test/paynet_easy/paynet_easy_api/query/status_query_test.rb +81 -0
- data/test/paynet_easy/paynet_easy_api/query/transfer_by_ref_query_test.rb +63 -0
- data/test/paynet_easy/paynet_easy_api/transport/gateway_client_test.rb +22 -0
- data/test/paynet_easy/paynet_easy_api/transport/response_test.rb +26 -0
- data/test/paynet_easy/paynet_easy_api/util/property_accessor_test.rb +52 -0
- data/test/paynet_easy/paynet_easy_api/util/validator_test.rb +42 -0
- metadata +204 -0
data/.gemtest
ADDED
|
File without changes
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Ruby Library for PaynetEasy API integration [](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,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)
|