Authorize.net — это широко используемый платежный шлюз, который позволяет предприятиям безопасно обрабатывать онлайн-платежи. Laravel — это надежный PHP-фреймворк, который позволяет разработчикам быстро и эффективно создавать веб-приложения. В этой статье мы расскажем, как интегрировать Authorize.net с Laravel 10 и создать платежный шлюз для вашего приложения.

Шаг 1: Установите Laravel 10

Прежде чем мы начнем интегрировать Authorize.net с Laravel, убедитесь, что на вашем компьютере установлена ​​Laravel 10. Вы можете установить Laravel с помощью Composer, выполнив следующую команду:

composer create-project --prefer-dist laravel/laravel myapp

Шаг 2: Установите Authorize.net PHP SDK

После установки Laravel 10 вам необходимо установить PHP SDK Authorize.net, который используется для взаимодействия с API Authorize.net. Вы можете установить SDK через Composer, выполнив следующую команду:

composer require authorize-net/authorizenet

Шаг 3: Настройте переменные среды

После установки SDK нам нужно настроить его, предоставив учетные данные API Authorize.net. В Laravel мы используем файл .env для хранения конфигурации нашего приложения. Добавьте следующие строки в файл .env:

AUTHORIZENET_API_LOGIN_ID=<your_api_login_id>  
AUTHORIZENET_TRANSACTION_KEY=<your_transaction_key>

Шаг 4: Создайте платежную форму

Следующим шагом является создание платежной формы, которая будет собирать платежные реквизиты клиента. Мы создадим простую платежную форму с помощью шаблонизатора Laravel Blade. В каталоге resources/views вашего приложения создайте файл с именем payment_form.blade.php со следующим кодом:

<form action="/process-payment" method="POST">
    @csrf
    <div>
        <label for="card_number">Card Number</label>
        <input type="text" id="card_number" name="card_number">
    </div>
    <div>
        <label for="expiration_date">Expiration Date</label>
        <input type="text" id="expiration_date" name="expiration_date">
    </div>
    <div>
        <label for="cvv">CVV</label>
        <input type="text" id="cvv" name="cvv">
    </div>
    <div>
        <button type="submit">Submit Payment</button>
    </div>
</form>

Шаг 5: Обработка платежа

После того, как клиент отправит платежную форму, нам необходимо обработать платеж с помощью Authorize.net SDK. В Laravel мы можем создать метод контроллера, который будет обрабатывать платежи. В каталоге app/Http/Controllers вашего приложения создайте файл с именем PaymentController.php со следующим кодом:

use Illuminate\Http\Request;
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;

class PaymentController extends Controller
{
    public function processPayment(Request $request)
    {
        $cardNumber = $request->input('card_number');
        $expirationDate = $request->input('expiration_date');
        $cvv = $request->input('cvv');

        $merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
        $merchantAuthentication->setName(env('AUTHORIZENET_API_LOGIN_ID'));
        $merchantAuthentication->setTransactionKey(env('AUTHORIZENET_TRANSACTION_KEY'));

        $creditCard = new AnetAPI\CreditCardType();
        $creditCard->setCardNumber($cardNumber);
        $creditCard->setExpirationDate($expirationDate);
        $creditCard->setCardCode($cvv);

        $payment = new AnetAPI\PaymentType();
        $payment->setCreditCard($creditCard);

        $transactionRequestType = new AnetAPI\TransactionRequestType();
        $transactionRequestType->setTransactionType("authCaptureTransaction");
        $transactionRequestType->setAmount("10.00");
        $transactionRequestType->setPayment($payment);

        $request = new AnetAPI\CreateTransactionRequest();
        $request->setMerchantAuthentication($merchantAuthentication);
        $request->setRefId("ref" . time());
        $request->setTransactionRequest($transactionRequestType);

        $controller = new AnetController\CreateTransactionController($request);
        $response = $controller->executeWithApiResponse(\net\authorize\api\constants\ANetEnvironment::SANDBOX);

        if ($response != null) {
            $tresponse = $response->getTransactionResponse();

            if ($tresponse != null && $tresponse->getResponseCode() == "1") {
                return "Payment successful!";
            } else {
                return "Payment failed: " . $tresponse->getResponseReasonText();
            }
        } else {
            return "Payment failed: " . $response->getMessages()->getMessage()[0]->getText();
        }
    }
}

