Omnipay: PaymentgateRu (Alfabank)
PaymentgateRu (ΠΠ»ΡΡΠ°Π±Π°Π½ΠΊ) Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π΄Π»Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Omnipay PHP, (*1)
, (*2)
Omnipay - ΡΡΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ°Ρ ΠΎΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ PHP 5.3+,
ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ»ΡΠ·Π°ΠΌΠΈ., (*3)
ΠΠ°Π½Π½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΄Π»Ρ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΠ·Π° ΠΠ»ΡΡΠ°Π±Π°Π½ΠΊΠ° paymentgate.ru., (*4)
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± - ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ΅Π· Composer. ΠΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π² Π²Π°Ρ composer.json
:, (*5)
composer require "pinguinjkeke/omnipay-paymentgateru"
ΠΠ»Ρ PHP 5.3 - 7.0 ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π²Π΅ΡΡΠΈΠΈ 2.*, (*6)
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ composer Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ:, (*7)
$ curl -s http://getcomposer.org/installer | php
$ php composer.phar update
ΠΡΠΎΡΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Omnipay., (*8)
Π ΡΡΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΠΎΠΏΠΈΡΠ°Π½Ρ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠ΅ ΠΊΠ΅ΠΉΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ (ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΡΡΠ΅Π΄ΡΡΠ²).
Π‘ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² REST API ΡΠ»ΡΠ·Π° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡ Π² src/Message
., (*9)
// ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΏΠ»Π°ΡΠ΅ΠΆΠ°
$response = Gateway::authorize([
'orderNumber' => $orderUuidOrNumber, // Π£Π½ΠΈΠΊΠ°Π»ΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ° Π·Π°ΠΊΠ°Π·Π°
'amount' => $price * 100, // Π¦Π΅Π½Π° Π² ΠΊΠΎΠΏΠ΅ΠΉΠΊΠ°Ρ
'currency' => 810, // ΠΠ°Π»ΡΡΠ° (ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΡΠ±Π»Ρ)
'description' => 'ΠΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·Π°', // Π‘ΡΡΠΎΠΊΠ° Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π·Π°ΠΊΠ°Π·Π°
'returnUrl' => 'http://yoursite.com/payment/success', // URL ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°ΡΡ
'failUrl' => 'http://yoursite.com/payment/failure', // URL ΠΏΡΠΎΠ²Π°Π»ΡΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°ΡΡ
'clientId' => 123 // ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊΠ°ΡΡΡ)
])
->setUserName('merchant_login')
->setPassword('merchant_password')
->send();
// Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ id Π·Π°ΠΊΠ°Π·Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΡΠ²ΠΎΠΈΠ» Π±Π°Π½ΠΊ
$bankOrderId = $response->getTransactionId();
// Π£ΡΠΏΠ΅ΡΠ½ΠΎ Π»ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎ?
$success = $response->isSuccess();
// ΠΠΎΠ·Π²ΡΠ°Ρ ΡΡΠ΅Π΄ΡΡΠ²
$response = Gateway::refund([
'orderId' => $bankOrderId, // ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°ΠΊΠ°Π·Π° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Π±Π°Π½ΠΊΠ°
'amount' => $price * 100 // Π¦Π΅Π½Π° Π² ΠΊΠΎΠΏΠ΅ΠΉΠΊΠ°Ρ
])
->setUserName('merchant_login')
->setPassword('merchant_password')
->send();
$success = $response->isSuccess();
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ Π€Π-54
ΠΠ°ΠΊΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΈΠΌΠ·Π΅Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΠ½Π»Π°ΠΉΠ½-ΠΊΠ°ΡΡΠ°ΠΌΠΈ ΠΏΠΎ Π€Π-54., (*10)
ΠΠ»Π°ΡΡ Π·Π°ΠΊΠ°Π·Π° Π² Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Omnipay\PaymentgateRu\OrderBundle\OrderInterface
, (*11)
class Order extends EloquentModel implements OrderInterface
{
// ΠΠΎΠ»ΠΆΠ΅Π½ Π²Π΅ΡΠ½ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎΠ²Π°ΡΠΎΠ², ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡΠΈΡ
OrderItemInterface
public function getItems(): iterable
{
return $this->cart;
}
// ΠΠΎΠ»ΠΆΠ΅Π½ Π²Π΅ΡΠ½ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ CustomerInterface
public function getCustomer(): ?string
{
return $this->customer;
}
public function getCreationDate(): int
{
return $order->created_at->getTimestamp();
}
}
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ, Π·Π°ΠΊΠ°Π· Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Omnipay\PaymentgateRu\OrderBundle\OrderDeliverableInterface
., (*12)
class Order extends EloquentModel implements OrderInterface, OrderDeliverableInterface
{
// ΠΠ°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΈΠ»ΠΈ null
public function getDeliveryType(): ?string
{
$this->delivery->name;
}
// ΠΠ²ΡΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΡΠ°Π½Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ RU, EN
public function getCountry(): ?string
{
return $this->delivery->country;
}
// ΠΠΎΡΠΎΠ΄ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ
public function getCity(): ?string
{
return $this->delivery->city;
}
// ΠΠ΄ΡΠ΅Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ
public function getPostAddress(): ?string
{
return $this->delivery->address;
}
}
ΠΠ΅ΡΠΎΠ΄ Π·Π°ΠΊΠ°Π·Π° getCustomer()
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ null, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ Omnipay\PaymentgateRu\OrderBundle\CustomerInterface
., (*13)
class User extends EloquentModel implements CustomerInterface
{
public function getEmail(): ?string
{
return $this->email;
}
public function getPhone(): ?string
{
return preg_replace('/\D/', '', $this->phone);
}
// ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ²ΡΠ·ΠΈ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ
public function getContact(): ?string
{
return "Fax: {$this->user->fax}";
}
}
Π’ΠΎΠ²Π°Ρ Π² ΠΊΠΎΡΠ·ΠΈΠ½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ OrderItemInterface., (*14)
class CartProduct extends EloquentModel implements OrderItemInterface
{
// ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΠΎΠ²Π°ΡΠ°
public function getName(): string
{
return $this->name;
}
// ΠΡΡΠΈΠΊΡΠ» ΡΠΎΠ²Π°ΡΠ°
public function getCode()
{
return $this->product->article;
}
// ΠΠ΄ΠΈΠ½ΠΈΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
public function getMeasure(): string
{
return 'ΡΡ.';
}
// ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ²Π°ΡΠ°
public function getQuantity(): float
{
return $this->quantity;
}
// Π¦Π΅Π½Π° Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠΎΠ²Π°Ρ
public function getPrice(): float
{
return $this->product->price;
}
// ΠΠ°Π»ΡΡΠ° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ISO-4217
// ΠΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ Π±Π°Π½ΠΊΠ°, Π²ΡΠ΅ ΡΠΎΠ²Π°ΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ Π·Π°ΠΊΠ°Π·Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ Π²Π°Π»ΡΡΠ΅!
public function getCurrency(): string
{
return $this->product->currency;
}
// Π¦Π΅Π½Π° Π½Π° ΡΠΎΠ²Π°Ρ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π°
public function getAmount(): float
{
return $this->getPrice() * $this->getQuantity();
}
// ΠΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π² ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ²ΠΎΠΉΡΡΠ², ΠΈΠ½Π°ΡΠ΅ - null
public function getDetailParams(): array
{
return [
'color' => $this->product->color,
'size' = $this->product->size
];
}
// percent - ΡΠΊΠΈΠ΄ΠΊΠ° Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ°Ρ
, value - ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠΊΠΈΠ΄ΠΊΠ°, null - Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
public function getDiscountType(): ?string
{
return 'percent';
}
// Π Π°Π·ΠΌΠ΅Ρ ΡΠΊΠΈΠ΄ΠΊΠΈ
public function getDiscountValue(): float
{
return $this->getPrice() * 0.1;
}
}
ΠΡΠ»ΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ
Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΈΡΡΠ΅ΠΌ Π½Π°Π»ΠΎΠ³ΠΎΠΎΠ±Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ
ΡΠΎΠ²Π°ΡΠΎΠ²
, ΡΠΎ Π²Π·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ OrderItemTaxableInterface
., (*15)
Π ΠΌΠ΅ΡΠΎΠ΄Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΊΠ°Π·Π° Π² Π±Π°Π½ΠΊΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠΈΡΡ Omnipay\PaymentgateRu\OrderBundle\OrderBundle
ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²Π°Ρ Π·Π°ΠΊΠ°Π· OrderInterface
, (*16)
$orderBundle = new OrderBundle(
$orderRepository->find($orderId)
);
$response = Gateway::authorize([
'orderNumber' => $orderUuidOrNumber, // Π£Π½ΠΈΠΊΠ°Π»ΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ° Π·Π°ΠΊΠ°Π·Π°
'amount' => $price * 100, // Π¦Π΅Π½Π° Π² ΠΊΠΎΠΏΠ΅ΠΉΠΊΠ°Ρ
'currency' => 810, // ΠΠ°Π»ΡΡΠ° (ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΡΠ±Π»Ρ)
'description' => 'ΠΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·Π°', // Π‘ΡΡΠΎΠΊΠ° Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π·Π°ΠΊΠ°Π·Π°
'returnUrl' => 'http://yoursite.com/payment/success', // URL ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°ΡΡ
'failUrl' => 'http://yoursite.com/payment/failure', // URL ΠΏΡΠΎΠ²Π°Π»ΡΠ½ΠΎΠΉ ΠΎΠΏΠ»Π°ΡΡ
'clientId' => 123 // ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊΠ°ΡΡΡ)
'taxSystem
])
->setUserName('merchant_login')
->setPassword('merchant_password')
->setTaxSystem(Gateway::TAX_SYSTEM_COMMON) // Π£ΠΊΠ°Π·Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π°Π»ΠΎΠ³ΠΎΠΎΠ±Π»ΠΎΠΆΠ΅Π½ΠΈΡ
->setOrderBundle($orderBundle) // ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠΈΡΡ OrderBundle ΠΊ Π·Π°ΠΊΠ°Π·Ρ
->send();
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°
Π― ΡΡΠ°ΡΠ°ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ pyamentgate., (*17)
ΠΡΠ»ΠΈ Π²Ρ Π½Π°ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Ρ ΡΠ°Π΄ΠΎΡΡΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΡ issue ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΡ pull request., (*18)