请教一般后端发送给前端消息该怎么实现

2020-08-17 10:33:19 +08:00
 rqxiao

场景:用户在扫码支付成功后,第三方支付方会异步回调本系统内的一个地址,希望收到回调返回成功后,给前端发送 您已支付成功订单 xx 元!

之前没做过消息发送到前端这方面的,想请教下简单的或者常用的做法是什么,就用 websocket ? 现在后台是 springboot,前端是 ios

8443 次点击
所在节点    Java
52 条回复
juzzle
2020-08-17 10:38:20 +08:00
刷新一下页面,请求下后端 获取一下支付结果就好了
aogu555
2020-08-17 10:38:32 +08:00
扫码支付的话一般是让前端做个定时器轮询,不断发请求查询支付状态
kkkkkrua
2020-08-17 10:38:39 +08:00
别想着同步的方案,前端轮询就行
janxin
2020-08-17 10:45:15 +08:00
websocket, long polling
dadaoqueyi
2020-08-17 10:54:07 +08:00
websocket (emq)
TomatoYuyuko
2020-08-17 10:58:10 +08:00
轮询成本最低
lyusantu
2020-08-17 11:12:49 +08:00
免费就前端轮询,图方便就买服务,如果量不大的话,GoEazy 还挺方便
paulee
2020-08-17 11:28:54 +08:00
你是想做消息推送吗?一般情况下,前端轮询就行(前端注意轮询频率和边界判断,别写 Bug 把服务器爆了
wangritian
2020-08-17 11:30:57 +08:00
支付场景轮询就好了,不需要长期推消息
xuanbg
2020-08-17 11:37:17 +08:00
一般异步结果前端轮询即可
LongMaoz
2020-08-17 11:44:12 +08:00
轮询就行了,上 WebSocket 也行
devliu1
2020-08-17 11:48:48 +08:00
轮询、SSE 、WS 都可以
xkeyideal
2020-08-17 11:52:38 +08:00
拉倒最后一个评论才说出最好的方式,sse 啊,一个半双工的场景,用 ws 干啥,轮询那么浪费资源,考虑一下服务端压力呢
ky11223344
2020-08-17 12:00:36 +08:00
可以试试 server sent events, 看下 js 的 EventSource API
liuzhaowei55
2020-08-17 12:03:25 +08:00
前端倒数 5 秒然后到后台查询结果,现在大部分都是这个操作吧
fhsan
2020-08-17 13:06:12 +08:00
eventsource
wc951
2020-08-17 13:50:46 +08:00
有一项远古的技术叫 dwr
yingqi7
2020-08-17 14:00:48 +08:00
感觉大家都前端轮询,或者用户刷新返回消息
sujin190
2020-08-17 14:11:07 +08:00
这种等待时间不会很长的,合适的做法还是 ajax 请求后保持直到有数据或者超时,要实现保持也有很多方法,比如 redis 的 pubsub,zookeeper,或者用分布式锁服务啥的都很方便,websocket 会复杂一些,也需要单独长连接处理服务才能支持,不能直接在 web 中实现成一个 rest api

https://github.com/snower/slock

用 go 实现过这样一个锁服务,分布式 Event 的语义也很简单,使用支付 ID 为 key,已 1 为 lock_id 在创建订单的时候锁住,前端等待的时候尝试 2 为 lock_id 获取锁,异步通知的时候释放 lock_id 为 1 的锁,这时候 lock_id 为 2 的获取成功就代表这个分布式 Event 被激活了也就是支付完成,前端等待会立刻收到反馈返回,搞定
berlin4h
2020-08-17 14:11:36 +08:00
1 、支付页面生成一个唯一标识
2 、付款成功后支付页面服务端发起请求,查询唯一标识是否支付成功
3 、服务器收到请求,查询。如果未支付,进入等待(wait),不立即返回
4 、一旦收到第三方通知支付成功,立即返回(notify)
5 、页面收到结果,做后续处理
步骤大概如此,但是有个问题,步骤 2 如果请求超时,如何处理?处理方式是,一段时间没有扫描后,后端返回 timeout,前端重新发起一个相同的网络请求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX