- 后端
- 即时通讯
- 金融科技
【免费下载链接】WeiXinMPSDK
微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
本文基于仓库根目录的 readme.en.md(英文版项目说明)展开,覆盖 Senparc.Weixin 的平台能力版图、NuGet 模块体系、"三行代码"启动流程、AccessToken 全生命周期托管机制与 MessageHandler 消息处理中间件的完整用法。读完本文,你将掌握在 .NET 6/8/10 环境下从零搭建一个微信公众号应用、调用高级接口并接收用户消息的完整路径,且每一步都能在仓库源码中找到对应实现。
项目定位与平台能力版图
Senparc.Weixin 是一个覆盖微信全生态的 .NET SDK。根据其英文版说明文档,它可以支撑以下平台的开发:
- 微信公众号(Official Account / MP)
- 小程序与小游戏(Mini Program / Mini Game / WxOpen)
- 企业微信(Enterprise WeChat / Work)
- 微信开放平台(Open Platform)
- 微信支付 V2 与 V3(TenPay / TenPayV3)
- JS-SDK、微信硬件/蓝牙等周边能力
框架层面,当前仓库同时提供面向.NET Framework 4.6.2+(对应 .NET Standard 2.x)与 .NET 10.0(向下兼容 .NET 5.0–9.0)的多目标工程,历史上还支持 .NET 3.5 / 4.0 / 4.5、.NET Core 2.x / 3.x。文档明确说明 SDK 与外部框架完全解耦,可运行在 MVC、Razor、WebApi、Console 命令行、桌面应用(.exe)、Blazor、MAUI、后台服务等多种宿主环境——这正是其各核心库仅依赖 .NET Standard 2.0 的设计目标。
功能支持清单(Feature Support)
readme.en.md 中的 Feature Support 章节列出了 SDK 的核心能力,完整继承如下:
- 支持大部分微信 8.x 接口,包括微信支付、自定义菜单/个性化菜单、模板消息接口、素材上传接口、群发消息接口、客服接口、支付接口、微信卡券接口、发票接口等;
- 支持公众号、小程序、企业号、开放平台、微信支付等模块化拆分;
- 支持用户会话上下文(MessageContext),解决服务端无法使用 Session 管理用户信息的经典问题;
- 支持分布式缓存与缓存策略扩展:默认内置本地缓存、Redis、Memcached,并可自由扩展,开发时无需关心具体缓存实现,可在配置文件或运行时切换。
文档还给出两条工程化承诺:官方接口"完全融合且升级尽量保证向后兼容",开发者可放心通过 NuGet 直接升级 DLL;也可以自行修改源码后编译——在Release模式下构建 Samples/All/net8-mvc 或 Samples/All/net10-mvc 解决方案,可自动在/src/BuildOutPut/生成多版本 NuGet 包。
模块库与 NuGet 包体系
各微信模块被解耦为独立 DLL 与独立 NuGet 包,可按需引用。readme.en.md 的 "Libraries by Module" 表格完整列出(下表已去除外部徽章链接,改为仓库内对应源码路径):
| # | 模块 | DLL | 源码位置 |
|---|---|---|---|
| 1 | 核心库 | Senparc.Weixin.dll | src/Senparc.Weixin |
| 2 | 公众号 / JSSDK / 摇一摇等 | Senparc.Weixin.MP.dll | src/Senparc.Weixin.MP |
| 3 | 小程序(含小游戏) | Senparc.Weixin.WxOpen.dll | src/Senparc.Weixin.WxOpen |
| 4 | 微信支付 V2 | Senparc.Weixin.TenPay.dll | src/Senparc.Weixin.TenPay |
| 5 | 微信支付 V3 | Senparc.Weixin.TenPayV3.dll | src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3 |
| 6 | ASP.NET MVC 扩展 | Senparc.Weixin.MP.MvcExtension.dll | src/Senparc.Weixin.MP.MvcExtension |
| 7 | 企业号(已停止运营) | Senparc.Weixin.QY.dll | 历史模块(NuGet 仍可引用) |
| 9 | 企业微信 | Senparc.Weixin.Work.dll | src/Senparc.Weixin.Work |
| 9 | 微信开放平台 | Senparc.Weixin.Open.dll | src/Senparc.Weixin.Open |
| 10 | Redis 分布式缓存 | Senparc.Weixin.Cache.Redis.dll | src/Senparc.Weixin.Cache |
| 11 | Memcached 分布式缓存 | Senparc.Weixin.Cache.Memcached.dll | src/Senparc.Weixin.Cache |
| 12 | WebSocket(独立项目) | Senparc.WebSocket.dll | src/Senparc.WebSocket |
| 13 | 全家桶 | Senparc.Weixin.All.dll | src/Senparc.Weixin.All |
此外还有三个 Web 宿主配套包:Senparc.Weixin.MP.Middleware/Senparc.Weixin.Work.Middleware/Senparc.Weixin.WxOpen.Middleware(消息处理中间件,源码分别在 src/Senparc.Weixin.MP.Middleware 等目录)以及Senparc.Weixin.AspNet(Web 支持类库,src/Senparc.Weixin.AspNet)。
兼容性与版本约束(来自原文档的 WARNING 提示):.NET Framework 3.5 / 4.0 自 2019 年 5 月 1 日起不再更新;.NET Framework 4.5 自 2022 年 4 月起被 4.6.2 取代;若继续使用 .NET Framework,文档建议按微软生命周期计划在支持结束前升级至 4.8+。需要一次性引用所有模块时,直接引用
Senparc.Weixin.All即可。
Hello World:三行代码启动微信开发
readme.en.md 的核心卖点是一套极简启动流程:"用 3 句代码开启微信开发之旅"。以下以 Samples/MP/Senparc.Weixin.Sample.MP 为蓝本(原文档同样以此示例目录为准),逐步拆解并对照源码。
第一步:DI 容器注册(一行代码)
在Program.cs的builder.Build()之前添加:
builder.Services.AddSenparcWeixinServices(builder.Configuration);若使用旧格式Startup.cs,该行放入ConfigureServices()。该扩展方法定义在 src/Senparc.Weixin/Senparc.Weixin/RegisterServices/SenparcWeixinRegisterServiceExtension.cs:AddSenparcWeixinServices实际是AddSenparcWeixin的别名,二者都会从IConfiguration中读取SenparcSetting与SenparcWeixinSetting两个配置节并注入 Options,同时自动包含 CO2NET 全局服务注册(AddSenparcGlobalServices)。
对照真实示例 Samples/MP/Senparc.Weixin.Sample.MP/Program.cs,实际写法为builder.Services.AddSenparcWeixin(builder.Configuration);,并且在使用内存缓存时还需要builder.Services.AddMemoryCache();。
第二步:启用微信配置并注册账号(一行代码)
在builder.Build()之后调用:
var registerService = app.UseSenparcWeixin(app.Environment, null, null, register => { }, (register, weixinSetting) => { // 注册公众号信息(可以执行多次,注册多个公众号) register.RegisterMpAccount(weixinSetting, "【盛派网络小助手】公众号"); });使用旧格式Startup.cs时放入Configure()。各参数含义可从 src/Senparc.Weixin/Senparc.Weixin/WeixinRegister.cs 的源码注释中确认:
- 前两个
null分别表示"覆盖 appsettings 中已读取的 SenparcSetting / SenparcWeixinSetting 配置",传null即沿用配置文件值; - 第三个
register => { }是 CO2NET 全局配置委托; - 第四个委托执行各平台账号的实际注册。
RegisterMpAccount的实现在 src/Senparc.Weixin.MP/Senparc.Weixin.MP/Register.cs:带ISenparcWeixinSettingForMP参数的重载会从SenparcWeixinSetting中提取 AppId/AppSecret,写入全局配置字典(键为自定义name,便于管理员识别多个公众号),最终调用AccessTokenContainer.Register(appId, appSecret, name)完成 AccessToken 容器的注册。
自动注册模式:如果引用了Senparc.Weixin.All,可以追加autoRegisterAllPlatforms: true,让 SDK 自动注册所有已配置平台的账号,注册委托留空即可:
var registerService = app.UseSenparcWeixin(app.Environment, null, null, register => { }, (register, weixinSetting) => { /* 无需手动注册 */ }, autoRegisterAllPlatforms: true /* 自动注册所有平台 */);配置项:appsettings.json 中的两个配置节
注册信息来自 Samples/MP/Senparc.Weixin.Sample.MP/appsettings.json,包含两个关键节,key 不可修改(改了会被视为无法自动识别),不用的参数可整条删除,但字符串值不允许留空串:
{ "SenparcSetting": { "IsDebug": true, "DefaultCacheNamespace": "DefaultCache", "Cache_Redis_Configuration": "#{Cache_Redis_Configuration}#", "Cache_Memcached_Configuration": "#{Cache_Memcached_Configuration}#", "SenparcUnionAgentKey": "#{SenparcUnionAgentKey}#" }, "SenparcWeixinSetting": { "IsDebug": true, "Token": "#{Token}#", "EncodingAESKey": "#{EncodingAESKey}#", "WeixinAppId": "#{WeixinAppId}#", "WeixinAppSecret": "#{WeixinAppSecret}#" } }SenparcSetting:CO2NET 全局配置,含分布式缓存连接串(Redis/Memcached,不用可删除);SenparcWeixinSetting:微信全局配置。Token必须与微信公众平台后台【设置与开发】>【基本配置】中设置的 Token 一致,EncodingAESKey为消息加解密密钥,WeixinAppId/WeixinAppSecret为公众号应用凭据。示例中的#{...}#是 CI 占位符,实际使用时替换为明文即可。
第三步:调用高级接口(一行代码)
在程序任意位置直接调用微信接口(以客服消息为例):
await CustomApi.SendTextAsync("AppId", "OpenId", "Hello World!");原文档给出四条重要提示,均有源码依据:
- AccessToken 全生命周期自动托管——开发时只需提供 AppId,无需处理 token 过期。这一点可从 src/Senparc.Weixin.MP/Senparc.Weixin.MP/Containers/AccessTokenContainer.cs 的文件头注释确认:"通用接口AccessToken容器,用于自动管理AccessToken,如果过期会重新获取";
- 注册信息自动注入:AppId 等注册信息从全局的
Senparc.Weixin.Config.SenparcWeixinSetting获取,其值在UseSenparcWeixin初始化流程中写入(见 WeixinRegister.cs); - 同步版本同样可用:
Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(); - 命名贴合官方文档:所有接口的命名空间参照微信官方 API 路径规则定义,参数命名尽量与官方文档一致(尤其是返回字段),便于在源码中快速定位、降低对接出错概率。
原文档特别强调:以上"两行启动 + 一行调用"的模式对所有微信模块通用,学会公众号即可举一反三到小程序、企业微信、微信支付。
公众号消息对话:MessageHandler 两步接入
公众号自带聊天窗口,可收发文字、图片、语音等消息。SDK 提供MessageHandler抽象机制将消息分发封装为"重写对应请求处理方法"的模式,同样适用于企业微信和小程序客服消息。接入只需两步。
第一步:创建自定义 MessageHandler
继承MessageHandler<TMC>(示例使用默认消息上下文DefaultMpMessageContext),重写需要处理的OnXXRequestAsync方法与兜底的DefaultResponseMessage:
using Senparc.NeuChar.Entities; using Senparc.Weixin.MP.Entities; using Senparc.Weixin.MP.Entities.Request; using Senparc.Weixin.MP.MessageContexts; using Senparc.Weixin.MP.MessageHandlers; namespace Senparc.Weixin.Sample.MP { /// <summary> /// 自定义 MessageHandler /// 把 MessageHandler 作为基类,重写对应请求的处理方法 /// </summary> public partial class CustomMessageHandler : MessageHandler<DefaultMpMessageContext> { public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false, IServiceProvider serviceProvider = null) : base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage, null, serviceProvider) { } /// <summary> /// 所有未处理类型的默认消息 /// </summary> public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) { // ResponseMessageText 也可以是 News 等其他类型 var responseMessage = this.CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = "你发送了一条消息,但程序没有指定处理过程"; return responseMessage; } public override Task<IResponseMessageBase> OnImageRequestAsync(RequestMessageImage requestMessage) { // 处理图片请求... } public override Task<IResponseMessageBase> OnLocationRequestAsync(RequestMessageLocation requestMessage) { // 处理地理位置请求... } } }对照完整示例 Samples/MP/Senparc.Weixin.Sample.MP/MessageHandlers/CustomMessageHandler.cs,可以补充理解几个生产细节:
OnTextRequestAsync中演示了requestMessage.StartHandler()的关键字路由链:支持精确关键字(不区分大小写、按序匹配)、Keywords批量匹配、Regex正则匹配、Default兜底,比 if-else 判断Content更清晰;- 构造函数中
OnlyAllowEncryptMessage = true可强制只接收加密消息以提升安全性; GlobalMessageContext.ExpireMinutes控制消息上下文(会话)的缓存过期时间;OnUnknownTypeRequestAsync用于兜底 SDK 尚未提供的未知消息类型,可从requestMessage.RequestDocument拿到原始 XML;- 通过重写
OnExecutingAsync/OnExecutedAsync可以在每次消息执行前后读写MessageContext.StorageData,实现跨请求的用户状态存储。
第二步:注册消息入口
SDK 提供Middleware(推荐)与Controller(或 WebApi)两种接入方式,任选其一。以中间件为例,在Program.cs中启用配置后追加:
app.UseMessageHandlerForMp("/WeixinAsync", (stream, postModel, maxRecordCount, serviceProvider) => new CustomMessageHandler(stream, postModel, maxRecordCount, false, serviceProvider), options => { options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting; });该扩展方法定义于 src/Senparc.Weixin.MP.Middleware/MessageHandlers/Middleware/MpMessageHandlerMiddleware.cs。从源码结构看,中间件会完成全部"脏活":MpMessageHandlerMiddleware.GetPostModel(同文件 L126-L141)自动从请求 Query 中读取signature、timestamp、nonce、msg_signature,并从AccountSettingFunc提供的配置中填充Token、AppId、EncodingAESKey,随后默认调用messageHandler.ExecuteAsync()执行消息处理并回写 XML 响应——因此不需要编写任何 Controller,GET 请求的 URL 校验(GetEchostr直接回显echostr)也由中间件一并处理。
options中的TextResponseLimitOptions用于设置文本回复长度上限,配合 SDK 的长文本自动分片能力(原文档公告中的 "automatic long-text chunking and sending"),超限部分可自动通过客服接口分段发送。示例 Program.cs 中即配置了new TextResponseLimitOptions(2048, weixinSetting.WeixinAppId)。
配置完成后,将https://你的域名/WeixinAsync填入微信公众平台后台【设置与开发】>【基本配置】> 服务器地址(URL),Token 与 appsettings.json 保持一致,即可开始收发消息。
若需要对整个消息处理过程做更细粒度的控制(或在 .NET Framework 中),可选用Controller(或 WebApi)方式:Controller 中依次完成"接收消息流 →new CustomMessageHandler(Request.InputStream, postModel)→messageHandler.Execute()→return new FixWeixinBugWeixinResult(messageHandler)"三步,每一步各一行代码,且必须对每次 POST 重新做CheckSignature.Check验签,防止请求伪造。
仓库结构:源码与示例目录导读
readme.en.md 的 "Source Code Project Folders" 与 "Samples Folder" 两节给出了官方目录地图,结合仓库实际结构整理如下。
src/ 源码目录
| 目录 | 说明 |
|---|---|
| src/Senparc.Weixin | 所有Senparc.Weixin.[x].dll基础库源码(核心库) |
| src/Senparc.Weixin.MP | 公众号 SDK 源码(AdvancedAPIs下含 250+ 接口文件) |
| src/Senparc.Weixin.MP.Middleware | 公众号消息中间件源码 |
| src/Senparc.Weixin.MP.MvcExtension | MVC 项目扩展包源码 |
| src/Senparc.Weixin.WxOpen | 小程序 SDK 源码(含小游戏) |
| src/Senparc.Weixin.WxOpen.Middleware | 小程序消息中间件源码 |
| src/Senparc.Weixin.Work | 企业微信 SDK 源码 |
| src/Senparc.Weixin.Work.Middleware | 企业微信消息中间件源码 |
| src/Senparc.Weixin.Open | 第三方开放平台 SDK 源码 |
| src/Senparc.Weixin.TenPay | 微信支付 V2 与 V3 源码 |
| src/Senparc.Weixin.Cache | Redis、CsRedis、Memcached、Dapr 等分布式缓存扩展 |
| src/Senparc.Weixin.AspNet | Web 支持类库 |
| src/Senparc.WebSocket | WebSocket 模块 |
| src/Senparc.Weixin.All | 全家桶聚合工程 |
多目标构建的公共属性集中在 src/Directory.Build.props,各工程(如 src/Senparc.Weixin.MP/Senparc.Weixin.MP/Senparc.Weixin.MP.net8.csproj 与.net10.csproj)分别面向 .NET 8 与 .NET 10 编译同一份源码。
Samples/ 示例目录
| 目录 | 说明 |
|---|---|
| Samples/MP | 公众号独立示例(含 Simple 精简版),NuGet 引用 |
| Samples/WxOpen | 小程序示例(含小程序前端代码),NuGet 引用 |
| Samples/Work | 企业微信示例,NuGet 引用 |
| Samples/TenPayV2 / Samples/TenPayV3 | 微信支付 V2 / V3 示例,NuGet 引用 |
| Samples/All | 集成所有平台的综合示例(进阶) |
| Samples/All/net10-mvc | .NET 10.0 生产就绪示例,源码引用,推荐 |
| Samples/All/net8-mvc | .NET 8.0 生产就绪示例,源码引用 |
| Samples/All/net45-mvc | .NET Framework 4.5 + ASP.NET MVC 示例(NuGet 引用) |
| Samples/All/console | 命令行 Console 示例(.NET Core 风格) |
| Samples/Shared | 所有示例共用的静态资源 |
| Samples with AI | AI 聊天机器人微信集成示例 |
从源码结构看,All目录下的示例工程(如 Samples/All/net10-mvc/Senparc.Weixin.Sample.Net10)包含 31 个 Controller,覆盖菜单、JSSDK、OAuth2、模板消息、素材、客服等几乎全部场景,且各示例"只需配置微信参数、无需修改任何代码"即可运行——这也是原文档强调"学会一个模块即可举一反三"的原因:各模块的配置、注册、AccessToken 管理、消息处理、接口调用模式完全一致。
更完整的进阶开发文档位于仓库的 docs 目录,其中 docs/zh/guide 按模块组织:公众号(mp)、小程序(wxopen)、企业微信(work)、微信支付 V2(tenpayv2)与 V3(tenpayv3)各有独立的安装、登录、JSSDK、OAuth 2.0、支付回调、退款等章节;docs/README.md 还说明了如何基于 VitePress 在本地构建这些文档站点。
部署与 .NET 开发路径
原文档 "Deployment guide" 与 "How to develop with .NET Core" 两节给出两条部署路径:
- Azure App Service:Azure 对 .NET 支持良好,SDK 的示例应用可直接发布为 Web App;
- 任意服务器 + FTP:安装 FTP 服务(原文档推荐 FileZilla Server)后上传编译产物即可。对应的可直接编译发布的示例是 Samples/All/net10-mvc 下的
Senparc.Weixin.Sample.Net10工程,无需修改代码;使用云托管时 FTP 通常同样可用。
关于开发版本的选择,原文档说明:当前分支包含 .NET Framework 4.6.2+ 与 .NET 6.0/7.0/8.0/10.0 的完整代码(更早版本对应 releases 快照);.NET 10.0 示例(向下兼容 .NET 5.0–8.0 与 .NET Core 3.1)位于Samples/All/net10-mvc,.NET Framework 示例位于Samples/All/net45-mvc。需要注意net10-mvc示例直接引用各模块源码,以Release模式构建时可产出多版本兼容的 NuGet 包;若只是学习或生产部署,建议使用 NuGet 包引用的Samples/MP、Samples/All/net8-mvc等工程。
分支策略、贡献与许可
- 分支(原文档 "Important Branches" 表):
master为正式发布主分支,稳定、可用于生产;Developer为开发分支(Beta),新功能在此分支开发后再合并至 master,建议向Developer而非master提交 Pull Request;BookVersion1为配套书籍出版时的代码快照;NET4.0(2017 年停更)与NET3.5(2015 年停更)为历史兼容分支。 - 贡献流程:Fork → 创建特性分支 → Commit → Push → 向
Developer分支发起 Pull Request。贡献者名单记录于 Contributors.md。 - 许可:项目采用Apache License 2.0(见 license.md),100% 开源、支持商业使用。
小结
readme.en.md 描述的 Senparc.Weixin 体系可以浓缩为三层能力:配置层(SenparcSetting/SenparcWeixinSetting双配置节 +UseSenparcWeixin统一初始化)、接口层(AccessTokenContainer自动托管凭据,各平台AdvancedAPIs按官方 API 命名的一行式调用)、消息层(MessageHandler+ 中间件的声明式消息处理)。配合 Samples/MP 的完整可运行示例与 src 下各模块源码,开发者可以用极少样板代码搭建出覆盖公众号、小程序、企业微信、支付与开放平台的生产级微信应用。
- 后端
- 即时通讯
- 金融科技
【免费下载链接】WeiXinMPSDK
微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
相关推荐
10个实战技巧:使用llama-nemotron-embed-vl-1b-v2-fp8构建高效视觉文档检索系统
10个实战技巧:使用llama nemotron embed vl 1b v2 fp8构建高效视觉文档检索系统 llama nemotron embed vl
后端即时通讯金融科技pytransform3d API完全参考:从基础函数到高级变换操作
pytransform3d API完全参考:从基础函数到高级变换操作 pytransform3d是一个强大的Python库,专注于3D变换操作,提供了从基础旋转
后端即时通讯金融科技Pig微服务平台实战指南:从架构设计到生产部署全流程解析
Pig微服务平台实战指南:从架构设计到生产部署全流程解析 在现代企业级应用开发中,微服务架构已经成为构建高可用、可扩展系统的首选方案。Pig项目作为一个基于Sp
后端微服务认证鉴权API网关代码生成任务调度
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考