后端即时通讯金融科技【免费下载链接】WeiXinMPSDK微信全平台 .NET SDK Senparc.Weixin for C#支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.项目地址https://gitcode.com/gh_mirrors/we/WeiXinMPSDK点击查看免费下载本篇技术指南以仓库 Samples/MP/readme.md 为骨架系统讲解 WeiXinMPSDKSenparc.Weixin for C#中微信公众号示例项目Senparc.Weixin.Sample.MP的定位、运行方式与两种消息处理架构。你将掌握如何通过 NuGet 包快速跑通公众号功能演示、如何将「精简模式」举一反三应用到小程序 / 企业微信 / 微信支付等平台以及在需要调试 SDK 源码时如何切换到项目引用模式。一、示例项目概览一套解决方案两种演示模式Samples/MP目录下的 Senparc.Weixin.Sample.MP.sln 是专为独立演示公众号主要功能而设计的解决方案其中包含两个不同的项目项目说明Senparc.Weixin.Sample.MP公众号主要功能的简要演示项目完整版Senparc.Weixin.Sample.MP.Simple公众号的最精简模式演示项目两者的核心区别在于功能覆盖度与代码量完整版Sample.MP演示了公众号几乎全部常见能力文本关键字回复、正则回复、图片 / 语音 / 视频 / 位置 / 链接 / 文件消息处理、各类事件关注、扫码、菜单点击、退订等、OAuth 2.0 授权、JSSDK、客服消息、模板消息、超长文本限制处理等是学习公众号 SDK 的最佳样板。精简版Sample.MP.Simple只保留「接收消息 → 回复文字」这条最小链路用于展示一个公众号应用最少需要多少代码。特别值得关注的是 readme 中的提示精简模式等实现方式都可以举一反三用在其他平台上如小程序、企业微信、微信支付等。这是因为 Senparc.Weixin 各平台模块MP / WxOpen / Work / TenPay共享同一套注册、中间件与 MessageHandler 设计范式仓库中 Samples/WxOpen、Samples/Work、Samples/TenPayV3 等示例正是这一结论的直接印证。二、快速开始打开解决方案打开Senparc.Weixin.Sample.MP.sln即可运行默认使用 NuGet 包引用无需手动编译任何 SDK 源码。项目所需的依赖在 .csproj 中集中声明例如完整版的 Senparc.Weixin.Sample.MP.csproj 引用了四个包!--引用 Nuget 包-- ItemGroup PackageReference IncludeSenparc.Weixin.AspNet Version1.6.4 / PackageReference IncludeSenparc.Weixin.MP Version16.25.0 / PackageReference IncludeSenparc.Weixin.MP.Middleware Version1.5.3 / PackageReference IncludeSenparc.Weixin.MP.MVC Version7.17.3 / /ItemGroup而精简版走的是「聚合包」路线Senparc.Weixin.Sample.MP.Simple.csproj 仅需一行ItemGroup PackageReference IncludeSenparc.Weixin.All Version2026.7.29 / /ItemGroupSenparc.Weixin.All聚合包一次引入全平台能力公众号、小程序、开放平台、企业微信、微信支付适合不想逐模块引包的场景。提示两个项目都以net10.0为目标框架精简版的历史记录显示其由 net8.0 迁移而来同时在仓库根目录的 Directory.Build.props 统一维护多目标框架构建配置SDK 源码侧还保留了 net8.0 的 Senparc.Weixin.MP.net8.csproj 与 net10.0 的 Senparc.Weixin.MP.net10.csproj说明本项目完整覆盖 .NET Framework 及 .NET Core / .NET 10 系列运行时。也可以通过全量 Sample 运行如果你希望看到公众号功能与其他平台小程序、企业微信、微信支付等的完整联动演示可以直接打开全量 Sample 解决方案Senparc.Weixin.Sample.Net8.sln然后将Senparc.Weixin.Sample.MP项目设为启动项目即可。全量 Sample 中同名项目还额外演示了 OAuth 2.0 回调、JSSDK 签名、模板消息等更完整的页面级交互。三、运行前必改appsettings.json 中的公众号配置两个项目共用同一份配置模板 appsettings.json精简版 此处运行前必须把占位符替换为你在微信公众平台后台申请到的真实信息{ Logging: { LogLevel: { Default: Information, Microsoft: Warning, Microsoft.Hosting.Lifetime: Information } }, AllowedHosts: *, //以下信息会被自动识别如无特殊说明不用的参数可以删除但修改 key 后将会无法自动识别 //CO2NET 设置 SenparcSetting: { IsDebug: true, DefaultCacheNamespace: DefaultCache, Cache_Redis_Configuration: #{Cache_Redis_Configuration}#, Cache_Memcached_Configuration: #{Cache_Memcached_Configuration}#, SenparcUnionAgentKey: #{SenparcUnionAgentKey}# }, //Senparc.Weixin SDK 设置 SenparcWeixinSetting: { IsDebug: true, Token: #{Token}#, EncodingAESKey: #{EncodingAESKey}#, WeixinAppId: #{WeixinAppId}#, WeixinAppSecret: #{WeixinAppSecret}# } }关键参数说明配置节参数必填说明SenparcSettingIsDebug是是否输出调试日志生产环境建议设为falseSenparcSettingDefaultCacheNamespace否默认缓存命名空间用于隔离不同应用 / 环境的缓存数据SenparcSettingCache_Redis_Configuration否Redis 分布式缓存连接串留空占位则使用内存缓存SenparcSettingCache_Memcached_Configuration否Memcached 连接配置SenparcWeixinSettingToken是公众号后台「基本配置 → 服务器配置」中填写的 Token用于签名校验区分大小写SenparcWeixinSettingEncodingAESKey是安全模式消息加解密密钥若后台选择明文模式可留空SenparcWeixinSettingWeixinAppId是公众号 AppIdSenparcWeixinSettingWeixinAppSecret是公众号 AppSecret用于获取 AccessToken两个必须注意的坑配置注释中的原话key 不可改名SDK 会按固定 key 自动识别配置修改 key 后「将无法自动识别」直接导致账号信息失效字符串值不可留空所有字符串值都可能被用于字典索引请勿留空字符串但可以根据需要删除整条设置。例如示例中Token: #{Token}#的#{...}#是 Azure DevOps 流水线占位符格式本机运行时需要整体替换为明文即写成Token: MyFullToken这样的形式。配置的读取在代码侧由AddSenparcWeixin(builder.Configuration)完成自动映射为SenparcWeixinSetting强类型对象可参考 Config.cs 与 SenparcWeixinSetting 相关实体此后在代码中即可通过Senparc.Weixin.Config.SenparcWeixinSetting.MpSetting拿到公众号专用的ISenparcWeixinSettingForMP含 Token、EncodingAESKey、WeixinAppId、WeixinAppSecret 属性详见 BaseController.cs。四、一行注册 一句启用Program.cs 的微信初始化现代 ASP.NET Core 应用采用最小托管模型Minimal Hosting完整版 Program.cs 中微信初始化被压缩成两个核心动作// 1) 注册必须将微信配置注入 DI 容器 builder.Services.AddSenparcWeixin(builder.Configuration); // 2) 启用必须完成全局初始化并注册公众号账号 var registerService app.UseSenparcWeixin(app.Environment, null /* 传入 null 则覆盖 appsettings 中的 SenpacSetting 配置*/, null /* 传入 null 则覆盖 appsettings 中的 SenpacWeixinSetting 配置*/, register { /* CO2NET 全局配置 */ }, (register, weixinSetting) { // 注册公众号账号信息可以执行多次注册多个公众号 register.RegisterMpAccount(weixinSetting, 【盛派网络小助手】公众号); });要点解读AddSenparcWeixin负责把SenparcSetting/SenparcWeixinSetting绑定为IOptionsT并注册 SDK 所需的各类服务。注释中演示了手动获取方式app.Services.GetServiceIOptionsSenparcWeixinSetting()!.Value。UseSenparcWeixin的两个null参数表示「覆盖 appsettings 配置」即允许以代码方式运行时覆盖配置文件中的设置实际项目如需动态配置可在此传入自定义对象。weixinRegisterConfigure回调中调用RegisterMpAccount注册公众号账号该方法可重复执行以支持多公众号场景若像精简版那样传autoRegisterAllPlatforms: true则会自动注册所有平台。注意由于本项目使用内存缓存还需显式添加builder.Services.AddMemoryCache()Program.cs 第 18 行注释「使用内存缓存必须添加」。若配置了 Redis / Memcached则需引用对应的 Senparc.Weixin.Cache.Redis 或 Senparc.Weixin.Cache.Memcached 扩展包并调用其注册方法详见各自 Register.cs。五、方案一推荐MessageHandler 中间件无需 Controller从 v16.9.102 起SDK 提供了 MessageHandler 中间件公众号消息回调不再需要编写 Controller。完整版与精简版均演示了这一模式// 使用公众号的 MessageHandler 中间件不再需要编写 Controller app.UseMessageHandlerForMp(/WeixinAsync, CustomMessageHandler.GenerateMessageHandler, options { // 获取默认微信配置 var weixinSetting Senparc.Weixin.Config.SenparcWeixinSetting; // [必填] 指定微信配置 options.AccountSettingFunc context weixinSetting; // [可选] 设置文本返回长度限制如需超长消息可通过客服接口分段回复 options.TextResponseLimitOptions new TextResponseLimitOptions(2048, weixinSetting.WeixinAppId); });参数含义/WeixinAsync中间件挂载的路径需要与公众号后台「服务器配置」中的 URL 保持一致例如https://你的域名/WeixinAsyncCustomMessageHandler.GenerateMessageHandler静态委托用于按请求动态创建 MessageHandler 实例其签名与消息处理器的构造函数完全匹配见下文options.AccountSettingFunc必填项返回本次请求使用的公众号配置天然支持多公众号按contextHttpContext路由options.TextResponseLimitOptions可选限制文本回复的最大长度此处 2048 字节超出时可改用客服接口分段回复。中间件的基础实现位于 Senparc.Weixin.MP.Middleware 项目它统一处理了微信服务器 POST 的 XML 流解析、PostModel打包、ExecuteAsync()执行与结果序列化开发者只需关注消息逻辑本身。配套的自定义 MessageHandler中间件模式下的核心是自定义 MessageHandler 类。完整版 CustomMessageHandler.cs 继承MessageHandlerDefaultMpMessageContext并提供一个专供中间件调用的生成委托public static FuncStream, PostModel, int, IServiceProvider, CustomMessageHandler GenerateMessageHandler (stream, postModel, maxRecordCount, serviceProvider) new CustomMessageHandler(stream, postModel, maxRecordCount, false /* 是否只允许处理加密消息以提高安全性 */, serviceProvider: serviceProvider);构造函数中还可以做全局设定例如GlobalMessageContext.ExpireMinutes 3; // 消息上下文会话过期时间 OnlyAllowEncryptMessage true; // 是否只接收加密消息安全模式消息处理的核心是重写各类OnXxxRequestAsync虚方法。以文本消息为例完整版展示了RequestHandler关键字链式匹配的用法关键字不区分大小写、按顺序匹配、命中即止public override async TaskIResponseMessageBase OnTextRequestAsync(RequestMessageText requestMessage) { var defaultResponseMessage base.CreateResponseMessageResponseMessageText(); var requestHandler await requestMessage.StartHandler() .Keyword(关键字1, () { defaultResponseMessage.Content 收到关键字1; return defaultResponseMessage; }) // 匹配任一关键字 .Keywords(new[] { 关键字2, 关键字3 }, () { defaultResponseMessage.Content 收到“关键字2”或“关键字3”; return defaultResponseMessage; }) .Keyword(OPENID, () { /* 调用 UserApi.Info 获取用户资料 */ }) .Keyword(MUTE, () new SuccessResponseMessage()) // 不回复任何消息 .SelectMenuKeyword(101, () { /* 菜单点击微信端格式 ids:101 */ }) .Regex(^\d#\d$, () { /* 正则匹配 */ }) .Default(async () { defaultResponseMessage.Content $您刚才发送了文字信息{requestMessage.Content}; return defaultResponseMessage; }); return requestHandler.GetResponseMessage() as IResponseMessageBase; }完整版还重写了图片、语音、视频、位置、链接、文件等消息处理方法并调用UserApi、MediaApi、CustomApi客服消息等高级接口事件类处理集中在 CustomMessageHandler_Events.cs关注 / 扫码 / 菜单点击 / 退订 / 群发完成等未处理的消息统一落入DefaultResponseMessage未知类型则由OnUnknownTypeRequestAsync兜底并写入WeixinTrace日志。这些方法名与实现逻辑均对应 SDK 源码中的 MessageHandlers 基类。六、方案二传统Controller 方式与完整消息链路如果你需要高度控制消息处理的每一个细节可以像 WeixinController.cs 那样使用传统 Controller 方式。其完整链路分为三步第 1 步GET 验证微信后台接入校验[HttpGet] [ActionName(Index)] public ActionResult Get(PostModel postModel, string echostr) { if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content(echostr); // 返回随机字符串则表示验证通过 } return Content(failed:...); // 校验失败提示 }第 2 步POST 接收消息并执行[HttpPost] [ActionName(Index)] public async TaskActionResult Post(PostModel postModel) { if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { return Content(参数错误); } // 打包 PostModel与公众号后台保持一致 postModel.Token Token; postModel.EncodingAESKey EncodingAESKey; postModel.AppId AppId; // 每个人上下文消息储存的最大数量0 不限制实际最大 99999 var maxRecordCount 10; // 创建自定义 MessageHandler第一步 var messageHandler new CustomMessageHandler( await Request.GetRequestMemoryStreamAsync(), postModel, maxRecordCount); // 消息去重防止微信服务器重复推送默认开启 messageHandler.OmitRepeatedMessage true; // 同步方法被重写、异步未重写时尝试调用同步方法 messageHandler.DefaultMessageHandlerAsyncEvent DefaultMessageHandlerAsyncEvent.SelfSynicMethod; messageHandler.SaveRequestMessageLog(); // 记录 Request 日志可选 await messageHandler.ExecuteAsync(CancellationToken.None); // 执行关键第二步 messageHandler.SaveResponseMessageLog(); // 记录 Response 日志可选 return new FixWeixinBugWeixinResult(messageHandler); // 返回第三步 }三个值得记住的细节OmitRepeatedMessage true开启消息去重避免微信服务器未及时收到响应而重复推送默认已开启DefaultMessageHandlerAsyncEvent.SelfSynicMethod兼容新旧异步方法重写策略FixWeixinBugWeixinResultSDK 提供的 ActionResult 包装器用于修正微信官方对部分返回内容如空字符串 / 纯数字的兼容性 bug其实现位于 FixWeixinBugWeixinResult.cs。Controller 中的Token/EncodingAESKey/AppId均取自MpSetting即Config.SenparcWeixinSetting.MpSetting通过 BaseController.cs 暴露确保与公众号后台配置严格一致。异常时项目还会把错误详情写入App_Data/Error_*.txt并调用WeixinTrace.Log记录。文件头注释特别提醒SDK 已全面转向异步方法驱动建议使用messageHandler.ExecuteAsync()不再推荐同步方法Execute()更多演示可参考全量 Sample 中的同名文件 WeixinController.cs。七、精简模式公众号应用的最少代码量精简版 CustomMessageHandler.cs 展示了「最小可用」的公众号消息处理器——只有生成委托、构造函数与两个重写方法public class CustomMessageHandler : MessageHandlerDefaultMpMessageContext { public static FuncStream, PostModel, int, IServiceProvider, CustomMessageHandler GenerateMessageHandler (stream, postModel, maxRecordCount, serviceProvider) new CustomMessageHandler(stream, postModel, maxRecordCount, false, serviceProvider: serviceProvider); public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount 0, bool onlyAllowEncryptMessage false, IServiceProvider serviceProvider null) : base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage, serviceProvider: serviceProvider) { } public override async TaskIResponseMessageBase OnTextOrEventRequestAsync(RequestMessageText requestMessage) { var responseMessage this.CreateResponseMessageResponseMessageText(); responseMessage.Content $收到您发来的文字信息{requestMessage.Content}; return responseMessage; } public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) { var responseMessage this.CreateResponseMessageResponseMessageText(); responseMessage.Content $收到一条您发来的信息类型为{requestMessage.MsgType}; return responseMessage; } }精简版 Program.cs 还额外演示了两个进阶点UseSenparcWeixin(..., autoRegisterAllPlatforms: true)自动注册所有平台无需手动逐平台调用注册方法零 Controller 的「逻辑接口」通过app.MapGroup(/)直接映射 HTTP 接口调用 SDK 高级 API例如获取公众号粉丝 OpenIdapp.MapGroup(/).MapGet(/TryApi, async () { var weixinSetting Senparc.Weixin.Config.SenparcWeixinSetting.MpSetting; var users await Senparc.Weixin.MP.AdvancedAPIs.UserApi.GetAsync(weixinSetting.WeixinAppId, null); Console.WriteLine($展示前 {users.count} 个 OpenId); return users.data.openid; });这正是 readme 中「举一反三」的落地形态注册 中间件 精简 Handler 直接 API 调用这套骨架可原样平移到小程序WxOpen Sample、企业微信Work Sample与微信支付TenPayV3 Sample——只需更换对应的UseMessageHandlerForXxx扩展与 Handler 基类。八、从 NuGet 包切换到源码引用调试 SDK 源码默认方案下 SDK 以 NuGet 包形式引用断点无法进入 SDK 内部。若要直接引用源码调试readme 给出的步骤是打开全量 Sample 解决方案Senparc.Weixin.Sample.Net8.sln编辑当前项目的.csproj文件根据注释删除 NuGet 包引用代码并启用源码项目引用。完整版 .csproj 中已经预置了切换用的注释模板Senparc.Weixin.Sample.MP.csproj!--引用 Nuget 包-- ItemGroup PackageReference IncludeSenparc.Weixin.AspNet Version1.6.4 / PackageReference IncludeSenparc.Weixin.MP Version16.25.0 / PackageReference IncludeSenparc.Weixin.MP.Middleware Version1.5.3 / PackageReference IncludeSenparc.Weixin.MP.MVC Version7.17.3 / /ItemGroup !--直接引用源码-- !--ItemGroup ProjectReference Include..\..\..\src\Senparc.Weixin.AspNet\Senparc.Weixin.AspNet.net6.csproj / ProjectReference Include..\..\..\src\Senparc.Weixin.MP.Middleware\Senparc.Weixin.MP.Middleware.net6.csproj / ProjectReference Include..\..\..\src\Senparc.Weixin.MP.MvcExtension\Senparc.Weixin.MP.MvcExtension\Senparc.Weixin.MP.MvcExtension.net6.csproj / ProjectReference Include..\..\..\src\Senparc.Weixin.MP\Senparc.Weixin.MP\Senparc.Weixin.MP.net6.csproj / /ItemGroup--切换时只需删除第一个ItemGroup取消第二个ItemGroup的注释即可注意将net6.csproj替换为与目标框架匹配的net8.csproj/net10.csproj。源码项目与示例位于同一仓库src/Senparc.Weixin.MP、src/Senparc.Weixin.AspNet、src/Senparc.Weixin.MP.Middleware、src/Senparc.Weixin.MP.MvcExtension切换后即可在断点中查看签名校验CheckSignature、消息工厂RequestMessageFactory/ResponseMessageFactory与消息处理基类的真实执行过程。九、小结一条从演示到生产的主线总结本示例给开发者的三条主线经验按需选择演示粒度功能全面看完整版 Senparc.Weixin.Sample.MP只要最小骨架看精简版 Senparc.Weixin.Sample.MP.Simple多平台联调则直接打开全量 Sample消息接收两条路日常开发优先使用UseMessageHandlerForMp中间件免 Controller、天然多公众号支持需要细粒度控制日志、去重、异常落盘时回到 Controller 三步流程调试与扩展需要深入 SDK 时按注释切换源码引用「注册 启用 中间件 Handler」这套范式可平移至小程序、企业微信、微信支付等全平台这正是 WeiXinMPSDK 全平台统一架构的核心价值。赞分享后端即时通讯金融科技【免费下载链接】WeiXinMPSDK微信全平台 .NET SDK Senparc.Weixin for C#支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.项目地址https://gitcode.com/gh_mirrors/we/WeiXinMPSDK点击查看免费下载相关推荐网盘下载卡在进度条用这款免费的网盘直链解析工具拿到真实下载地址网盘下载卡在进度条用这款免费的网盘直链解析工具拿到真实下载地址 凌晨两点一个 2GB 的压缩包在网盘里转了两个小时还没过半。这不是网速的问题而是网盘在礼后端即时通讯金融科技Nacos AI Vector 插件规范实战基于 pgvector 的 AI 资源向量索引与语义检索全解析Nacos AI Vector 插件规范实战基于 pgvector 的 AI 资源向量索引与语义检索全解析 Nacos 的 AI 领域模块 plugin/a后端即时通讯金融科技Ray Tune 集成 BOHB 超参调优从入门示例到源码级原理解析Ray Tune 集成 BOHB 超参调优从入门示例到源码级原理解析 导读 本文以 Ray 官方仓库中的 BOHB 示例 bohb_example.py h人工智能分布式训练强化学习任务调度模型推理服务后端上一篇Scaffold-ETH多语言支持i18n集成与前端文本国际化下一篇Bourbon色彩系统contrast-switch功能实现智能配色创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
