当前位置: 首页 > news >正文

如何远程通过内网穿透实现微信公众号在本地的完整调试

文章目录

  • 前言
  • 1. 配置本地服务器
  • 2. 内网穿透
    • 2.1 下载安装cpolar内网穿透
    • 2.2 创建隧道
  • 3. 测试公网访问
  • 4. 固定域名
    • 4.1 保留一个二级子域名
    • 4.2 配置二级子域名
  • 5. 使用固定二级子域名进行微信开发

前言

在微信公众号开发中,微信要求开发者需要拥有自己的服务器资源来响应微信发送的token验证,这个服务器只能通过域名访问,不能使用ip地址来进行访问,如果购买服务器,再购买域名,将是一笔比较大的开销,如果能将本地服务暴露出去,再使用域名去访问,不仅能简化配置,还能减少开销,达到快速开发的效果。

幸运的是,Cpolar帮您搞定这一点。 启动Cpolar并将隧道的URL粘贴到微信公众号对接服务器的URL字段中,完成!

1. 配置本地服务器

创建本地服务,这里以java服务为例,环境配置:

  • JDK1.8
  • maven
  • springboot
  • tomcat

根据微信开发者文档的接入指南中要求,对微信的发送的get请求参数进行加密对比

202301161502

在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端口

202301161502

2. 内网穿透

这里我们使用cpolar内网穿透,将本地服务映射到公网,无需公网ip,也不用设置路由器,操作非常简单。【cpolar.cn已备案】

2.1 下载安装cpolar内网穿透

cpolar官网:https://www.cpolar.com/

访问cpolar官网,注册一个账号,并下载安装cpolar客户端。详细可以参考文档教程进行下载安装.

20230116153634

2.2 创建隧道

cpolar安装成功后,我们在浏览器上访问本地9200端口,登录Cpolar的web ui界面:http://localhost:9200。

点击左侧仪表盘的隧道管理——创建隧道,我们来创建一条隧道,将在本地8080端口下的web服务映射到公网:

  • 隧道名称:可自定义,注意不要与已有隧道名称重复
  • 协议:http协议
  • 本地地址:80
  • 域名类型:免费选择随机域名
  • 地区:选择China VIP

点击创建

202301161503

提示隧道创建成功后,页面自动跳转至隧道列表,可以看到刚刚创建成功的tunnel-1隧道,状态active,表示为正常在线,注意无需再次点击启动。

点击左侧仪表盘的状态——在线隧道列表,可以看到刚刚创建的隧道已经有生成了相应的公网地址,一个http协议,一个https协议(免去配置ssl证书的繁琐步骤),均可以访问到本地web服务,复制公网地址。

202301161504

3. 测试公网访问

打开微信公众平台公众号页面,点击下面的基本配置,在URL框中填写复制的公网地址,

202301161505

出现提交成功表示验证成功

202301161506

点击启用服务器配置,出现操作成功表示启用成功

202301161507

4. 固定域名

由于以上配置的公网地址使用的是随机地址,在24小时内会随机变化,为了使服务更稳定运行,建议必须配置固定域名地址。

注意需要将cpolar套餐升级至基础套餐或以上。【cpolar.cn已备案】

4.1 保留一个二级子域名

访问Cpolar官网www.cpolar.com,登录cpolar官网后台,点击左侧的预留,找到保留二级子域名:

  • 地区:选择China VIP
  • 二级域名:可自定义填写
  • 描述:即备注,可自定义填写

点击保留

202301161508

提示子域名保留成功,复制所保留的二级子域名

202301161509

4.2 配置二级子域名

访问http://127.0.0.1:9200/,登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到刚刚创建的http微信开发隧道,点击右侧的编辑

202301161510

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名

点击更新

202301161511

更新完后,再次打开在线隧道列表,此时可以看到,隧道变成了固定的二级子域名,名称是我们在官网保留的wechat,然后复制该域名

202301161512

5. 使用固定二级子域名进行微信开发

打开微信公众平台——公众号页面,点击基本配置,修改URL的值,修改前需要点击停用服务器配置,替换后点击提交

202301161513

出现提交成功表示替换成功

202301161514

接着,点击启动服务器配置,出现操作成功表示成功,接下来就可以使用本地服务器进行微信开发啦

202301161515

转载自cpolar极点云文章:微信公众号开发:对接本地开发环境【内网穿透】

http://www.lryc.cn/news/198759.html

相关文章:

  • 【LeetCode刷题(数据结构与算法)】:合并两个有序链表
  • spark DStream从不同数据源采集数据(RDD 队列、文件、diy 采集器、kafka)(scala 编程)
  • 【三:Mock服务的使用】
  • 驱动:驱动相关概念,内核模块编程,内核消息打印printk函数的使用
  • 【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件
  • 【Java基础面试二十四】、String类有哪些方法?
  • [DRAFT] LLVM ThinLTO原理分析
  • 使用Gitlab构建简单流水线CI/CD
  • 【AIGC核心技术剖析】用于高效 3D 内容创建生成(从单视图图像生成高质量的纹理网格)
  • nginx平滑升级添加echo模块、localtion配置、rewrite配置
  • 系统架构师备考倒计时19天(每日知识点)
  • 谈谈 Redis 如何来实现分布式锁
  • .NET 6.0 Web API Hangfire
  • 基于java的校园论坛系统,ssm+jsp,Mysql数据库,前台用户+后台管理,完美运行,有一万多字论文
  • Django小白开发指南
  • 保序回归与金融时序数据
  • 基于单片机设计的家用自来水水质监测装置
  • ubuntu20.04运用startup application开机自启动python程序
  • SpringBoot整合Caffeine实现缓存
  • DVWA-弱会话IDS
  • 【C++中cin、cin.get()、cin.getline()、getline() 的区别】
  • SSH连接华为交换机慢
  • Web攻防03_MySQL注入_数据请求
  • JS加密/解密那些必须知道的事儿
  • 搭建伪分布式Hadoop
  • 【C++】特殊类的设计(只在堆、栈创建对象,单例对象)
  • 分类预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入分类预测
  • 【Spring Boot项目】根据用户的角色控制数据库访问权限
  • EthernetIP 转MODBUS RTU协议网关连接FANUC机器人作为EthernetIP通信从站
  • 如何注册微信小程序