此流程是否向用户付费,可靠且安全?

时间:2011-06-08 13:10:16

标签: process paypal playframework payment

我正在开发一个项目,要求我的应用程序在用户询问时向用户支付费用。

到目前为止我是这样做的:

  1. (已记录)用户转到付款页面,该页面将列出所有付款(已接收或未接收)
  2. 他输入了他的Paypal电子邮件和他的应用程序(我的)密码(为安全起见)
  3. POST页面获取该用户的状态=“UNPAID”的所有付款的列表,并将状态更新为“WORKING”(以避免用户在整个过程完成之前刷新页面并重新发送该页面金额)
  4. 我们会计算该列表中的总支付金额(简单for
  5. 金额通过Paypal自适应支付API发送到Paypal(请求:付款)
  6. 检查响应,如果完成,列表状态设置为“COMPLETED”,否则,列表将恢复为“UNPAID”(如果是第二次付款,则通过WHERE id IN(x, y, z)进行SQL更新请求已在此期间提出。
  7. 然后会向用户显示一条消息
  8. 但我需要你的帮助,我面临一个我想避免的风险问题,我会知道你会怎么做:

    • 如果用户在流程页面上点击刷新,我不想向他发送两次(或更多)金额(此处为“WORKING”锁定,但如果用户在设置之前点击刷新会发生什么情况锁?)
    • 很少可能:如果用户在锁定“正在工作”之后,但在收到PayPal请求之前点击了f5,并且收到了新的付款,会发生什么。通过遵循我所做的,只有一个项目(新项目)将获得并设置为工作,但所有其他项目之前的付款将会丢失
    你会怎么做?什么是使其100%可靠的最佳方法?

    感谢您的帮助

    注意:

    4到6之间的步骤是通过PlayFramework jobs进行的,使用now()awaiting()调用结果

1 个答案:

答案 0 :(得分:2)

你可以:

  • 防止加倍post via JQuery
  • 使用checkAuthenticity()方法验证请求
  • 在处理POST后进行GET重定向(因此即使错误也无法提交2次)
  • 进行异步付款处理(见下文)

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

这样您就不会将请求链接到处理,并且您不会遇到线程/赛车问题,并且如果您执行顺序处理,则能够检测过时的请求(已完成的付款)。