2011-06-08 61 views
2

我正在开发一个项目,要求我的应用程序在用户付费时向他的PayPal帐户付款。这个流程支付给用户,可靠和安全吗?

以下是我做到了到目前为止:

  1. 的(记录)用户转到支付页面会列出他的所有付款(接受或不)
  2. 他进入他的PayPal电子邮件和他的应用(我的)密码(用于安全)
  3. POST页面获取该用户的status =“UNPAID”的所有付款列表,并将状态更新为“WORKING”(以避免用户刷新页面整个过程完成并重新发送相同数量的钱)
  4. 我们计算的总吨数升量在该列表中付出(一个简单的for
  5. 量通过Paypal自适应支付API(请求:PAY)发送到贝宝
  6. 的响应被检查,如果已完成,则列表状态被设置为“已完成“,如果不是,列表将恢复为”UNPAID“(如果在此期间发生了第二次付款请求,则通过WHERE id IN(x, y, z)进行SQL更新。然后
  7. 的消息被显示给用户

但我需要你们的帮助,我是一个有风险的问题前,我想避免的,我就知道你会怎么做:

  • 如果用户在进程页面上点击刷新,我不想给他发送两次(或更多)金额(“工作”锁在这里,但是如果用户在我之前点击刷新会发生什么设置锁?)
  • 很少可能:如果用户在锁定“WORKING”之后点击f5,但在请求paypal之前发生了什么,以及收到新的付款。通过遵循我所做的,只有一个项目(新)将被设置为WORKING,但其他所有其他付款将会丢失

你会怎么做?使其100%可靠的最佳方法是什么?

感谢您的帮助

注:

4间6的步骤通过PlayFramework jobs制成,具有now()awaiting()结果

回答

2

叫您可以:

  • 防止双重post via JQuery
  • 使用checkAuthenticity()方法来验证请求
  • 做一个GET处理POST之后重定向(所以他们甚至不能错误地提交相同的2倍)
  • 做支付处理异步(见下文)

对于付款,不是调用作业,而是在队列(或数据库中的表)中设置付款的ID,并且每分钟处理一次该数据处理该数据的作业。当用户执行POST时,您将重定向到一个页面,该页面显示您正在处理付款,并会在出现问题时通知您。您稍后可以通过使用彗星的UI警告或通过邮件通知用户。

通过这种方式,您不会将请求链接到处理,并且如果您执行顺序处理,则不会遇到线程/竞争问题,以及能够检测陈旧请求(已完成的付款)。