cdonut / laravel-sberbank-acquiring
提供与Sberbank收单系统交互的功能
Requires
- php: ^7.2
- ext-curl: *
- ext-json: *
Requires (Dev)
- mockery/mockery: ^1.3.1
- orchestra/testbench: ^3.8|^4.0|^5.0
- phpunit/phpunit: ^8.0|^9.0
- squizlabs/php_codesniffer: ^3.5
This package is not auto-updated.
Last update: 2024-10-03 08:17:50 UTC
README
该包为您的应用程序提供了使用Sberbank收单进行支付的功能。功能
- 创建和存储支付
- 记录支付操作日志
建议在使用前阅读Sberbank提供的文档。
要求
- PHP >= 7.2
- Laravel >= 5.8
- PHP扩展:ext-json, ext-curl
- 关系型数据库
安装
将包添加到依赖项
composer require avlyalin/laravel-sberbank-acquiring
发布配置文件
php artisan vendor:publish --provider="Avlyalin\SberbankAcquiring\Providers\AcquiringServiceProvider" --tag=config
运行迁移
php artisan migrate
概述
表
为了存储支付和操作的历史记录,创建了多个表
- acquiring_payments - 基础支付表,存储所有支付系统的支付信息
- acquiring_payment_operations - 支付操作
- acquiring_sberbank_payments - 通过Sberbank系统直接进行的支付
- acquiring_apple_pay_payments - 通过Apple Pay进行的支付
- acquiring_samsung_pay_payments - 通过Samsung Pay进行的支付
- acquiring_google_pay_payments - 通过Google Pay进行的支付
- acquiring_payment_statuses - 支付状态参考表
- acquiring_payment_operation_types - 操作类型参考表
- acquiring_payment_systems - 支付系统参考表
图表:
基础支付和不同支付系统中的支付通过ORM层面的多态关系组织。
客户端
该包包含两个客户端类来处理收单操作
ApiClient
- 调用Sberbank的APIApiClient
- 为ApiClient
提供封装,保存交易和操作到数据库,并使用配置文件。推荐使用。
ApiClient
和 Client
已添加到 Service Container 中,并可被依赖注入使用。类解析
use Avlyalin\SberbankAcquiring\Client\ApiClient;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$apiClient = $this->app->make(ApiClient::class);
操作
目前支持的收单操作
注册订单
必需参数 - 金额。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->register(
1000, // сумма
['orderNumber' => '123-456'], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
$status = $acquiringPayment->status->name; // 'Зарегистрирован'
如果第二个参数中没有指定 returnUrl 和 failUrl 参数,则它们将从配置文件中获取。
注册带预授权的订单
必需参数 - 金额。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->registerPreAuth(
1000, // сумма
['orderNumber' => '123-456'], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
$status = $acquiringPayment->status->name; // 'Зарегистрирован'
如果第二个参数中没有指定 returnUrl 和 failUrl 参数,则它们将从配置文件中获取。
请求订单完成支付
必需参数:支付模型ID (AcquiringPayment),金额。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->deposit(
1, // id модели платежа (AcquiringPayment)
1000, // сумма
[], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
请求取消订单支付
必需参数 - 支付模型ID (AcquiringPayment)。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->reverse(
1, // id модели платежа (AcquiringPayment)
['language' => 'EN'], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
请求退款
必需参数:支付模型ID (AcquiringPayment),金额。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->refund(
1, // id модели платежа (AcquiringPayment)
500, // сумма
['language' => 'EN'], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
获取订单状态
必需参数 - 支付模型ID (AcquiringPayment)。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->getOrderStatusExtended(
1, // id модели платежа (AcquiringPayment)
['language' => 'EN'], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
请求通过Apple Pay支付
必需参数 - 从Apple Pay系统获取的 paymentToken。更多信息 在这里。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->payWithApplePay(
'vnkXadsIDvejvKQPvcxbTqeEhfbPOG', // Токен, полученный от системы Apple Pay
[ // необязательные параметры
'orderNumber' => '123_abc',
'language' => 'EN',
'description' => 'payment description',
],
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
请求通过Samsung Pay支付
必需参数 - paymentToken,由三星支付系统获取。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->payWithSamsungPay(
'vnkXadsIDvejvKQPvcxbTqeEhfbPOG', // Токен, полученный от системы Samsung Pay
[ // необязательные параметры
'orderNumber' => '123_abc',
'language' => 'EN',
'description' => 'payment description',
],
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
请求通过Google Pay支付
必需参数:从谷歌支付系统获取的 paymentToken,金额。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\Client;
$client = $this->app->make(Client::class);
$acquiringPayment = $client->payWithGooglePay(
'vnkXadsIDvejvKQPvcxbTqeEhfbPOG', // Токен, полученный от системы Google Pay
1000,
[ // необязательные параметры
'orderNumber' => '123_abc',
'language' => 'EN',
'description' => 'payment description',
],
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
请求获取收据信息
更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->getReceiptStatus(
[ // параметры
'orderId' => 'kvp431_Wmvx_gqQx',
'language' => 'EN'
],
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
请求激活绑定
必需参数 - 之前创建的绑定标识符。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->bindCard(
'131-cvlg-1vcvc-14cvx', // id связки
[], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
请求停用绑定
必需参数 - 之前创建的绑定标识符。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->unBindCard(
'131-cvlg-1vcvc-14cvx', // id связки
[], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
请求获取客户所有绑定的列表
必需参数 - 客户在商店系统中的客户编号。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->getBindings(
'client-id-1', // номер (идентификатор) клиента
[], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
请求获取特定银行卡的绑定列表
更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->getBindingsByCardOrId(
'client-id-1', // номер (идентификатор) клиента
[], // необязательные параметры
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
请求更改绑定有效期
必需参数 - 之前创建的绑定标识符。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->getBindingsByCardOrId(
'131-cvlg-1vcvc-14cvx', // id связки
[ // параметры
'newExpiry' => 202012,
],
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
3DS卡片参与度检查请求
必需参数 - 用于支付的卡号(PAN)。更多信息请参阅此处。
use Avlyalin\SberbankAcquiring\Client\HttpClientInterface;
use Avlyalin\SberbankAcquiring\Client\ApiClient;
$apiClient = $this->app->make(ApiClient::class);
$response = $apiClient->verifyEnrollment(
'4111111111111111', // номер карты
HttpClientInterface::METHOD_GET, // метод запроса
['Cache-Control' => 'no-cache'] // хэдеры запроса
);
if ($response->isOk) {
print_r($response->getResponseArray());
} else {
print_r($response->getErrorMessage());
}
设置
请参阅配置文件。
身份验证
在调用支付网关时,可以使用以下在注册时获取的数据进行身份验证
- 服务账户的登录/密码对
- 令牌
- 卖家登录名(当使用Apple Pay、三星支付、谷歌支付时)
配置文件文件提供了设置身份验证数据的参数
...
'auth' => [
'userName' => env('SBERBANK_USERNAME', ''),
'password' => env('SBERBANK_PASSWORD', ''),
'token' => env('SBERBANK_TOKEN', ''),
],
'merchant_login' => env('SBERBANK_MERCHANT_LOGIN', ''),
...
您可以通过编辑配置文件或指定.env
中的值来设置数据
SBERBANK_USERNAME=your_username
SBERBANK_PASSWORD=your_password
SBERBANK_TOKEN=your_token
SBERBANK_MERCHANT_LOGIN=your_merchant_login
更新支付状态
某些操作不允许确定新的支付状态。为此,实现了 artisan 命令,该命令调用 getOrderStatusExtended
操作来更新所有具有指定状态的支付。
命令接受 id 参数 - 需要更新状态的支付 ID 集合
php artisan sberbank-acquiring:update-statuses --id=1 --id=7
建议将此命令添加到调度器中(app/Console/Kernel.php)
use Avlyalin\SberbankAcquiring\Commands\UpdateStatusCommand;
use Avlyalin\SberbankAcquiring\Models\AcquiringPaymentStatus;
protected function schedule(Schedule $schedule)
{
$schedule->command(UpdateStatusCommand::class, [
'--id' => [
AcquiringPaymentStatus::NEW,
AcquiringPaymentStatus::ACS_AUTH,
],
])->everyMinute();
}
事件(Events)
目前实现了一个事件
事件 | 描述 | 参数 |
---|---|---|
UpdateStatusCommandHasFailed | 在更新支付状态时出现错误 | 异常数组 |
异常(Exceptions)
包在出现错误时抛出异常。
异常 | 原因 |
---|---|
HttpClientException | 服务器在响应请求时返回了除 200 之外的状态码 |
NetworkException | 无法执行请求 |
JsonException | 无法解码服务器 JSON 响应 |
ResponseProcessingException | 无法保存服务器响应 |
ConfigException | 配置文件错误 |
ModelNotFoundException | 无法找到模型(支付) |
\InvalidArgumentException | 请求参数不正确 |
\Throwable | 在保存模型时出现错误 |
支持
如果这个项目对您有帮助,您可以在此处支持其发展。
许可证(License)
MIT 许可证(MIT)。有关更多信息,请参阅许可文件。