В приведенном выше коде мы создаем новый класс PaymentController с методом processPayment, который обрабатывает платежи. Метод извлекает информацию о кредитной карте из платежной формы и создает новый экземпляр классов MerchantAuthenticationType, CreditCardType и PaymentType SDK Authorize.net. Затем мы создаем новый объект TransactionRequestType и устанавливаем тип транзакции, сумму платежа и информацию о платеже. Наконец, мы создаем новый объект CreateTransactionRequest, устанавливаем аутентификацию продавца, идентификатор ссылки и запрос транзакции и передаем его новому экземпляру объекта CreateTransactionController. Затем мы запускаем контроллер в среде песочницы и проверяем ответ на наличие ошибок.

Шаг 6: Обновите маршруты

Теперь, когда мы создали платежную форму и метод обработки платежей, нам нужно обновить маршруты нашего приложения для обработки запросов. В файле routes/web.php вашего приложения добавьте следующий маршрут:

Route::post('/process-payment', [PaymentController::class, 'processPayment'])->name('process.payment');

Шаг 7: Создайте представления

Наконец, нам нужно создать представления для платежной формы и подтверждения платежа. В Laravel мы можем создать каталог resources/views и добавить два новых файла с именами payment.blade.php и payment-confirmation.blade.php.

В payment.blade.php добавьте следующий код:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Payment Form</div>

                <div class="card-body">
                    @if ($errors->any())
                    <div class="alert alert-danger">
                        <ul>
                            @foreach ($errors->all() as $error)
                            <li>{{ $error }}</li>
                            @endforeach
                        </ul>
                    </div>
                    @endif

                    <form method="POST" action="{{ route('process.payment') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="card_number" class="col-md-4 col-form-label text-md-right">{{ __('Card Number') }}</label>

                            <div class="col-md-6">
                                <input id="card_number" type="text" class="form-control @error('card_number') is-invalid @enderror" name="card_number" required autocomplete="off" maxlength="16">

                                @error('card_number')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="expiration_date" class="col-md-4 col-form-label text-md-right">{{ __('Expiration Date (MM/YY)') }}</label>

                            <div class="col-md-6">
                                <input id="expiration_date" type="text" class="form-control @error('expiration_date') is-invalid @enderror" name="expiration_date" required autocomplete="off" maxlength="5">

                                @error('expiration_date')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="cvv" class="col-md-4 col-form-label text-md-right">{{ __('CVV') }}</label>

                            <div class="col-md-6">
                                <input id="cvv" type="text" class="form-control @error('cvv') is-invalid @enderror" name="cvv" required autocomplete="off" maxlength="4">

                                @error('cvv')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Pay') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

В payment-confirmation.blade.php добавьте следующий код:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Payment Confirmation</div>

                <div class="card-body">
                    <h5 class="card-title">Thank you for your payment!</h5>
                    <p class="card-text">Your payment of ${{ $amount / 100 }} was successful.</p>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Шаг 8. Проверьте процесс оплаты

Чтобы проверить процесс оплаты, мы можем перейти к платежной форме по адресу http://localhost:8000/payment и ввести некоторые данные тестовой кредитной карты. Мы можем использовать следующие номера тестовых карт, предоставленные Authorize.net:

  • Виза: 4111111111111111
  • MasterCard: 5424000000000015
  • Американ Экспресс: 370000000000002
  • Откройте для себя: 6011000000000012

Для даты истечения срока действия мы можем использовать любую дату в будущем, а для кода CVV мы можем использовать любое 3- или 4-значное число.

После того, как мы отправим платежную форму, мы должны быть перенаправлены на страницу подтверждения платежа и увидеть сообщение «Спасибо за платеж! Ваш платеж в размере $x.xx был успешно выполнен».

Заключение

В этой статье мы узнали, как интегрировать платежный шлюз Authorize.net с приложением Laravel 10. Мы рассмотрели, как установить и настроить PHP SDK Authorize.net, как создать платежную форму и обрабатывать платежи, а также как обрабатывать подтверждение платежа. Обладая этими знаниями, вы сможете легко добавлять платежные функции в свое приложение Laravel и безопасно обрабатывать транзакции по кредитным картам.