Skip to content

Commit 4802abf

Browse files
author
Alexey Babak
committed
added new MarketplaceRefnud examples and functions
1 parent 2679ac1 commit 4802abf

10 files changed

+362
-7
lines changed

example.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@
3333
break;
3434
case 'simpleGetPaymentLink':
3535
case 'getPaymentLink':
36+
case 'getPaymentLinkMarketplace':
3637
case 'getToken':
3738
case 'paymentByToken':
3839
case 'paymentCapture':
3940
case 'paymentGetStatus':
4041
case 'paymentWebhook':
4142
case 'paymentRefund':
43+
case 'paymentRefundMarketplace':
4244
case 'returnPage':
4345
include './src/Examples/start.php';
4446
include './src/Examples/'.$_GET['function'] . '.php';

example_list.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
'about' => 'Это пример платежа с максимальным набором полей.',
2525
'link' => '',
2626
],
27+
'getPaymentLinkMarketplace' => [
28+
'name' => 'Платёж со сплитом',
29+
'about' => 'Это пример платежа со сплитом (разделением оплаты на несколько плательщиков).',
30+
'link' => '',
31+
],
2732
'getToken' => [
2833
'name' => 'Создание токена',
2934
'about' => 'Приложение передаёт номер успешно оплаченного заказа в YPMN API, и получает в ответ платёжный токен',
@@ -44,6 +49,11 @@
4449
'about' => 'Запрос на полный или частичный возврат средств.',
4550
'link' => '',
4651
],
52+
'paymentRefundMarketplace' => [
53+
'name' => 'Возврат средств со сплитом',
54+
'about' => 'Запрос на полный или частичный возврат средств с разделением на несколько получателей.',
55+
'link' => '',
56+
],
4757
'paymentGetStatus' => [
4858
'name' => 'Проверка статуса платежа',
4959
'about' => 'Запрос к YPMN API о состоянии платежа.',
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
<?php
2+
3+
/**
4+
* Этот файл аналогичен getPaymentLink.php за исключением того,
5+
* что здесь оплата разделяется на несколько мерчантов
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
use Ypmn\Authorization;
11+
use Ypmn\Delivery;
12+
use Ypmn\IdentityDocument;
13+
use Ypmn\Payment;
14+
use Ypmn\Client;
15+
use Ypmn\Billing;
16+
use Ypmn\ApiRequest;
17+
use Ypmn\PaymentException;
18+
use Ypmn\Product;
19+
use Ypmn\Std;
20+
21+
// Подключим файл, в котором заданы параметры мерчанта
22+
include_once 'start.php';
23+
24+
// Оплата по ссылке Ypmn
25+
// Представим, что нам надо оплатить пару позиций: Синий Мяч и Жёлтый Круг
26+
27+
// Опишем первую позицию
28+
$product1 = new Product;
29+
// Установим Наименование (название товара или услуги)
30+
$product1->setName('Синий Квадрат');
31+
// Установим Артикул
32+
$product1->setSku('ball-05');
33+
// Установим Стоимость за единицу
34+
$product1->setUnitPrice(500);
35+
// Установим Количество
36+
$product1->setQuantity(1);
37+
// Установим НДС
38+
$product1->setVat(20);
39+
// Установим Код Мерчанта (для маркетплейса)
40+
$product1->setMarketplaceSubmerchantByCode('SUBMERCHANT_1');
41+
42+
//Опишем вторую позицию с помощью сокращённого синтаксиса:
43+
$product2 = new Product([
44+
'name' => 'Оранжевый Круг',
45+
'sku' => 'toy-15',
46+
'unitPrice' => 160000,
47+
'quantity' => 3,
48+
'vat' => 0,
49+
'merchantCode' => 'SUBMERCHANT_2',
50+
]);
51+
52+
// Опишем Биллинговую (платёжную) информацию
53+
$billing = new Billing;
54+
// Установим Код страны
55+
$billing->setCountryCode('RU');
56+
// Установим Город
57+
$billing->setCity('Москва');
58+
// Установим Регион
59+
$billing->setState('Центральный регион');
60+
// Установим Адрес Плательщика (первая строка)
61+
$billing->setAddressLine1('Улица Старый Арбат, дом 10');
62+
// Установим Адрес Плательщика (вторая строка)
63+
$billing->setAddressLine1('Офис Ypmn');
64+
// Установим Почтовый Индекс Плательщика
65+
$billing->setZipCode('121000');
66+
// Установим Имя Плательщика
67+
$billing->setFirstName('Иван');
68+
// Установим Фамилия Плательщика
69+
$billing->setLastName('Петров');
70+
// Установим Телефон Плательщика
71+
$billing->setPhone('+79670660742');
72+
// Установим Email Плательщика
73+
$billing->setEmail('[email protected]');
74+
75+
// (необязательно) Опишем Доствку и принимающее лицо
76+
$delivery = new Delivery;
77+
// Установим документ, подтверждающий право приёма доставки
78+
$delivery->setIdentityDocument(
79+
new IdentityDocument('123456', 'PERSONALID')
80+
);
81+
// Установим Код страны
82+
$delivery->setCountryCode('RU');
83+
// Установим Город
84+
$delivery->setCity('Москва');
85+
// Установим Регион
86+
$delivery->setState('Центральный регион');
87+
// Установим Адрес Лица, принимающего заказ (первая строка)
88+
$delivery->setAddressLine1('Улица Старый Арбат, дом 10');
89+
// Установим Адрес Лица, принимающего заказ (вторая строка)
90+
$delivery->setAddressLine1('Офис Ypmn');
91+
// Установим Почтовый Индекс Лица, принимающего заказ
92+
$delivery->setZipCode('121000');
93+
// Установим Имя Лица, принимающего заказ
94+
$delivery->setFirstName('Мария');
95+
// Установим Фамилия Лица, принимающего заказ
96+
$delivery->setLastName('Петрова');
97+
// Установим Телефон Лица, принимающего заказ
98+
$delivery->setPhone('+79670660743');
99+
// Установим Email Лица, принимающего заказ
100+
$delivery->setEmail('[email protected]');
101+
// Установим Название Компании, в которой можно оставить заказ
102+
$delivery->setCompanyName('ООО "Вектор"');
103+
104+
// Создадим клиентское подключение
105+
$client = new Client;
106+
// Установим биллинг
107+
$client->setBilling($billing);
108+
// Установим доставку
109+
$client->setDelivery($delivery);
110+
// Установим IP (автоматически)
111+
$client->setCurrentClientIp();
112+
// И Установим время (автоматически)
113+
$client->setCurrentClientTime();
114+
115+
// Создадим платёж
116+
$payment = new Payment;
117+
// Установим позиции
118+
$payment->addProduct($product1);
119+
$payment->addProduct($product2);
120+
// Установим валюту
121+
$payment->setCurrency('RUB');
122+
// Создадим и установим авторизацию по типу платежа
123+
$payment->setAuthorization(new Authorization('CCVISAMC',true));
124+
// Установим номер заказа (должен быть уникальным в вашей системе)
125+
$payment->setMerchantPaymentReference('primer_nomer__' . time());
126+
// Установим адрес перенаправления пользователя после оплаты
127+
$payment->setReturnUrl('https://test.u2go.ru/php-api-client/?function=returnPage');
128+
// Установим клиентское подключение
129+
$payment->setClient($client);
130+
131+
// Создадим HTTP-запрос к API
132+
$apiRequest = new ApiRequest($merchant);
133+
// Включить режим отладки (закомментируйте или удалите в рабочей программе!)
134+
$apiRequest->setDebugMode();
135+
// Переключиться на тестовый сервер (закомментируйте или удалите в рабочей программе!)
136+
$apiRequest->setSandboxMode();
137+
// Отправим запрос
138+
$responseData = $apiRequest->sendAuthRequest($payment, $merchant);
139+
// Преобразуем ответ из JSON в массив
140+
try {
141+
$responseData = json_decode((string) $responseData["response"], true);
142+
143+
// Нарисуем кнопку оплаты
144+
echo Std::drawYpmnButton([
145+
'url' => $responseData["paymentResult"]['url'],
146+
'sum' => $payment->sumProductsAmount(),
147+
]);
148+
149+
// Либо сделаем редирект (перенаправление) браузера по адресу оплаты:
150+
// echo Std::redirect($responseData["paymentResult"]['url']);
151+
} catch (Exception $exception) {
152+
//TODO: обработка исключения
153+
echo Std::alert([
154+
'text' => '
155+
Извините, платёжный метод временно недоступен.<br>
156+
Вы можете попробовать другой способ оплаты, либо свяжитесь с продавцом.<br>
157+
<br>
158+
<pre>' . $exception->getMessage() . '</pre>',
159+
'type' => 'danger',
160+
]);
161+
162+
throw new PaymentException('Платёжный метод временно недоступен');
163+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
/**
4+
* Этот файл аналогичен paymentRefund.php за исключением того,
5+
* что здесь возврат разделяется на несколько мерчантов
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
use Ypmn\ApiRequest;
11+
use Ypmn\Refund;
12+
13+
// Подключим файл, в котором заданы параметры мерчанта
14+
include_once 'start.php';
15+
16+
// Создадим запрос на возврат средств
17+
$refund = (new Refund);
18+
// Установим номер платежа Ypmn
19+
$refund->setYpmnPaymentReference("2297597");
20+
// Cумма исходной операции на авторизацию
21+
$refund->setOriginalAmount(3700);
22+
// Cумма фактического списания
23+
$refund->setAmount(3700);
24+
// Добавим Сабмерчантов
25+
$refund->addMarketPlaceSubmerchant('SUBMERCHANT_1', 3000);
26+
$refund->addMarketPlaceSubmerchant('SUBMERCHANT_2', 700);
27+
// Установим валюту
28+
$refund->setCurrency('RUB');
29+
// Создадим HTTP-запрос к API
30+
$apiRequest = new ApiRequest($merchant);
31+
// Включить режим отладки (закомментируйте или удалите в рабочей программе!)
32+
$apiRequest->setDebugMode();
33+
// Переключиться на тестовый сервер (закомментируйте или удалите в рабочей программе!)
34+
$apiRequest->setSandboxMode();
35+
// Отправим запрос к API
36+
$responseData = $apiRequest->sendRefundRequest($refund, $merchant);

src/MarketplaceSubmerchant.php

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
namespace Ypmn;
4+
5+
use JsonSerializable;
6+
use stdClass;
7+
8+
/**
9+
* Это объект Сабмерчанта
10+
* (для маркетплейса/сплита/разделения платежа)
11+
*/
12+
class MarketplaceSubmerchant implements MarketplaceSubmerchantInterface, JsonSerializable
13+
{
14+
/** @var string Код Сабмерчанта (можно получить в личном кабинете) */
15+
private string $merchantCode;
16+
17+
/** @var float|null Сумма этого Сабмерчанта в заказе */
18+
private ?float $amount = null;
19+
20+
/** @throws PaymentException */
21+
public function __construct(string $merchantCode, float $amount = null)
22+
{
23+
$this->setMerchantCode($merchantCode);
24+
if (null !== $amount) {
25+
$this->setAmount($amount);
26+
}
27+
}
28+
29+
/** @inheritDoc */
30+
public function setMerchantCode(string $merchantCode): self
31+
{
32+
$this->merchantCode = $merchantCode;
33+
34+
return $this;
35+
}
36+
37+
/** @inheritDoc */
38+
public function getMerchantCode(): string
39+
{
40+
return $this->merchantCode;
41+
}
42+
43+
/** @inheritDoc
44+
* @throws PaymentException
45+
*/
46+
public function setAmount(float $amount): self
47+
{
48+
if ($amount <= 0) {
49+
throw new PaymentException('Отрицательные суммы не принимаются');
50+
}
51+
52+
$this->amount = $amount;
53+
54+
return $this;
55+
}
56+
57+
/** @inheritDoc */
58+
public function getAmount(): float
59+
{
60+
return $this->amount;
61+
}
62+
63+
/** @inheritDoc */
64+
public function arraySerialize()
65+
{
66+
$resultArray = [
67+
'merchantCode' => $this->merchantCode,
68+
];
69+
70+
if ($this->amount > 0) {
71+
$resultArray['amount'] = $this->amount;
72+
}
73+
74+
return $resultArray;
75+
}
76+
77+
public function jsonSerialize(){
78+
$dto = (object) [
79+
'merchantCode' => $this->getMerchantCode(),
80+
'amount' => $this->getAmount(),
81+
];
82+
83+
return json_encode($dto, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_LINE_TERMINATORS);
84+
}
85+
}

src/MarketplaceSubmerchantInterface.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Ypmn;
44

55
/**
6-
* Это объект Сабмерчанта (для маркетплейса)
6+
* Это интерфейс Сабмерчанта (для маркетплейса)
77
*/
88
interface MarketplaceSubmerchantInterface
99
{
@@ -22,17 +22,16 @@ public function getMerchantCode() : string;
2222

2323
/**
2424
* Установить Сумму
25-
* @param int $amount
25+
* @param float $amount
2626
* @return $this
2727
*/
28-
public function setAmount(int $amount) : self;
28+
public function setAmount(float $amount) : self;
2929

3030
/**
3131
* Получить Сумму
32-
* @return int
32+
* @return float
3333
*/
34-
public function getAmount() : int;
35-
34+
public function getAmount() : float;
3635

3736
/**
3837
* Преобразовать в массив

0 commit comments

Comments
 (0)