内网穿透笔记

内网穿透

1、配置natapp隧道,确保127.0.0.1可以访问
在这里插入图片描述

2、下载客户端放在盘下任意位置并配置config.ini文件 只需要在authtoken后写上隧道的authtoken

#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken=0b8834ef49c17311                      #对应一条隧道的authtoken
clienttoken=             #对应客户端的clienttoken,将会忽略authtoken,若无请留空
log=none  
#log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR                  
#日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy=                     
#代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空

3、启动natapp.exe观察出现如下信息即可

Forwarding http://746iqr.natappfree.cc -> 127.0.0.1:8080

4、前端代码

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+")");
				},
				mounted:function(){
					//渲染二维码
					var qrcode = new QRCode($("#payQrcodeDiv")[0],{
						width:200,
						height:200
					});
					qrcode.makeCode(this.orderInfo.payUrl);
					
					//前端发送websocket连接请求
					console.log(this.orderInfo.orderId);
					var webSocketUrl = webSocketBaseUrl + "webSocket/"+ this.orderInfo.orderId;//在base.js中配置var webSocketBaseUrl = "ws://localhost:8080/",在此页面引入base.js
					var websocket = new WebSocket( webSocketUrl );
					console.log(webSocketUrl);
					//只要后端通过websocket向此连接发消息就会触发onmessage事件
					websocket.onmessage = function(event){
						var msg = event.data;
						if(msg=="1"){
							$("#div1").html("订单支付成功!");
						}
					}

后段代码接收websocket请求

@Component
@ServerEndpoint("/webSocket/{oid}")   //服务节点 表示我这个类可以接收别人的请求
public class WebSocketServer {

    private static ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>();
    /**
     * 前端发送请求建立websocket连接,就会执行@OnOpen方法
     **/
    @OnOpen
    //PathParam就是websocket的注解 类似@PathVariable
    public void open(@PathParam("oid") String orderId, Session session) {
        System.out.println("------------建立连接:" + orderId);
        sessionMap.put(orderId, session);
    }

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

    public static void sendMsg(String orderId, String msg) {
        try {
            Session session = sessionMap.get(orderId);
            session.getBasicRemote().sendText(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

需要创建配置类WebSocketConfig

@Configuration
public class WebSocketConfig {   
    @Bean  
    public ServerEndpointExporter getServerEndpointExporter(){  
        return new ServerEndpointExporter();  
    }
}

支付完成时会执行orderController中的以下代码

data.put("notify_url", "http://746iqr.natappfree.cc/pay/callback");

从而进行内网穿透进入PayController类中执行方法

@RestController
@RequestMapping("/pay")
public class PayController {

    @Autowired
    private OrderService orderService;

    /**
     * 回调接口:当用户支付成功之后,微信支付平台就会请求这个接口,将支付状态的数据传递过来
     */
    @RequestMapping("/callback")
    public String paySuccess(HttpServletRequest request) throws Exception {
        System.out.println("--------------------callback");
        // 1.接收微信支付平台传递的数据(使用request的输入流接收)
        ServletInputStream is = request.getInputStream();
        byte[] bs = new byte[1024];
        int len = -1;
        StringBuilder builder = new StringBuilder();
        while ((len = is.read(bs)) != -1) {
            builder.append(new String(bs, 0, len));
        }
        //微信支付传回来的是xml格式数据,以标签名作为key对应的值作为value
        String s = builder.toString();
        //  System.out.println(s);
        //使用帮助类将xml接口的字符串装换成map
        Map<String, String> map = WXPayUtil.xmlToMap(s);

        if (map != null && "success".equalsIgnoreCase(map.get("result_code"))) {
            //支付成功
            //2.修改订单状态为“待发货/已支付”
            String orderId = map.get("out_trade_no");
            int i = orderService.updateOrderStatus(orderId, "2");
            System.out.println("--orderId:" + orderId);
            //3.通过websocket连接,向前端推送消息
            WebSocketServer.sendMsg(orderId, "1");

            //4.响应微信支付平台,防止频繁提示
            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);
            }
        }
        return null;
    }

}

最后前段接收到付款成功的信息,执行响应

	websocket.onmessage = function(event){
						var msg = event.data;
						if(msg=="1"){
							$("#div1").html("订单支付成功!");
						}
					}

最后前段接收到付款成功的信息,执行响应

```js
	websocket.onmessage = function(event){
						var msg = event.data;
						if(msg=="1"){
							$("#div1").html("订单支付成功!");
						}
					}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值