Laravel:多次提交表单会中断结帐流程

Laravel: Submittng form multiple times breaks checkout process

在我的自定义 Laravel 商店中创建订单需要一些时间,因为有第三方 API 调用。为了防止用户提交两次结帐表单,我禁用了提交按钮并通过 Javascript.

显示并用进程图标替换它

然而,有些客户无法等待 10 秒来完成该过程。他们重新加载页面并再次提交表单。在这种情况下,商店会生成两个订单。

现在我可以防止表单提交多次带有令牌匹配的服务器站点 (Prevent Multiple Submitting in one button laravel)。实际上,此解决方案会导致其他问题。所以我不能简单地将客户重定向到成功页面,因为订单流程可能不完整。否则顾客会卡在结账页面。

这个问题的最佳实践是什么?

根据我们在您的原始评论中的讨论 post:

主要问题是服务器处理表单提交所花费的时间长度,这让用户有机会变得不耐烦并刷新页面,然后提交相同的数据两次。 您的外部 API 调用以获取代发货数据是耗时最多的过程。

所以我建议在允许最终提交表单之前获取代发货数据。您可以将其作为 Ajax 请求来执行,并保持提交按钮处于禁用状态,直到返回一件代发数据。 这样,当用户提交表单时,服务器端的处理时间就被最小化了。

仍有可能表单提交的处理时间仍然足够长,以至于用户在提交完成之前刷新页面。

我认为剩下的过程应该足够短,让用户在提交完成之前没有机会刷新页面。如果是,那么您可能需要查看提交逻辑中需要时间的任何流程,并在提交之前准备它们,例如直接运送 API 调用,或者将它们推送给队列工作人员。

您还可以将对数据库的持久化作为提交过程中返回响应之前的最终操作。这样,如果用户能够在该过程完成之前刷新,则数据被持久化的可能性最小,这意味着如果第二次提交表单,数据被复制的可能性最小。

您可以沿用在表单中设置令牌的方式,以确保表单只能加载一次,或者在之前的步骤中存储“预期”订单,并使提交成为标记“预期”订单的简单操作”订单作为“真实”订单。 但是这些方法感觉比典型的表单提交请求方法过于复杂,该方法假定请求和响应周期不会被中断。