我最近开发的一个网络应用程序是这样工作的:
- 用户选择订阅级别
- 用户在网站上输入各种自定义/个人数据并选择某些选项
- 用户确认他们的数据
- 系统将此数据存储在一个数组中,并设置了一个标志来指定数据不完整
- 用户被引导至 PayPal 进行支付
- PayPal 发出 IPN 请求,我们获取包含他们信息的行 ID 并填写其余字段,从而有效地完成流程。
现在,显然这种方法存在一些问题。
<强>1。这些行是在用户访问表单时创建的,并且可以快速加起来
我通过添加作为时间戳的 last_touched 列解决了这个问题,并且我经常删除超过 48 小时的记录(足够完成 PayPal 交易的时间)。
<强>2。由于上述原因,用户可能可以使用 PayPal 成功结账,但数据库中没有任何行
我使用 PayPal 自定义字段传输订阅包 ID 等基本信息,如果在我请求 IPN 时该行不存在,我将使用提供给 PayPal 的数据填写空白并来自自定义字段。
<强>3。用户输入的用户名理论上可以在他们结帐时使用
我通过检查用户名是否已被占用解决了这个问题,如果是,我会向其添加一个数字并不断递增该数字,直到我获得可用的用户名。
我不确定这是否是处理给定情况的最佳方式,或者是否有更好的选择(不涉及 PayPal Payments Pro)。在什么情况下,此类系统的潜在问题会超过 PayPal Payments Pro 的成本?
最佳答案
最好的办法是将所有帐户信息存储在您的数据库中,就好像用户在将它们发送到 PayPal 之前创建帐户一样。
因此,在允许他们继续结帐之前,请存储包括用户名在内的所有内容。这使您能够在他们转到 PayPal 之前验证他们的信息和用户名。然后你将它全部缓存 48 小时,以确保他们在结账时不会丢失用户名。您还可以利用 PHP 的 session 支持来跟踪用户是否在第二天碰巧回来购买。只要他们没有清除他们的 cookie/缓存并且您的 session 生命周期没有在 session 服务器端过期,他们应该能够从他们中断的地方继续 session 并直接转到 PayPal。
我仍然会将所有重要数据发送到 PayPal,以防万一用户以某种方式设法在 PayPal 的支付页面上停留一周,然后决定输入 CC 信息。
您还可以使用该系统“检查”用户是否已经开始付款。或许要求他们先输入电子邮件地址。将所有数据关联到该电子邮件和用户的 IP 地址($_SERVER['REMOTE_ADDR'])。如果您没有用户的 session 并发性,但他们输入了数据库中已有的电子邮件地址。检查他们的 IP(如果您想真正了解它,甚至可能还要检查浏览器),如果匹配,请告诉用户“看起来您之前已经开始结帐但从未完成。要继续吗?”让他们从中断的地方继续。显然不要以这种方式存储任何敏感信息,并且只将其缓存在用于 paypal 的临时表中,因此它最多只能持续 2 天。
这样,用户可以单击"is",他们不必再次选择订阅并再次进行所有选择/决定。如果用户说“不,我想重新开始”,那么只需删除临时表中的行并为他们创建一个新行。
关于php - 当数据存储在我们的网站上并且用户被带到 PayPal 并返回时的数据完整性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6920861/