我们制作了一个AngularJS应用程序,用户打开一个URL(xyz.com/booking)填写表格,然后选择一些商品进行购买。
之后,用户点击“购买”按钮,离开支付网关站点的站点。成功付款后,Payment Gateway通过在回拨URL(xyz.com/booking-success)上发送POST请求来回送用户。
现在问题是我为该回调URL配置的相应Angular页面没有打开。我在RouteProvider中配置了xyz.com/booking-success页面,但这似乎没有用。
但是,如果我直接通过浏览器打开页面xyz.com/booking-success,它就会被打开。
如何处理此方案?任何帮助将不胜感激。
答案 0 :(得分:7)
ngRoute
无法处理通过POST访问的网址,如果你在index.html上重写,你只是发布到index.html而不是你的路由,当你配置/时,它不起作用预订 - 成功,你通过cURL在该网址上发布,你实际上是发布到index.html。角度路由只是“虚拟”而不是真实的。像cURL或任何其他HTTP客户端这样的系统无法看到它,因此它们会发布到index.html。
永远不要处理来自付款/预订/角网内任何网关的回调网址。 Angular很危险,因为您必须确保将执行回调过程。 Angular不具有容错能力,如果有任何javascript错误,你的角度调用中的任何错误都会丢失所有回调数据而你就会被搞砸了。
回调必须是REST API的一部分,并且必须实现以返回HTTP状态代码200,否则在任何其他HTTP代码的情况下,网关应该知道它们必须重试调用。 (例如,skrill.com在没有HTTP 200代码的情况下重复10次回调)。实际上,AngularJS每次都会响应200,因为您的Web服务器将提供index.html,它不关心javascript代码中发生了什么。
redirect_url
,通常是用户在代理方成功付款/操作后重定向的网址。但与此同时,仍然会在应用程序的较低级别调用回调URL。重定向URL通过浏览器重定向内的GET调用,因此用户可以正常看到它。每个“普通”网关都有callback_url
(您的API的低级别通知,操作成功并redirect_url
,即重定向回您的网站xyz.com/booking-success)。但他们应该分开。如果您的网关没有重定向,则您无法选择,只能在新窗口中打开整个预订。并在调用回调后以某种方式通知您的前端。这可以通过间隔轮询来完成。例如,10秒,即检索您将在回调代码中设置的booking_id
(列is_processed (true|false)
的实际状态。当状态从false更改为true时,您将通知您的前端(重定向用户或show popup)。您还可以实现socket.io库,您可以处理轮询,并且在调用回调URL时您的通知将是即时的。