后端即时通讯金融科技【免费下载链接】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点击查看免费下载本文以 WeiXinMPSDK 仓库中的 Samples/Work/readme.md 为入口系统讲解企业微信企业号独立示例项目Senparc.Weixin.Sample.Work的完整使用流程如何打开解决方案、如何通过 NuGet 包或源码引用运行调试、如何完成企业微信账号的全局注册与配置以及如何基于 MessageHandler 中间件处理消息、调用高级接口、配置 JSSDK含agentConfig、接入 OAuth 2.0 网页授权和自定义菜单。读完本文你可以将一个全新的 ASP.NET Core 项目快速改造成可对接企业微信的 Web 应用。1. Sample 定位与项目结构根据 Samples/Work/readme.mdSenparc.Weixin.Sample.Work是用于独立演示企业微信主要功能的示例项目与公众号MP、小程序WxOpen、微信支付TenPayV3、企业微信Work等其他模块的 Sample 并列聚焦于企业微信这一个平台便于开发者单独对照学习。项目目录结构如下见 Samples/Work/Senparc.Weixin.Sample.Work目录 / 文件作用Controllers/MVC 控制器WorkController消息对接、OAuth2Controller网页授权、JSSDKControllerJS 签名、AdvancedApiController高级接口演示、HomeController首页、BaseController基类提供 CorpId / WorkSetting 便捷访问MessageHandlers/WorkCustomMessageHandler.cs自定义消息处理器主文件、WorkCustomMessageContext.cs自定义消息上下文可选Views/Home/Index.cshtml示例首页同时也是功能图文教程、JSSDK/、OAuth2/、Shared/等视图wwwroot/images/安装与注册流程的截图素材Program.cs.NET 6 入口完成注册与中间件接入appsettings.json企业微信账号等全部配置Senparc.Weixin.Sample.Work.csproj/*.net8.csproj/*.net10.csproj多目标框架工程文件net6.0 / net8.0 / net10.0其中 NuGet 引用与源码引用两种方式在文件中以注释形式切换工程采用多目标框架设计net8.csproj面向net8.0net10.csproj面向net10.0并记录了依赖升级日志基础csproj面向net6.0。ImplicitUsings与Nullable均已启用。2. 打开与运行 Sample2.1 直接打开独立解决方案在 Visual Studio 中直接打开 Senparc.Weixin.Sample.Work.sln 即可运行。该解决方案默认使用NuGet 包引用readme 已注明 使用 Nuget 包引用无需额外搭建本地依赖即可还原并启动。当前工程引用的 NuGet 包及版本以net10工程为例见 Senparc.Weixin.Sample.Work.net10.csprojItemGroup PackageReference IncludeSenparc.Weixin.AspNet Version1.6.6 / PackageReference IncludeSenparc.Weixin.Work Version3.32.1 / PackageReference IncludeSenparc.Weixin.Work.Middleware Version1.5.5 / /ItemGroup三个包的分工Senparc.Weixin.AspNet提供 ASP.NET Core 环境下的全局注册扩展AddSenparcWeixin/UseSenparcWeixin与FixWeixinBugWeixinResult等 MVC 辅助类型Senparc.Weixin.Work企业微信核心 SDK包含实体、容器AccessTokenContainer/JsApiTicketContainer、WorkMessageHandler基类以及全部高级接口Senparc.Weixin.Work.Middleware提供UseMessageHandlerForWork()中间件让消息接收可以脱离 Controller 直接挂载到请求管道。2.2 通过全量 Sample 解决方案打开readme 同时说明也可以使用全量 Sample 解决方案打开并将Senparc.Weixin.Sample.MP项目设为启动项目。当前仓库中全量 Sample 位于 Samples/All/net8-mvcSenparc.Weixin.Sample.Net8.sln与 Samples/All/net10-mvcSenparc.Weixin.Sample.Net10.sln此外还有 net45-mvc 版本。全量解决方案汇集了公众号、小程序、微信支付、企业微信等多个平台的 Sample 与共享资源Senparc.Weixin.Sample.Shared适合整体学习各模块之间的异同。2.3 安装依赖包的三种方式若要在自己的项目中引入Senparc.Weixin.WorkSample 首页提供了三种安装途径对应截图位于 Samples/Work/Senparc.Weixin.Sample.Work/wwwroot/imagesVisual Studio在“解决方案资源管理器”中对目标项目右键 → “管理 NuGet 程序包” → 浏览页搜索Senparc.Weixin.Work→ 安装VS Code打开终端面板后执行dotnet add package Senparc.Weixin.Workdotnet 命令行进入项目目录后执行dotnet add package Senparc.Weixin.Work。通过 Visual Studio 安装 Senparc.Weixin.Work通过 dotnet CLI 安装 Senparc.Weixin.Work安装完成后.csproj中会生成对应的PackageReference节点。3. 引用源码调试readme 明确提示当前项目默认使用 NuGet 包引用如果想直接引用源码调试需要编辑当前项目的.csproj文件根据注释删除 NuGet 包引用代码并启用源码项目引用。以 Senparc.Weixin.Sample.Work.net8.csproj 为例源码引用块以注释形式预置在文件中!--引用 Nuget 包-- ItemGroup PackageReference IncludeSenparc.Weixin.AspNet Version1.6.4 / PackageReference IncludeSenparc.Weixin.Work Version3.32.0 / PackageReference IncludeSenparc.Weixin.Work.Middleware Version1.5.3 / /ItemGroup !--直接引用源码-- !--ItemGroup ProjectReference Include..\..\..\src\Senparc.Weixin.AspNet\Senparc.Weixin.AspNet.net8.csproj / ProjectReference Include..\..\..\src\Senparc.Weixin.Work.Middleware\Senparc.Weixin.Work.Middleware.net8.csproj / ProjectReference Include..\..\..\src\Senparc.Weixin.Work\Senparc.Weixin.Work\Senparc.Weixin.Work.net8.csproj / /ItemGroup--切换时注释掉PackageReference三个条目同时取消ProjectReference三个条目的注释即可。两种引用方式只能二选一不可同时启用。对应的源码工程位于仓库 src/Senparc.Weixin.AspNet、src/Senparc.Weixin.Work.Middleware 与 src/Senparc.Weixin.Work。readme 也建议通过全量 Sample 解决方案进行源码调试全量方案中相关依赖已经就位。说明工程中的GenerateEmbeddedFilesManifest、EmbeddedResource与Import共享projitems等节点是 Sample 为了共享静态资源而添加的实际项目无需保留.csproj 中均有注释标注。4. 全局注册与企业微信配置所有 Senparc.Weixin 下级模块的注册过程都一致只需在 Program.cs 中加入三句代码// 使用内存缓存必须添加 builder.Services.AddMemoryCache(); // Senparc.Weixin 注册必须 builder.Services.AddSenparcWeixin(builder.Configuration); // 启用微信配置必须 var registerService app.UseSenparcWeixin(app.Environment, null, null, register { }, (register, weixinSetting) { // 注册企业微信账号信息可以执行多次注册多个账号 register.RegisterWorkAccount(weixinSetting, 【盛派网络】企业微信); });三点说明AddMemoryCache()Senparc.Weixin 支持本机内存缓存、Redis、Memcached 等多种缓存策略默认使用本机缓存此时必须显式激活本地缓存AddSenparcWeixin(builder.Configuration)完成 Senparc.Weixin 的整体注册UseSenparcWeixin()的第二个委托中调用register.RegisterWorkAccount(weixinSetting, name)即可完成默认企业微信账号的注册该委托可多次调用以注册多个账号。注册 Senparc.Weixin 全局代码4.1 appsettings.json 配置项详解RegisterWorkAccount中传入的weixinSetting默认来自 appsettings.json 中的SenparcWeixinSetting节点SenparcWeixinSetting: { IsDebug: true, //企业微信 WeixinCorpId: #{WeixinCorpId}#, WeixinCorpAgentId: #{WeixinCorpAgentId}#, WeixinCorpSecret: #{WeixinCorpSecret}#, WeixinCorpToken: #{WeixinCorpToken}#, WeixinCorpEncodingAESKey: #{WeixinCorpEncodingAESKey}#, Items: { //添加多个企业微信应用 企业微信审批: { WeixinCorpId: #{WeixinCorpId2}#, WeixinCorpAgentId: #{WeixinCorpAgentId2}#, WeixinCorpSecret: #{WeixinCorpSecret2}#, WeixinCorpToken: #{WeixinCorpToken2}#, WeixinCorpEncodingAESKey: #{WeixinCorpEncodingAESKey2}# } } }各键含义配置键含义来源WeixinCorpId企业微信账号唯一标识 corpId企业微信管理后台“我的企业”WeixinCorpAgentId当前应用的 agentId自建应用各自独立应用详情页WeixinCorpSecret当前应用的 secret应用详情页WeixinCorpToken消息接收 URL 的 Token需与后台一致区分大小写应用“接收消息”设置页WeixinCorpEncodingAESKey消息加解密密钥需与后台一致区分大小写应用“接收消息”设置页配置约定文件注释中已强调所有字符串值都可能被用作字典索引请勿留空字符串不使用的参数可以删除整条设置但key 修改后会自动识别失效#{...#}是占位符部署前替换为真实值即可Items节点用于追加多个企业微信应用如示例中的“企业微信审批”“企业微信OAuth2.0”后续可通过Senparc.Weixin.Config.SenparcWeixinSetting[企业微信审批]按名称取用这一多应用注册机制对公众号、小程序、微信支付等其他模块同样通用。注册完成后所有配置可通过Senparc.Weixin.Config.SenparcWeixinSetting全局访问。5. MessageHandler企业微信消息处理MessageHandler负责处理企业微信会话窗口的消息。SDK 已封装好全部基础能力开发者只需继承基类并重写需要自定义业务逻辑的方法即可。5.1 自定义 MessageHandler 与消息上下文示例中自定义处理器为WorkCustomMessageHandler见 MessageHandlers/WorkCustomMessageHandler.cs它继承自WorkMessageHandlerWorkCustomMessageContextpublic class WorkCustomMessageHandler : WorkMessageHandlerWorkCustomMessageContext { // 为中间件提供生成当前类的委托 public static FuncStream, PostModel, int, IServiceProvider, WorkCustomMessageHandler GenerateMessageHandler (stream, postModel, maxRecordCount, serviceProvider) new WorkCustomMessageHandler(stream, postModel, maxRecordCount, serviceProvider); public WorkCustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount 0, IServiceProvider serviceProvider null) : base(inputStream, postModel, maxRecordCount, serviceProvider: serviceProvider) { } public override IWorkResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { var responseMessage this.CreateResponseMessageResponseMessageText(); responseMessage.Content 您发送了消息 requestMessage.Content; //发送一条客服消息 var weixinSetting Config.SenparcWeixinSetting.WorkSetting; var appKey AccessTokenContainer.BuildingKey(weixinSetting.WeixinCorpId, weixinSetting.WeixinCorpSecret); MassApi.SendText(appKey, weixinSetting.WeixinCorpAgentId, 这是一条客服消息对应您发送的消息 requestMessage.Content, OpenId); return responseMessage; } // ... 其他 OnXxxRequest 重写 }示例中演示的重写方法包括OnTextRequest回复文本并通过MassApi.SendText(appKey, agentId, content, OpenId)额外下发一条客服消息OnImageRequest原样回显图片MediaIdOnEvent_ClickRequest根据EventKey区分菜单点击事件对应下文“自定义菜单”OnEvent_LocationRequest返回位置坐标OnEvent_EnterAgentRequest进入应用时返回欢迎语与当前时间OnEvent_ChangeContactUpdateUserRequest通讯录成员变更事件示例中通过ChatApi.SendChatSimpleMessage向群聊001推送变更通知 JSONDefaultResponseMessage唯一必须重写的方法当用户消息找不到对应重写方法时兜底回复。其中GenerateMessageHandler静态委托是中间件方式接入的“工厂”中间件会调用它来创建处理器实例。消息上下文 MessageHandlers/WorkCustomMessageContext.cs 继承DefaultWorkMessageContext属于可选扩展它订阅了MessageContextRemoved事件可用于在消息上下文过期时执行清理逻辑示例代码中以注释形式给出参考。5.2 中间件方式推荐中间件方式无需创建任何新文件只需在Program.cs的注册代码之后追加见 Program.csapp.UseMessageHandlerForWork(/WorkAsync, WorkCustomMessageHandler.GenerateMessageHandler, options { // 获取默认微信配置 var weixinSetting Senparc.Weixin.Config.SenparcWeixinSetting; // [必填] 指定微信配置 options.AccountSettingFunc context weixinSetting; // [可选] 设置文本返回长度限制如需超长消息可通过客服接口分段回复 var appKey AccessTokenContainer.BuildingKey(weixinSetting.WorkSetting); options.TextResponseLimitOptions new TextResponseLimitOptions(2048, appKey); });配置完成后域名/WorkAsync即成为消息接收地址可填入企业微信后台应用“接收消息”的 URL。TextResponseLimitOptions用于限制单次文本回复长度示例为 2048 字符超长场景可通过客服接口分段回复。中间件与 Controller 两种方式共享同一个WorkCustomMessageHandler可随时切换或共存。5.3 Controller 方式当中间件无法满足精细化控制需求时可以使用 Controller 将执行过程“展开”。示例见 Controllers/WorkController.cs需要两个 ActionGET后台验证接收msg_signature/timestamp/nonce/echostr调用Signature.VerifyURL(Token, EncodingAESKey, CorpId, ...)验证通过后返回解密后的随机字符串POST消息推送构造WorkCustomMessageHandler执行await messageHandler.ExecuteAsync(new CancellationToken())最后用FixWeixinBugWeixinResult自动返回加密响应。关键调用链WorkController.cs#L54-L66 与 WorkController.cs#L73-L134// GET 验证 var verifyUrl Signature.VerifyURL(Token, EncodingAESKey, CorpId, msg_signature, timestamp, nonce, echostr); // POST 消息处理 var messageHandler new WorkCustomMessageHandler(Request.GetRequestMemoryStream(), postModel, maxRecordCount); await messageHandler.ExecuteAsync(new CancellationToken()); // 执行微信处理过程关键 return new FixWeixinBugWeixinResult(messageHandler); // 自动返回加密后结果WorkController还提供了极简演示MiniPost仅用三行代码完成“构造 → 执行 → 返回”。文件头注释特别强调SDK 已全面转向异步方法驱动建议使用ExecuteAsync()等异步方法不再推荐同步写法。完成后域名/Work即消息接收地址。6. 高级接口调用AppKey 与 AccessToken完成Program.cs的常规注册后可在程序任意位置调用高级接口。企业微信以CorpId Secret定位每个应用的授权信息SDK 将二者合并为一个唯一参数AppKey企业微信 SDK 内几乎所有高级接口的第一个参数同时支持传入 AppKey 或 AccessToken通常命名为accessTokenOrAppKeySDK 会根据参数特征自动识别并区分处理。6.1 使用 AppKey推荐见 Controllers/AdvancedApiController.cs#L13-L30public async TaskIActionResult TryApiByAppKey() { // 获取注册信息 var workWeixinSetting Config.SenparcWeixinSetting.WorkSetting; // 获取 AppKey var appKey AccessTokenContainer.BuildingKey(workWeixinSetting); try { // 发送文字提醒 var result await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(appKey, 001, 这是一条来企业微信的消息); return Content(OK); } catch (ErrorJsonResultException ex) { return Content($出错啦{ex.Message}); } }BuildingKey(corpId, corpSecret)与BuildingKey(weixinSetting)均可生成 AppKey。只要传入的是已经注册过的企业微信信息内部包含 CorpId 与 Secret即使 AccessToken 过期SDK 也会自动刷新续期无需关心令牌生命周期。6.2 使用 AccessToken不推荐见 Controllers/AdvancedApiController.cs#L36-L53通过AccessTokenContainer.GetTokenAsync(corpId, corpSecret)手动取令牌再调用var accessToken await AccessTokenContainer.GetTokenAsync(workWeixinSetting.WeixinCorpId, workWeixinSetting.WeixinCorpSecret); var result await Senparc.Weixin.Work.AdvancedAPIs.MassApi.SendTextAsync(accessToken, 001, 这是一条来企业微信的消息);这种方式无法保证当前令牌的有效性需配合有效性校验与try-catch重试常规场景不推荐。高级接口配置与 MessageHandler 相互独立可以单独使用也可以配合使用。7. JSSDK服务端签名与前端配置JSSDK 用于提供企业微信内置浏览器能力转发控制、调用摄像头、文件上传、关闭窗口、唤起扫码等使用分“服务端获取签名信息”和“网页端配置 JSSDK”两步。7.1 常规 JSSDK服务端见 Controllers/JSSDKController.cs#L13-L26public async TaskActionResult Index() { // 当前 URL var url https://sdk.work.weixin.senparc.com/JSSDK/; // 获取企业微信配置 var workSetting Senparc.Weixin.Config.SenparcWeixinSetting.WorkSetting; // 获取 JsApiTicket保密信息不可外传 var jsApiTicket await JsApiTicketContainer.GetTicketAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, false); // 获取 UI 打包信息 var jsApiUiPackage await JSSDKHelper.GetJsApiUiPackageAsync(workSetting.WeixinCorpId, workSetting.WeixinCorpSecret, url, jsApiTicket, false); ViewData[jsApiUiPackage] jsApiUiPackage; return View(); }前端Views/JSSDK/Index.cshtml使用wx.config配置签名信息并可通过wx.invoke(shareWechatMessage, ...)实现“企业微信内转发网页到个人微信”wx.config({ beta: true, // 必须这么写否则 wx.invoke 调用形式的 jsapi 会有问题 debug: true, // 开启调试模式 appId: jsApiUiPackage.AppId, // 必填企业微信的 corpID timestamp: jsApiUiPackage.Timestamp, // 必填生成签名的时间戳 nonceStr: jsApiUiPackage.NonceStr, // 必填生成签名的随机串 signature: jsApiUiPackage.Signature, // 必填签名 jsApiList: [shareWechatMessage] // 必填需要使用的 JS 接口列表 });wx.config校验成功后进入wx.ready失败进入wx.errorSPA 应用可在wx.error中重新拉取签名更新配置。7.2 agentConfig多应用与审批流等专属接口部分接口如审批流、剪切板必须使用wx.agentConfig()它是在常规 JSSDK 基础上的增量配置。服务端见 Controllers/JSSDKController.cs#L32-L59关键差异是通过Senparc.Weixin.Config.SenparcWeixinSetting[企业微信审批]按名称读取Items 中注册的第二个应用对应 appsettings.json 的“企业微信审批”节点JsApiTicketContainer.GetTicketAsync(corpId, corpSecret, true)与JSSDKHelper.GetJsApiUiPackageAsync(..., true)的最后一个布尔参数用于区分agentConfig 专用 ticket/签名包常规 JSSDK 传false额外向视图提供corpId、agentId与thirdNo第三方审批单号。前端在调用审批流接口前先执行wx.agentConfig见 Views/JSSDK/AgentConfig.cshtmlwx.agentConfig({ corpid: ViewData[corpId], // 必填必须与当前登录企业一致 agentid: ViewData[agentId], // 必填企业微信的应用 id timestamp: agentJsApiUiPackage.Timestamp, nonceStr: agentJsApiUiPackage.NonceStr, signature: agentJsApiUiPackage.Signature, jsApiList: [thirdPartyOpenPage], // 必填传入需要使用的接口名称 success: function(res) { // 回调中调用 wx.invoke(thirdPartyOpenPage, {...}) 唤起审批流程 }, fail: function(res) { /* 处理失败如版本过低等 */ } });8. OAuth 2.0 网页授权需要获取网页访问者的 UserId、头像、称呼等信息时使用 OAuth 2.0 与企业微信服务器通讯。SDK 已封装全部过程只需三步示例见 Controllers/OAuth2Controller.cs。8.1 第一步生成授权 URLpublic IActionResult Index(string returnUrl) { // 设置自己的 URL var url https://4424-222-93-135-159.ngrok.io; // 此页面引导用户点击授权snsapi_base 方式回调地址 var oauthUrl OAuth2Api.GetCode(_corpId, ${url}/OAuth2/BaseCallback?returnUrl{returnUrl.UrlEncode()}, null, null); ViewData[UrlBase] oauthUrl; ViewData[returnUrl] returnUrl; return View(); }企业微信授权有两种方式snsapi_userinfo与snsapi_base企业自建应用使用snsapi_base示例默认这是所有场景下兼容的方式。returnUrl一般取自用户进入登录页之前的 URL授权完成后跳回该地址。8.2 第二步前端引导前端页面Views/OAuth2/Index.cshtml直接以链接方式引导用户打开授权地址a hrefViewData[UrlBase]点击这里测试snsapi_base/a8.3 第三步回调处理授权成功后跳转到${url}/OAuth2/BaseCallback?returnUrl...public async TaskActionResult BaseCallback(string code, string returnUrl) { if (string.IsNullOrEmpty(code)) return Content(您拒绝了授权); try { var appKey AccessTokenContainer.BuildingKey(_workWeixinSetting); var accessToken await AccessTokenContainer.GetTokenAsync(_corpId, _corpSecret); // 用 code 换取 UserId var oauthResult await OAuth2Api.GetUserIdAsync(accessToken, code); var userId oauthResult.UserId; // 用 UserId 获取成员详情 GetMemberResult result await MailListApi.GetMemberAsync(appKey, userId); if (result.errcode ! ReturnCode_Work.请求成功) { return Content(错误 result.errmsg); } ViewData[returnUrl] returnUrl; return View(result); } catch (Exception ex) { return Content(错误 ex.Message); } }整个闭环为Index携带returnUrl生成 AuthorizeUrl → 用户授权 → 回调BaseCallbackcode换UserId→ 拉取成员信息→ 业务处理后借助returnUrl跳回登录前页面。注意实际场景应跳转到returnUrl而非停留在回调页因为用户刷新回调页时code已失效。另外需将上述网址与路径在企业微信后台配置为与自身服务器匹配的合法地址。示例中该控制器通过构造函数从SenparcWeixinSetting[企业微信OAuth2.0]读取独立的第二套应用配置演示了多应用场景下的 OAuth 接入。9. 自定义菜单设置与使用菜单使用分为设置与使用两个环节。9.1 设置菜单代码方式后台方式可直接在企业微信管理后台配置代码方式只需执行一次建议放在管理员后台手动运行构建ButtonGroup后调用CommonApi.CreateMenuAsync(appKey, agentId, bg)示例代码见 Views/Home/Index.cshtml 菜单部分ButtonGroup bg new ButtonGroup(); // 单击按钮 bg.button.Add(new SingleClickButton() { name 单击测试, key OneClick, type MenuButtonType.click.ToString(), }); // 二级菜单 var subButton new SubButton() { name 二级菜单 }; subButton.sub_button.Add(new SingleClickButton() { key SubClickRoot_Text, name 返回文本 }); subButton.sub_button.Add(new SingleViewButton() { url https://weixin.senparc.com, name Url跳转 }); bg.button.Add(subButton); var workWeixinSetting Config.SenparcWeixinSetting.WorkSetting; var appKey AccessTokenContainer.BuildingKey(workWeixinSetting); int agentId; if (!int.TryParse(workWeixinSetting.WeixinCorpAgentId, out agentId)) { throw new WeixinException(WeixinCorpAgentId 必须为整数); } var result await CommonApi.CreateMenuAsync(appKey, agentId, bg);注意WeixinCorpAgentId必须以整数形式传入。9.2 使用菜单事件回调菜单被点击时企业微信服务器会推送对应事件到消息 URL即已配置的 MessageHandler。只需在WorkCustomMessageHandler中重写事件方法MessageHandlers/WorkCustomMessageHandler.cs#L62-L76public override IWorkResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { var reponseMessage CreateResponseMessageResponseMessageText(); if (requestMessage.EventKey SubClickRoot_Text) { reponseMessage.Content 您点击了【返回文本】按钮; } else { reponseMessage.Content 您点击了其他事件按钮; } return reponseMessage; }通过EventKey与设置菜单时定义的key对应即可实现“点击菜单 → 事件推送 → 自定义回复”的完整链路。该事件处理的承载方式中间件或 Controller与普通消息完全一致。10. 总结Senparc.Weixin.Sample.Work是一个聚焦企业微信平台的独立示例完整串联了 Senparc.Weixin.Work 模块的核心链路运行与调试可直接打开 Senparc.Weixin.Sample.Work.slnNuGet 引用或通过 Samples/All/net8-mvc 全量方案运行需要断点调试 SDK 源码时按.csproj注释切换到ProjectReference源码引用接入配置Program.cs三句代码完成全局注册appsettings.json的SenparcWeixinSetting承载单应用与Items多应用配置消息处理WorkCustomMessageHandlerUseMessageHandlerForWork中间件推荐或WorkController两种承载方式业务能力AppKey 驱动的高级接口、常规 JSSDK 与agentConfig双签名、OAuth 2.0 三步授权闭环、自定义菜单设置与事件响应。对于要基于 .NET 集成企业微信含审批流、网页授权、消息推送等场景的开发者该 Sample 即是最佳参照模板从 readme.md 起步对照 Program.cs、appsettings.json 与各 Controller/MessageHandler 文件即可快速迁移到自己的业务项目中。赞分享后端即时通讯金融科技【免费下载链接】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点击查看免费下载相关推荐QMCDecode3分钟解锁QQ音乐加密格式的完整解决方案QMCDecode3分钟解锁QQ音乐加密格式的完整解决方案 你是否曾经下载了喜欢的QQ音乐歌曲却发现只能在特定客户端播放无法在其他设备或播放器上欣赏这就后端即时通讯金融科技如何实现企业微信到微信消息推送的完整解决方案如何实现企业微信到微信消息推送的完整解决方案 还在为错过重要通知而烦恼吗Wecom酱为您提供企业微信到微信消息推送的完美解决方案无需安装额外应用只需微信就后端即时通讯ServerlessOpenModScan跑通 Modbus 协议测试的免费寄存器调试工具OpenModScan跑通 Modbus 协议测试的免费寄存器调试工具 凌晨两点产线 PLC 的温度寄存器死活读不出来寄存器调试卡在了半路。OpenMod后端即时通讯金融科技上一篇用 webnovel-writer 做冲突设计从冲突卡到升级链的 4 步实操流程下一篇Tsuru平台监控告警终极指南智能阈值与高效通知策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考