由于需要第三方API调用,在我的自定义Laravel商店中创建订单需要一些时间。为了防止用户两次提交结帐表单,我禁用了submit bitton,并通过Javascript将其显示并替换为进程图标。
然而,一些客户不能等待10秒来完成这个过程。他们重新加载页面并再次提交表单。在本例中,商店生成两个订单。
现在,我可以防止表单使用令牌匹配多次提交服务器(防止在一个按钮中多次提交)。实际上,这个解决方案还会引发其他问题。因此,我不能简单地将客户重定向到成功页面,因为订单流程可能无法完成。否则,客户将停留在结账页面。
解决这个问题的最佳实践是什么?
发布于 2021-02-28 02:55:27
根据我们在你最初帖子的评论中的讨论:
主要问题是服务器处理表单提交所需的时间长度,这让用户有机会不耐烦地刷新页面,然后将相同的数据提交两次。获取直接发货数据的外部API调用是耗费时间最多的过程。
因此,我建议在允许最终提交表单之前获得直接送货数据。您可以将其作为一个Ajax请求来执行,并保持submit按钮处于禁用状态,直到返回drop shipping数据。这样,当用户提交表单时,服务器端的处理时间就最小化了。
仍然有可能表单提交的处理时间仍然足够长,以便用户在提交完成之前刷新页面。
我认为剩下的过程应该足够短,以便用户在提交完成之前没有机会刷新页面。如果是,那么您可能需要查看提交逻辑中任何耗时的流程,并在提交之前准备它们,例如使用drop shipping API调用,或者将它们推送到队列工作者。
您还可以在返回响应之前将对数据库的持久化作为提交过程中的最终操作。这样,如果用户能够在该过程完成之前进行刷新,则数据被持久化的可能性最小,这意味着如果第二次提交表单,则数据被复制的可能性最小。
您可以在表单中设置令牌,以确保表单只能加载一次,或者在前面的步骤中存储“预期”顺序,并使提交成为将“预期”顺序标记为“真实”顺序的简单操作。但是,这些方法觉得典型的表单提交请求方法过于复杂,该方法假定请求和响应周期不会中断。
https://stackoverflow.com/questions/66397226
复制相似问题