微信扫码支付实时通知用户订单支付状态
前言
个人支付上线有一段时间了,也产生了几百条订单,不少热心的同志一分、一毛的在支付,都是满满的热情啊!为了更好的服务大家,小编决定接入实时通知用户订单支付状态的小功能。
实现思路
市面上一般有两种实现思路:
轮询,就是前端定时向后端发送请求,查询订单是否支付
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:网页版微信扫码登录的流程 ① 点击扫码登录按钮 ② qrAuthorize(访问微信接口,如果微信接口判断有权限生成二维码的话,跳转到二维码页面.) ...
- asp源码微信扫码授权登陆电脑版
网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登 ...
- 企业实战, java、spingboot微信扫码支付,页面生成微信二维码,微信扫码付款,websocket通知,处理订单!复制粘贴代码直接开干
一 功能描述: 前端选择商品后生成二维码,用户微信扫码支付 备注: 红色为后台给前端的接口 1.前端 选择确认商品 2.调后台生成订单接口 (状态未付款) 3.返回订单的详情(订单确认页面 ...
- java 实时监控微信扫码支付,支付成功跳转到成功页面
**原文链接:https://www.blog-china.cn/liuzaiqingshan/home/39/1510305872502 欢迎访问个人博客,分享更多技术码上中国博客(CodeChin ...
- 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态
微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...
- B2C电商项目(第十二天、微信扫码支付、支付二维码、支付回调逻辑、推送支付通知)
一. 微信扫码支付 学习内容: 能够根据微信支付的开发文档调用微信支付的 api 完成统一下单生成微信支付二维码功能 完成支付回调的逻辑处理,掌握 EchoSite的使用 完成推送支付通知功能 微信支 ...
- springboot 实现 订单 和 微信扫码支付 功能
1:下面是简单生成订单和支付的流程 后端实现 1: 首先开发 生成订单接口,根据订单查询接口, 生成微信支付的二维码的接口,查询订单支付的状态的接口 @Api(tags="订单接口" ...
- 支付宝微信扫码支付调研
一.支付宝扫码支付 1.1 系统流程说明 1.1.1 条码支付(被扫) 条码支付是支付宝给到线下传统行业的一种收款方式.商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款.用户仅 ...
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇
// 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment(https://github.com/Essensoft/Pa ...
最新文章
- CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)
- 为什么 SAP Spartacus 4.0 源代码版本读取不到 CX_BASE_URL 环境变量的值?
- PDH-SDH光端机指示灯具体含义介绍
- python 在不同层级目录import 模块的方法
- 如何设计销售CRM×运营CRM×社交化SCRM系统?(一)
- Android学习笔记---24_网络通信之网页源码查看器
- 贴片电阻丝印看阻值大全,附高精度贴片电阻代码表
- 解决网站80端口被封,本地公网IP加速25mb/s网站访问速度
- Linux系统Centos7安装RabbitMQ使用压缩包配置环境变量RabbitMQ 3.8.16.tar.xz Erlang 24
- 如何快速部署企业私有云存储
- AI深度学习入门与实战19 语义分割:打造简单高效的人像分割模型
- 盥洗台的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 百度权重、360权重、Google PR值详解
- 交互式甘特图控件VARCHART XGantt .NET ,如何从v5.1升级到v5.2?
- HTML_网页设计参考手册 中文WORD版
- oppo手机使用应用沙盒动态修改序列号信息
- IP地址查询对应的域名在线网址分享
- 2012-02-09 北京爱情故事第四十集(转载)
- Python--Opencv工业广角相机图像畸变矫正
- Blender入门必学之如何拖动地面(即拖动视图)及如何弹出工具栏右下角选项
热门文章
- Navicat使用介绍
- 商超便利店如何提高销售额
- VMware虚拟机安装Windows Server 2012 R2
- linux vi 按键删除键出现字母A,B,C,D 等字母解决办法
- python 隔一个取一个 取出奇数索引元素 取出偶数索引元素
- 修改数据库某个字段的长度时出现“无法修改表。无法对 表‘XXX‘ 执行 删除,因为它正用于复制。”
- IEC104 模拟器使用教程
- 题解 CF821C 【Okabe and Boxes】
- U盘文件或目录损坏且无法读取怎么修复
- java的split劈开获取数组的数据问题