Skip to content

Commit

Permalink
Merge pull request #6 from aslangery/master
Browse files Browse the repository at this point in the history
feat: Google Pay request, fix cart items in order
  • Loading branch information
anmoroz authored Jan 18, 2022
2 parents 1c66b85 + ca9413c commit de4d389
Show file tree
Hide file tree
Showing 13 changed files with 289 additions and 13 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "3davinci/sberbank-gateway",
"version": "0.2.1",
"version": "0.2.2",
"description": "Sberbank REST client",
"type": "library",
"license": "MIT",
Expand Down
16 changes: 16 additions & 0 deletions src/Sberbank/Http/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,22 @@ public function get($uri, array $headers = []): ResponseInterface
return $this->sendRequest($request);
}

/**
* Send a POST request.
*
* @param UriInterface|string $uri
* @param array $headers
* @param null $body
* @return ResponseInterface
* @throws Exception
*/
public function post($uri, array $headers = [], $body = null): ResponseInterface
{
$request = $this->createRequest('POST', $uri, $headers, $body);

return $this->sendRequest($request);
}

/**
* @return HttpClient
*/
Expand Down
2 changes: 1 addition & 1 deletion src/Sberbank/Message/BindCardRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ public function validate()
*/
public function getMethodName(): string
{
return 'bindCard.do';
return 'rest/bindCard.do';
}
}
2 changes: 1 addition & 1 deletion src/Sberbank/Message/BindingsRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@ public function validate()
*/
public function getMethodName(): string
{
return 'getBindings.do';
return 'rest/getBindings.do';
}
}
184 changes: 184 additions & 0 deletions src/Sberbank/Message/GooglePaymentRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
<?php

namespace Sberbank\Message;

class GooglePaymentRequest extends RequestAbstract
{
/**
* Логин продавца в платёжном шлюзе.
*
* @param string $value
* @return RequestAbstract
*/
public function setMerchant(string $value)
{
return $this->setParameter('merchant', $value);
}

/**
* Номер (идентификатор) заказа в системе магазина, уникален для каждого магазина в пределах системы
*
* @param string|int $value
* @return RequestAbstract
*/
public function setOrderNumber($value)
{
return $this->setParameter('orderNumber', $value);
}

/**
* Номер (идентификатор) заказа в системе магазина, уникален для каждого магазина в пределах системы
*
* @param string|int $value
* @return RequestAbstract
*/
public function setProtocolVersion($value)
{
return $this->setParameter('protocolVersion', $value);
}


/**
* Описание заказа в свободной форме
*
* @param string $value
* @return RequestAbstract
*/
public function setDescription(string $value)
{
return $this->setParameter('description', mb_substr($value, 0, 512));
}

/**
* Код валюты платежа ISO 4217. Если не указан, считается равным коду валюты по умолчанию.
*
* @param string $value
* @return RequestAbstract
*/
public function setCurrencyCode(string $value)
{
return $this->setParameter('currencyCode', $value);
}

/**
* Язык в кодировке ISO 639-1. Если не указан, будет использован язык, указанный в настройках магазина как язык по умолчанию (default language).
*
* @param string $value
* @return RequestAbstract
*/
public function setLanguage(string $value)
{
return $this->setParameter('language', $value);
}

/**
* Номер (идентификатор) клиента в системе магазина. Используется для реализации функционала связок.
* Может присутствовать, если магазину разрешено создание связок.
*
* @param string $value
* @return RequestAbstract
*/
public function setClientId(string $value)
{
return $this->setParameter('clientId', $value);
}

/**
* Сумма платежа в копейках (или центах)
*
* @param int $value
* @return RequestAbstract
*/
public function setAmount(int $value)
{
return $this->setParameter('amount', $value);
}

/**
* Адрес, на который требуется перенаправить пользователя в случае успешной оплаты. Адрес должен быть указан полностью,
* включая используемый протокол (например, https://test.ru вместо tes t.ru). В противном случае пользователь будет
* перенаправлен по адресу следующего вида: http://<ад рес_платёжного_шлюза>/<адрес_продавца>.
*
* @param string $value
* @return RequestAbstract
*/
public function setReturnUrl(string $value)
{
return $this->setParameter('returnUrl', $value);
}

/**
* Адрес, на который требуется перенаправить пользователя в случае неуспешной оплаты. Адрес должен быть указан полностью,
* включая используемый протокол (например, https://test.ru вместо tes t.ru). В противном случае пользователь будет
* перенаправлен по адресу следующего вида: http://<ад рес_платёжного_шлюза>/<адрес_продавца>.
*
* @param string $value
* @return RequestAbstract
*/
public function setFailUrl(string $value)
{
return $this->setParameter('failUrl', $value);
}

/**
* Номер телефона клиента. Может быть следующего формата: ^((+7|7|8)?([0-9]){10})$.
*
* @param string $value
* @return RequestAbstract
*/
public function setPhone(string $value)
{
return $this->setParameter('phone', $value);
}

/**
* Адрес электронной почты покупателя.
*
* @param string $value
* @return RequestAbstract
*/
public function setEmail(string $value)
{
return $this->setParameter('email', $value);
}

/**
* Токен, полученный от Google Pay и закодированный в Base64.
*
* @param string $value
* @return RequestAbstract
*/
public function setPaymentToken(string $value)
{
return $this->setParameter('paymentToken', $value);
}

/**
* @throws \Sberbank\Exception\InvalidRequestException
*/
public function validate()
{
parent::validate('merchant', 'orderNumber', 'paymentToken', 'amount');
}

public function getMethodName()
{
return 'google/payment.do';
}

public function send(): ResponseInterface
{
/** @var \Psr\Http\Message\ResponseInterface $httpResponse */
$httpResponse = $this->sberbankClient->post(
$this->getUrl(),
['Content-type' => 'application/json'],
json_encode($this->getParameters(['orderBundle']))
);

$body = $httpResponse->getBody();
$jsonToArrayResponse = !empty($body) ? json_decode((string) $body, true) : [];
$responseClassName = $this->responseClassName;

return $this->response = new $responseClassName($this, $jsonToArrayResponse, $httpResponse->getStatusCode());
}
}
22 changes: 22 additions & 0 deletions src/Sberbank/Message/GooglePaymentResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Sberbank\Message;

