18-非微信服务器推送给我们系统的消息可以本地local域名来测试

本地调试微信公众号接口(非回调类)

你说得非常对,这里其实涉及两类接口,性质完全不同:

一、需要域名(微信服务器主动推送)

这类接口是微信服务器向你的服务器发请求,所以你的程序必须能被外网访问:

场景说明
接收用户消息用户给公众号发文字、图片等
事件推送关注/取消关注、菜单点击、扫码等
网页授权回调用户授权后微信跳转回 redirect_uri

这些情况下微信服务器需要能访问到你的 URL,所以必须配置:

  • 外网域名(如 2l1941590s.imwork.net)
  • 或内网穿透工具(花生壳、ngrok、frp 等)

这也是为什么之前要在测试账号里配接口地址、配网页授权回调域名的原因。

二、不需要域名(主动调用微信 API)

这类接口是你的服务器主动请求微信服务器,微信不会反向访问你,所以完全不需要外网可达:

场景接口
获取 AccessToken/cgi-bin/token
获取用户列表/cgi-bin/user/get
获取用户信息/cgi-bin/user/info
创建/删除菜单/cgi-bin/menu/create
发送模板消息/cgi-bin/message/template/send
设置行业/cgi-bin/template/api_set_industry
获取模板列表/cgi-bin/template/get_all_private_template
群发消息/cgi-bin/message/mass/send

这些接口本质上就是 HTTP POST/GET 请求微信的 API 服务器,跟你在浏览器里访问一个网址没区别。

本地调试方式

所以你可以直接在本地用 localhost 或 127.0.0.1 跑项目,直接调用这些接口:

// 本地直接调试,不需要域名
public ActionResult TestGetToken()
{
    var token = GetAccessToken(); // 缓存版,7200秒有效
    return Content(token);
}

public ActionResult TestGetUserList()
{
    var url = $"https://api.weixin.qq.com/cgi-bin/user/get?access_token={GetAccessToken()}";
    var json = HtmlHelper.HttpGet(url);
    return Content(json);
}

public ActionResult TestCreateMenu()
{
    // 创建菜单,本地直接发请求即可
    var handler = new MenuCreateHandle();
    var result = handler.DoPost<dynamic>();
    return Json(result);
}Code language: PHP (php)

访问 http://localhost:端口号/home/TestGetToken 就能直接调通。

实际开发建议

场景推荐做法
开发阶段(主动调用API)本地 localhost 直接调试,快速方便
开发阶段(接收消息/事件)用内网穿透(花生壳/ngrok)映射到本地
测试/生产环境部署到服务器,配真实域名

调试技巧

  1. Token 缓存后本地调试更高效:配合上一节课的 CacheOrLoad 方法,Token 两小时内不重复请求,本地调试基本秒响应。
  2. 用 Postman 也能直接测:这些 API 本质上就是 HTTPS 请求,拿到 access_token 后,Postman 里直接填参数就能调。
  3. 区分两类接口写代码:可以把主动调用微信 API 的逻辑封装成 Service 类,不依赖 HttpContext,方便本地单元测试。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注