- 后端
- 即时通讯
- 金融科技
【免费下载链接】WeiXinMPSDK
微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
本文以 WeiXinMPSDK 仓库 Samples/All/net10-mvc 下的综合示例为主体,系统讲解如何在 .NET 10.0 环境下部署、配置与调试 Senparc.Weixin SDK。你将掌握该示例的环境要求、解决方案结构、启动注册流程、多模块账号配置(公众号、小程序、企业微信、微信支付、开放平台)以及 MessageHandler 中间件接入方式,并了解 SDK 源码与示例、单元测试之间的协作关系,可直接用于搭建综合场景的微信全平台项目。
项目定位:一个集成了全平台微信模块的 .NET 10.0 示例
net10-mvc目录下的 Senparc.Weixin.Sample.Net10 是 Senparc.Weixin SDK 各模块集成在一起的综合 Web 示例,以 .NET 10.0 作为默认运行框架,对应解决方案文件为 Senparc.Weixin.Sample.Net10.sln。
按仓库 Samples/All/readme.md 的说明,net10-mvc是当前推荐、快速更新的示例,可用于直接部署测试。与之并列的其他示例包括:console(命令行注册过程演示)、net45-mvc(.NET Framework 4.6.2+ MVC 示例)以及各单模块 Sample(MP、Work、WxOpen、TenPayV2、TenPayV3 等)。net8-mvc等旧框架示例已在仓库说明中标记为停止更新,因此学习 .NET 10.0 之上集成微信能力,应优先以本示例为起点。
环境要求
- 开发工具:Visual Studio 2022(或更新版本)。
- 运行时:安装 .NET 10.0 SDK。
- 编译前置条件:由于
/src目录下的 SDK 源码采用了条件编译,默认情况下开发环境需要同时安装 .NET Framework 4.6.2 与 .NET 10.0才能完整编译成功。这一点在项目 readme 中有明确提示,是首次拉取仓库编译时最常见的坑。
示例默认集成公众号、微信支付、企业微信、小程序等多个模块,模块间通过注释、文件夹等方式区分,代码可读性有保障,非常适合作为综合场景实际项目的参考基线。若只想学习某一个单一模块的用法,可直接查看 Samples 目录下对应模块的独立 Sample,或查看各模块的单元测试项目。
解决方案结构:一个仓库、多目标框架、多项目分组
打开Senparc.Weixin.Sample.Net10.sln可以看到,解决方案按用途做了清晰的分组(NestedProjects 配置),大致包含:
| 分组 | 内容 | 说明 |
|---|---|---|
| 01 Libraries | SDK 各模块源码项目 | Senparc.Weixin、Senparc.Weixin.MP、Senparc.Weixin.Work、Senparc.Weixin.Open、Senparc.Weixin.WxOpen、Senparc.Weixin.TenPay、Senparc.Weixin.TenPayV3、Senparc.Weixin.AspNet、Senparc.WebSocket、缓存库(Redis / CsRedis / Memcached / Dapr)等,均以net10为目标的 csproj 引用进来 |
| 02 Tests | 单元测试项目 | Senparc.WeixinTests、Senparc.Weixin.MP.Test、Senparc.Weixin.Open.Test、Senparc.Weixin.Work.Test、Senparc.Weixin.TenPay.Test、Senparc.Weixin.TenPayV3.Test、Senparc.Weixin.WxOpen.Tests等 |
| 03 Samples.net10 | 示例项目 | 完整综合示例(进阶)、不同微信模块 Samples(MP.Simple、Work、WxOpen、TenPayV2、TenPayV3)、人工智能(AI)分组 |
| AspNet / MCP / Cache / TenPay | 中间件、MCP 服务与缓存扩展 | 如Senparc.Weixin.MP.Middleware、Senparc.Weixin.MCP.Server、各缓存策略库 |
Web 主项目 Senparc.Weixin.Sample.net10.csproj 的TargetFramework为net10.0,通过ProjectReference引用共享公共代码库Senparc.Weixin.Sample.CommonService(其下有对应 net10 版本的 csproj),并通过SharedProject方式导入Senparc.Weixin.Sample.Shared共享静态资源(wwwroot)。值得注意的是,该 csproj 同时保留了多目标编译能力:SDK 各模块项目均同时维护net8.csproj与net10.csproj(部分含src.csproj),这正是 readme 所述"支持 .NET 4.6.2+、.NET Standard 2.1+、.NET 10.0 不同版本库编译,并可在 Release 条件下生成 nuget 包"的工程基础。
启动流程与依赖注入注册:Program.cs 与 Startup.cs 的职责分工
示例采用经典的Program.cs+Startup.cs结构。Program.cs 的核心在于通过UseServiceProviderFactory(new SenparcServiceProviderFactory())引入 Senparc 自定义服务工厂,这是 Senparc.Weixin 在 ASP.NET Core 中完成容器扩展的基础;随后UseStartup<Startup>()进入启动配置。
真正的注册逻辑集中在 Startup.cs,其注册顺序本身就是一份可复用的"最佳实践清单":
- 基础服务:
AddSession()、AddControllersWithViews().AddNewtonsoftJson()、AddSingleton<ITempDataProvider, CookieTempDataProvider>()、AddMemoryCache()(使用本地缓存必须添加)、AddSignalR()。IIS 部署时还显式开启AllowSynchronousIO。 - Senparc 全家桶注册(链式):
services.AddSenparcWeixin(Configuration, Env) // Senparc.Weixin 注册(必须) .AddSenparcWebSocket<CustomNetCoreWebSocketMessageHandler>() // WebSocket 注册(按需) .AddSenparcAI(Configuration) // Senparc.AI,提供 AI 能力(可选) - 管道配置:
UseEnableRequestRewind()、UseSession()、异常页/HSTS、静态文件;Debug 模式下额外映射Senparc.Weixin.Sample.Shared/wwwroot共享静态目录。 - 全局注册:
UseSenparcGlobal(env, senparcSetting.Value, globalRegister => { ... }, true)——这是 CO2NET 全局注册,必须调用,内部完成默认缓存命名空间、Redis/Memcached 缓存策略、TraceLog 日志、APM 状态统计等配置。 - 微信注册:
UseSenparcWeixin(senparcWeixinSetting.Value, (weixinRegister, weixinSetting) => { ... }),内部按"缓存优先"原则依次注册各模块账号(详见下文)。
缓存策略切换:内存 / Redis / Memcached
Startup.cs通过UseRedis()与UseMemcached()两个辅助方法判断配置字符串是否仍是占位符默认值(#{...}#),从而决定是否启用对应分布式缓存:
- Redis(CsRedis 驱动):
Senparc.CO2NET.Cache.CsRedis.Register.SetConfigurationOption(redisConfigurationStr)后调用UseKeyValueRedisNow()立即切换为键值对缓存策略(注释中同时保留UseHashRedisNow()与 StackExchange.Redis 驱动的替换写法)。 - Memcached:
app.UseEnyimMemcached()后由Senparc.CO2NET.Cache.Memcached.Register完成注册切换。 - 若都不启用,则回退到内存缓存。
微信侧缓存与全局缓存一一对应:weixinRegister.UseSenparcWeixinCacheCsRedis()、UseSenparcWeixinCacheRedis()、UseSenparcWeixinCacheMemcached()。注意注释中的关键提示:若使用了非本地缓存却不执行对应注册块,会收到"当前扩展缓存策略没有进行注册"的异常;微信缓存注册必须放在配置开头,以确保其他可能依赖缓存的注册过程使用正确配置。
多模块账号注册:公众号、小程序、企业微信、支付、开放平台
UseSenparcWeixin回调中以链式方式注册各类账号(均可注册多个,name 参数用于标识):
- 公众号:
RegisterMpAccount(senparcWeixinSetting.Value, "【盛派网络小助手】公众号") - 小程序:
RegisterWxOpenAccount(senparcWeixinSetting.Value, "【盛派网络小助手】小程序"),以及通过Items["第二个小程序"]注册第二个小程序,演示了 appsettings 多重配置的用法 - 企业微信:
RegisterWorkAccount(senparcWeixinSetting.Value, "【盛派网络】企业微信")、RegisterWorkAccount(senparcWeixinSetting.Value["企业微信审批"], ...) - 微信支付 V2(旧版):
RegisterTenpayOld(...);V3:RegisterTenpayV3(...)与RegisterTenpayApiV3(...) - 开放平台:
RegisterOpenComponent(senparcWeixinSetting.Value, getComponentVerifyTicketFunc, getAuthorizerRefreshTokenFunc, authorizerTokenRefreshedFunc, "【盛派网络】开放平台")——示例中这三个委托基于本地文件(~/App_Data/OpenTicket、~/App_Data/AuthorizerInfo)读写 component_verify_ticket 与 authorizer_refresh_token,注释明确说明仅用于演示部署,分布式系统请改用其他存储。
此外,代码注释给出了绕开 Startup 的"随处注册"方式:AccessTokenContainer.Register(appId, appSecret, name)(公众号/小程序)与ComponentContainer.Register()(开放平台),便于在业务代码中动态注册账号。
MessageHandler 中间件:不再需要独立 Controller
Configure后半段演示了 SDK 提供的 MessageHandler 中间件用法,用三段中间件取代了传统独立的接收消息 Controller:
// 公众号(功能最全的演示) app.UseMessageHandlerForMp("/WeixinAsync", CustomMessageHandler.GenerateMessageHandler, options => { // [必须] 根据 context 动态提供 Token、EncodingAESKey 等参数 options.AccountSettingFunc = context => senparcWeixinSetting.Value; // 异步方法未重写时回退到同步方法 options.DefaultMessageHandlerAsyncEvent = DefaultMessageHandlerAsyncEvent.SelfSynicMethod; options.EnableRequestLog = true; // 默认即为 true options.EnbleResponseLog = true; options.AggregateExceptionCatch = ex => false; // 异常回调 // 超长文本回复分批处理(调用客服接口) options.TextResponseLimitOptions = new TextResponseLimitOptions(2048, senparcWeixinSetting.Value.WeixinAppId); }); // 小程序(简化) app.UseMessageHandlerForWxOpen("/WxOpenAsync", CustomWxOpenMessageHandler.GenerateMessageHandler, options => { ... }); // 企业微信(最简化) app.UseMessageHandlerForWork("/WorkAsync", WorkCustomMessageHandler.GenerateMessageHandler, o => o.AccountSettingFunc = c => senparcWeixinSetting.Value);AccountSettingFunc支持三种写法:使用默认配置、通过名称取指定配置、结合context.Request参数(如 URL 中的id)动态匹配多账号,配合示例的多账号注册能力,可轻松支撑多租户场景。
配置文件详解:appsettings.json 的三层配置体系
示例的 appsettings.json 是理解整个 SDK 配置体系的钥匙,包含三个顶层节点。
SenparcSetting:CO2NET 全局配置
| 配置项 | 默认值/说明 |
|---|---|
IsDebug | true,调试开关,影响日志输出等行为 |
DefaultCacheNamespace | DefaultCache,缓存命名空间 |
Cache_Redis_Configuration | #{Cache_Redis_Configuration}#,Redis 连接字符串;支持localhost:6379或带密码与参数的完整格式,如localhost:6379,password=senparc,connectTimeout=1000,connectRetry=2,syncTimeout=10000,defaultDatabase=3 |
Cache_Memcached_Configuration | #{Cache_Memcached_Configuration}#,Memcached 连接配置 |
SenparcUnionAgentKey | #{SenparcUnionAgentKey}# |
文件注释强调:这些 key 会被自动识别,不要修改 key 名称,不用的参数可以删除,但修改 key 后无法自动识别。
SenparcWeixinSetting:微信全平台账号配置
按模块组织,所有未配置的值统一使用#{...}#占位符(Azure DevOps 默认占位符格式),配置明文时应删除#与{}。核心字段:
- 公众号:
Token、EncodingAESKey、WeixinAppId、WeixinAppSecret - 小程序:
WxOpenAppId、WxOpenAppSecret、WxOpenToken、WxOpenEncodingAESKey - 企业微信:
WeixinCorpId、WeixinCorpAgentId、WeixinCorpSecret、WeixinCorpToken、WeixinCorpEncodingAESKey - 微信支付 V2:
WeixinPay_PartnerId、WeixinPay_Key、WeixinPay_AppId、WeixinPay_AppKey、WeixinPay_TenpayNotify - 微信支付 V3:
TenPayV3_AppId、TenPayV3_AppSecret、TenPayV3_SubAppId、TenPayV3_SubAppSecret、TenPayV3_MchId、TenPayV3_SubMchId(子商户,没有可留空)、TenPayV3_Key、TenPayV3_CertPath(证书路径,支持物理路径或~/App_Data/cert/...相对路径,必须放在受保护目录)、TenPayV3_CertSecret、TenPayV3_TenpayNotify、TenPayV3_PrivateKey(证书私钥)、TenPayV3_SerialNumber、TenPayV3_ApiV3Key、TenPayV3_WxOpenTenpayNotify、EncryptionType(加密类型:RSA/SM,按商户平台申请证书类型选择,大部分情况为 RSA) - 开放平台:
Component_Appid、Component_Secret、Component_Token、Component_EncodingAESKey - 扩展/代理:
AgentUrl、AgentToken、SenparcWechatAgentKey
Items节点用于多账号配置,Key 不可重复,每一组账号的格式与顶层对应模块一致。示例中预置了"第二个公众号"、"第三个公众号"、"第二个小程序"、"第四个公众号+对应小程序+对应微信支付"(组合演示)以及"企业微信审批"等多组配置,并与Startup.cs中的RegisterWorkAccount(senparcWeixinSetting.Value["企业微信审批"], ...)一一对应,展示了同进程托管多个微信账号的标准姿势。
SenparcAiSetting:AI 能力配置
IsDebug与AiPlatform(枚举字符串值,示例为AzureOpenAI,需按实际平台修改)决定使用哪套密钥;NeuCharAIKeys、AzureOpenAIKeys、OpenAIKeys分别对应三套供应商配置(各自含ApiKey、Endpoint、ModelName.Chat等),Items节点可再挂载额外模型(如AzureDallE3的TextToImage: dall-e-3)。结合Startup.cs中的AddSenparcAI(Configuration)与registerService.UseSenparcAI(),即可在示例中启用 AI 对话能力。
示例功能导览:按模块划分的 Controller 与公共代码
Web 项目 Controllers 目录按微信模块分子目录组织,与 readme"用文件夹区分模块"的说明一致:
- Weixin/MP:公众号能力最全,包含
WeixinController(消息收发)、WeixinAsyncController、WeixinController_OldPost、OAuth2Controller、JSSDK、MenuController、MediaController(素材)、AnalysisController(数据分析)、DeviceController(设备)、SubscribeMsgController(订阅消息)、AsyncMethodsController(异步方法)、WebSocketController等 12 个控制器。 - Weixin/Open:开放平台与第三方平台授权。
- Weixin/TenPay:微信支付。
- Weixin/Work:企业微信。
- Weixin/WxOpen:小程序。
- Weixin/ThirdPartyAuth:第三方授权。
公共业务代码集中在 Senparc.Weixin.Sample.CommonService,其中的CustomMessageHandler(含事件处理)、WorkMessageHandlers、WxOpenMessageHandler、OpenMessageHandler、WebSocket处理器以及TemplateMessage(模板消息)、OpenTicket(开放平台票据)等,可以在 .NET Framework / .NET 8.0 / .NET 10.0 / WebForms 等不同框架的 Sample 中复用——这正是多框架 Sample 共享同一套业务逻辑的工程技巧。AI 相关代码也已整合进该公共库的 AI 目录。
历史框架示例与版本演进:net8-mvc 与 net45-mvc
net10-mvc的 readme 明确给出了旧框架示例的入口:
- 使用 .NET 8.0 Demo:见 net8-mvc(目录内同样提供
Senparc.Weixin.Sample.Net8.sln与Senparc.Weixin.Sample.Net8项目)。按 Samples/All/readme.md 的标记,net8 及更早的 net7/net6 示例已停止更新,仅 net10 保持快速更新。 - 使用 .NET Framework 4.5 Demo:见 net45-mvc(
Senparc.Weixin.MP.Sample)。注意:该 .NET Framework 4.5 Sample 自2019 年 9 月 1 日起停止小版本更新(大版本更新仍保持同步,.NET 4.5 所有库更新不受影响);且自 2022 年 5 月 4 日起,该示例已升级为 .NET Framework 4.6.2,并将随官方生命周期逐步迁移到 4.8,目录名net45仅为历史沿用。
无论选择哪个解决方案,类库功能都是一致的——这是 Senparc.Weixin 多目标框架策略的体现:同一套 API 在 .NET Framework、.NET 8.0、.NET 10.0 上保持一致。
调试与二次开发要点
- 以源码调试 SDK:解决方案直接引用了
/src下的各模块源码项目(如 src/Senparc.Weixin、src/Senparc.Weixin.MP 等),因此断点可直接进入 SDK 内部,方便学习容器注册、AccessToken 缓存、消息处理等底层实现。 - 以单元测试验证行为:仓库为每个模块都配备了测试项目,例如 Senparc.Weixin.MP.Test、Senparc.Weixin.Open.Test、Senparc.Weixin.Work.Test、Senparc.Weixin.TenPayV3.Test、Senparc.Weixin.WxOpen.Tests。阅读单模块用法时可结合这些测试用例,它们比综合示例更聚焦。
- 单模块快速上手:若只想跑通某个模块,仓库在 Samples/MP、Samples/Work、Samples/WxOpen、Samples/TenPayV2、Samples/TenPayV3 等目录提供了各模块的独立 Sample,复杂度远低于综合示例。
- 部署测试:示例可直接部署运行,普通功能无需改配置即可体验;涉及微信后台回调、支付、开放平台等高级功能时,需按上文
appsettings.json的字段说明替换为自己的appId、Token、EncodingAESKey、支付证书等真实参数,并将回调地址在微信公众平台/商户平台完成配置。
结语
net10-mvc综合示例把公众号、小程序、企业微信、微信支付(V2/V3)、开放平台、WebSocket、AI 等能力收敛到一个 .NET 10.0 MVC 项目中,其Startup.cs的注册顺序、appsettings.json的分层配置与多账号Items机制、MessageHandler 中间件用法,构成了可直接迁移到生产项目的"微信全平台脚手架"。建议在动手改造前,先在源码与单元测试中确认各模块的调用契约,再对照本示例逐项替换配置,即可快速搭建属于你自己的微信综合业务系统。
- 后端
- 即时通讯
- 金融科技
【免费下载链接】WeiXinMPSDK
微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
相关推荐
LanzouAPI终极指南:如何3秒获取蓝奏云高速直链
LanzouAPI终极指南:如何3秒获取蓝奏云高速直链 还在为蓝奏云文件下载的繁琐流程而烦恼吗?每次点击链接都要经过多个页面跳转,等待时间漫长,操作效率低下?今
后端即时通讯金融科技Senparc.Weixin SDK .NET Framework 示例项目(net45-mvc)完全指南:编译、配置与全模块实战
Senparc.Weixin SDK .NET Framework 示例项目(net45 mvc)完全指南:编译、配置与全模块实战 本文围绕 WeiXinMPS
后端即时通讯金融科技WeiXinMPSDK 综合示例实战指南:基于 Senparc.Weixin.Sample.Net8 的全平台微信模块集成与 AI 对话能力
WeiXinMPSDK 综合示例实战指南:基于 Senparc.Weixin.Sample.Net8 的全平台微信模块集成与 AI 对话能力 本指南以 Senp
后端即时通讯金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考