微信开发教程 (.NET Core / .NET Framework 版)
目录
- 准备工作:你需要什么?
- 微信公众号/小程序/企业微信账号
- 开发环境 (.NET SDK / Visual Studio)
- 本地调试工具 (ngrok)
- 核心概念:服务器配置与消息接收
- 服务器配置 (URL, Token, EncodingAESKey)
- 消息签名验证 (核心安全机制)
- 接收和回复文本/图片等消息
- 高级功能:API 调用与网页授权
- 获取 Access Token (全局唯一票据)
- 自定义菜单创建
- 网页授权获取用户信息 (OAuth2.0)
- 实战项目:一个简单的自动回复机器人
- 项目结构
- 代码实现
- 部署与发布
- 进阶与资源
- 小程序开发简介
- 微信支付
- 推荐的 .NET 微信开发库
准备工作:你需要什么?
1 微信公众号账号
- 订阅号:适合媒体、个人创作者,功能相对简单,认证后可拥有高级接口。
- 服务号:适合企业、组织,功能强大,可获取用户信息、微信支付等。
- 建议:初学者使用测试号进行开发,无需认证,功能齐全,访问 微信公众平台测试号申请。
2 开发环境
- .NET SDK: 安装最新版本的 .NET SDK (推荐 .NET 6/7/8)。
- IDE: Visual Studio 2025 或 VS Code。
- 项目模板: 创建一个 ASP.NET Core 空项目 或 Web API 项目,我们以空项目为例,因为它更轻量。
3 本地调试工具
微信服务器需要通过公网 IP 访问你的服务,本地开发时,我们可以使用 ngrok 工具将本地的 localhost:5001 映射到一个公网 URL。
- 下载: ngrok 官网
- 使用:
- 启动你的 .NET 项目 (
dotnet run)。 - 在命令行中运行:
ngrok http 5001(假设你的项目运行在 5001 端口)。 - ngrok 会生成一个类似
https://xxxxxxxx.ngrok.io的公网地址,这个地址就是你用来配置微信服务器的 URL。
- 启动你的 .NET 项目 (
核心概念:服务器配置与消息接收
这是微信开发最基础也是最重要的一步。
1 服务器配置
- 登录 微信公众平台 -> 设置与开发 -> 基本配置。
- 点击“服务器配置” -> “修改配置”。
- 填写以下信息:
- URL: 你部署在公网的服务器地址,
https://xxxxxxxx.ngrok.io/api/wechat。 - Token: 可以任意填写,用于验证请求是否来自微信。
- EncodingAESKey: 随机生成或填写,用于消息加解密(可选,先不填)。
- 消息加解密方式: 选择
明文模式(最简单)。
- URL: 你部署在公网的服务器地址,
2 消息签名验证
当微信服务器向你的 URL 发送请求时,会带上几个参数:signature, timestamp, nonce, echostr,你需要验证 signature 是否正确,以确认请求来源是微信。
验证逻辑:
- 获取
token,timestamp,nonce三个参数。 - 将它们按字典序排序。
- 将排序后的三个参数字符串拼接成一个字符串,并进行
SHA1加密。 - 将加密后的字符串与微信传来的
signature进行对比,如果相同,则验证通过。
3 接收和回复消息
微信服务器向你的 URL 发送的是 POST 请求,消息格式为 XML,你的服务器需要解析这个 XML,并根据内容返回一个符合规范的 XML 响应给微信服务器,微信服务器再将这个响应推送给用户。
消息类型:
- 文本消息 (
text) - 图片消息 (
image) - 事件推送 (
event,如关注、点击菜单等)
实战项目:一个简单的自动回复机器人
我们将创建一个 ASP.NET Core 项目,实现一个能接收文本消息并自动回复的机器人。
1 项目结构
WeChatDemo/
├── Controllers/
│ └── WeChatController.cs // 处理微信所有请求的控制器
├── Models/
│ └── WeChatMessage.cs // 微信消息的C#模型
├── Services/
│ └── WeChatService.cs // 处理消息逻辑和验证逻辑
└── Program.cs
2 代码实现
安装 NuGet 包 我们使用一个强大的 .NET 微信开发库来简化开发:Senparc.Weixin。 在 NuGet 包管理器控制台中运行:
Install-Package Senparc.Weixin Install-Package Senparc.Weixin.MP // 微信公众号SDK Install-Package Senparc.Weixin.Cache.Redis // 可选,用于分布式缓存
配置 WeChatService.cs 这个类负责处理验证和消息逻辑。
// Services/WeChatService.cs
using Microsoft.AspNetCore.Mvc;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Senparc.Weixin.MP.TenPay;
public class WeChatService
{
private readonly string _token;
private readonly string _appId;
private readonly string _appSecret;
// 从 appsettings.json 中读取配置
public WeChatService(IOptions<WeChatOptions> options)
{
var weChatOptions = options.Value;
_token = weChatOptions.Token;
_appId = weChatOptions.AppId;
_appSecret = weChatOptions.AppSecret;
}
// 处理请求的核心方法
public async Task<string> HandleRequestAsync(Stream inputStream)
{
// 使用 Senparc.Weixin 提供的 MessageHandler 基类
var messageHandler = new CustomMessageHandler(inputStream, _token, _appId, _appSecret);
// Senparc.Weixin 会自动处理验证请求和消息解析
await messageHandler.ExecuteAsync();
// 返回处理结果(XML格式)
return messageHandler.ExecuteResult();
}
// 自定义消息处理逻辑
private class CustomMessageHandler : MessageHandler<CustomMessageContext>
{
public CustomMessageHandler(Stream inputStream, string token, string appId, string appSecret)
: base(inputStream, token, appId, appSecret)
{
}
// 重写文本消息处理方法
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
// 获取用户发送的文本
var receivedText = requestMessage.Content;
// 根据关键词回复不同内容
if (receivedText == "你好")
{
return new ResponseMessageText()
{
Content = "你好,欢迎使用我们的服务!"
};
}
else if (receivedText == "关于我们")
{
return new ResponseMessageNews()
{
Articles = new[]
{
new Article()
{
Title = "关于我们",
Description = "我们是一个专注于 .NET 微信开发的小团队。",
PicUrl = "https://your-image-url.com/logo.png",
Url = "https://your-website.com/about"
}
}
};
}
// 默认回复
return new ResponseTextMessage("收到您的消息:" + receivedText);
}
// 其他消息类型的处理...
public override IResponseMessageBase OnEventRequest(RequestMessageEventBase requestMessage)
{
// 处理关注事件
if (requestMessage is RequestMessageEventSubscribe)
{
return new ResponseTextMessage("感谢您的关注!回复“你好”或“关于我们”试试看。");
}
return null;
}
}
}
// 用于存放微信配置的类
public class WeChatOptions
{
public string Token { get; set; }
public string AppId { get; set; }
public string AppSecret { get; set; }
}
配置 appsettings.json
{
"Logging": { ... },
"AllowedHosts": "*",
"WeChat": {
"Token": "your_wechat_token", // 填写你在微信后台配置的Token
"AppId": "your_app_id", // 填写你的AppId
"AppSecret": "your_app_secret" // 填写你的AppSecret
}
}
在 Program.cs 中注册服务
// Program.cs
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
// 1. 读取配置
builder.Services.Configure<WeChatOptions>(builder.Configuration.GetSection("WeChat"));
// 2. 注册 Senparc.Weixin 的全局配置
// 注意:实际项目中,Senparc.Weixin 的配置应该更复杂,这里简化处理
builder.Services.AddSingleton<WeChatOAuthAccessToken>(provider =>
{
var weChatOptions = provider.GetRequiredService<IOptions<WeChatOptions>>().Value;
return new WeChatOAuthAccessToken(weChatOptions.AppId, weChatOptions.AppSecret);
});
var app = builder.Build();
// 3. 创建中间件处理微信请求
app.MapPost("/api/wechat", async (context, weChatService) =>
{
using var inputStream = context.Request.Body;
var responseXml = await weChatService.HandleRequestAsync(inputStream);
context.Response.ContentType = "text/xml; charset=utf-8";
await context.Response.WriteAsync(responseXml);
});
// 注册 WeChatService 为单例
app.Services.AddSingleton<WeChatService>();
app.Run();
创建 WeChatController.cs (可选,但推荐)
// Controllers/WeChatController.cs
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;
[ApiController]
[Route("api/[controller]")]
public class WeChatController : ControllerBase
{
private readonly WeChatService _weChatService;
public WeChatController(WeChatService weChatService)
{
_weChatService = weChatService;
}
[HttpPost]
public async Task<IActionResult> Post()
{
// 请求体就是微信发来的XML
using var reader = new StreamReader(Request.Body);
var xmlContent = await reader.ReadToEndAsync();
// 这里你可以添加日志记录 xmlContent
// 调用服务处理
var response = await _weChatService.HandleRequestAsync(Request.Body);
return Content(response, "text/xml");
}
}
4 部署与测试
- 本地测试: 使用 ngrok 启动项目,并将
https://xxxxxxxx.ngrok.io/api/wechat填入微信后台。 - 微信后台配置: 保存配置,如果配置成功,微信服务器会向你发送一个
GET请求用于验证,我们的代码会自动处理并返回echostr。 - 发送消息: 用微信关注你的测试号,发送消息 "你好",你应该能收到自动回复。
高级功能:API 调用与网页授权
1 获取 Access Token
Access Token 是调用微信接口的全局唯一票据,有效期 2 小时。
// 使用 Senparc.Weixin SDK 获取 Token var accessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetAccessToken(appId, appSecret); string token = accessToken.AccessToken;
最佳实践: 将 AccessToken 缓存起来,避免频繁调用。Senparc.Weixin 库已经内置了缓存机制,你只需正确配置即可。
2 自定义菜单创建
// 使用 SDK 创建菜单
var menu = new Menu
{
button = new List<MenuButton>
{
new ClickButton()
{
name = "点击一下",
key = "CLICK_KEY_1",
type = "click"
},
new ViewButton()
{
name = "访问官网",
url = "https://www.senparc.com",
type = "view"
}
}
};
// 创建菜单
Senparc.Weixin.MP.CommonAPIs.CommonApi.CreateMenu(accessToken.AccessToken, menu);
3 网页授权获取用户信息 (OAuth2.0)
当用户在微信中点击一个链接,你想获取他的基本信息时,需要使用网页授权。
流程:
- 用户点击链接,重定向到微信授权服务器。
- 用户同意授权。
- 微信重定向回你指定的
redirect_uri,并带上code。 - 你用
code换取access_token和openid。
实现:
// 在你的 Controller 中
[HttpGet("oauth")]
public async Task<IActionResult> OAuth()
{
// 从配置中获取 AppId
var appId = "your_app_id";
var redirectUri = "https://yourdomain.com/wechat/callback"; // 授权成功后的回调地址
var scope = "snsapi_userinfo"; // 获取用户信息
var state = "random_state_123"; // 防止CSRF攻击
// 构造微信授权URL
var authUrl = OAuthApi.GetAuthorizeUrl(appId, redirectUri, state, scope);
// 重定向到该URL
return Redirect(authUrl);
}
[HttpGet("callback")]
public async Task<IActionResult> Callback(string code, string state)
{
if (state != "random_state_123")
{
return BadRequest("Invalid state.");
}
var appId = "your_app_id";
var appSecret = "your_app_secret";
var redirectUri = "https://yourdomain.com/wechat/callback";
// 使用 code 换取 access_token
var result = OAuthApi.GetAccessToken(appId, appSecret, code, redirectUri);
if (result.errcode == ReturnCode.请求成功)
{
// 使用 access_token 和 openid 获取用户信息
var userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);
// userInfo 中包含了用户的昵称、头像、性别等信息
// 你可以在这里处理用户信息,比如登录、创建账户等
return Content($"Hello, {userInfo.nickname}! 你的头像: <img src='{userInfo.headimgurl}' />");
}
return Content("授权失败。");
}
进阶与资源
1 小程序开发简介
小程序开发基于微信提供的 WXML (类似 HTML), WXSS (类似 CSS) 和 JavaScript,后端交互依然是调用微信 API,流程与公众号类似,但 AppID 不同,你可以使用 Senparc.Weixin.MP 中的 MiniProgram 相关命名空间来处理小程序的请求和消息。
2 微信支付
微信支付流程非常复杂,涉及下单、用户扫码、支付回调、签名验证等多个环节,强烈建议使用成熟的 SDK,如 Senparc.Weixin.TenPay,它封装了绝大多数支付场景。
3 推荐的 .NET 微信开发库
- Senparc.Weixin: 强烈推荐,功能最全面、文档最完善、社区最活跃的 .NET 微信开发框架,支持公众号、小程序、企业微信、小游戏等,几乎所有功能都已为你封装好,可以节省大量开发时间。
- Microsoft.Bot.Builder: 如果你的目标是构建更通用的聊天机器人,并且希望未来能扩展到其他平台 (如 Teams, Slack),可以考虑微软的 Bot Framework。
希望这份详细的教程能帮助你顺利入门 .NET 微信开发!祝你开发愉快!