class GooglePaymentResponse extends RestResponse
{
protected array $errorMessages = [
0 => 'Обработка запроса прошла без системных ошибок',
1 => 'Недостаточно средств на карте',
5 => 'Доступ запрещён.',
7 => 'Системная ошибка',
10 => 'Некорректное значение параметра'
];

/**
* @return string|null
*/
public function getOrderId(): ?string
{
return $this->data['orderId'] ?? null;
}
}
2 changes: 1 addition & 1 deletion src/Sberbank/Message/OrderStatusRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ public function validate()
*/
public function getMethodName(): string
{
return 'getOrderStatus.do';
return 'rest/getOrderStatus.do';
}
}
2 changes: 1 addition & 1 deletion src/Sberbank/Message/PaymentCancellationRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ public function validate()
*/
public function getMethodName(): string
{
return 'reverse.do';
return 'rest/reverse.do';
}
}
2 changes: 1 addition & 1 deletion src/Sberbank/Message/RefundRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,6 @@ public function validate()
*/
public function getMethodName(): string
{
return 'refund.do';
return 'rest/refund.do';
}
}
33 changes: 32 additions & 1 deletion src/Sberbank/Message/RegisterOrderRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,37 @@ public function validate()
*/
public function getMethodName(): string
{
return 'register.do';
return 'rest/register.do';
}

public function send(): ResponseInterface
{
$httpResponse = $this->sberbankClient->post(
$this->getUrl() . '?' . http_build_query($this->getParameters([
'userName',
'password',
'orderNumber',
'amount',
'returnUrl',
'failUrl',
'pageView',
'sessionTimeoutSecs',
'currency',
'language',
'merchantLogin',
'bindingId',
'description',
'phone',
'email'
])),
['Content-type' => 'application/json'],
json_encode($this->getParameters(['orderBundle']))
);

$body = $httpResponse->getBody();
$jsonToArrayResponse = !empty($body) ? json_decode((string) $body, true) : [];
$responseClassName = $this->responseClassName;

return $this->response = new $responseClassName($this, $jsonToArrayResponse, $httpResponse->getStatusCode());
}
}
22 changes: 17 additions & 5 deletions src/Sberbank/Message/RequestAbstract.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
*/
abstract class RequestAbstract implements RequestInterface
{
protected string $liveUrl = 'https://securepayments.sberbank.ru/payment/rest/';
protected string $testUrl = 'https://3dsec.sberbank.ru/payment/rest/';
protected $liveUrl = 'https://securepayments.sberbank.ru/payment/';
protected $testUrl = 'https://3dsec.sberbank.ru/payment/';

/**
* The request parameters
Expand Down Expand Up @@ -115,13 +115,25 @@ public function setTestMode(bool $value): RequestAbstract
}

/**
* Get all parameters
* Return parameters listed in $keys
* Return all parameters if $keys empty
*
* @param array $keys
* @return array
*/
public function getParameters(): array
public function getParameters(array $keys = []): array
{
return $this->parameters;
if (empty($keys)) {

return $this->parameters;
} else {
$params = [];
foreach ($keys as $key) {
$params[$key] = $this->getParameter($key);
}

return $params;
}
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Sberbank/Message/UnbindCardRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ public function validate()
*/
public function getMethodName(): string
{
return 'unBindCard.do';
return 'rest/unBindCard.do';
}
}
11 changes: 11 additions & 0 deletions src/Sberbank/RestGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,17 @@ public function registerOrder(array $parameters = []): RequestAbstract
return $this->createRequest('RegisterOrder', $parameters);
}

/**
* Запрос оплаты заказа через GooglePay
*
* @param array $parameters
* @return RequestAbstract
*/
public function googlePayment(array $parameters = [])
{
return $this->createRequest('GooglePayment', $parameters);
}

/**
* Запрос отмены оплаты заказа
*
Expand Down

0 comments on commit de4d389

Please sign in to comment.