惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cisco Talos Blog
Cisco Talos Blog
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
J
Java Code Geeks
博客园_首页
Scott Helme
Scott Helme
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
V
Visual Studio Blog
Cloudbric
Cloudbric
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
The Last Watchdog
The Last Watchdog
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
W
WeLiveSecurity
K
Kaspersky official blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hacker News: Ask HN
Hacker News: Ask HN
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
量子位
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 三生石上(FineUI控件)
Recent Commits to openclaw:main
Recent Commits to openclaw:main

博客园 - SZW

微信 SDK + Senparc.AI + MCP 打造微信 AI 开发助手(二):在 Cursor、VS Code 等 IDE 中自动编写 微信 SDK + Senparc.AI + MCP 打造微信 AI 开发助手(一):网页版 Senparc.AI 系列教程(二):配置大模型,开始开发应用 Senparc.AI 系列教程(一):概要 Senparc 基础库全面适配 .NET 8.0 Senparc.Weixin SDK 微信平台开发教程(二十四):顺应 GenAI 应用,自动“续航”回复超长文本消息 微信新菜单类型 article_id 设置教程 微信 CLI 工具正式发布 v1.0 微信支付 V3 开发教程(一):初识 Senparc.Weixin.TenPayV3 [备忘]如何备份 VPN 文件 - SZW 动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建) [备忘] 解决 rzc discover exited with code -2147450730 问题 “此 Url 可用于服务器 token 签名校验”提示 1个类,2个方法,3句代码,完成微信公众号开发的极简流程 [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo [备忘]使用 .NET Core 模板生成时,在 .csproj 文件中使用条件编译的注意点 [备忘]处理错误:Your project does not reference ".NETFramework,Version=v4.5" framework. Add a reference to ".NETFramework,Version=v4.5" in the "TargetFrameworks" ... WeChatSampleBuilder V2.0 使用教程(网页版+桌面版) SCF(SenparcCoreFramework) 系列教程(一):项目介绍及快速搭建
在开发环境内网穿透测试微信公众号
SZW · 2021-05-15 · via 博客园 - SZW

前言

  上一篇《1个类,2个方法,3句代码,完成微信公众号开发的极简流程》介绍了一个只用很少量的代码,就能实现消息回复和高级接口两大经典微信应用。

  文末,我们对开发完的程序进行了测试,并且抛出了一个问题:

我没有服务器,也没有注册微信公众号,如何在本地完成以上所有上线操作和测试呢?

   本文就将带你亲自实现内网穿透,在本地环境下,模拟正式环境服务器对接微信,并进行调试。本文同样适用于微信小程序、企业微信、QQ小程序等其他需要穿透到内网测试的场景。

  在上一篇已经完成的基础上,本篇主要内容边看边练习的时间约为 15 分钟,进阶内容约为 10 分钟,源码已经开放:

内容导航

背景

  微信公众号的服务原理如下图所示:  

来源:http://book.weixin.senparc.com/BookHelper#c-40

  微信用户发送给公众号的信息,经微信服务器中转处理成约定的格式后,转发给开发者的服务器(网站),然后再将网站返回的指定格式的消息经过处理转发给微信用户。

  这个过程中,对于正式的公众号来说,“网站”必须配有经过 ICP 备案的域名,也就是说必须部署在正规机房或特殊地点,而不能是一般的家中或公司中。

  这就带来了篇头所说的问题,如果我现在手里没有服务器、没有域名,或者即使有了,我也不想每次都部署,而是在本地进行运行和调试,那应该怎么做呢?

  这就牵出了一个技术:内网穿透。

  关于内网穿透的方案有很多,这里不一一列举,仅介绍其中我觉得最简便的方案之一:ngrok  —— 只需一行命令即可完成整个穿透过程。

安装 ngrok

  ngrok 的官网:https://ngrok.com/

  点击 Download 即可下载,下载后解压安装到本地目录,如 D:\ngrok,文件夹下面只有一个文件,非常清爽:

使用 ngrok 进行内网穿透

  按照《1个类,2个方法,3句代码,完成微信公众号开发的极简流程》中的流程,运行项目(一定要确保正在运行),在运行状态中找到对应的 Url 地址:

  

  使用命令行进入 D:\ngrok 目录,输入命令:ngrok http http://localhost:45638

   注意:这里使用的是 http,而不是 https,至于为什么现在只能使用 http,下文会解释。

  运行之后,即可启动 ngrok 的代理程序:

  此时我们获得了1个随机的公网域名(每次启动 ngrok 都会变),同时支持 http 和 https 访问(映射到的都是内网的 http):

  • http://bb2042af5b6a.ngrok.io 
  • https://bb2042af5b6a.ngrok.io 

  我们访问一下这两个域名,发现都返回了错误:

    如果看到 400 Bad Request 的错误页面,不用着急,按 Ctrl+C 退出程序,修改一下命令为:

D:\ngrok>ngrok  http http://localhost:45638 --host-header="localhost:45638"

(如果端口好不同,对应修改)

  重新运行后将获得新的随机域名:

   访问 https://704728067974.ngrok.io 临时域名,此时已经又看到了熟悉的画面:

   太棒了!得到这个“小确信”的页面后,就可以放心进行配置了。

配置测试号

  由于正式的公众号必须要 ICP 备案的国内域名才可以对接,显然这个域名并不满足条件,但是作为测试,我们可以使用测试账号,为了方便大家查找入口,我们在线上Demo(https://sdk.weixin.senparc.com/)提供了快捷入口:

  点击进入后,即可用每个人的个人微信扫码,“领用”到一个测试号(每个个人微信唯一):

  

   记录下【测试号信息】中的 appID 和 appsecret 参数,分别填写到 appsetting.json 中的 “WeixinAppId” 和 “WeixinAppSecret” 值中(如果不需要使用高级接口,只处理消息回复的话,则不需要用到这两个参数,可以忽略)。

  同时将 appsettings.json 中的 "Token" 自定义一个更加复杂的值(3-32个字符),稍后会用到。

   设置 appsetting.json

  随后点击页面【接口配置信息】后面的【修改】按钮,输入刚才设置的 Token,以及 ngrok 正在运行中的消息页面地址(注意:必须是带有消息接口完整路径的地址),如本例中的:

 设置 URL & Token | https://704728067974.ngrok.io/WeixinAsync

  注意:修改 appsetting.json 之后需要重启站点(此时千万不要重启 ngrok,否则需要重新到后台设置 URL)

  重启后,点击【提交】按钮,即可看到设置成功的界面:

设置成功 

联机测试 

   将页面向下拉,可以看到个人测试号的二维码,用微信扫一扫,并关注(最多可以添加100个关注者)

扫码注册

   关注之后,即可在手机上看到这个测试公众号的界面,每次发送消息后,即可看到两条回复,第一条是通过高级接口(AppId + Secret)发送的,你可以尝试一下一口气多发几条,第二条是正式的回复消息,每次最多只能收到1条,因为程序中是先调用了高级接口(客服消息),然后返回回复信息,因此客户端先收到的就是客服消息。

  如果我们不发送文字信息,而是一个图片信息,系统会发现我们并没有重写图片处理过程,因此返回的是默认消息。

 消息回复成功,穿透到内网服务器

调试

  穿透到内网之后,可以非常方便地进行调试,我们使用调试模式打开站点,并且在文字回复信息返回之前设置一个断点:

开始调试 

  当我们在客户端发送一条文字消息之后,即可在调试模式下看到收到的消息,以及即将回复的信息。其中客服消息应该在断点之前就运行了,因此微信客户端立即就能收到。

  但因为调试时间超过了 5 秒钟,超过了微信服务器等待的时间,因此客户端收到了“该公众号提供的服务出现故障”的提示,此时,我们超时回复的消息将被忽略。

 发送消息

  下面我们再试一次,在5秒内快速修改返回内容:

 成功调试并修改信息

  这一次,前面 2 个步骤和之前是一致的,我们使用【即使窗口】输入命令修改了 responseMessage.Content 的值,然后让程序继续运行,返回属性值后的 responseMessage 对象,最后在手机端收到了被修改的回复信息。

查看日志

  Senparc.Weixin SDK 在默认设置下,会记录所有的消息和接口调用信息。

  消息发送和返回的日志,可以在 /App_Data/WeChat_OfficialAccount 目录下看到已经按照日期分类的公众号消息日志,以上述经过调试的消息为例:

一组 Request(请求)和 Response(响应)消息日志 

  高级接口的调用信息默认存放在 /App_Data/SenparcTraceLog 目录下,每天的日志放在一个 .log 文件中:

  高级接口的调用及传送信息可以完全透明地看到

进阶

  1. 如何使用 ngrok 映射到内部 https 协议的网址上?

  ngrok 默认情况下只支持映射内网的 http 协议,如果强行映射 https,则会提示错误,如果必须要映射内网 https,则需要到官网(https://ngrok.com/)注册一个账号。

  这里有一个小提示:常规注册过程需要使用到 Google 的 reCAPTCHA 验证,对于“原始”状态访问互联网的同学可能因此无法完成注册过程,此处建议直接使用 GitHub 等外部账号授权登录,可以跳过这个尴尬的异步。

  注册完成后进入后台(https://dashboard.ngrok.com/get-started/setup)就可以找到一个 authtoken:

  复制这一段令牌信息,打开桌面命令行,进入 ngrok 目录,输入:

D:\ngrok>ngrok authtoken 6vwCLn**********************

储存 authtoken

   ngrok 会把这个令牌自动存入到本地文件中,以后再调用 ngrok 的命令,就是“持证上岗”啦!

  下面我们修改一下之前的 http 绑定为 https 绑定:

D:\ngrok>ngrok http https://localhost:44368 -host-header="localhost:44368"

(注意:http 和 https 的端口是不一样的)

  运行后可以看到 ngrok 已经并订到了内网的 https 协议地址上:

成功绑定 https

   当然,也可以注意到外网域名已经发生了变化,如果需要继续使用的话,需要再次到微信测试号后台绑定新域名。

  如果需要自定义域名(固定),那么需要购买对应的服务才能开通权限。即使每次都变化,如果电脑不重启的话(亲测系统休眠和睡眠都没问题),可以一直使用,所以并不是特别大的痛点。

  2. 如何关闭日志?

  Senparc.Weixin SDK 将日志分为了消息日志和调试日志(包含接口调用信息),默认为开启状态,如果不希望记录消息,可以通过如下方法关闭。

  2.1 关闭消息日志

  修改之前写入到 Startup.cs 中的中间件配置,添加禁用代码:

1             //使用中间件注册 MessageHandler,指定 CustomMessageHandler 为自定义处理方法
2             app.UseMessageHandlerForMp("/WeixinAsync",
3                 (stream, postModel, maxRecordCount, serviceProvider) => new CustomMessageHandler(stream, postModel, maxRecordCount, serviceProvider),
4                 options =>
5                 {
6                     options.AccountSettingFunc = context => senparcWeixinSetting.Value;
7                     options.EnableRequestLog = false;   //关闭请求消息日志
8                     options.EnbleResponseLog = false;   //关闭响应消息日志
9                 });

  为了达到更好的灵活性,我们将 Request(请求)和 Resposne(响应)消息的日志记录状态进行了分离的管理。

  2.1 关闭接口日志

  接口日志必须在调试状态下开启,默认为开启状态,如果需要禁用,可以在执行完 app.UseSenparcGlobal() 方法后的任意位置调用:

1             Senparc.CO2NET.Config.IsDebug = false;  //关闭全局调试状态,不记录日志

  添加以下 3 行代码将全面禁用调试日志(包括接口调用日志)以及消息请求/响应日志:

   特别说明:本文所提供的“内网穿透”技术是一项常见的辅助信息调试的技术,仅供用于本项目测试使用,请勿用于违规用途!

更多微信开发教程:

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(二):成为开发者
  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题
  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明
  11. Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明
  12. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
  13. Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明
  14. Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重
  15. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密
  16. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
  17. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
  18. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
  19. Senparc.Weixin.MP SDK 微信公众平台开发教程(十九):MessageHandler 的未知类型消息处理
  20. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能
  21. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
  22. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
  23. 【番外篇】1个类,2个方法,3句代码,完成微信公众号开发的极简流程