我正在开发一个支付和订阅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列?使用缓存保存锁定状态几分钟?