简单内网映射到公网方法--免费

article/2025/8/26 6:48:11

我是一名Android API Player,最近公司需要做微信公众号二次开发,我跟着学学,公司后台.net。

我mac安装windows之后用vs感觉太差了,可能是我的mac要淘汰了吧。

所以我决定用java后台来跟着做。

仔细一想我没有服务器啊。

再仔细一想我没有公众号啊或者服务号也行啊,申请太麻烦还要提交证明还要花钱,用公司的怕给玩坏了。

不过这都不是问题,解决方法总比问题多。


下面一步一步来记录下这些问题的解决,可能文笔不好,有的点会漏掉,只能慢慢来优化了。


第一步首先我们来解决没有服务器的问题:

大概思路就是将我们的本地的服务器地址映射到公网上,这样外网就可以访问我们的电脑指定路径了。

思路确定之后开始找软件了,试了几个之后,最后选定Sunny-Ngrok(免费的版本就够用了,放心吧,我也是穷人)。

本来一开始看博客有人推荐了Ngrok,试了以后发现他服务器在国外,映射的网址访问慢的不行。

下面是Sunny-Ngrok的官网:

https://www.ngrok.cc/

首先主页下拉下载你电脑对应的版本:



之后你要注册一个账号,登陆。(这个网站我发现了几个Bug,等我给他们反馈一下)

登陆之后文档里有一篇《隧道开通》的,我就是照着弄的:

http://www.sunnyos.com/article-show-67.html

写到这里忘了说了,之后我们会用到Tomcat,不会配置的同学可以参考下面这篇漏文:

http://blog.csdn.net/geanwen/article/details/78410595

都是基本操作,都坐好。


上面继续Sunny-Ngrok网站,登陆之后就可以到了具体操作界面了:

右侧有个开通隧道,点进去新建一个隧道:



选择免费的就可以:



新建填一些配置:



这些上面贴出的文档里应该都有,跟着走就可以,不过这里微信开发需要80端口需要注意一下。

这里填的除了前置域名固定的,其他的都可以后来修改。

创建之后来到了隧道管理界面,你创建的条目里有一个隧道id,

这时候回到你上面下载的文件,通过终端进入文件所在的文件夹,输入下面的命令:

  1. ./sunny clientid 隧道id
之后你会看到:



其中:http://aool.ngrok.cc就是你本地路径映射后的结果。

web界面127.0.0.1:4040就是web界面的展示,到时候调试请求出问题了可以通过这里查看详细的错误或日志。

到这里,没有服务器的问题解决了。


接下来先看看Java后台的代码,很简单,按照微信官方文档需要验证。

代码也是我看文章找的:

package servlet;import bean.TextMessage;
import util.CheckUtil;
import util.MessageUtils;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;public class WechatServlet extends HttpServlet{/*** 接收微信服务器发送的4个参数并返回echostr*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 接收微信服务器以Get请求发送的4个参数String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");PrintWriter out = response.getWriter();if (CheckUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);        // 校验通过,原样返回echostr参数内容}}/*** 接收并处理微信客户端发送的请求*/public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/xml;charset=utf-8");PrintWriter out = response.getWriter();Map<String, String> map = MessageUtils.xmlToMap(request);String toUserName = map.get("ToUserName");String fromUserName = map.get("FromUserName");String msgType = map.get("MsgType");String content = map.get("Content");String message = null;if ("text".equals(msgType)) {                // 对文本消息进行处理TextMessage text = new TextMessage();text.setFromUserName(toUserName);         // 发送和回复是反向的text.setTouserName(fromUserName);text.setMsgType("text");text.setCreateTime(String.valueOf(new Date().getTime()));text.setContent("你发送的消息是:" + content);message = MessageUtils.textMessageToXML(text);System.out.println(message);}out.print(message);                            // 将回应发送给微信服务器}
}

里面的工具类CheckUtils:

