powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Laravel 5.5 Braintree защита от повторных созданий подписки
4 сообщений из 4, страница 1 из 1
Laravel 5.5 Braintree защита от повторных созданий подписки
    #39570603
alonecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Работаю над проектом с оплатой и подписками braintree.

Возник вопрос защиты от повторных запросов на подписку пользователя. Они возникают, например, если не блокировать кнопку submit при отправки формы. Если сохранять форму из разных табов/брузеров. Функция создания подписки состоит из двух частей - запрос к braintree на создании подписки и затем сохранение в БД подписки. За время запроса к braintree которое может быть до пару секунд возникает race_conditions когда первый запрос еще не сделал пользователя подписанным и за ним проходят еще несколько запросов.

Код создания подписки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public function createSubscription($request)
{   

    if (isset($request['payment_method_nonce'])) {
        $gatewayCustomer = $this->findOrCreateCustomer();
        $this -> createPaymentMethod($request['payment_method_nonce'], $gatewayCustomer);
    }

    $trial_ends_at = isset($request['trial_ends_at']) ? $request['trial_ends_at'] : null;

    $plan = Plan::findOrFail($request["plan_id"]);


    if (!empty($this->defaultCard)) {
        $gatewaySubscription =  $this -> createGatewaySubscription($plan, $trial_ends_at);
    } 

    $subscription = $this->subscriptions()->create([
        'plan_id' => $plan->id,
        'trial_ends_at' => $trial_ends_at,
        'gateway_id' => isset($gatewaySubscription) ? $gatewaySubscription -> id : null,
        'card_id' => isset($this->defaultCard) ? $this->defaultCard->id : null,
    ]);
}


Также замечу, что пользователь может иметь только одну активную подписку одновременно.

Думаю в начале функции нужно записывать куда то время начале запроса. И при следующем запросе если с этого времени прошло скажем менее минуты отсекать повторный запрос. Пометку данную убирать в случае когда подписка успешно добавлена.

Думаю как лучше создавать такую метку. Через фасад Cache в памяти? Но надежно ли? Создать столбец типа locked_time в Users? Также через фасад Cache, но выбрать драйвер для кеша БД?
...
Рейтинг: 0 / 0
Laravel 5.5 Braintree защита от повторных созданий подписки
    #39570611
alonecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что нашел

Код: php
1.
2.
3.
4.
5.
6.
7.
$sem = sem_get(1234, 1);
if (sem_acquire($sem)) {
    //successful lock, go ahead
    sem_release($sem);
} else {
    //Something went wrong...
}



Встроенную блокировку семафором в PHP
...
Рейтинг: 0 / 0
Laravel 5.5 Braintree защита от повторных созданий подписки
    #39570627
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать транзакции?
...
Рейтинг: 0 / 0
Laravel 5.5 Braintree защита от повторных созданий подписки
    #39570645
alonecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не причем... Запрос к БД один. И есть ещё запрос через API его то в транзакцию не запихнешь...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Laravel 5.5 Braintree защита от повторных созданий подписки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]