0

我目前正在做一个电子商务项目,我需要一些关于我的付款页面的帮助。在结帐页面,我得到了用户的支付信息,它只是一个 GSM 号码,我将其发布到支付系统服务,该服务返回一个同步响应。响应可以是“OK”、“NOT OK”、“AWAIT”和“TIMEOUT”。OK 表示支付成功,NOT OK 表示支付不成功,当然“TIMEOUT”表示支付操作超时。

棘手的部分是“等待”。该服务的超时时间为 4 分钟。这 4 分钟用于用户通过他/她的手机完成他/她的付款。支付系统以这样不同的方式工作,当我开始支付过程时,服务立即返回“等待”并向用户的智能手机发送通知。此通知启动,我们称其为自定义钱包,自定义钱包应用程序。然后,用户选择他/她在此自定义钱包系统中预定义的支付卡并确认支付。用户有 4 分钟的超时时间。在这 4 分钟内,他/她要么完成付款,要么操作超时。我的问题是,这个支付服务是一个同步操作。所以,我必须每 5 秒调用一次,持续 4 分钟,直到我得到除“AWAIT”之外的响应。到这个时候,我必须向页面返回一个同步响应,指示支付过程已经开始并等待用户确认,并启动一个异步操作,检查这个自定义钱包服务 4 分钟并获得响应。然后我需要将此异步响应发布到网页。

我正在寻找一种解决此问题的方法,以避免可能出现的并发或同步等问题。我也希望有一些示例代码。谢谢...

4

1 回答 1

3

到这个时候,我必须向页面返回一个同步响应,表明支付过程已经开始并等待用户确认,并启动一个异步操作,检查这个自定义钱包服务 4 分钟并获得响应。然后我需要将此异步响应发布到网页。

是的,这并不容易。我可以推荐的唯一解决方案非常复杂。

当初始请求进来时,您需要为该事务创建一个持久实体,保存它,然后返回唯一的实体标识符。请注意,它必须保存在持久位置(即 Azure 表)中。

接下来,您将需要一个单独的服务器来轮询更新(即 Azure 辅助角色或 Win32 服务)。这不应该从 ASP.NET 完成,因为它是在没有 HTTP 请求的情况下进行的工作。

然后,当您的最终用户应用程序轮询完成时,您的 Web 服务可以从持久实体中检索当前状态。

您可以采用不同的“捷径”:将实体保存在内存中而不是持久化,并将服务器滚动到 ASP.NET 站点中的某种后台进程中。但这两种捷径都会带来严重的可靠性和稳健性问题,不应考虑用于金融交易。

于 2013-04-04T14:27:32.847 回答