所以我有订票系统。
我在api上有订票请求,从我的申请中我们称之为支付服务。
如果第一次尝试失败,我们将在队列中添加消息,以便以后处理付款。然后继续向顾客发放机票。
从队列中,我们重新尝试使用支付api 10次在10分钟内,如果没有成功,我们添加一些状态的票预订记录和离线意味着从客户那里得到钱。
问题:由于信用卡欺诈,我们得到了很多这样的预订。
我有一个解决方案,我不会继续在付款失败时发行机票,相反,我想返回一些不同的http代码给客户端。和其他一切一样,除了报酬,一切都是成功的。
在处理来自队列的消息时,如果消息在10次尝试后失败,我想通知客户端,这个事务失败了。
如果通过让客户知道继续开票
问:该解决方案是否具有技术可行性?
发布于 2018-07-16 19:03:09
HTTP返回代码设计用于处理HTTP协议,而不是每个可能的请求/响应。
而不是选择一段模糊的代码,如果你斜视它,它可能会被粗略地解释成你想要它做的事情。只需在响应体中返回更多信息即可。
200 OK
{
"userCreation" : "Passed",
"ticketReservation" : "Passed",
"paymentProcessing" : "Failed"
"orderStatus" : "PendingPayment"
}发布于 2018-07-16 22:10:10
返回一个202 Accepted响应在这里非常合适。
来自维基百科:
请求已被接受以进行处理,但处理尚未完成。请求可能会被执行,也可能不会被执行,并且可能在处理发生时被不允许。
这种状态是保留在这样的情况下,现在一切都很好,但有些带外处理正在进行,客户端应该稍后再检查。
各种“带外”处理都会发生。比如上传图片或视频后进行优化,或者像你一样,处理信用卡付款。
发布于 2018-07-16 22:22:42
您可以在系统中引入另一个对象,即票证购买请求。
当用户试图购买票证时,您将立即创建其中一个对象(以及从cooresponding返回)。
然后调用方可以监视此请求的状态,使用之前返回的ID调用获取/票证购买-请求/{ID}。他可以读回它的状态,它仍然被信用卡公司验证,或者它失败了。
我不知道你为什么会想自动重试信用卡申请?如果它失败了,而你说这是因为欺诈性的请求,我看不出有理由再试一次。重试的唯一原因是,如果一个临时错误(例如,网络连接或服务器繁忙)导致信用卡运行失败。您需要查看信用卡公司返回的状态代码(如果他们说拒绝,不要重试)。
https://softwareengineering.stackexchange.com/questions/375264
复制相似问题