本地调试微信公众号接口(非回调类)
你说得非常对,这里其实涉及两类接口,性质完全不同:
一、需要域名(微信服务器主动推送)
这类接口是微信服务器向你的服务器发请求,所以你的程序必须能被外网访问:
| 场景 | 说明 |
|---|---|
| 接收用户消息 | 用户给公众号发文字、图片等 |
| 事件推送 | 关注/取消关注、菜单点击、扫码等 |
| 网页授权回调 | 用户授权后微信跳转回 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)映射到本地 |
| 测试/生产环境 | 部署到服务器,配真实域名 |
调试技巧
- Token 缓存后本地调试更高效:配合上一节课的
CacheOrLoad方法,Token 两小时内不重复请求,本地调试基本秒响应。 - 用 Postman 也能直接测:这些 API 本质上就是 HTTPS 请求,拿到 access_token 后,Postman 里直接填参数就能调。
- 区分两类接口写代码:可以把主动调用微信 API 的逻辑封装成 Service 类,不依赖 HttpContext,方便本地单元测试。
Previous: 17-Token使用缓存的方式来存储