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, трябва да инсталирате Authorize.net PHP SDK, който се използва за взаимодействие с Authorize.net API. Можете да инсталирате 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: Създайте формуляр за плащане

Следващата стъпка е да създадете формуляр за плащане, който ще събира данните за плащане на клиента. Ние ще създадем прост формуляр за плащане с Blade шаблонния двигател на Laravel. В директорията 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 на Authorize.net SDK. След това създаваме нов обект 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
  • American Express: 370000000000002
  • Открийте: 6011000000000012

За дата на изтичане можем да използваме всяка бъдеща дата, а за CVV код можем да използваме произволно 3 или 4 цифрено число.

След като изпратим формуляра за плащане, трябва да бъдем пренасочени към страницата за потвърждение на плащането и да видим съобщението „Благодарим ви за плащането! Вашето плащане на $x.xx беше успешно.“

Заключение

В тази статия научихме как да интегрираме платежния портал Authorize.net с приложение Laravel 10. Разгледахме как да инсталираме и конфигурираме Authorize.net PHP SDK, как да създадем формуляр за плащане и да обработваме плащанията и как да обработваме потвърждението на плащането. С това знание би трябвало да можете лесно да добавяте функция за плащане към вашето приложение Laravel и сигурно да обработвате транзакции с кредитни карти.