显示支付结果_WebSocket实现_方案2

本文介绍了如何使用Spring Boot和WebSocket技术构建一个实时通讯系统,展示了从接收到微信支付回调、更新订单状态到通过WebSocket向前端推送消息的全过程。前端通过Vue.js实现二维码支付和长连接,确保支付完成时用户能立即获取通知。
摘要由CSDN通过智能技术生成

流程分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

package com.qfedu.fmmall.websocket;

import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author beyondx
 * @date Created in 2022/08/21/ 14:31
 */
@Component
@ServerEndpoint("/webSocket/{oid}") // 表示这个类, 可以接收 别人的请求; 接收 websocket请求
public class WebSocketServer {

    private static ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>();

    /**
     * 前端发送请求, 建立 webSocket链接, 就会执行 @OnOpen方法
     * @param orderId 订单id
     * @param session 代表连接
     */
    @OnOpen
    public void open(@PathParam("oid") String orderId, Session session) {
        System.out.println("------------建立连接:" + orderId);
        sessionMap.put(orderId, session);
    }

    /**
     * 前端 关闭页面, 或者 主动关闭 webSocket连接, 都会执行close
     * @param orderId
     */
    @OnClose
    public void close(@PathParam("oid") String orderId) {
        sessionMap.remove(orderId);
    }

