前言

个人支付上线有一段时间了,也产生了几百条订单,不少热心的同志一分、一毛的在支付,都是满满的热情啊!为了更好的服务大家,小编决定接入实时通知用户订单支付状态的小功能。

实现思路

市面上一般有两种实现思路:

  • 轮询,就是前端定时向后端发送请求,查询订单是否支付

  • WebSocket实现,服务器收到回调信息后主动推送消息到前端

优缺点:

  • 轮询,服务端浪费CPU、内存和带宽资源,客户端占用较多的内存资源与请求数,非实时,延迟取决于请求间隔。

  • WebSocket,实时,CPU和内存资源不以客户端数量衡量,而是以客户端事件数衡量。需要Socket程序实现和额外端口,客户端实现简单。

项目集成

配置文件pom.xml引入:

 

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

定义 WebSocketConfig:

 

/**
* WebSocket配置
*/
@Configuration
public classWebSocketConfig{

@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}

定义 WebSocketServer:

 

@ServerEndpoint("/webSocket/{userId}")
@Component
public classWebSocketServer{

private final static Logger logger = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
*/
private static int onlineCount = 0;
/**
* concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
*/
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();

/**
* 与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
private Session session;

/**
* 接收userId
*/
private String userId="";
/**
* 连接建立成功调用的方法*/
@OnOpen
publicvoidonOpen(Session session,@PathParam("userId") String userId) {
this.session = session;
webSocketSet.add(this); //加入set中
addOnlineCount(); //在线数加1
logger.info("有新窗口开始监听:"+userId+",当前在线人数为" + getOnlineCount());
this.userId=userId;
try {
sendMessage("服务器连接成功,支付成功会提示你额!");
} catch (IOException e) {
logger.error("webSocket IO异常");
}
}

/**
* 连接关闭调用的方法
*/
@OnClose
publicvoidonClose(){
webSocketSet.remove(this); //从set中删除
subOnlineCount(); //在线数减1
logger.info("有一连接关闭!当前在线人数为" + getOnlineCount());
}

/**
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息
*/
@OnMessage
publicvoidonMessage(String message, Session session){
logger.info("收到来自窗口"+userId+"的信息:"+message);
//群发消息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* @param session
* @param error
*/
@OnError
publicvoidonError(Session session, Throwable error){
logger.error("发生错误");
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
publicvoidsendMessage(String message)throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 群发自定义消息
* */
publicstaticvoidsendInfo(String message,@PathParam("userId") String userId){
logger.info("推送消息到窗口"+userId+",推送内容:"+message);
for (WebSocketServer item : webSocketSet) {
try {
//这里可以设定只推送给这个userId的,为null则全部推送
if(userId==null) {
item.sendMessage(message);
}else if(item.userId.equals(userId)){
item.sendMessage(message);
}
} catch (IOException e) {
continue;
}
}
}

publicstaticsynchronizedintgetOnlineCount(){
return onlineCount;
}

publicstaticsynchronizedvoidaddOnlineCount(){
WebSocketServer.onlineCount++;
}

publicstaticsynchronizedvoidsubOnlineCount(){
WebSocketServer.onlineCount--;
}
}

前端实现:

 

var basePath = "ws://localhost:8080/";
socket = {
webSocket : "",
init : function(userId) {
if ('WebSocket' in window) {
webSocket = new WebSocket(basePath+'webSocket/'+userId);
}
else if ('MozWebSocket' in window) {
webSocket = new MozWebSocket(basePath+"webSocket/"+userId);
}
else {
webSocket = new SockJS(basePath+"sockjs/webSocket/"+userId);
}
webSocket.onerror = function(event) {
alert("webSockt连接发生错误,请刷新页面重试!")
};
webSocket.onopen = function(event) {

};
webSocket.onmessage = function(event) {
var message = event.data;
alert(message);
};
}
}

这里需要注意的是,如果部署到外网,架设了Nginx代理和HTTPS认证,Nginx配置文件需要添加以下参数:

 

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

前端需要修改以下协议前缀,改为:

 

var basePath = "wss://wwww.xxxxx.com/";

有兴趣的小伙伴可以去测试一下,支付一分钱,满满的都是爱。

网址:https://pay.cloudbed.vip

账号:pay 密码:123456

微信扫码支付实时通知用户订单支付状态相关推荐

  1. 关于网页版微信扫码登录以及获取用户信息

    由于我只研究了1天时间,可能有些地方认知错误 1:网页版微信扫码登录的流程 ① 点击扫码登录按钮 ② qrAuthorize(访问微信接口,如果微信接口判断有权限生成二维码的话,跳转到二维码页面.) ...

  2. asp源码微信扫码授权登陆电脑版

    网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登 ...

  3. 企业实战, java、spingboot微信扫码支付,页面生成微信二维码,微信扫码付款,websocket通知,处理订单!复制粘贴代码直接开干

    一  功能描述:    前端选择商品后生成二维码,用户微信扫码支付 备注: 红色为后台给前端的接口 1.前端 选择确认商品 2.调后台生成订单接口 (状态未付款) 3.返回订单的详情(订单确认页面  ...

  4. java 实时监控微信扫码支付,支付成功跳转到成功页面

    **原文链接:https://www.blog-china.cn/liuzaiqingshan/home/39/1510305872502 欢迎访问个人博客,分享更多技术码上中国博客(CodeChin ...

  5. 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态

    微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...

  6. B2C电商项目(第十二天、微信扫码支付、支付二维码、支付回调逻辑、推送支付通知)

    一. 微信扫码支付 学习内容: 能够根据微信支付的开发文档调用微信支付的 api 完成统一下单生成微信支付二维码功能 完成支付回调的逻辑处理,掌握 EchoSite的使用 完成推送支付通知功能 微信支 ...

  7. springboot 实现 订单 和 微信扫码支付 功能

    1:下面是简单生成订单和支付的流程 后端实现 1: 首先开发 生成订单接口,根据订单查询接口, 生成微信支付的二维码的接口,查询订单支付的状态的接口 @Api(tags="订单接口" ...

  8. 支付宝微信扫码支付调研

    一.支付宝扫码支付 1.1 系统流程说明 1.1.1 条码支付(被扫) 条码支付是支付宝给到线下传统行业的一种收款方式.商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款.用户仅 ...

  9. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment(https://github.com/Essensoft/Pa ...

最新文章

  1. CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)
  2. 为什么 SAP Spartacus 4.0 源代码版本读取不到 CX_BASE_URL 环境变量的值?
  3. PDH-SDH光端机指示灯具体含义介绍
  4. python 在不同层级目录import 模块的方法
  5. 如何设计销售CRM×运营CRM×社交化SCRM系统?(一)
  6. Android学习笔记---24_网络通信之网页源码查看器
  7. 贴片电阻丝印看阻值大全,附高精度贴片电阻代码表
  8. 解决网站80端口被封,本地公网IP加速25mb/s网站访问速度
  9. Linux系统Centos7安装RabbitMQ使用压缩包配置环境变量RabbitMQ 3.8.16.tar.xz Erlang 24
  10. 如何快速部署企业私有云存储
  11. AI深度学习入门与实战19 语义分割:打造简单高效的人像分割模型
  12. 盥洗台的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. 百度权重、360权重、Google PR值详解
  14. 交互式甘特图控件VARCHART XGantt .NET ,如何从v5.1升级到v5.2?
  15. HTML_网页设计参考手册 中文WORD版
  16. oppo手机使用应用沙盒动态修改序列号信息
  17. IP地址查询对应的域名在线网址分享
  18. 2012-02-09 北京爱情故事第四十集(转载)
  19. Python--Opencv工业广角相机图像畸变矫正
  20. Blender入门必学之如何拖动地面(即拖动视图)及如何弹出工具栏右下角选项

热门文章

  1. Navicat使用介绍
  2. 商超便利店如何提高销售额
  3. VMware虚拟机安装Windows Server 2012 R2
  4. linux vi 按键删除键出现字母A,B,C,D 等字母解决办法
  5. python 隔一个取一个 取出奇数索引元素 取出偶数索引元素
  6. 修改数据库某个字段的长度时出现“无法修改表。无法对 表‘XXX‘ 执行 删除,因为它正用于复制。”
  7. IEC104 模拟器使用教程
  8. 题解 CF821C 【Okabe and Boxes】
  9. U盘文件或目录损坏且无法读取怎么修复
  10. java的split劈开获取数组的数据问题