目录
咱先跟着cpolar官方教程学一下怎么使用cpolar
一、使用cpolar
1 使用cpoloar进行内网穿透
1.1 下载安装cpolar内网穿透 【macOS】
前提:已经安装Homebrew。详见:macOS的设置与常用软件
- 安装cpolar
brew tap probezy/core && brew install cpolar
1.2 token认证
- 注册帐号
- 查看自己的认证token
- 执行:
cpolar authtoken xxx
1.3 安装服务
- sudo cpolar service install
1.4 启动服务
- sudo cpolar service start
1.5 查看是否正常启动服务
1.6 创建隧道映射本地端口
- 使用cpolar账号登录
- 创建隧道
更正:“China Top”改为“
China VIP
”
- 查看公网地址
1.7 测试公网地址
- 本地服务器的代码:
@RequestMapping("/test")
@RestController
public class SimpleTestCpolarController {
/**
* 接收前端请求,进行接口测试
* @param data 请求参数,包含测试数据
* @return 返回测试结果,如果测试数据为空则返回null
*/
@PostMapping("interTest")
public Map<String, String> interTest(@RequestBody Map<String, String> data) {
System.out.println(data);
if (data.size() > 0) {
return data;
} else {
return null;
}
}
}
- 结果(Apifox发生http请求):
2 固定公网地址
免费套餐,随机公网地址,24小时内会随机变化,不利于长期远程访问。
- 解决办法:为其配置二级子域名,该地址为固定地址,不会随机变化。
2.1 保留一个二级子域名
需要花钱…
- 结果:
2.2 配置二级子域名
- 查看:
2.3 测试使用固定公网地址
3 Cpolar监听器
- 使用cpolar监听器(http://localhost:4040)查看接口请求日志,处理讨厌的bug。
- 甚至可以重播请求消息包,加速测试的请求,单击重放(Replay)按钮,重新发送该HTTP信令请求,而不是手动重新触发操作。
3.1 开启侦听功能
3.2 请求侦听
- 在浏览器访问本地4040端口,http://localhost:4040
- 结果:
我replay没效果… 而且,我还是习惯在apifox发起请求。
二、微信公众号开发:对接本地开发环境【内网穿透】
1 配置本地服务器
- 代码:
/**
* 微信服务调用接口
*/
@Controller
@RequestMapping("/wechat")
public class WeChatController {
// 与“微信公众号-基本配置-Token”保持一致
private static String wxToken = "xxx";
@GetMapping("")
public void weChatTestV(HttpServletRequest request, HttpServletResponse response) {
// 1、验证消息的确来自微信服务器
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
//将微信echostr返回给微信服务器
try (OutputStream os = response.getOutputStream()) {
//和signature进行对比
if (check(wxToken, signature, timestamp, nonce)) {
// 返回echostr给微信
os.write(URLEncoder.encode(echostr, "UTF-8").getBytes());
os.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean check(String token, String signature, String timestamp, String nonce) {
String[] arr = new String[]{token, timestamp, nonce};
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (String s : arr) {
content.append(s);
}
MessageDigest md;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null && tmpStr.equals(signature.toUpperCase());
}
/**
* 将字节数组转换为十六进制字符串
*/
private static String byteToStr(byte[] byteArray) {
StringBuilder strDigest = new StringBuilder();
for (byte b : byteArray) {
strDigest.append(byteToHexStr(b));
}
return strDigest.toString();
}
/**
* 将字节转换为十六进制字符串
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
return new String(tempArr);
}
}
一定要先启动!否则“2 配置微信公众号”会失败。
- 上述编码规则,详见:微信公众号-接入指南
2 配置微信公众号
- 点击“提交”后,微信服务器将发送GET请求到填写的服务器地址URL上。
因此,必须先启动本地服务!
- 结果:
点击“提交”后,本地服务就能收到请求了!
3 使用本地服务器进行微信开发(demo)
- 代码:
@PostMapping("")
public void replyMessage(@RequestParam("openid") String openid, HttpServletResponse response) {
// 简单回复
ReplyTextMessage replyTextMessage = new ReplyTextMessage()
.setToUserName(openid) // 用户向公众号发消息,现在要回复ta,也就是to ta
.setFromUserName("xxx") // 公众号设置-注册信息-原始ID
.setCreateTime(String.valueOf(System.currentTimeMillis()))
.setMsgType("text")
.setContent("Happy New Year"); // 中文无法显示
//将回复xml的数据包输出给用户
try (PrintWriter out = response.getWriter()) {
out.print(XmlUtil.beanToXml(replyTextMessage));
out.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
- 结果:
- 成功实现基于cpolar微信公众号访问本地服务!