企业微信相关方法封装
$ dotnet add package DreamSlave.Wecom当前为预览版,仅用于实验/学习,勿直接用于生产。
IWecomUnifiedService
通过 serviceName 区分多实例,内部使用 IMemoryCache 保存 token / ticket。
// 多实例按需调用多次
builder.Services.AddWecomConfig("oauth2", cfg =>
{
cfg.CorpID = "企业微信Id";
cfg.CorpSecret = "Secret";
cfg.AgentId = 1000001;
cfg.Token = "";
cfg.EncodingAesKey = "";
cfg.AutoRefresh = true; // 后台自动刷新
});
var dto = _wecom.GetJsapiTicketDto("oauth2", currentUrl);
var authUrl = _wecom.BuildOAuth2Url("oauth2", callbackUrl, state);
// 回调里
var user = await _wecom.GetOAuth2UserInfoAsync("oauth2", code);
var detail = await _wecom.GetOAuth2UserDetailAsync("oauth2", user);
var loginUrl = _wecom.BuildWebLoginUrl("oauth2", callbackUrl, state);
var webUser = await _wecom.GetWebLoginUserInfoAsync("oauth2", code);
后台已自动注册 WecomCommandExecService (按实例 serviceName)。
[HttpGet("/api/wecom/callback")] // 检测签名
public IActionResult Verify([FromQuery] Callback cb)
{
if(!_wecom.CheckSignature("oauth2", cb)) return Content("签名错误");
return Content(_wecom.DecryptEchostr("oauth2", cb));
}
[HttpPost("/api/wecom/callback")] // 处理消息
public async Task<IActionResult> Receive([FromQuery] Callback cb)
{
using var reader = new StreamReader(Request.Body);
var payload = await reader.ReadToEndAsync();
var xml = _wecom.DecryptCallBackData("oauth2", payload);
return Content(await _exec.HandleMessageAsync(xml));
}
文本命令:
public class DeveloperHandler
{
[WecomTextCommand("id")]
public Task<string> IdAsync(IServiceProvider sp, MessageReceive msg)
=> Task.FromResult("您的ID:" + msg.fromUserName);
}
事件命令:
public class EventHandler
{
[WecomEventCommand("enter_agent")] public Task<string> EnterAsync(IServiceProvider sp, MessageReceive m) => Task.FromResult("进入应用:"+m.AgentId);
}
支持作用域过滤:
[WecomHandlerScope("oauth2")] // 仅在 oauth2 实例生效
await _wecom.SendTextMessageAsync("oauth2", "测试", "UserA");
当配置 AutoRefresh=true,会启动后台刷新服务:
仅供学习/测试,不对稳定性与合规性负责。