package util;import java.security.MessageDigest;
import java.util.Arrays;public class CheckUtil {private static final String token = "geanwen";public static boolean checkSignature(String signature, String timestamps, String nonce){String[] arr = new String[]{token, timestamps, nonce};// 排序Arrays.sort(arr);// 生成字符串StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}// sha1加密String temp = encode(content.toString());return temp.equals(signature); // 与微信传递过来的签名进行比较}private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};/*** Takes the raw bytes from the digest and formats them correct.** @param bytes the raw bytes from the digest.* @return the formatted bytes.*/private static String getFormattedText(byte[] bytes) {int len = bytes.length;StringBuilder buf = new StringBuilder(len * 2);// 把密文转换成十六进制的字符串形式for (int j = 0; j < len; j++) {buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);buf.append(HEX_DIGITS[bytes[j] & 0x0f]);}return buf.toString();}public static String encode(String str) {if (str == null) {return null;}try {MessageDigest messageDigest = MessageDigest.getInstance("SHA1");messageDigest.update(str.getBytes());return getFormattedText(messageDigest.digest());} catch (Exception e) {throw new RuntimeException(e);}}}

MessageUtils:

package util;import bean.TextMessage;
import com.thoughtworks.xstream.XStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MessageUtils {/*** xml转为map集合*/public static Map<String, String> xmlToMap(HttpServletRequest request){Map<String, String> map = new HashMap<>();SAXReader reader = new SAXReader();try {// 从request中获取输入流InputStream ins = request.getInputStream();Document doc = reader.read(ins);// 获取xml中的跟元素Element root = doc.getRootElement();// 获取跟元素所有节点放到list中List<Element> list = root.elements();// 遍历for (Element e : list){map.put(e.getName(), e.getText());}ins.close();return map;} catch (IOException e) {e.printStackTrace();return null;} catch (DocumentException e) {e.printStackTrace();return null;}}/*** 将文本消息对象转换成XML*/public static String textMessageToXML(TextMessage textMessage){XStream xstream = new XStream();              // 使用XStream将实体类的实例转换成xml格式xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”return xstream.toXML(textMessage);}}

按照微信要求的实体类TextMessage:

package bean;public class TextMessage {private String TouserName;private String FromUserName;private String CreateTime;private String MsgType;private String Content;private String MsgId;public String getTouserName() {return TouserName;}public void setTouserName(String touserName) {TouserName = touserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public String getCreateTime() {return CreateTime;}public void setCreateTime(String createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}public String getContent() {return Content;}public void setContent(String content) {Content = content;}public String getMsgId() {return MsgId;}public void setMsgId(String msgId) {MsgId = msgId;}
}

Web.xml中添加配置Servlet:

<servlet><servlet-name>wechatServlet</servlet-name><servlet-class>servlet.WechatServlet</servlet-class></servlet><servlet-mapping><servlet-name>wechatServlet</servlet-name><url-pattern>/wx.do</url-pattern></servlet-mapping>


接下来配置Tomcat运行:


服务启动,这时候回去看看Sunny Ngrok的隧道的属性是否正确,没问题了就可以进入下一步:

微信测试号


一般我们的公众号开发都是在公众号已经开始运营的时候,贸然直接与后台连接可能会影响关注的粉丝们在公众号正常的使用;

即使我们没有多余的测试服务号,没有多余的测试的公众号。也可以


下面一步一步来


微信提供给我们开发者测试号的功能,具体是什么意思呢,就是我们申请一个测试账号,进入测试管理系统,就可以使用差不多公众号所有的功能;

测试账号网址:

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

只需要点击登陆扫码就好了:



登陆之后就可以进行配置:

配置URL--刚才我们写的微信get接口。

Token--我们上面代码中Token设置的是geanwen,所以这里也要一样。


我们将我们上面代码的服务启动,使用微信在线测试接口:

点击打开链接

输入对应参数,检查:



好了,这里潦草结尾,感觉写的太长了,后续在另起一张吧。

欢迎一起讨论,主要是记录一下大概思路,详细内容都可以针对去查。






http://chatgpt.dhexx.cn/article/uW2L1KRO.shtml

相关文章

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后&#xff0c;在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的&#xff0c;但在外网电脑和设备如何访问呢&#xff1f;由于内网环境下&#xff0c;无法提供公网IP使用&#xff0c;外网访问内网就需要一个内外网转换的介质。这里介绍…

内网和外网之间的通信(端口映射原理)

内网和外网之间的通信&#xff08;端口映射原理&#xff09; 首先解释一下“内网”与“外网”的概念&#xff1a; 内网&#xff1a;即所说的局域网&#xff0c;比如学校的局域网&#xff0c;局域网内每台计算机的IP地址在本局域网内具有互异性&#xff0c;是不可重复的。但两…

实现内网通过外网域名访问NAT映射的内网服务器

大家都知道在用Huawei的中低端路由器做NAT地址映射时只能支持 “外网访问” 不支持 “内网访问”。也就是说只支持NAT映射后外网IP通过外网域名&#xff08;外网IP&#xff09;访问NAT映射的服务器 &#xff0c;不支持NAT映射后内网IP通过外网域名&#xff08;外网IP&#xff0…

给内网映射增加安全防护

1.背景 内部网络资源的访问&#xff0c;通用的做法是部署企业VPN&#xff0c;通过VPN设备提供公网接入服务&#xff0c;客户端接入后&#xff0c;则可以像本地网络一样访问内网资源。但是部署VPN需要专业设备&#xff0c;且配置管理往往需要专业人员&#xff0c;对普通小…

公网映射思路

1、使用环境 目前政务微信的有两台内网环境71和14服务器&#xff0c;外网不能访问&#xff0c;只能内部访问&#xff0c;但是项目部署在14上面71的nginx转发到14服务器上面&#xff0c;但是现在14的项目需要网络支持&#xff0c;另外需要一台公网环境180服务器。 2、公网环境…

外网做ip映射访问内网链接

首先这个外网必须是独立ip 然后在路由器设置ip映射&#xff0c;注意防火墙放通该端口&#xff0c;可以telnet连一下试试有没通

几种内网映射到公网的方法

1、windows_386_ngork ngrok.exe用来将内网映射到外网上&#xff0c;即让外网能访问局域网内本地的应用&#xff0c;例如在外网访问你本地http://127.0.0.1指向的Web站点。下载windows_386_ngork软件&#xff0c;可以到官网下载&#xff0c;可以直接用我提供的下载地址&#x…

云服务器部署内网穿透映射本地服务

项目开发时需要和前端联调&#xff0c;考虑使用内网穿透避免每次上传服务部署的过程 下载frp &#xff08;开源内网穿透、反向代理工具&#xff09; https://github.com/fatedier/frp/releases/上传云服务器并解压&#xff08;使用xftp等工具上传&#xff09; tar -zxvf frp_0…

内网与外网及内网映射的概念

内网与外网及内网映射的概念 所谓内网&#xff0c;也就是局域网&#xff0c;一般是由几台电脑加上路由器和网线搭建起来&#xff0c;只能在局域网中通过路由器分配的IP地址来访问&#xff0c;且访问地址是动态的可变的。本机也算是一个相对独立的内网&#xff0c;本机的内网IP就…

内网如何映射到公网访问互联网

我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联网&#x…

将内网映射到外网

如何把你的电脑映射到外网 前几天一个客户说需要把他的服务器映射到外网&#xff0c;然后别人可以通过远程连接来操作&#xff0c;远程安装使用软件&#xff0c;但不知道怎么做&#xff0c;在之前也是一头雾水的&#xff0c;不知所云&#xff0c;但经过某思虑片刻之后&#xff…

内网ip映射外网方法

内网ip映射外网方法 主要是使用花生壳app实现 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 内网ip映射外网方法一、下载软件二、使用步骤1.注册账号&#xff0c;添加映射 总结 一、下载软件 花生壳下载地址 …

如何实现内网映射到公网?

有些时候我们需要把自己的笔记本当做服务器连接到公网上&#xff0c;以便让自己的小项目能够被其他人访问或者看到。正常情况&#xff0c;我们台电脑上网都应该是配备了一个公网ip的。但是呢&#xff0c;不幸的是我们的电脑所分配到的ip都是内网ip&#xff0c;因此我们无法让外…

内网透传------局域网IP映射到公网

切记&#xff1a;重启&#xff01;&#xff01;&#xff01;&#xff01; 一下知识总的来说就是2点&#xff1a; 第一点&#xff1a;如何通过路由器公网IP映射的公网端口号---访问局域网服务器 第二点&#xff1a;如何通过花生壳的域名花生壳的端口号-----访问局域网服务器 …

内网映射(如何映射自己的项目至公网)

内网映射&#xff08;如何映射自己的项目至公网&#xff09; 1.浏览器进入https://natapp.cn/ 2.登录网页后&#xff0c;进行如下操作 购买成功后&#xff0c;操作下面~ 到这里你已经成功大半了&#xff0c;是不是很开心。此时需要准备如下操作 #将本文件放置于natapp同级…

内网穿透怎么设置?内网映射外网需要注意什么

自己在本地搭建服务器&#xff0c;由于没有公网IP或没有公网路由权限&#xff0c;在提供互联网连接访问时&#xff0c;就需要用到内网穿透。内网穿透&#xff0c;即内网映射&#xff0c;内网IP地址端口映射到外网访问的实现方法。那么&#xff0c;怎么做内网穿透呢&#xff0c;…

实现内网映射的三种方式:

实现内网映射的三种方式: 1.ngrok. 1)下载ngrok 下载地址:https://ngrok.com/download 选择合适的版本下载,我下载的是win64为的是这样: 2)解压下载下来的文件得到一个名为ngrok的应用程序 3)双击运行ngrok,输入ngrok得到命令提示(不输入打开也有) 4)输入命令:n…

大数据面试题带答案

版本更新时间更新内容v1.02020-07-01新建v1.12020-07-18朋友面试大数据工程师提供的关于架构及数仓方面的题目(智云健康)v1.22020-08-08朋友面试数据专家提供的数据驱动&#xff0c;spark及flink方面面试题(华为&#xff0c;阿里&#xff0c;小影&#xff0c;拼便宜)v1.32020-0…

2021大数据面试题

文章目录 前言一、考察SQL能力*初级*1. 表A只有一个字段ID&#xff0c;值为[1,2,2,3,3,3]。现要求查询出重复的id2.表A又两个字段ID和Create_Time&#xff0c;计算今天新增的ID表[不包含昨天的那一部分]&#xff1b;3. 表A和表B都只有一个字段Account&#xff0c;如果account来…

大数据面试题(一)

一、.hdfs写文件的步骤 答案&#xff1a; (1)client向NameNode申请上传…/xxx.txt文件 (2)NN向client响应可以上传文件 (3)Client向NameNode申请DataNode (4)NN向Client返回DN1,DN2,DN3 (5)Client向DN1,DN2,DN3申请建立文件传输通道 (6)DN3,DN2,DN1依次响应连接 (7)Cli…