前言
在微信公众号开发中,微信要求开发者需要拥有自己的服务器资源来响应微信发送的token验证,这个服务器只能通过域名访问,不能使用ip地址来进行访问,如果购买服务器,再购买域名,将是一笔比较大的开销,如果能将本地服务暴露出去,再使用域名去访问,不仅能简化配置,还能减少开销,达到快速开发的效果。
幸运的是,Cpolar帮您搞定这一点。 启动Cpolar并将隧道的URL粘贴到微信公众号对接服务器的URL字段中,完成!
转载自cpolar极点云文章 微信公众号开发:对接本地开发环境【内网穿透】
1. 配置本地服务器
创建本地服务,这里以java服务为例,环境配置:
- JDK1.8
- maven
- springboot
- tomcat
根据微信开发者文档的接入指南中要求,对微信的发送的get请求参数进行加密对比
在springboot服务controller编写一个微信验证的接口,根据要求获取微信传入的参数进行处理
/** * 微信服务调用接口 */ @Controller @RequestMapping("/wechat") public class WeChatTest { private static String wxToken="flzabc123"; @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()) { String sha1 = getSHA1(wxToken, timestamp, nonce, ""); //和signature进行对比 if (sha1.equals(signature)){ // 返回echostr给微信 os.write(URLEncoder.encode(echostr, "UTF-8").getBytes()); os.flush(); } } catch (Exception e) { e.printStackTrace(); } } /** * 用SHA1算法生成安全签名 * * @param token 票据 * @param timestamp 时间戳 * @param nonce 随机字符串 * @param encrypt 密文 * @return 安全签名 * @throws Exception */ public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws Exception { try { String[] array = new String[]{token, timestamp, nonce, encrypt}; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0; i < 4; i++) { sb.append(array[i]); } String str = sb.toString(); // SHA1签名生成 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } return hexstr.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } }
编写好接口后,接着启动服务,启动springboot,这里暴露的是8080端口
2. 内网穿透
这里我们使用cpolar内网穿透,将本地服务映射到公网,无需公网ip,也不用设置路由器,操作非常简单。【cpolar.cn已备案】
2.1 下载安装cpolar内网穿透
cpolar官网:https://www.cpolar.com/
访问cpolar官网,注册一个账号,并下载安装cpolar客户端。详细可以参考文档教程进行下载安装.
2.2 创建隧道
cpolar安装成功后,我们在浏览器上访问本地9200端口,登录Cpolar的web ui界面:http://localhost:9200。
点击左侧仪表盘的隧道管理——创建隧道,我们来创建一条隧道,将在本地8080端口下的web服务映射到公网:
- 隧道名称:可自定义,注意不要与已有隧道名称重复
- 协议:http协议
- 本地地址:80
- 域名类型:免费选择随机域名
- 地区:选择China VIP
点击创建
提示隧道创建成功后,页面自动跳转至隧道列表,可以看到刚刚创建成功的tunnel-1隧道,状态active,表示为正常在线,注意无需再次点击启动。
点击左侧仪表盘的状态——在线隧道列表,可以看到刚刚创建的隧道已经有生成了相应的公网地址,一个http协议,一个https协议(免去配置ssl证书的繁琐步骤),均可以访问到本地web服务,复制公网地址。
3. 测试公网访问
打开微信公众平台公众号页面,点击下面的基本配置,在URL框中填写复制的公网地址,
出现提交成功表示验证成功
点击启用服务器配置,出现操作成功表示启用成功