我最近开发的一个Web应用程序就像这样:
现在,显然这种方法存在一些问题。
1。只要用户访问表单,就会创建这些行,并且可以快速添加
我通过添加一个时间戳的last_touched列解决了这个问题,我经常删除超过48小时的记录(超过完成PayPal事务的时间)。
2。由于上述原因,用户可以使用PayPal成功结账并且数据库中没有行
我使用PayPal自定义字段传输订阅包的ID等基本信息,如果我在执行IPN请求时该行不存在,则使用提供给PayPal的数据填写空白并从自定义字段。
第3。用户输入的用户名理论上可以在他们结帐时使用
我已经通过检查用户名是否被占用来解决这个问题,如果是,我会在其中添加一个数字并继续增加数字,直到我获得可用的用户名。
我不确定这是否是处理特定情况的最佳方式,或者是否有更好的替代方案(不涉及PayPal Payments Pro)。在这一点上,像这样的系统的潜在问题会超过PayPal Payments Pro的成本吗?
答案 0 :(得分:1)
您最好的选择是将所有帐户信息存储在您的数据库中,就像用户在之前将帐户发送到PayPal一样。
因此,在允许他们进行结账之前,请存储包括用户名在内的所有内容。这使您可以在进入PayPal之前验证其信息和用户名。然后你将它全部缓存48小时,以确保它们在结账时不会丢失用户名。您还可以利用PHP的会话支持来跟踪用户是否恰好在第二天回来进行购买。只要他们没有清除他们的cookie /缓存并且会话服务器端的会话生命周期没有到期,他们应该能够在他们中断的地方恢复会话并直接进入PayPal。
我仍然会将所有重要数据发送到PayPal,以防用户以某种方式设法在PayPal的付款页面上停留一周,然后决定输入CC信息。
您还可以使用此系统“检查”用户是否已开始付款。也许让他们先输入一个电子邮件地址。将所有数据与该电子邮件和用户的IP地址相关联($ _SERVER ['REMOTE_ADDR'])。如果您没有用户的会话并发,但他们输入了数据库中已有的电子邮件地址。检查他们的IP(甚至可能是浏览器,如果你想真的肛门),如果它是一个匹配,告诉用户“看起来你开始检查之前,从未完成。想继续吗?”让他们从他们离开的地方继续前行。显然不要以这种方式存储任何敏感信息,只能将其缓存在临时表中以支付宝贝,所以它最多只能持续2天。
这样,用户可以点击“是”,他们不必再次选择他们的订阅,并且第二次完成所有选择/决定。如果用户说“不,我想重新开始”,那么只需删除临时表中的行并为它们创建一个新行。