Laravel braintree重复请求和竞争条件

时间:2017-12-15 19:32:22

标签: laravel race-condition braintree laravel-5.5

我正在开发一个支付和订阅braintree的项目。我需要保护免受重复的用户订阅请求。例如,当您反复按提交按钮时,就会出现这种情况。订阅创建功能由两部分组成 - 请求braintree创建订阅,然后将订阅保存在本地数据库中。在对braintree的长期查询期间,发生了竞争条件。

一个重要条件:

  • 用户只能拥有一个有效订阅。订阅用户 不应该再次订阅

创建订阅的代码:

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,
    ]);
}

可以有什么解决方案?

启动createSubscription()方法后锁定用户?用户表locked_at列?使用缓存保存锁定状态几分钟?

0 个答案:

没有答案