appwilio/yakassa

Yandex.Kassa 支付

v0.5 2021-02-18 10:04 UTC

This package is auto-updated.

Last update: 2024-09-18 18:11:58 UTC


README

Latest Version on Packagist Testing Quality Score Code Coverage StyleCI Total Downloads License MIT

早期alpha版本,请谨慎使用!

功能

  • 创建支付表单;
  • 按照54-ФЗ传输数据;
  • 处理 checkOrderpaymentAviso 通知。

要求

  • php >= 7.1
  • Laravel >= 5.3

安装

composer require appwilio/yakassa

连接服务提供商

// config/app.php
'providers' => [
    ...
    Appwilio\YaKassa\YaKassaServiceProvider::class,
],

设置

参数描述.

// config/services.php
...
'yakassa' => [
    'test_mode'     => env('YAKASSA_TEST_MODE', true),
    'shop_id'       => env('YAKASSA_SHOP_ID', ''),
    'showcase_id'   => env('YAKASSA_SHOWCASE_ID', ''),
    'shop_password' => env('YAKASSA_SHOP_PASSWORD', ''),        
],
...

准备支付表单的基本数据

订单必须实现接口 \Appwilio\YaKassa\Contracts\YaKassaOrder

use Appwilio\YaKassa\Contracts\YaKassaOrder;

class Order implements YaKassaOrder
{
    public function getOrderSum(): float
    {
        return $this->total;
    }
    
    public function getCustomerNumber(): string
    {
        return $this->customer->id;
    }
    
    public function getOrderNumber(): ?string
    {
        return $this->id;
    }
    
    public function getPaymentType(): ?string
    {
        return 'PC';
    }
    
    public function getCustomerEmail(): ?string
    {
        return $this->customer->email;
    }
    
    public function getCustomerPhone(): ?string
    {
        return $this->customer->phone;
    }
}

根据54-ФЗ要求的额外数据

注意!协议正在补充,当前版本为2.1. 基本信息变更说明.

订单必须实现接口 \Appwilio\YaKassa\Contracts\YaKassaOrder54FZ

use Appwilio\YaKassa\Contracts\YaKassaOrder54FZ;

class Order implements YaKassaOrder54FZ
{
    public function getOrderSum(): float
    {
        return $this->total;
    }
    
    public function getCustomerNumber(): string
    {
        return $this->customer->id;
    }
    
    public function getItems(): iterable
    {
        return $this->items; // товары/услуги в заказе
    }
    
    public function getTaxSystem(): ?int
    {
        return YaKassaOrder54FZ::TAX_OSN;
    }
    
    public function getCustomerContact(): string
    {
        return $this->customer->phone;
    }
        
    public function getOrderNumber(): ?string
    {
        return $this->id;
    }
    
    public function getPaymentType(): ?string
    {
        return 'PC';
    }
    
    public function getCustomerEmail(): ?string
    {
        return $this->customer->email;
    }
    
    public function getCustomerPhone(): ?string
    {
        return $this->customer->phone;
    }
}

每个订单项目必须实现接口 \Appwilio\YaKassa\Contracts\YaKassaOrderItem54FZ

use Appwilio\YaKassa\Contracts\YaKassaOrderItem54FZ;

class OrderItem implements YaKassaOrderItem54FZ
{
    public function getAmount(): float
    {
        return $this->amount;
    }

    public function getQuantity(): float
    {
        return $this->quantity;
    }

    public function getTaxRate(): int
    {
        return YaKassaOrderItem54FZ::VAT_18;
    }

    public function getCurrency(): ?string
    {
        return null; // равнозначно RUB
    }

    public function getTitle(): string
    {
        return $this->product->title;
    }
}

创建支付表单

在控制器中

use Appwilio\YaKassa\YaKassa;

class OrdersController
{
    public function showPaymentForm(YaKassa $kassa, $orderId)
    {
        $order = Order::find($orderId);
        
        $paymentForm = $kassa->buildPaymentForm($order);
        
        return view('payment', ['form' => $paymentForm]);
    }    
}

在模板中

<form method="POST" action="{{ $form->getPaymentUrl() }}">
    @foreach ($form->toArray() as $k => $v) 
        <input type="hidden" name="{{ $k }}" value="{{ $v }}" />
    @endforeach
    
    ...
</form>

处理通知

通知机制概述

use Appwilio\YaKassa\YaKassa;

class YaHookController extends Controller
{
    public function checkOrder(YaKassa $kassa)
    {
        $order = Order::find($kassa->getRequest()->getOrderNumber());

        if (! $order) {
            return $kassa->responseDeclined();
        }

        // используем реальное значение суммы заказа, а не присланное Я.Кассой
        $kassa->setGenuineOrderSumAmount($order->total);

        if (! $kassa->verify()) {
            return $kassa->responseUnauthorized();
        }

        return $kassa->responseAccepted();
    }
}