Process 这是我们向用户付费的过程,可靠且安全吗?

Process 这是我们向用户付费的过程,可靠且安全吗?,process,paypal,playframework,payment,Process,Paypal,Playframework,Payment,我正在做一个项目,要求我的应用程序在用户要求时向他的paypal帐户付款 到目前为止,我是这样做的: (已登录)用户进入付款页面,该页面将列出其所有付款(已收到或未收到) 他输入他的Paypal电子邮件和他的应用程序(我的)密码(出于安全考虑) POST页面获取该用户状态为“未支付”的所有付款的列表,并将状态更新为“正在工作”(以避免用户在整个过程完成之前刷新页面并重新发送相同金额的款项) 我们在该列表中计算要支付的总金额(对于,一个简单的) 金额通过Paypal自适应支付API发送到Paypa

我正在做一个项目,要求我的应用程序在用户要求时向他的paypal帐户付款

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

  • (已登录)用户进入付款页面,该页面将列出其所有付款(已收到或未收到)
  • 他输入他的Paypal电子邮件和他的应用程序(我的)密码(出于安全考虑)
  • POST页面获取该用户状态为“未支付”的所有付款的列表,并将状态更新为“正在工作”(以避免用户在整个过程完成之前刷新页面并重新发送相同金额的款项)
  • 我们在该列表中计算要支付的总金额(对于,一个简单的
  • 金额通过Paypal自适应支付API发送到Paypal(请求:支付)
  • 检查响应,如果已完成,列表状态设置为“已完成”,如果未完成,列表将恢复为“未支付”(SQL更新通过
    进行,其中id在(x,y,z)
    中,以防在此期间发出第二次付款请求
  • 然后向用户显示一条消息
  • 但我需要你的帮助,我面临一个我想避免的风险问题,我知道你会怎么做:

    • 如果用户点击流程页面上的刷新,我不想给他发送两倍(或更多)的金额(这里的“工作”锁就是为了这个,但是如果用户在我设置锁之前点击刷新会发生什么情况?)
    • 罕见的可能性:如果用户在锁定“工作”后,但在向paypal发出请求并收到新付款之前,点击f5会发生什么情况。按照我所做的操作,只会获得一个项目(新项目)并将其设置为工作,但所有其他以前的付款都会丢失
    你会怎么做?让它100%可靠的最好方法是什么

    谢谢你的帮助

    注意:

    4到6之间的步骤是通过一个调用
    now()
    waiting()

    • 防止双重
    • 使用该方法验证请求
    • 在处理帖子后执行GET重定向(这样即使是错误提交,他们也不能提交相同的两次)
    • 进行异步支付处理(见下文)
    对于付款,不要调用作业,而是在队列(或数据库中的表)中设置付款的id以及一个每分钟运行一次的作业,如果表中有数据,该作业将处理该表。当用户发布帖子时,您将重定向到一个页面,该页面显示您正在处理付款,并将在出现问题时发出通知。您可以稍后使用comet或通过邮件通过UI警告通知用户

    这样,您就不会将请求链接到处理,也不会出现线程/竞速问题,而且如果您进行顺序处理,您还能够检测到过时的请求(已完成的付款)