    /**
     * 发送消息, 工具方法
     * @param orderId
     * @param msg
     */
    public static void sendMsg(String orderId, String msg) {
        try {
            Session session = sessionMap.get(orderId);
            session.getBasicRemote().sendText(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.qfedu.fmmall.controller;

import com.github.wxpay.sdk.WXPayUtil;
import com.qfedu.fmmall.service.OrderService;
import com.qfedu.fmmall.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.websocket.Session;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 回调接口
 * @author beyondx
 * @date Created in 2022/08/20/ 21:17
 */
@RestController
@RequestMapping("/pay")
public class PayController {
    @Autowired
    private OrderService orderService;

    /**
     * 支付回调; 接收 微信支付平台的 请求(通知)
     * 支付回到: 当用户支付成功之后, 支付凭条会向我们指定的服务器接口 放请求, 传递 订单支付状态数据
     * 1.接收微信支付平台传递的数据(使用request的输入流接收)
     */
    @RequestMapping("/callback")
    public String paySuccess(HttpServletRequest request) throws Exception {
        System.out.println("-----------------callback");
        ServletInputStream is = request.getInputStream();
        byte[] bs = new byte[1024];
        int len = -1;
        StringBuilder builder = new StringBuilder();
        while((len = is.read()) != -1) {
            builder.append(new String(bs, 0, len));
        }
        String s = builder.toString();

        // 使用帮助类, 将 xml结构的 字符串, 转化为 Map
        // 将接收得到的 (微信响应给到的数据) 转化为 Map
        // 以标签名作为 key, 标签中的值, 作为 value
        Map<String, String> map = WXPayUtil.xmlToMap(s);
        if(map != null && "success".equalsIgnoreCase(map.get("result_code"))) {
            // 支付成功; 2件事要做
            // 1.修改订单状态 为 待发货(已支付); 数据库操作; 直接使用 tkMapper操作的w
            // 订单 是 我们的 组件
            String orderId = map.get("out_treade_no");
            int i = orderService.updateOrderStatus(orderId, "2");
            System.out.println("--orderId: " + orderId);
            // 3.通过websocket连接, 向前端推送消息
            // 这个session 就是 跟 支付页面对应的 连接对象
            WebSocketServer.sendMsg(orderId, "1");

            // 2.响应 微信支付平台; 否则 微信支付平台, 会一直 发信息
            // 注意: 响应的时候, 最好不要用 原来的map, 这里是 新构造了一个map(resp)
            if(i > 0) {
                HashMap<String, String> resp = new HashMap<>();
                resp.put("return_code", "success");
                resp.put("return_msg", "OK");
                resp.put("appid", map.get("appid"));
                resp.put("result_code", "success");
                return WXPayUtil.mapToXml(resp);
            }
            // 这里没有 else也可以, 订单状态修改失败, 我希望你再通知我一次, 我再修改
//            else {
//                return null;
//            }
        }
        return null;
    }
}

		<script type="text/javascript">
			var baseUrl = "http://localhost:8080/";
			var webSocketBaseUrl = "ws://localhost:8080/";
			var vm = new Vue({
				el: "#container",
				data: {
					orderInfo: {}
				},
				// vue声明周期:创建对象--beforeCreate--初始化data--created--加载模块--beforeMount--渲染数据--mounted
				created: function () {
					var jsonstr = localStorage.getItem("orderInfo");
					if(jsonstr != null) {
						localStorage.removeItem("orderInfo");
					}
					this.orderInfo = eval("("+jsonstr+")");

					console.log(this.orderInfo.payUrl);
				},
				// mounted表示 vue的 渲染已经结束
				mounted: function () {
					// 渲染(显示)二维码
					var str = this.orderInfo.payUrl;
					var qrcode = new QRCode($("#payQrcodeDiv")[0], {
						width: 200,
						height: 200
					});
					qrcode.makeCode(this.orderInfo.payUrl);

					// 前端发送websocket连接请求, 创建和 后端 socket的连接
					console.log("-----1111");
					// 建立 长连接
					var webSocketUrl = webSocketBaseUrl + "webSocket/" + this.orderInfo.orderId;
					websocket = new WebSocket(webSocketUrl);
					// 只要后端通过 websocket 向次连接发消息, 就会触发 onmessage事件
					websocket.onmessage = function (event) {
						var msg = event.data;
						if(msg == "1") {
							// 订单支付完成
							$("#div1").html("<label style='font-size: 20px; color: green'>订单支付完成!</label>");
						}
					}
				}
			});
		</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.java_websocket是一个Java语言实现WebSocket协议库,它提供了WebSocket客户端和服务器端的功能。通过使用org.java_websocket库,你可以轻松地创建WebSocket客户端来与WebSocket服务器进行通信。 要使用org.java_websocket实现WebSocket客户端,你需要进行以下步骤: 1. 导入org.java_websocket库:首先,你需要将org.java_websocket库添加到你的Java项目中。你可以通过在项目的构建文件(如Maven或Gradle)中添加相应的依赖来实现。 2. 创建WebSocket客户端对象:使用org.java_websocket库,你可以创建一个WebSocketClient对象来表示WebSocket客户端。你需要提供WebSocket服务器的URL作为参数来初始化WebSocketClient对象。 3. 实现WebSocketClient的回调方法:WebSocketClient类提供了一些回调方法,用于处理与WebSocket服务器的连接、消息接收和错误处理等。你需要扩展WebSocketClient类,并重写这些回调方法来实现自定义的逻辑。 4. 连接到WebSocket服务器:通过调用WebSocketClient对象的connect()方法,你可以连接到WebSocket服务器。 5. 发送和接收消息:一旦连接建立,你可以使用WebSocketClient对象的send()方法发送消息到服务器,并通过重写onMessage()方法来处理从服务器接收到的消息。 下面是一个简单的示例代码,演示了如何使用org.java_websocket实现WebSocket客户端: ```java import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.net.URISyntaxException; public class MyWebSocketClient extends WebSocketClient { public MyWebSocketClient(String serverUrl) throws URISyntaxException { super(new URI(serverUrl)); } @Override public void onOpen(ServerHandshake handshakedata) { System.out.println("Connected to WebSocket server"); } @Override public void onMessage(String message) { System.out.println("Received message: " + message); } @Override public void onClose(int code, String reason, boolean remote) { System.out.println("Disconnected from WebSocket server"); } @Override public void onError(Exception ex) { System.err.println("WebSocket error: " + ex.getMessage()); } public static void main(String[] args) { try { MyWebSocketClient client = new MyWebSocketClient("ws://localhost:8080/websocket"); client.connect(); } catch (URISyntaxException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们创建了一个名为MyWebSocketClient的类,它扩展了WebSocketClient类,并重写了一些回调方法。在main()方法中,我们创建了一个MyWebSocketClient对象,并通过调用connect()方法连接到WebSocket服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值