Browse Source

Merge pull request #1404 from colinin/wecom

feat(wechat): Optimize the integration of WeCom
pull/1407/head
yx lin 3 months ago
committed by GitHub
parent
commit
d5c750a202
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN.Abp.WeChat.SettingManagement.csproj
  2. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/AbpWeChatSettingManagementModule.cs
  3. 12
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/WeChatSettingAppService.cs
  4. 100
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/WeChatWorkContactTokenProvider.cs
  5. 18
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs
  6. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN.Abp.WeChat.Work.ExternalContact.csproj
  7. 3
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/AbpWeChatWorkExternalContactModule.cs
  8. 6
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Attachments/WeChatWorkAttachmentProvider.cs
  9. 6
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Contacts/WeChatWorkExternalContactProvider.cs
  10. 24
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/WeChatWorkCustomerProvider.cs
  11. 36
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/WeChatWorkCustomerStrategyProvider.cs
  12. 6
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Follows/WeChatWorkFollowUserProvider.cs
  13. 18
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/GroupChats/WeChatWorkGroupChatProvider.cs
  14. 4
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Localization/Resources/en.json
  15. 4
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Localization/Resources/zh-Hans.json
  16. 23
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Messages/Models/ExternalContactMsgAuditApprovedEvent.cs
  17. 16
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Messages/Models/ExternalContactMsgAuditNotifyEvent.cs
  18. 48
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/IWeChatWorkMsgAuditProvider.cs
  19. 35
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Models/RoomAgreeInfo.cs
  20. 25
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Models/RoomMember.cs
  21. 39
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Models/UserAgreeInfo.cs
  22. 25
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkCheckRoomAgreeRequest.cs
  23. 33
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkCheckSingleAgreeRequest.cs
  24. 25
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkGetGroupChatRequest.cs
  25. 57
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkGetPermitUserListRequest.cs
  26. 22
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkCheckRoomAgreeResponse.cs
  27. 22
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkCheckSingleAgreeResponse.cs
  28. 50
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkGetGroupChatResponse.cs
  29. 21
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkGetPermitUserListResponse.cs
  30. 76
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/WeChatWorkMsgAuditProvider.cs
  31. 30
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Settings/WeChatWorkExternalContactSettingDefinitionProvider.cs
  32. 12
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Settings/WeChatWorkExternalContactSettingNames.cs
  33. 30
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Tags/WeChatWorkCropTagProvider.cs
  34. 24
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Tags/WeChatWorkStrategyTagProvider.cs
  35. 23
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Token/IWeChatWorkExternalContactTokenProvider.cs
  36. 50
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Token/WeChatWorkExternalContactTokenProvider.cs
  37. 18
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Transfers/WeChatWorkEmployExtendProvider.cs
  38. 24
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Transfers/WeChatWorkResignExtendProvider.cs
  39. 9
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Attachments.cs
  40. 9
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Contacts.cs
  41. 36
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Customers.cs
  42. 11
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Follows.cs
  43. 28
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.GroupChats.cs
  44. 97
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.MsgAudits.cs
  45. 52
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Strategies.cs
  46. 76
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tags.cs
  47. 57
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Transfers.cs
  48. 1
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs
  49. 5
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/WeChatWorkAuthorizeGenerator.cs
  50. 15
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/WeChatWorkUserFinder.cs
  51. 16
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Chat/WeChatWorkAppChatManager.cs
  52. 3
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/JsSdk/JsApiTicketProvider.cs
  53. 20
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Media/WeChatWorkMediaProvider.cs
  54. 6
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageManager.cs
  55. 16
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageSender.cs
  56. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Security/IWeChatWorkServerProvider.cs
  57. 10
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Security/WeChatWorkServerProvider.cs
  58. 99
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/WeChatWorkTokenProvider.cs
  59. 111
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/WeChatWorkTokenProviderBase.cs
  60. 17
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Auth.cs
  61. 27
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Chat.cs
  62. 18
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Media.cs
  63. 36
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Message.cs
  64. 11
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Security.cs
  65. 8
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs

1
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN.Abp.WeChat.SettingManagement.csproj

@ -31,6 +31,7 @@
<ProjectReference Include="..\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WeChat.Work.Contacts\LINGYUN.Abp.WeChat.Work.Contacts.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.WeChat.Work.Contacts\LINGYUN.Abp.WeChat.Work.Contacts.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WeChat.Work.ExternalContact\LINGYUN.Abp.WeChat.Work.ExternalContact.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WeChat.Work\LINGYUN.Abp.WeChat.Work.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.WeChat.Work\LINGYUN.Abp.WeChat.Work.csproj" />
</ItemGroup> </ItemGroup>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/AbpWeChatSettingManagementModule.cs

@ -3,6 +3,7 @@ using LINGYUN.Abp.WeChat.MiniProgram;
using LINGYUN.Abp.WeChat.Official; using LINGYUN.Abp.WeChat.Official;
using LINGYUN.Abp.WeChat.Work; using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.Contacts; using LINGYUN.Abp.WeChat.Work.Contacts;
using LINGYUN.Abp.WeChat.Work.ExternalContact;
using LINGYUN.Abp.WeChat.Work.Localization; using LINGYUN.Abp.WeChat.Work.Localization;
using Localization.Resources.AbpUi; using Localization.Resources.AbpUi;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -18,6 +19,7 @@ namespace LINGYUN.Abp.WeChat.SettingManagement;
typeof(AbpWeChatMiniProgramModule), typeof(AbpWeChatMiniProgramModule),
typeof(AbpWeChatWorkModule), typeof(AbpWeChatWorkModule),
typeof(AbpWeChatWorkContactModule), typeof(AbpWeChatWorkContactModule),
typeof(AbpWeChatWorkExternalContactModule),
typeof(AbpAspNetCoreMvcModule))] typeof(AbpAspNetCoreMvcModule))]
public class AbpWeChatSettingManagementModule : AbpModule public class AbpWeChatSettingManagementModule : AbpModule
{ {

12
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/WeChatSettingAppService.cs

@ -7,6 +7,8 @@ using LINGYUN.Abp.WeChat.Official.Settings;
using LINGYUN.Abp.WeChat.Settings; using LINGYUN.Abp.WeChat.Settings;
using LINGYUN.Abp.WeChat.Work.Contacts.Features; using LINGYUN.Abp.WeChat.Work.Contacts.Features;
using LINGYUN.Abp.WeChat.Work.Contacts.Settings; using LINGYUN.Abp.WeChat.Work.Contacts.Settings;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Features;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Settings;
using LINGYUN.Abp.WeChat.Work.Features; using LINGYUN.Abp.WeChat.Work.Features;
using LINGYUN.Abp.WeChat.Work.Settings; using LINGYUN.Abp.WeChat.Work.Settings;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -186,6 +188,16 @@ public class WeChatSettingAppService : ApplicationService, IWeChatSettingAppServ
providerName); providerName);
} }
if (await FeatureChecker.IsEnabledAsync(WeChatWorkExternalContactFeatureNames.Enable))
{
workConnectionSetting.AddDetail(
await SettingDefinitionManager.GetAsync(WeChatWorkExternalContactSettingNames.Secret),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(WeChatWorkExternalContactSettingNames.Secret, providerName, providerKey),
ValueType.String,
providerName);
}
workConnectionSetting.AddDetail( workConnectionSetting.AddDetail(
await SettingDefinitionManager.GetAsync(WeChatWorkSettingNames.Connection.Token), await SettingDefinitionManager.GetAsync(WeChatWorkSettingNames.Connection.Token),
StringLocalizerFactory, StringLocalizerFactory,

100
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/WeChatWorkContactTokenProvider.cs

@ -1,12 +1,8 @@
using LINGYUN.Abp.WeChat.Work.Contacts.Features; using LINGYUN.Abp.WeChat.Work.Contacts.Features;
using LINGYUN.Abp.WeChat.Work.Contacts.Settings; using LINGYUN.Abp.WeChat.Work.Contacts.Settings;
using LINGYUN.Abp.WeChat.Work.Settings; using LINGYUN.Abp.WeChat.Work.Settings;
using LINGYUN.Abp.WeChat.Work.Token;
using LINGYUN.Abp.WeChat.Work.Token.Models; using LINGYUN.Abp.WeChat.Work.Token.Models;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -19,22 +15,15 @@ using Volo.Abp.Settings;
namespace LINGYUN.Abp.WeChat.Work.Contacts.Token; namespace LINGYUN.Abp.WeChat.Work.Contacts.Token;
[RequiresFeature(WeChatWorkContactsFeatureNames.Enable)] [RequiresFeature(WeChatWorkContactsFeatureNames.Enable)]
public class WeChatWorkContactTokenProvider : IWeChatWorkContactTokenProvider, ISingletonDependency public class WeChatWorkContactTokenProvider : WeChatWorkTokenProviderBase, IWeChatWorkContactTokenProvider, ISingletonDependency
{ {
public ILogger<WeChatWorkContactTokenProvider> Logger { get; set; } protected override string ProviderName => "WeChatWorkContactToken";
protected ISettingProvider SettingProvider { get; }
protected IHttpClientFactory HttpClientFactory { get; }
protected IDistributedCache<WeChatWorkTokenCacheItem> WeChatWorkTokenCache { get; }
public WeChatWorkContactTokenProvider( public WeChatWorkContactTokenProvider(
ISettingProvider settingProvider, ISettingProvider settingProvider,
IHttpClientFactory httpClientFactory, IHttpClientFactory httpClientFactory,
IDistributedCache<WeChatWorkTokenCacheItem> cache) IDistributedCache<WeChatWorkTokenCacheItem> cache)
: base(settingProvider, httpClientFactory, cache)
{ {
HttpClientFactory = httpClientFactory;
SettingProvider = settingProvider;
WeChatWorkTokenCache = cache;
Logger = NullLogger<WeChatWorkContactTokenProvider>.Instance;
} }
public async virtual Task<WeChatWorkToken> GetTokenAsync(CancellationToken cancellationToken = default) public async virtual Task<WeChatWorkToken> GetTokenAsync(CancellationToken cancellationToken = default)
@ -56,85 +45,6 @@ public class WeChatWorkContactTokenProvider : IWeChatWorkContactTokenProvider, I
string secret, string secret,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return (await GetCacheItemAsync("WeChatWorkContactToken", corpId, agentId, secret, cancellationToken)).Token; return (await InternalGetTokenAsync(corpId, agentId, secret, cancellationToken)).Token;
}
/// <summary>
/// 获取缓存中的Token配置
/// </summary>
/// <param name="provider"></param>
/// <param name="corpId"></param>
/// <param name="agentId"></param>
/// <param name="secret"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async virtual Task<WeChatWorkTokenCacheItem> GetCacheItemAsync(
string provider,
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
Check.NotNullOrEmpty(corpId, nameof(corpId));
Check.NotNullOrEmpty(agentId, nameof(agentId));
Check.NotNullOrEmpty(secret, nameof(secret));
var cacheKey = WeChatWorkTokenCacheItem.CalculateCacheKey(provider, corpId, agentId);
return await GetCacheItemAsync(cacheKey, provider, corpId, agentId, secret);
}
/// <summary>
/// 获取或刷新分布式缓存中的Token配置
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="provider"></param>
/// <param name="corpId"></param>
/// <param name="agentId"></param>
/// <param name="secret"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async virtual Task<WeChatWorkTokenCacheItem> GetCacheItemAsync(
string cacheKey,
string provider,
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
var cacheItem = await WeChatWorkTokenCache.GetAsync(cacheKey, token: cancellationToken);
if (cacheItem != null)
{
Logger.LogDebug($"Found WeChatWorkContactToken in the cache: {cacheKey}");
return cacheItem;
}
Logger.LogDebug($"Not found WeChatWorkContactToken in the cache, getting from the httpClient: {cacheKey}");
var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkTokenRequest
{
CorpId = corpId,
CorpSecret = secret,
};
using var response = await client.GetTokenAsync(request, cancellationToken);
var tokenResponse = await response.DeserializeObjectAsync<WeChatWorkTokenResponse>();
var token = tokenResponse.ToWeChatWorkToken();
cacheItem = new WeChatWorkTokenCacheItem(corpId, agentId, token);
Logger.LogDebug($"Setting the cache item: {cacheKey}");
var cacheOptions = new DistributedCacheEntryOptions
{
// 设置绝对过期时间为Token有效期剩余的二分钟
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(token.ExpiresIn - 100),
};
await WeChatWorkTokenCache.SetAsync(cacheKey, cacheItem, cacheOptions, token: cancellationToken);
Logger.LogDebug($"Finished setting the cache item: {cacheKey}");
return cacheItem;
} }
} }

18
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs

@ -1,21 +1,5 @@
using LINGYUN.Abp.WeChat.Work.Token.Models; namespace System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetTokenAsync(this HttpMessageInvoker client, WeChatWorkTokenRequest request, CancellationToken cancellationToken = default)
{
var urlBuilder = new StringBuilder();
urlBuilder.Append("/cgi-bin/gettoken");
urlBuilder.AppendFormat("?corpid={0}", request.CorpId);
urlBuilder.AppendFormat("&corpsecret={0}", request.CorpSecret);
var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken);
}
} }

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN.Abp.WeChat.Work.ExternalContact.csproj

@ -13,6 +13,8 @@
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<RootNamespace /> <RootNamespace />
<!--<Version>9.3.6.3</Version>
<PackageVersion>9.3.6.3</PackageVersion>-->
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

3
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/AbpWeChatWorkExternalContactModule.cs

@ -30,6 +30,7 @@ public class AbpWeChatWorkExternalContactModule : AbpModule
"del_external_contact" => context.GetWeChatMessage<ExternalContactDeleteEvent>(), "del_external_contact" => context.GetWeChatMessage<ExternalContactDeleteEvent>(),
"del_follow_user" => context.GetWeChatMessage<ExternalContactDeleteFollowUserEvent>(), "del_follow_user" => context.GetWeChatMessage<ExternalContactDeleteFollowUserEvent>(),
"transfer_fail" => context.GetWeChatMessage<ExternalContactTransferFailEvent>(), "transfer_fail" => context.GetWeChatMessage<ExternalContactTransferFailEvent>(),
"msg_audit_approved" => context.GetWeChatMessage<ExternalContactMsgAuditApprovedEvent>(),
_ => throw new AbpWeChatException($"Contact change event change_external_contact:{changeType} is not mounted!"), _ => throw new AbpWeChatException($"Contact change event change_external_contact:{changeType} is not mounted!"),
}; };
}); });
@ -69,6 +70,8 @@ public class AbpWeChatWorkExternalContactModule : AbpModule
_ => throw new AbpWeChatException($"Contact change event change_external_tag:{changeType} is not mounted!"), _ => throw new AbpWeChatException($"Contact change event change_external_tag:{changeType} is not mounted!"),
}; };
}); });
// 产生会话回调事件
options.MapEvent("msgaudit_notify", context => context.GetWeChatMessage<ExternalContactMsgAuditNotifyEvent>());
}); });
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>

6
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Attachments/WeChatWorkAttachmentProvider.cs

@ -32,10 +32,6 @@ public class WeChatWorkAttachmentProvider : IWeChatWorkAttachmentProvider, ISing
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.UploadAsync(token.AccessToken, request, cancellationToken); return await client.UploadAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkUploadAttachmentResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

6
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Contacts/WeChatWorkExternalContactProvider.cs

@ -35,10 +35,6 @@ public class WeChatWorkExternalContactProvider : IWeChatWorkExternalContactProvi
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetExternalContactListAsync(token.AccessToken, request, cancellationToken); return await client.GetExternalContactListAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetExternalContactListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

24
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/WeChatWorkCustomerProvider.cs

@ -35,11 +35,7 @@ public class WeChatWorkCustomerProvider : IWeChatWorkCustomerProvider, ISingleto
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetCustomerListAsync(token.AccessToken, userId, cancellationToken); return await client.GetCustomerListAsync(token.AccessToken, userId, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetCustomerListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkBulkGetCustomerResponse> BulkGetCustomerAsync( public async virtual Task<WeChatWorkBulkGetCustomerResponse> BulkGetCustomerAsync(
@ -51,11 +47,7 @@ public class WeChatWorkCustomerProvider : IWeChatWorkCustomerProvider, ISingleto
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.BulkGetCustomerAsync(token.AccessToken, request, cancellationToken); return await client.BulkGetCustomerAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkBulkGetCustomerResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGetCustomerResponse> GetCustomerAsync( public async virtual Task<WeChatWorkGetCustomerResponse> GetCustomerAsync(
@ -68,11 +60,7 @@ public class WeChatWorkCustomerProvider : IWeChatWorkCustomerProvider, ISingleto
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetCustomerAsync(token.AccessToken, externalUserid, cursor, cancellationToken); return await client.GetCustomerAsync(token.AccessToken, externalUserid, cursor, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetCustomerResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> UpdateCustomerRemarkAsync( public async virtual Task<WeChatWorkResponse> UpdateCustomerRemarkAsync(
@ -84,10 +72,6 @@ public class WeChatWorkCustomerProvider : IWeChatWorkCustomerProvider, ISingleto
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.UpdateCustomerRemarkAsync(token.AccessToken, request, cancellationToken); return await client.UpdateCustomerRemarkAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

36
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/WeChatWorkCustomerStrategyProvider.cs

@ -32,11 +32,7 @@ public class WeChatWorkCustomerStrategyProvider : IWeChatWorkCustomerStrategyPro
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetCustomerStrategyListAsync(token.AccessToken, request, cancellationToken); return await client.GetCustomerStrategyListAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetCustomerStrategyListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGetCustomerStrategyResponse> GetCustomerStrategyAsync( public async virtual Task<WeChatWorkGetCustomerStrategyResponse> GetCustomerStrategyAsync(
@ -46,11 +42,7 @@ public class WeChatWorkCustomerStrategyProvider : IWeChatWorkCustomerStrategyPro
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetCustomerStrategyAsync(token.AccessToken, request, cancellationToken); return await client.GetCustomerStrategyAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetCustomerStrategyResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGetCustomerStrategyRangeResponse> GetCustomerStrategyRangeAsync( public async virtual Task<WeChatWorkGetCustomerStrategyRangeResponse> GetCustomerStrategyRangeAsync(
@ -60,11 +52,7 @@ public class WeChatWorkCustomerStrategyProvider : IWeChatWorkCustomerStrategyPro
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetCustomerStrategyRangeAsync(token.AccessToken, request, cancellationToken); return await client.GetCustomerStrategyRangeAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetCustomerStrategyRangeResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkCreateCustomerStrategyResponse> CreateCustomerStrategyAsync( public async virtual Task<WeChatWorkCreateCustomerStrategyResponse> CreateCustomerStrategyAsync(
@ -74,11 +62,7 @@ public class WeChatWorkCustomerStrategyProvider : IWeChatWorkCustomerStrategyPro
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.CreateCustomerStrategyAsync(token.AccessToken, request, cancellationToken); return await client.CreateCustomerStrategyAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkCreateCustomerStrategyResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> UpdateCustomerStrategyAsync( public async virtual Task<WeChatWorkResponse> UpdateCustomerStrategyAsync(
@ -88,11 +72,7 @@ public class WeChatWorkCustomerStrategyProvider : IWeChatWorkCustomerStrategyPro
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.UpdateCustomerStrategyAsync(token.AccessToken, request, cancellationToken); return await client.UpdateCustomerStrategyAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> DeleteCustomerStrategyAsync( public async virtual Task<WeChatWorkResponse> DeleteCustomerStrategyAsync(
@ -102,10 +82,6 @@ public class WeChatWorkCustomerStrategyProvider : IWeChatWorkCustomerStrategyPro
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.DeleteCustomerStrategyAsync(token.AccessToken, request, cancellationToken); return await client.DeleteCustomerStrategyAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

6
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Follows/WeChatWorkFollowUserProvider.cs

@ -29,10 +29,6 @@ public class WeChatWorkFollowUserProvider : IWeChatWorkFollowUserProvider, ISing
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetFollowUserListAsync(token.AccessToken, cancellationToken); return await client.GetFollowUserListAsync(token.AccessToken, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetFollowUserListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

18
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/GroupChats/WeChatWorkGroupChatProvider.cs

@ -35,11 +35,7 @@ public class WeChatWorkGroupChatProvider : IWeChatWorkGroupChatProvider, ISingle
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetGroupChatListAsync(token.AccessToken, request, cancellationToken); return await client.GetGroupChatListAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetGroupChatListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGetGroupChatResponse> GetGroupChatAsync( public async virtual Task<WeChatWorkGetGroupChatResponse> GetGroupChatAsync(
@ -51,11 +47,7 @@ public class WeChatWorkGroupChatProvider : IWeChatWorkGroupChatProvider, ISingle
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetGroupChatAsync(token.AccessToken, request, cancellationToken); return await client.GetGroupChatAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetGroupChatResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkOpengIdToChatIdResponse> OpengIdToChatIdAsync( public async virtual Task<WeChatWorkOpengIdToChatIdResponse> OpengIdToChatIdAsync(
@ -67,10 +59,6 @@ public class WeChatWorkGroupChatProvider : IWeChatWorkGroupChatProvider, ISingle
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.OpengIdToChatIdAsync(token.AccessToken, request, cancellationToken); return await client.OpengIdToChatIdAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkOpengIdToChatIdResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

4
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Localization/Resources/en.json

@ -4,6 +4,8 @@
"Features:ExternalContact": "External Contact", "Features:ExternalContact": "External Contact",
"Features:ExternalContactDesc": "WeCom ExternalContact Application.", "Features:ExternalContactDesc": "WeCom ExternalContact Application.",
"Features:ExternalContactEnable": "Enable External Contact", "Features:ExternalContactEnable": "Enable External Contact",
"Features:ExternalContactEnableDesc": "Enable the ability to provide the application with an Enterprise wechat customer contact interface." "Features:ExternalContactEnableDesc": "Enable the ability to provide the application with an Enterprise wechat customer contact interface.",
"DisplayName:WeChatWorkExternalContact.Secret": "External Contact Secret",
"Description:WeChatWorkExternalContact.Secret": "Customer contact application access key, some customer contact interfaces require customer contact application secret."
} }
} }

4
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Localization/Resources/zh-Hans.json

@ -4,6 +4,8 @@
"Features:ExternalContact": "客户联系", "Features:ExternalContact": "客户联系",
"Features:ExternalContactDesc": "企业微信客户联系应用集成.", "Features:ExternalContactDesc": "企业微信客户联系应用集成.",
"Features:ExternalContactEnable": "启用客户联系", "Features:ExternalContactEnable": "启用客户联系",
"Features:ExternalContactEnableDesc": "启用以使应用拥有企业微信客户联系接口的能力." "Features:ExternalContactEnableDesc": "启用以使应用拥有企业微信客户联系接口的能力.",
"DisplayName:WeChatWorkExternalContact.Secret": "客户联系访问密钥",
"Description:WeChatWorkExternalContact.Secret": "客户联系应用访问密钥,部分客户联系接口需要客户联系应用secret."
} }
} }

23
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Messages/Models/ExternalContactMsgAuditApprovedEvent.cs

@ -0,0 +1,23 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using LINGYUN.Abp.WeChat.Work.Common.Messages;
using System.Xml.Serialization;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Messages.Models;
/// <summary>
/// 客户同意进行聊天内容存档事件推送
/// </summary>
[EventName("external_contact_msg_audit_approved")]
public class ExternalContactMsgAuditApprovedEvent : ExternalContactChangeEvent
{
/// <summary>
/// 欢迎语code,可用于发送欢迎语
/// </summary>
[XmlElement("WelcomeCode")]
public string WelcomeCode { get; set; }
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ExternalContactMsgAuditApprovedEvent>(this);
}
}

16
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Messages/Models/ExternalContactMsgAuditNotifyEvent.cs

@ -0,0 +1,16 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using LINGYUN.Abp.WeChat.Work.Common.Messages;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Messages.Models;
/// <summary>
/// 产生会话回调事件推送
/// </summary>
[EventName("external_contact_msgaudit_notify")]
public class ExternalContactMsgAuditNotifyEvent : WeChatWorkEventMessage
{
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ExternalContactMsgAuditNotifyEvent>(this);
}
}

48
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/IWeChatWorkMsgAuditProvider.cs

@ -0,0 +1,48 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits;
/// <summary>
/// 会话存档接口
/// </summary>
public interface IWeChatWorkMsgAuditProvider
{
/// <summary>
/// 获取会话内容存档开启成员列表
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91614" />
/// </remarks>
Task<WeChatWorkGetPermitUserListResponse> GetPermitUserListAsync(
WeChatWorkGetPermitUserListRequest request,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取单聊会话同意情况
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
Task<WeChatWorkCheckSingleAgreeResponse> CheckSingleAgreeAsync(
WeChatWorkCheckSingleAgreeRequest request,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取群聊会话同意情况
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
Task<WeChatWorkCheckRoomAgreeResponse> CheckRoomAgreeAsync(
WeChatWorkCheckRoomAgreeRequest request,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取会话内容存档内部群信息
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/92951" />
/// </remarks>
Task<WeChatWorkGetGroupChatResponse> GetGroupChatAsync(
WeChatWorkGetGroupChatRequest request,
CancellationToken cancellationToken = default);
}

35
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Models/RoomAgreeInfo.cs

@ -0,0 +1,35 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Models;
/// <summary>
/// 群聊同意情况
/// </summary>
public class RoomAgreeInfo
{
/// <summary>
/// 外部成员的exteranalopenid
/// </summary>
[NotNull]
[JsonProperty("exteranalopenid")]
[JsonPropertyName("exteranalopenid")]
public string ExteranalOpenId { get; set; }
/// <summary>
/// 同意:"Agree",不同意:"Disagree"
/// </summary>
[NotNull]
[JsonProperty("agree_status")]
[JsonPropertyName("agree_status")]
public string AgreeStatus { get; set; }
/// <summary>
/// 同意状态改变的具体时间,utc时间
/// </summary>
[CanBeNull]
[JsonProperty("status_change_time")]
[JsonPropertyName("status_change_time")]
public long? StatusChangeTime { get; set; }
}

25
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Models/RoomMember.cs

@ -0,0 +1,25 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Models;
/// <summary>
/// 群聊成员
/// </summary>
public class RoomMember
{
/// <summary>
/// roomid群成员的id,userid
/// </summary>
[NotNull]
[JsonProperty("memberid")]
[JsonPropertyName("memberid")]
public string MemberId { get; set; }
/// <summary>
/// roomid群成员的入群时间
/// </summary>
[NotNull]
[JsonProperty("jointime")]
[JsonPropertyName("jointime")]
public long JoinTime { get; set; }
}

39
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Models/UserAgreeInfo.cs

@ -0,0 +1,39 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Models;
/// <summary>
/// 单聊同意情况
/// </summary>
public class UserAgreeInfo
{
/// <summary>
/// 内部成员的userid
/// </summary>
[NotNull]
[JsonProperty("userid")]
[JsonPropertyName("userid")]
public string UserId { get; set; }
/// <summary>
/// 外部成员的exteranalopenid
/// </summary>
[NotNull]
[JsonProperty("exteranalopenid")]
[JsonPropertyName("exteranalopenid")]
public string ExteranalOpenId { get; set; }
/// <summary>
/// 同意:"Agree",不同意:"Disagree"
/// </summary>
[NotNull]
[JsonProperty("agree_status")]
[JsonPropertyName("agree_status")]
public string AgreeStatus { get; set; }
/// <summary>
/// 同意状态改变的具体时间,utc时间
/// </summary>
[CanBeNull]
[JsonProperty("status_change_time")]
[JsonPropertyName("status_change_time")]
public long? StatusChangeTime { get; set; }
}

25
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkCheckRoomAgreeRequest.cs

@ -0,0 +1,25 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
/// <summary>
/// 获取群聊会话同意情况请求参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
public class WeChatWorkCheckRoomAgreeRequest : WeChatWorkRequest
{
/// <summary>
/// 待查询的roomid
/// </summary>
[NotNull]
[JsonProperty("roomid")]
[JsonPropertyName("roomid")]
public string RoomId { get; }
public WeChatWorkCheckRoomAgreeRequest(string roomId)
{
RoomId = roomId;
}
}

33
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkCheckSingleAgreeRequest.cs

@ -0,0 +1,33 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
/// <summary>
/// 获取单聊会话同意情况请求参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
public class WeChatWorkCheckSingleAgreeRequest : WeChatWorkRequest
{
/// <summary>
/// 内部成员的userid
/// </summary>
[NotNull]
[JsonProperty("userid")]
[JsonPropertyName("userid")]
public string UserId { get; }
/// <summary>
/// 外部成员的exteranalopenid
/// </summary>
[NotNull]
[JsonProperty("exteranalopenid")]
[JsonPropertyName("exteranalopenid")]
public string ExteranalOpenId { get; }
public WeChatWorkCheckSingleAgreeRequest(string userId, string exteranalOpenId)
{
UserId = userId;
ExteranalOpenId = exteranalOpenId;
}
}

25
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkGetGroupChatRequest.cs

@ -0,0 +1,25 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
/// <summary>
/// 获取会话内容存档内部群信息请求参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/92951" />
/// </remarks>
public class WeChatWorkGetGroupChatRequest : WeChatWorkRequest
{
/// <summary>
/// 待查询的roomid
/// </summary>
[NotNull]
[JsonProperty("roomid")]
[JsonPropertyName("roomid")]
public string RoomId { get; }
public WeChatWorkGetGroupChatRequest(string roomId)
{
RoomId = roomId;
}
}

57
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Request/WeChatWorkGetPermitUserListRequest.cs

@ -0,0 +1,57 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
/// <summary>
/// 获取会话内容存档开启成员列表请求参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91614" />
/// </remarks>
public class WeChatWorkGetPermitUserListRequest : WeChatWorkRequest
{
/// <summary>
/// 拉取对应版本的开启成员列表。1表示办公版;2表示服务版;3表示企业版。非必填,不填写的时候返回全量成员列表
/// </summary>
[CanBeNull]
[JsonProperty("cursor")]
[JsonPropertyName("cursor")]
public int? Type { get; }
private WeChatWorkGetPermitUserListRequest(int? type = null)
{
Type = type;
}
/// <summary>
/// 默认
/// </summary>
/// <returns></returns>
public static WeChatWorkGetPermitUserListRequest Default()
{
return new WeChatWorkGetPermitUserListRequest();
}
/// <summary>
/// 办公版
/// </summary>
/// <returns></returns>
public static WeChatWorkGetPermitUserListRequest Office()
{
return new WeChatWorkGetPermitUserListRequest(1);
}
/// <summary>
/// 服务版
/// </summary>
/// <returns></returns>
public static WeChatWorkGetPermitUserListRequest Service()
{
return new WeChatWorkGetPermitUserListRequest(2);
}
/// <summary>
/// 企业版
/// </summary>
/// <returns></returns>
public static WeChatWorkGetPermitUserListRequest Enterprise()
{
return new WeChatWorkGetPermitUserListRequest(3);
}
}

22
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkCheckRoomAgreeResponse.cs

@ -0,0 +1,22 @@
using JetBrains.Annotations;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Models;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
/// <summary>
/// 获取群聊会话同意情况响应参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
public class WeChatWorkCheckRoomAgreeResponse : WeChatWorkResponse
{
/// <summary>
/// 同意情况
/// </summary>
[NotNull]
[JsonProperty("agreeinfo")]
[JsonPropertyName("agreeinfo")]
public RoomAgreeInfo[] AgreeInfo { get; set; }
}

22
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkCheckSingleAgreeResponse.cs

@ -0,0 +1,22 @@
using JetBrains.Annotations;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Models;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
/// <summary>
/// 获取单聊会话同意情况响应参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
public class WeChatWorkCheckSingleAgreeResponse : WeChatWorkResponse
{
/// <summary>
/// 同意情况
/// </summary>
[NotNull]
[JsonProperty("agreeinfo")]
[JsonPropertyName("agreeinfo")]
public UserAgreeInfo[] AgreeInfo { get; set; }
}

50
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkGetGroupChatResponse.cs

@ -0,0 +1,50 @@
using JetBrains.Annotations;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Models;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
/// <summary>
/// 获取会话内容存档内部群信息响应参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91782" />
/// </remarks>
public class WeChatWorkGetGroupChatResponse : WeChatWorkResponse
{
/// <summary>
/// roomid对应的群名称
/// </summary>
[NotNull]
[JsonProperty("roomname")]
[JsonPropertyName("roomname")]
public string RoomName { get; set; }
/// <summary>
/// roomid对应的群创建者,userid
/// </summary>
[NotNull]
[JsonProperty("creator")]
[JsonPropertyName("creator")]
public string Creator { get; set; }
/// <summary>
/// roomid对应的群创建时间
/// </summary>
[NotNull]
[JsonProperty("room_create_time")]
[JsonPropertyName("room_create_time")]
public long RoomCreateTime { get; set; }
/// <summary>
/// roomid对应的群公告
/// </summary>
[CanBeNull]
[JsonProperty("notice")]
[JsonPropertyName("notice")]
public string? Notice { get; set; }
/// <summary>
/// roomid对应的群成员列表
/// </summary>
[NotNull]
[JsonProperty("members")]
[JsonPropertyName("members")]
public RoomMember[] Members { get; set; }
}

21
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/Response/WeChatWorkGetPermitUserListResponse.cs

@ -0,0 +1,21 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
/// <summary>
/// 获取会话内容存档开启成员列表响应参数
/// </summary>
/// <remarks>
/// 详情见: <see href="https://developer.work.weixin.qq.com/document/path/91614" />
/// </remarks>
public class WeChatWorkGetPermitUserListResponse : WeChatWorkResponse
{
/// <summary>
/// 设置在开启范围内的成员的userid列表
/// </summary>
[NotNull]
[JsonProperty("ids")]
[JsonPropertyName("ids")]
public string[] Ids { get; set; }
}

76
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/MsgAudits/WeChatWorkMsgAuditProvider.cs

@ -0,0 +1,76 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Features;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Token;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits;
[RequiresFeature(WeChatWorkExternalContactFeatureNames.Enable)]
public class WeChatWorkMsgAuditProvider : IWeChatWorkMsgAuditProvider, ISingletonDependency
{
protected IHttpClientFactory HttpClientFactory { get; }
protected IWeChatWorkExternalContactTokenProvider WeChatWorkExternalContactTokenProvider { get; }
public WeChatWorkMsgAuditProvider(
IHttpClientFactory httpClientFactory,
IWeChatWorkExternalContactTokenProvider weChatWorkExternalContactTokenProvider)
{
HttpClientFactory = httpClientFactory;
WeChatWorkExternalContactTokenProvider = weChatWorkExternalContactTokenProvider;
}
public async virtual Task<WeChatWorkGetPermitUserListResponse> GetPermitUserListAsync(
WeChatWorkGetPermitUserListRequest request,
CancellationToken cancellationToken = default)
{
Check.NotNull(request, nameof(request));
var token = await WeChatWorkExternalContactTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient();
return await client.GetPermitUserListAsync(token.AccessToken, request, cancellationToken);
}
public async virtual Task<WeChatWorkCheckSingleAgreeResponse> CheckSingleAgreeAsync(
WeChatWorkCheckSingleAgreeRequest request,
CancellationToken cancellationToken = default)
{
Check.NotNull(request, nameof(request));
var token = await WeChatWorkExternalContactTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient();
return await client.CheckSingleAgreeAsync(token.AccessToken, request, cancellationToken);
}
public async virtual Task<WeChatWorkCheckRoomAgreeResponse> CheckRoomAgreeAsync(
WeChatWorkCheckRoomAgreeRequest request,
CancellationToken cancellationToken = default)
{
Check.NotNull(request, nameof(request));
var token = await WeChatWorkExternalContactTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient();
return await client.CheckRoomAgreeAsync(token.AccessToken, request, cancellationToken);
}
public async virtual Task<WeChatWorkGetGroupChatResponse> GetGroupChatAsync(
WeChatWorkGetGroupChatRequest request,
CancellationToken cancellationToken = default)
{
Check.NotNull(request, nameof(request));
var token = await WeChatWorkExternalContactTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient();
return await client.GetGroupChatAsync(token.AccessToken, request, cancellationToken);
}
}

30
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Settings/WeChatWorkExternalContactSettingDefinitionProvider.cs

@ -0,0 +1,30 @@
using LINGYUN.Abp.WeChat.Work.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Settings;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Settings;
public class WeChatWorkExternalContactSettingDefinitionProvider : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context)
{
context.Add(
new SettingDefinition(
WeChatWorkExternalContactSettingNames.Secret,
displayName: L("DisplayName:WeChatWorkExternalContact.Secret"),
description: L("Description:WeChatWorkExternalContact.Secret"),
isVisibleToClients: false,
isEncrypted: true)
.WithProviders(
DefaultValueSettingValueProvider.ProviderName,
ConfigurationSettingValueProvider.ProviderName,
GlobalSettingValueProvider.ProviderName,
TenantSettingValueProvider.ProviderName)
);
}
private static ILocalizableString L(string name)
{
return LocalizableString.Create<WeChatWorkResource>(name);
}
}

12
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Settings/WeChatWorkExternalContactSettingNames.cs

@ -0,0 +1,12 @@
using LINGYUN.Abp.WeChat.Work.Settings;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Settings;
public static class WeChatWorkExternalContactSettingNames
{
public const string Prefix = WeChatWorkSettingNames.Prefix + ".ExternalContact";
/// <summary>
/// 客户联系应用Srcret
/// </summary>
public const string Secret = Prefix + ".Secret";
}

30
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Tags/WeChatWorkCropTagProvider.cs

@ -35,11 +35,7 @@ public class WeChatWorkCropTagProvider : IWeChatWorkCropTagProvider, ISingletonD
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetCropTagListAsync(token.AccessToken, request, cancellationToken); return await client.GetCropTagListAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetCropTagListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkCreateCropTagResponse> CreateCropTagAsync( public async virtual Task<WeChatWorkCreateCropTagResponse> CreateCropTagAsync(
@ -51,11 +47,7 @@ public class WeChatWorkCropTagProvider : IWeChatWorkCropTagProvider, ISingletonD
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.CreateCropTagAsync(token.AccessToken, request, cancellationToken); return await client.CreateCropTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkCreateCropTagResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> UpdateCropTagAsync( public async virtual Task<WeChatWorkResponse> UpdateCropTagAsync(
@ -67,11 +59,7 @@ public class WeChatWorkCropTagProvider : IWeChatWorkCropTagProvider, ISingletonD
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.UpdateCropTagAsync(token.AccessToken, request, cancellationToken); return await client.UpdateCropTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> DeleteCropTagAsync( public async virtual Task<WeChatWorkResponse> DeleteCropTagAsync(
@ -83,11 +71,7 @@ public class WeChatWorkCropTagProvider : IWeChatWorkCropTagProvider, ISingletonD
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.DeleteCropTagAsync(token.AccessToken, request, cancellationToken); return await client.DeleteCropTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> MarkCropTagAsync( public async virtual Task<WeChatWorkResponse> MarkCropTagAsync(
@ -99,10 +83,6 @@ public class WeChatWorkCropTagProvider : IWeChatWorkCropTagProvider, ISingletonD
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.MarkCropTagAsync(token.AccessToken, request, cancellationToken); return await client.MarkCropTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

24
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Tags/WeChatWorkStrategyTagProvider.cs

@ -35,11 +35,7 @@ public class WeChatWorkStrategyTagProvider : IWeChatWorkStrategyTagProvider, ISi
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetStrategyTagListAsync(token.AccessToken, request, cancellationToken); return await client.GetStrategyTagListAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetStrategyTagListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkCreateStrategyTagResponse> CreateStrategyTagAsync( public async virtual Task<WeChatWorkCreateStrategyTagResponse> CreateStrategyTagAsync(
@ -51,11 +47,7 @@ public class WeChatWorkStrategyTagProvider : IWeChatWorkStrategyTagProvider, ISi
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.CreateStrategyTagAsync(token.AccessToken, request, cancellationToken); return await client.CreateStrategyTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkCreateStrategyTagResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> UpdateStrategyTagAsync( public async virtual Task<WeChatWorkResponse> UpdateStrategyTagAsync(
@ -67,11 +59,7 @@ public class WeChatWorkStrategyTagProvider : IWeChatWorkStrategyTagProvider, ISi
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.UpdateStrategyTagAsync(token.AccessToken, request, cancellationToken); return await client.UpdateStrategyTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResponse> DeleteStrategyTagAsync( public async virtual Task<WeChatWorkResponse> DeleteStrategyTagAsync(
@ -83,10 +71,6 @@ public class WeChatWorkStrategyTagProvider : IWeChatWorkStrategyTagProvider, ISi
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.DeleteStrategyTagAsync(token.AccessToken, request, cancellationToken); return await client.DeleteStrategyTagAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

23
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Token/IWeChatWorkExternalContactTokenProvider.cs

@ -0,0 +1,23 @@
using LINGYUN.Abp.WeChat.Work.Token.Models;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Token;
/// <summary>
/// 客户联系应用Token提供者
/// </summary>
/// <remarks>
/// 企业微信部分接口需要使用客户联系应用Token
/// </remarks>
public interface IWeChatWorkExternalContactTokenProvider
{
/// <summary>
/// 获取客户联系应用Token
/// </summary>
/// <remarks>
/// 参考:https://developer.work.weixin.qq.com/document/path/91039
/// </remarks>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<WeChatWorkToken> GetTokenAsync(CancellationToken cancellationToken = default);
}

50
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Token/WeChatWorkExternalContactTokenProvider.cs

@ -0,0 +1,50 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Features;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Settings;
using LINGYUN.Abp.WeChat.Work.Settings;
using LINGYUN.Abp.WeChat.Work.Token;
using LINGYUN.Abp.WeChat.Work.Token.Models;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.Abp.Settings;
namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Token;
[RequiresFeature(WeChatWorkExternalContactFeatureNames.Enable)]
public class WeChatWorkExternalContactTokenProvider : WeChatWorkTokenProviderBase, IWeChatWorkExternalContactTokenProvider, ISingletonDependency
{
protected override string ProviderName => "WeChatWorkExternalContactToken";
public WeChatWorkExternalContactTokenProvider(
ISettingProvider settingProvider,
IHttpClientFactory httpClientFactory,
IDistributedCache<WeChatWorkTokenCacheItem> cache)
: base(settingProvider, httpClientFactory, cache)
{
}
public async virtual Task<WeChatWorkToken> GetTokenAsync(CancellationToken cancellationToken = default)
{
var corpId = await SettingProvider.GetOrNullAsync(WeChatWorkSettingNames.Connection.CorpId);
var agentId = await SettingProvider.GetOrNullAsync(WeChatWorkSettingNames.Connection.AgentId);
var secret = await SettingProvider.GetOrNullAsync(WeChatWorkExternalContactSettingNames.Secret);
Check.NotNullOrWhiteSpace(corpId, nameof(corpId));
Check.NotNullOrWhiteSpace(agentId, nameof(agentId));
Check.NotNullOrWhiteSpace(secret, nameof(secret));
return await GetTokenAsync(corpId, agentId, secret, cancellationToken);
}
public async virtual Task<WeChatWorkToken> GetTokenAsync(
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
return (await InternalGetTokenAsync(corpId, agentId, secret, cancellationToken)).Token;
}
}

18
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Transfers/WeChatWorkEmployExtendProvider.cs

@ -35,11 +35,7 @@ public class WeChatWorkEmployExtendProvider : IWeChatWorkEmployExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.AssignCustomerAsync(token.AccessToken, request, cancellationToken); return await client.AssignCustomerAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkTransferCustomerResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGetTransferResultResponse> GetTransferResultAsync( public async virtual Task<WeChatWorkGetTransferResultResponse> GetTransferResultAsync(
@ -51,11 +47,7 @@ public class WeChatWorkEmployExtendProvider : IWeChatWorkEmployExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetTransferResultAsync(token.AccessToken, request, cancellationToken); return await client.GetTransferResultAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetTransferResultResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGroupChatOnjobTransferResponse> GroupChatOnjobTransferAsync( public async virtual Task<WeChatWorkGroupChatOnjobTransferResponse> GroupChatOnjobTransferAsync(
@ -67,10 +59,6 @@ public class WeChatWorkEmployExtendProvider : IWeChatWorkEmployExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.OnjobTransferAsync(token.AccessToken, request, cancellationToken); return await client.GroupChatOnjobTransferAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGroupChatOnjobTransferResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

24
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Transfers/WeChatWorkResignExtendProvider.cs

@ -35,11 +35,7 @@ public class WeChatWorkResignExtendProvider : IWeChatWorkResignExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetUnassignedListAsync(token.AccessToken, request, cancellationToken); return await client.GetUnassignedListAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetUnassignedListResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkResignedTransferCustomerResponse> ResignedTransferCustomerAsync( public async virtual Task<WeChatWorkResignedTransferCustomerResponse> ResignedTransferCustomerAsync(
@ -51,11 +47,7 @@ public class WeChatWorkResignExtendProvider : IWeChatWorkResignExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.ResignedTransferCustomerAsync(token.AccessToken, request, cancellationToken); return await client.ResignedTransferCustomerAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkResignedTransferCustomerResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGetResignedTransferResultResponse> GetResignedTransferResultAsync( public async virtual Task<WeChatWorkGetResignedTransferResultResponse> GetResignedTransferResultAsync(
@ -67,11 +59,7 @@ public class WeChatWorkResignExtendProvider : IWeChatWorkResignExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetResignedTransferResultAsync(token.AccessToken, request, cancellationToken); return await client.GetResignedTransferResultAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGetResignedTransferResultResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
public async virtual Task<WeChatWorkGroupChatTransferResponse> GroupChatTransferAsync( public async virtual Task<WeChatWorkGroupChatTransferResponse> GroupChatTransferAsync(
@ -83,10 +71,6 @@ public class WeChatWorkResignExtendProvider : IWeChatWorkResignExtendProvider, I
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateWeChatWorkApiClient(); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GroupChatTransferAsync(token.AccessToken, request, cancellationToken); return await client.GroupChatTransferAsync(token.AccessToken, request, cancellationToken);
var wechatResponse = await response.DeserializeObjectAsync<WeChatWorkGroupChatTransferResponse>();
wechatResponse.ThrowIfNotSuccess();
return wechatResponse;
} }
} }

9
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Attachments.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Attachments.Request; using LINGYUN.Abp.WeChat.Work.ExternalContact.Attachments.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Attachments.Response;
using LINGYUN.Abp.WeChat.Work.Utils; using LINGYUN.Abp.WeChat.Work.Utils;
using System.IO; using System.IO;
using System.Text; using System.Text;
@ -8,7 +9,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> UploadAsync( public async static Task<WeChatWorkUploadAttachmentResponse> UploadAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkUploadAttachmentRequest request, WeChatWorkUploadAttachmentRequest request,
@ -21,13 +22,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("&attachment_type={0}", request.AttachmentType); urlBuilder.AppendFormat("&attachment_type={0}", request.AttachmentType);
var fileBytes = await request.Content.GetStream().GetAllBytesAsync(); var fileBytes = await request.Content.GetStream().GetAllBytesAsync();
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = WeChatWorkHttpContentBuildHelper.BuildUploadMediaContent("media", fileBytes, request.Content.FileName) Content = WeChatWorkHttpContentBuildHelper.BuildUploadMediaContent("media", fileBytes, request.Content.FileName)
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkUploadAttachmentResponse>();
} }
} }

9
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Contacts.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Contacts.Request; using LINGYUN.Abp.WeChat.Work.ExternalContact.Contacts.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Contacts.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -6,7 +7,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetExternalContactListAsync( public async static Task<WeChatWorkGetExternalContactListResponse> GetExternalContactListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetExternalContactListRequest request, WeChatWorkGetExternalContactListRequest request,
@ -16,13 +17,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/contact_list"); urlBuilder.Append("/cgi-bin/externalcontact/contact_list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetExternalContactListResponse>();
} }
} }

36
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Customers.cs

@ -1,4 +1,6 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Request; using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -6,7 +8,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetCustomerListAsync( public async static Task<WeChatWorkGetCustomerListResponse> GetCustomerListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
string userId, string userId,
@ -17,14 +19,16 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
urlBuilder.AppendFormat("&userid={0}", userId); urlBuilder.AppendFormat("&userid={0}", userId);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Get, HttpMethod.Get,
urlBuilder.ToString()); urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetCustomerListResponse>();
} }
public async static Task<HttpResponseMessage> BulkGetCustomerAsync( public async static Task<WeChatWorkBulkGetCustomerResponse> BulkGetCustomerAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkBulkGetCustomerRequest request, WeChatWorkBulkGetCustomerRequest request,
@ -34,17 +38,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/batch/get_by_user"); urlBuilder.Append("/cgi-bin/externalcontact/batch/get_by_user");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkBulkGetCustomerResponse>();
} }
public async static Task<HttpResponseMessage> GetCustomerAsync( public async static Task<WeChatWorkGetCustomerResponse> GetCustomerAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
string externalUserid, string externalUserid,
@ -60,14 +66,16 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("&cursor={0}", cursor); urlBuilder.AppendFormat("&cursor={0}", cursor);
} }
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Get, HttpMethod.Get,
urlBuilder.ToString()); urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetCustomerResponse>();
} }
public async static Task<HttpResponseMessage> UpdateCustomerRemarkAsync( public async static Task<WeChatWorkResponse> UpdateCustomerRemarkAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkUpdateCustomerRemarkRequest request, WeChatWorkUpdateCustomerRemarkRequest request,
@ -77,13 +85,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/remark"); urlBuilder.Append("/cgi-bin/externalcontact/remark");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
} }

11
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Follows.cs

@ -1,11 +1,12 @@
using System.Text; using LINGYUN.Abp.WeChat.Work.ExternalContact.Follows.Response;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetFollowUserListAsync( public async static Task<WeChatWorkGetFollowUserListResponse> GetFollowUserListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
@ -14,10 +15,12 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/get_follow_user_list"); urlBuilder.Append("/cgi-bin/externalcontact/get_follow_user_list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Get, HttpMethod.Get,
urlBuilder.ToString()); urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetFollowUserListResponse>();
} }
} }

28
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.GroupChats.cs

@ -1,5 +1,5 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Request; using LINGYUN.Abp.WeChat.Work.ExternalContact.GroupChats.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.GroupChats.Request; using LINGYUN.Abp.WeChat.Work.ExternalContact.GroupChats.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetGroupChatListAsync( public async static Task<WeChatWorkGetGroupChatListResponse> GetGroupChatListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetGroupChatListRequest request, WeChatWorkGetGroupChatListRequest request,
@ -17,17 +17,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/groupchat/list"); urlBuilder.Append("/cgi-bin/externalcontact/groupchat/list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetGroupChatListResponse>();
} }
public async static Task<HttpResponseMessage> GetGroupChatAsync( public async static Task<WeChatWorkGetGroupChatResponse> GetGroupChatAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetGroupChatRequest request, WeChatWorkGetGroupChatRequest request,
@ -37,17 +39,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/groupchat/get"); urlBuilder.Append("/cgi-bin/externalcontact/groupchat/get");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetGroupChatResponse>();
} }
public async static Task<HttpResponseMessage> OpengIdToChatIdAsync( public async static Task<WeChatWorkOpengIdToChatIdResponse> OpengIdToChatIdAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkOpengIdToChatIdRequest request, WeChatWorkOpengIdToChatIdRequest request,
@ -57,13 +61,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/opengid_to_chatid"); urlBuilder.Append("/cgi-bin/externalcontact/opengid_to_chatid");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkOpengIdToChatIdResponse>();
} }
} }

97
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.MsgAudits.cs

@ -0,0 +1,97 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.MsgAudits.Response;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions
{
public async static Task<WeChatWorkGetPermitUserListResponse> GetPermitUserListAsync(
this HttpMessageInvoker client,
string accessToken,
WeChatWorkGetPermitUserListRequest request,
CancellationToken cancellationToken = default)
{
var urlBuilder = new StringBuilder();
urlBuilder.Append("/cgi-bin/msgaudit/get_permit_user_list");
urlBuilder.AppendFormat("?access_token={0}", accessToken);
using var httpRequest = new HttpRequestMessage(
HttpMethod.Post,
urlBuilder.ToString())
{
Content = new StringContent(request.SerializeToJson())
};
using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetPermitUserListResponse>();
}
public async static Task<WeChatWorkCheckSingleAgreeResponse> CheckSingleAgreeAsync(
this HttpMessageInvoker client,
string accessToken,
WeChatWorkCheckSingleAgreeRequest request,
CancellationToken cancellationToken = default)
{
var urlBuilder = new StringBuilder();
urlBuilder.Append("/cgi-bin/msgaudit/check_single_agree");
urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage(
HttpMethod.Post,
urlBuilder.ToString())
{
Content = new StringContent(request.SerializeToJson())
};
using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkCheckSingleAgreeResponse>();
}
public async static Task<WeChatWorkCheckRoomAgreeResponse> CheckRoomAgreeAsync(
this HttpMessageInvoker client,
string accessToken,
WeChatWorkCheckRoomAgreeRequest request,
CancellationToken cancellationToken = default)
{
var urlBuilder = new StringBuilder();
urlBuilder.Append("/cgi-bin/msgaudit/check_room_agree");
urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage(
HttpMethod.Post,
urlBuilder.ToString())
{
Content = new StringContent(request.SerializeToJson())
};
using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkCheckRoomAgreeResponse>();
}
public async static Task<WeChatWorkGetGroupChatResponse> GetGroupChatAsync(
this HttpMessageInvoker client,
string accessToken,
WeChatWorkGetGroupChatRequest request,
CancellationToken cancellationToken = default)
{
var urlBuilder = new StringBuilder();
urlBuilder.Append("/cgi-bin/msgaudit/groupchat/get");
urlBuilder.AppendFormat("?access_token={0}", accessToken);
using var httpRequest = new HttpRequestMessage(
HttpMethod.Post,
urlBuilder.ToString())
{
Content = new StringContent(request.SerializeToJson())
};
using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetGroupChatResponse>();
}
}

52
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Strategies.cs

@ -1,4 +1,6 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Request; using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -6,7 +8,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetCustomerStrategyListAsync( public async static Task<WeChatWorkGetCustomerStrategyListResponse> GetCustomerStrategyListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetCustomerStrategyListRequest request, WeChatWorkGetCustomerStrategyListRequest request,
@ -16,17 +18,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/list"); urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetCustomerStrategyListResponse>();
} }
public async static Task<HttpResponseMessage> GetCustomerStrategyAsync( public async static Task<WeChatWorkGetCustomerStrategyResponse> GetCustomerStrategyAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetCustomerStrategyRequest request, WeChatWorkGetCustomerStrategyRequest request,
@ -36,17 +40,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/get"); urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/get");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetCustomerStrategyResponse>();
} }
public async static Task<HttpResponseMessage> GetCustomerStrategyRangeAsync( public async static Task<WeChatWorkGetCustomerStrategyRangeResponse> GetCustomerStrategyRangeAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetCustomerStrategyRangeRequest request, WeChatWorkGetCustomerStrategyRangeRequest request,
@ -56,17 +62,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/get_range"); urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/get_range");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetCustomerStrategyRangeResponse>();
} }
public async static Task<HttpResponseMessage> CreateCustomerStrategyAsync( public async static Task<WeChatWorkCreateCustomerStrategyResponse> CreateCustomerStrategyAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkCreateCustomerStrategyRequest request, WeChatWorkCreateCustomerStrategyRequest request,
@ -76,17 +84,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/create"); urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/create");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkCreateCustomerStrategyResponse>();
} }
public async static Task<HttpResponseMessage> UpdateCustomerStrategyAsync( public async static Task<WeChatWorkResponse> UpdateCustomerStrategyAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkUpdateCustomerStrategyRequest request, WeChatWorkUpdateCustomerStrategyRequest request,
@ -96,17 +106,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/edit"); urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/edit");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> DeleteCustomerStrategyAsync( public async static Task<WeChatWorkResponse> DeleteCustomerStrategyAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkDeleteCustomerStrategyRequest request, WeChatWorkDeleteCustomerStrategyRequest request,
@ -116,13 +128,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/del"); urlBuilder.Append("/cgi-bin/externalcontact/customer_strategy/del");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
} }

76
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tags.cs

@ -1,4 +1,6 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Tags.Request; using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Tags.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Tags.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -6,7 +8,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetCropTagListAsync( public async static Task<WeChatWorkGetCropTagListResponse> GetCropTagListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetCropTagListRequest request, WeChatWorkGetCropTagListRequest request,
@ -16,17 +18,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/get_corp_tag_list"); urlBuilder.Append("/cgi-bin/externalcontact/get_corp_tag_list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetCropTagListResponse>();
} }
public async static Task<HttpResponseMessage> CreateCropTagAsync( public async static Task<WeChatWorkCreateCropTagResponse> CreateCropTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkCreateCropTagRequest request, WeChatWorkCreateCropTagRequest request,
@ -36,17 +40,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/add_corp_tag"); urlBuilder.Append("/cgi-bin/externalcontact/add_corp_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkCreateCropTagResponse>();
} }
public async static Task<HttpResponseMessage> UpdateCropTagAsync( public async static Task<WeChatWorkResponse> UpdateCropTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkUpdateCropTagRequest request, WeChatWorkUpdateCropTagRequest request,
@ -56,17 +62,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/edit_corp_tag"); urlBuilder.Append("/cgi-bin/externalcontact/edit_corp_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> DeleteCropTagAsync( public async static Task<WeChatWorkResponse> DeleteCropTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkDeleteCropTagRequest request, WeChatWorkDeleteCropTagRequest request,
@ -76,17 +84,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/del_corp_tag"); urlBuilder.Append("/cgi-bin/externalcontact/del_corp_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> MarkCropTagAsync( public async static Task<WeChatWorkResponse> MarkCropTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkMarkCropTagRequest request, WeChatWorkMarkCropTagRequest request,
@ -96,17 +106,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/mark_tag"); urlBuilder.Append("/cgi-bin/externalcontact/mark_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> GetStrategyTagListAsync( public async static Task<WeChatWorkGetStrategyTagListResponse> GetStrategyTagListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetStrategyTagListRequest request, WeChatWorkGetStrategyTagListRequest request,
@ -116,17 +128,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/get_strategy_tag_list"); urlBuilder.Append("/cgi-bin/externalcontact/get_strategy_tag_list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetStrategyTagListResponse>();
} }
public async static Task<HttpResponseMessage> CreateStrategyTagAsync( public async static Task<WeChatWorkCreateStrategyTagResponse> CreateStrategyTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkCreateStrategyTagRequest request, WeChatWorkCreateStrategyTagRequest request,
@ -136,17 +150,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/add_strategy_tag"); urlBuilder.Append("/cgi-bin/externalcontact/add_strategy_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkCreateStrategyTagResponse>();
} }
public async static Task<HttpResponseMessage> UpdateStrategyTagAsync( public async static Task<WeChatWorkResponse> UpdateStrategyTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkUpdateStrategyTagRequest request, WeChatWorkUpdateStrategyTagRequest request,
@ -156,17 +172,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/edit_strategy_tag"); urlBuilder.Append("/cgi-bin/externalcontact/edit_strategy_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> DeleteStrategyTagAsync( public async static Task<WeChatWorkResponse> DeleteStrategyTagAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkDeleteStrategyTagRequest request, WeChatWorkDeleteStrategyTagRequest request,
@ -176,13 +194,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/del_strategy_tag"); urlBuilder.Append("/cgi-bin/externalcontact/del_strategy_tag");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
} }

57
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Transfers.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.WeChat.Work.ExternalContact.Transfers.Request; using LINGYUN.Abp.WeChat.Work.ExternalContact.Transfers.Request;
using LINGYUN.Abp.WeChat.Work.ExternalContact.Transfers.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -6,7 +7,7 @@ using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> AssignCustomerAsync( public async static Task<WeChatWorkTransferCustomerResponse> AssignCustomerAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkTransferCustomerRequest request, WeChatWorkTransferCustomerRequest request,
@ -16,17 +17,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/transfer_customer"); urlBuilder.Append("/cgi-bin/externalcontact/transfer_customer");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkTransferCustomerResponse>();
} }
public async static Task<HttpResponseMessage> GetTransferResultAsync( public async static Task<WeChatWorkGetTransferResultResponse> GetTransferResultAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetTransferResultRequest request, WeChatWorkGetTransferResultRequest request,
@ -36,17 +39,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/transfer_result"); urlBuilder.Append("/cgi-bin/externalcontact/transfer_result");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetTransferResultResponse>();
} }
public async static Task<HttpResponseMessage> OnjobTransferAsync( public async static Task<WeChatWorkGroupChatOnjobTransferResponse> GroupChatOnjobTransferAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGroupChatOnjobTransferRequest request, WeChatWorkGroupChatOnjobTransferRequest request,
@ -56,17 +61,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/groupchat/onjob_transfer"); urlBuilder.Append("/cgi-bin/externalcontact/groupchat/onjob_transfer");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGroupChatOnjobTransferResponse>();
} }
public async static Task<HttpResponseMessage> GetUnassignedListAsync( public async static Task<WeChatWorkGetUnassignedListResponse> GetUnassignedListAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetUnassignedListRequest request, WeChatWorkGetUnassignedListRequest request,
@ -76,17 +83,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/get_unassigned_list"); urlBuilder.Append("/cgi-bin/externalcontact/get_unassigned_list");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetUnassignedListResponse>();
} }
public async static Task<HttpResponseMessage> ResignedTransferCustomerAsync( public async static Task<WeChatWorkResignedTransferCustomerResponse> ResignedTransferCustomerAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkResignedTransferCustomerRequest request, WeChatWorkResignedTransferCustomerRequest request,
@ -96,17 +105,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/resigned/transfer_customer"); urlBuilder.Append("/cgi-bin/externalcontact/resigned/transfer_customer");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResignedTransferCustomerResponse>();
} }
public async static Task<HttpResponseMessage> GetResignedTransferResultAsync( public async static Task<WeChatWorkGetResignedTransferResultResponse> GetResignedTransferResultAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGetResignedTransferResultRequest request, WeChatWorkGetResignedTransferResultRequest request,
@ -116,17 +127,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/resigned/transfer_result"); urlBuilder.Append("/cgi-bin/externalcontact/resigned/transfer_result");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGetResignedTransferResultResponse>();
} }
public async static Task<HttpResponseMessage> GroupChatTransferAsync( public async static Task<WeChatWorkGroupChatTransferResponse> GroupChatTransferAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkGroupChatTransferRequest request, WeChatWorkGroupChatTransferRequest request,
@ -136,13 +149,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/externalcontact/groupchat/transfer"); urlBuilder.Append("/cgi-bin/externalcontact/groupchat/transfer");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()), Content = new StringContent(request.SerializeToJson()),
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkGroupChatTransferResponse>();
} }
} }

1
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs

@ -1,5 +1,4 @@
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
} }

5
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/WeChatWorkAuthorizeGenerator.cs

@ -1,5 +1,6 @@
using LINGYUN.Abp.WeChat.Work.Features; using LINGYUN.Abp.WeChat.Work.Features;
using LINGYUN.Abp.WeChat.Work.Settings; using LINGYUN.Abp.WeChat.Work.Settings;
using Microsoft.Extensions.DependencyInjection;
using System; using System;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
@ -38,7 +39,7 @@ public class WeChatWorkAuthorizeGenerator : IWeChatWorkAuthorizeGenerator, ISing
Check.NotNullOrEmpty(corpId, nameof(corpId)); Check.NotNullOrEmpty(corpId, nameof(corpId));
Check.NotNullOrEmpty(agentId, nameof(agentId)); Check.NotNullOrEmpty(agentId, nameof(agentId));
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.OAuthClient); var client = HttpClientFactory.CreateWeChatWorkOAuthClient();
var generatedUrlBuilder = new StringBuilder(); var generatedUrlBuilder = new StringBuilder();
@ -72,7 +73,7 @@ public class WeChatWorkAuthorizeGenerator : IWeChatWorkAuthorizeGenerator, ISing
Check.NotNullOrEmpty(corpId, nameof(corpId)); Check.NotNullOrEmpty(corpId, nameof(corpId));
Check.NotNullOrEmpty(agentId, nameof(agentId)); Check.NotNullOrEmpty(agentId, nameof(agentId));
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.LoginClient); var client = HttpClientFactory.CreateWeChatWorkLoginClient();
var generatedUrlBuilder = new StringBuilder(); var generatedUrlBuilder = new StringBuilder();

15
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/WeChatWorkUserFinder.cs

@ -3,6 +3,7 @@ using LINGYUN.Abp.WeChat.Work.Authorize.Request;
using LINGYUN.Abp.WeChat.Work.Authorize.Response; using LINGYUN.Abp.WeChat.Work.Authorize.Response;
using LINGYUN.Abp.WeChat.Work.Features; using LINGYUN.Abp.WeChat.Work.Features;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -30,12 +31,11 @@ public class WeChatWorkUserFinder : IWeChatWorkUserFinder, ISingletonDependency
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetUserInfoAsync(token.AccessToken, code, cancellationToken); var wechatWorkResponse = await client.GetUserInfoAsync(token.AccessToken, code, cancellationToken);
var userInfoResponse = await response.DeserializeObjectAsync<WeChatWorkUserInfoResponse>();
return userInfoResponse.ToUserInfo(); return wechatWorkResponse.ToUserInfo();
} }
public async virtual Task<WeChatWorkUserDetail> GetUserDetailAsync( public async virtual Task<WeChatWorkUserDetail> GetUserDetailAsync(
@ -43,12 +43,11 @@ public class WeChatWorkUserFinder : IWeChatWorkUserFinder, ISingletonDependency
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkUserDetailRequest(userTicket); var request = new WeChatWorkUserDetailRequest(userTicket);
using var response = await client.GetUserDetailAsync(token.AccessToken, request, cancellationToken); var wechatWorkResponse = await client.GetUserDetailAsync(token.AccessToken, request, cancellationToken);
var userDetailResponse = await response.DeserializeObjectAsync<WeChatWorkUserDetailResponse>();
return userDetailResponse.ToUserDetail(); return wechatWorkResponse.ToUserDetail();
} }
} }

16
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Chat/WeChatWorkAppChatManager.cs

@ -2,6 +2,7 @@
using LINGYUN.Abp.WeChat.Work.Chat.Response; using LINGYUN.Abp.WeChat.Work.Chat.Response;
using LINGYUN.Abp.WeChat.Work.Features; using LINGYUN.Abp.WeChat.Work.Features;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -29,10 +30,9 @@ public class WeChatWorkAppChatManager : IWeChatWorkAppChatManager, ISingletonDep
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.CreateAppChatAsync(token.AccessToken, request, cancellationToken); return await client.CreateAppChatAsync(token.AccessToken, request, cancellationToken);
return await response.DeserializeObjectAsync<WeChatWorkAppChatCreateResponse>();
} }
public async virtual Task<WeChatWorkAppChatInfoResponse> GetAsync( public async virtual Task<WeChatWorkAppChatInfoResponse> GetAsync(
@ -41,10 +41,9 @@ public class WeChatWorkAppChatManager : IWeChatWorkAppChatManager, ISingletonDep
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetAppChatAsync(token.AccessToken, agentId, cancellationToken); return await client.GetAppChatAsync(token.AccessToken, agentId, cancellationToken);
return await response.DeserializeObjectAsync<WeChatWorkAppChatInfoResponse>();
} }
public async virtual Task<WeChatWorkResponse> UpdateAsync( public async virtual Task<WeChatWorkResponse> UpdateAsync(
@ -52,9 +51,8 @@ public class WeChatWorkAppChatManager : IWeChatWorkAppChatManager, ISingletonDep
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.UpdateAppChatAsync(token.AccessToken, request, cancellationToken); return await client.UpdateAppChatAsync(token.AccessToken, request, cancellationToken);
return await response.DeserializeObjectAsync<WeChatWorkAppChatCreateResponse>();
} }
} }

3
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/JsSdk/JsApiTicketProvider.cs

@ -1,6 +1,7 @@
using LINGYUN.Abp.WeChat.Work.JsSdk.Models; using LINGYUN.Abp.WeChat.Work.JsSdk.Models;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using System; using System;
@ -79,7 +80,7 @@ public class JsApiTicketProvider : IJsApiTicketProvider, ISingletonDependency
Logger.LogDebug($"Not found JsApiTicket in the cache, getting from the httpClient: {cacheKey}"); Logger.LogDebug($"Not found JsApiTicket in the cache, getting from the httpClient: {cacheKey}");
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetAsync( using var response = await client.GetAsync(
jsapiTicketUrl, jsapiTicketUrl,

20
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Media/WeChatWorkMediaProvider.cs

@ -1,5 +1,6 @@
using LINGYUN.Abp.WeChat.Work.Media.Models; using LINGYUN.Abp.WeChat.Work.Media.Models;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.DependencyInjection;
using System; using System;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
@ -27,7 +28,7 @@ public class WeChatWorkMediaProvider : IWeChatWorkMediaProvider, ISingletonDepen
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetMediaAsync( using var response = await client.GetMediaAsync(
token.AccessToken, token.AccessToken,
@ -79,17 +80,13 @@ public class WeChatWorkMediaProvider : IWeChatWorkMediaProvider, ISingletonDepen
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkMediaRequest( var request = new WeChatWorkMediaRequest(
token.AccessToken, token.AccessToken,
media); media);
using var response = await client.UploadMediaAsync(type, request, cancellationToken); return await client.UploadMediaAsync(type, request, cancellationToken);
var mediaRespose = await response.DeserializeObjectAsync<WeChatWorkMediaResponse>();
mediaRespose.ThrowIfNotSuccess();
return mediaRespose;
} }
public async virtual Task<WeChatWorkImageResponse> UploadImageAsync( public async virtual Task<WeChatWorkImageResponse> UploadImageAsync(
@ -97,15 +94,12 @@ public class WeChatWorkMediaProvider : IWeChatWorkMediaProvider, ISingletonDepen
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkMediaRequest( var request = new WeChatWorkMediaRequest(
token.AccessToken, token.AccessToken,
image); image);
using var response = await client.UploadImageAsync(request, cancellationToken); return await client.UploadImageAsync(request, cancellationToken);
var mediaRespose = await response.DeserializeObjectAsync<WeChatWorkImageResponse>();
mediaRespose.ThrowIfNotSuccess();
return mediaRespose;
} }
} }

6
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageManager.cs

@ -1,5 +1,6 @@
using LINGYUN.Abp.WeChat.Work.Messages.Request; using LINGYUN.Abp.WeChat.Work.Messages.Request;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using System.Net.Http; using System.Net.Http;
@ -29,14 +30,13 @@ public class WeChatWorkMessageManager : IWeChatWorkMessageManager, ISingletonDep
public async virtual Task<bool> ReCallMessageAsync(string messageId, CancellationToken cancellationToken = default) public async virtual Task<bool> ReCallMessageAsync(string messageId, CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkMessageReCallRequest( var request = new WeChatWorkMessageReCallRequest(
token.AccessToken, token.AccessToken,
messageId); messageId);
using var response = await client.ReCallMessageAsync(request, cancellationToken); var messageResponse = await client.ReCallMessageAsync(request, cancellationToken);
var messageResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
return messageResponse.IsSuccessed; return messageResponse.IsSuccessed;
} }

16
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageSender.cs

@ -3,6 +3,7 @@ using LINGYUN.Abp.WeChat.Work.Features;
using LINGYUN.Abp.WeChat.Work.Messages.Request; using LINGYUN.Abp.WeChat.Work.Messages.Request;
using LINGYUN.Abp.WeChat.Work.Messages.Response; using LINGYUN.Abp.WeChat.Work.Messages.Response;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using System.Net.Http; using System.Net.Http;
@ -39,14 +40,13 @@ public class WeChatWorkMessageSender : IWeChatWorkMessageSender, ISingletonDepen
public async virtual Task<WeChatWorkMessageResponse> SendAsync(WeChatWorkMessage message, CancellationToken cancellationToken = default) public async virtual Task<WeChatWorkMessageResponse> SendAsync(WeChatWorkMessage message, CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkMessageRequest<WeChatWorkMessage>( var request = new WeChatWorkMessageRequest<WeChatWorkMessage>(
token.AccessToken, token.AccessToken,
message); message);
using var response = await client.SendMessageAsync(request, cancellationToken); var messageResponse = await client.SendMessageAsync(request, cancellationToken);
var messageResponse = await response.DeserializeObjectAsync<WeChatWorkMessageResponse>();
if (!messageResponse.IsSuccessed) if (!messageResponse.IsSuccessed)
{ {
@ -65,14 +65,13 @@ public class WeChatWorkMessageSender : IWeChatWorkMessageSender, ISingletonDepen
public async virtual Task<WeChatWorkResponse> SendAsync(WeChatWorkAppChatMessage message, CancellationToken cancellationToken = default) public async virtual Task<WeChatWorkResponse> SendAsync(WeChatWorkAppChatMessage message, CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkMessageRequest<WeChatWorkAppChatMessage>( var request = new WeChatWorkMessageRequest<WeChatWorkAppChatMessage>(
token.AccessToken, token.AccessToken,
message); message);
using var response = await client.SendMessageAsync(request, cancellationToken); var messageResponse = await client.SendMessageAsync(request, cancellationToken);
var messageResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
if (!messageResponse.IsSuccessed) if (!messageResponse.IsSuccessed)
{ {
@ -91,10 +90,9 @@ public class WeChatWorkMessageSender : IWeChatWorkMessageSender, ISingletonDepen
// 消息发送频率限制: https://developer.work.weixin.qq.com/document/path/99110#%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E9%A2%91%E7%8E%87%E9%99%90%E5%88%B6 // 消息发送频率限制: https://developer.work.weixin.qq.com/document/path/99110#%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E9%A2%91%E7%8E%87%E9%99%90%E5%88%B6
public async virtual Task<WeChatWorkResponse> SendAsync(string webhookKey, WeChatWorkWebhookMessage message, CancellationToken cancellationToken = default) public async virtual Task<WeChatWorkResponse> SendAsync(string webhookKey, WeChatWorkWebhookMessage message, CancellationToken cancellationToken = default)
{ {
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.SendMessageAsync(webhookKey, message, cancellationToken); var messageResponse = await client.SendMessageAsync(webhookKey, message, cancellationToken);
var messageResponse = await response.DeserializeObjectAsync<WeChatWorkResponse>();
if (!messageResponse.IsSuccessed) if (!messageResponse.IsSuccessed)
{ {

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Security/IWeChatWorkServerProvider.cs

@ -13,5 +13,5 @@ public interface IWeChatWorkServerProvider
/// </remarks> /// </remarks>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
Task<WeChatServerDomainModel> GetWeChatServerAsync(CancellationToken cancellationToken = default); Task<WeChatServerDomainResponse> GetWeChatServerAsync(CancellationToken cancellationToken = default);
} }

10
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Security/WeChatWorkServerProvider.cs

@ -1,5 +1,6 @@
using LINGYUN.Abp.WeChat.Work.Security.Models; using LINGYUN.Abp.WeChat.Work.Security.Models;
using LINGYUN.Abp.WeChat.Work.Token; using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -19,14 +20,11 @@ public class WeChatWorkServerProvider : IWeChatWorkServerProvider, ISingletonDep
WeChatWorkTokenProvider = weChatWorkTokenProvider; WeChatWorkTokenProvider = weChatWorkTokenProvider;
} }
public async virtual Task<WeChatServerDomainModel> GetWeChatServerAsync(CancellationToken cancellationToken = default) public async virtual Task<WeChatServerDomainResponse> GetWeChatServerAsync(CancellationToken cancellationToken = default)
{ {
var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken);
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); var client = HttpClientFactory.CreateWeChatWorkApiClient();
using var response = await client.GetServerDomainIpAsync(token.AccessToken, cancellationToken); return await client.GetServerDomainIpAsync(token.AccessToken, cancellationToken);
var serverDomainResponse = await response.DeserializeObjectAsync<WeChatServerDomainResponse>();
return serverDomainResponse.ToServerDomain();
} }
} }

99
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/WeChatWorkTokenProvider.cs

@ -1,35 +1,23 @@
using LINGYUN.Abp.WeChat.Work.Settings; using LINGYUN.Abp.WeChat.Work.Settings;
using LINGYUN.Abp.WeChat.Work.Token.Models; using LINGYUN.Abp.WeChat.Work.Token.Models;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Settings; using Volo.Abp.Settings;
namespace LINGYUN.Abp.WeChat.Work.Token; namespace LINGYUN.Abp.WeChat.Work.Token;
public class WeChatWorkTokenProvider : IWeChatWorkTokenProvider, ISingletonDependency public class WeChatWorkTokenProvider : WeChatWorkTokenProviderBase, IWeChatWorkTokenProvider, ISingletonDependency
{ {
public ILogger<WeChatWorkTokenProvider> Logger { get; set; } protected override string ProviderName => "WeChatWorkToken";
protected ISettingProvider SettingProvider { get; }
protected IHttpClientFactory HttpClientFactory { get; }
protected IDistributedCache<WeChatWorkTokenCacheItem> WeChatWorkTokenCache { get; }
public WeChatWorkTokenProvider( public WeChatWorkTokenProvider(
ISettingProvider settingProvider, ISettingProvider settingProvider,
IHttpClientFactory httpClientFactory, IHttpClientFactory httpClientFactory,
IDistributedCache<WeChatWorkTokenCacheItem> cache) IDistributedCache<WeChatWorkTokenCacheItem> cache)
: base(settingProvider, httpClientFactory, cache)
{ {
HttpClientFactory = httpClientFactory;
SettingProvider = settingProvider;
WeChatWorkTokenCache = cache;
Logger = NullLogger<WeChatWorkTokenProvider>.Instance;
} }
public async virtual Task<WeChatWorkToken> GetTokenAsync(CancellationToken cancellationToken = default) public async virtual Task<WeChatWorkToken> GetTokenAsync(CancellationToken cancellationToken = default)
@ -47,85 +35,6 @@ public class WeChatWorkTokenProvider : IWeChatWorkTokenProvider, ISingletonDepen
string secret, string secret,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return (await GetCacheItemAsync("WeChatWorkToken", corpId, agentId, secret, cancellationToken)).Token; return (await InternalGetTokenAsync(corpId, agentId, secret, cancellationToken)).Token;
}
/// <summary>
/// 获取缓存中的Token配置
/// </summary>
/// <param name="provider"></param>
/// <param name="corpId"></param>
/// <param name="agentId"></param>
/// <param name="secret"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async virtual Task<WeChatWorkTokenCacheItem> GetCacheItemAsync(
string provider,
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
Check.NotNullOrEmpty(corpId, nameof(corpId));
Check.NotNullOrEmpty(agentId, nameof(agentId));
Check.NotNullOrEmpty(secret, nameof(secret));
var cacheKey = WeChatWorkTokenCacheItem.CalculateCacheKey(provider, corpId, agentId);
return await GetCacheItemAsync(cacheKey, provider, corpId, agentId, secret);
}
/// <summary>
/// 获取或刷新分布式缓存中的Token配置
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="provider"></param>
/// <param name="corpId"></param>
/// <param name="agentId"></param>
/// <param name="secret"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async virtual Task<WeChatWorkTokenCacheItem> GetCacheItemAsync(
string cacheKey,
string provider,
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
var cacheItem = await WeChatWorkTokenCache.GetAsync(cacheKey, token: cancellationToken);
if (cacheItem != null)
{
Logger.LogDebug($"Found WeChatWorkToken in the cache: {cacheKey}");
return cacheItem;
}
Logger.LogDebug($"Not found WeChatWorkToken in the cache, getting from the httpClient: {cacheKey}");
var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient);
var request = new WeChatWorkTokenRequest
{
CorpId = corpId,
CorpSecret = secret,
};
using var response = await client.GetTokenAsync(request, cancellationToken);
var tokenResponse = await response.DeserializeObjectAsync<WeChatWorkTokenResponse>();
var token = tokenResponse.ToWeChatWorkToken();
cacheItem = new WeChatWorkTokenCacheItem(corpId, agentId, token);
Logger.LogDebug($"Setting the cache item: {cacheKey}");
var cacheOptions = new DistributedCacheEntryOptions
{
// 设置绝对过期时间为Token有效期剩余的二分钟
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(token.ExpiresIn - 100),
};
await WeChatWorkTokenCache.SetAsync(cacheKey, cacheItem, cacheOptions, token: cancellationToken);
Logger.LogDebug($"Finished setting the cache item: {cacheKey}");
return cacheItem;
} }
} }

111
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/WeChatWorkTokenProviderBase.cs

@ -0,0 +1,111 @@
using LINGYUN.Abp.WeChat.Work.Token.Models;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Caching;
using Volo.Abp.Settings;
namespace LINGYUN.Abp.WeChat.Work.Token;
public abstract class WeChatWorkTokenProviderBase
{
public ILogger<WeChatWorkTokenProviderBase> Logger { get; set; }
protected abstract string ProviderName { get; }
protected ISettingProvider SettingProvider { get; }
protected IHttpClientFactory HttpClientFactory { get; }
protected IDistributedCache<WeChatWorkTokenCacheItem> WeChatWorkTokenCache { get; }
protected WeChatWorkTokenProviderBase(
ISettingProvider settingProvider,
IHttpClientFactory httpClientFactory,
IDistributedCache<WeChatWorkTokenCacheItem> cache)
{
HttpClientFactory = httpClientFactory;
SettingProvider = settingProvider;
WeChatWorkTokenCache = cache;
Logger = NullLogger<WeChatWorkTokenProviderBase>.Instance;
}
/// <summary>
/// 获取缓存中的Token配置
/// </summary>
/// <param name="corpId"></param>
/// <param name="agentId"></param>
/// <param name="secret"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async virtual Task<WeChatWorkTokenCacheItem> InternalGetTokenAsync(
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
Check.NotNullOrEmpty(corpId, nameof(corpId));
Check.NotNullOrEmpty(agentId, nameof(agentId));
Check.NotNullOrEmpty(secret, nameof(secret));
var cacheKey = WeChatWorkTokenCacheItem.CalculateCacheKey(ProviderName, corpId, agentId);
return await GetCacheItemAsync(cacheKey, ProviderName, corpId, agentId, secret, cancellationToken);
}
/// <summary>
/// 获取或刷新分布式缓存中的Token配置
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="provider"></param>
/// <param name="corpId"></param>
/// <param name="agentId"></param>
/// <param name="secret"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async virtual Task<WeChatWorkTokenCacheItem> GetCacheItemAsync(
string cacheKey,
string provider,
string corpId,
string agentId,
string secret,
CancellationToken cancellationToken = default)
{
var cacheItem = await WeChatWorkTokenCache.GetAsync(cacheKey, token: cancellationToken);
if (cacheItem != null)
{
Logger.LogDebug($"Found WeChatWorkToken in the cache: {cacheKey}");
return cacheItem;
}
Logger.LogDebug($"Not found WeChatWorkToken in the cache, getting from the httpClient: {cacheKey}");
var client = HttpClientFactory.CreateWeChatWorkApiClient();
var request = new WeChatWorkTokenRequest
{
CorpId = corpId,
CorpSecret = secret,
};
var tokenResponse = await client.GetTokenAsync(request, cancellationToken);
var token = tokenResponse.ToWeChatWorkToken();
cacheItem = new WeChatWorkTokenCacheItem(corpId, agentId, token);
Logger.LogDebug($"Setting the cache item: {cacheKey}");
var cacheOptions = new DistributedCacheEntryOptions
{
// 设置绝对过期时间为Token有效期剩余的二分钟
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(token.ExpiresIn - 100),
};
await WeChatWorkTokenCache.SetAsync(cacheKey, cacheItem, cacheOptions, token: cancellationToken);
Logger.LogDebug($"Finished setting the cache item: {cacheKey}");
return cacheItem;
}
}

17
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Auth.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.WeChat.Work.Authorize.Request; using LINGYUN.Abp.WeChat.Work.Authorize.Request;
using LINGYUN.Abp.WeChat.Work.Authorize.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -7,7 +8,7 @@ namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetUserInfoAsync( public async static Task<WeChatWorkUserInfoResponse> GetUserInfoAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
string code, string code,
@ -18,12 +19,14 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
urlBuilder.AppendFormat("&code={0}", code); urlBuilder.AppendFormat("&code={0}", code);
var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString()); using var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkUserInfoResponse>();
} }
public async static Task<HttpResponseMessage> GetUserDetailAsync( public async static Task<WeChatWorkUserDetailResponse> GetUserDetailAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkUserDetailRequest request, WeChatWorkUserDetailRequest request,
@ -33,13 +36,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/auth/getuserdetail"); urlBuilder.Append("/cgi-bin/auth/getuserdetail");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkUserDetailResponse>();
} }
} }

27
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Chat.cs

@ -1,4 +1,6 @@
using LINGYUN.Abp.WeChat.Work.Chat.Request; using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.Chat.Request;
using LINGYUN.Abp.WeChat.Work.Chat.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -7,7 +9,7 @@ namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetAppChatAsync( public async static Task<WeChatWorkAppChatInfoResponse> GetAppChatAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
string chatId, string chatId,
@ -18,14 +20,16 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
urlBuilder.AppendFormat("&chatid={0}", chatId); urlBuilder.AppendFormat("&chatid={0}", chatId);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Get, HttpMethod.Get,
urlBuilder.ToString()); urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkAppChatInfoResponse>();
} }
public async static Task<HttpResponseMessage> CreateAppChatAsync( public async static Task<WeChatWorkAppChatCreateResponse> CreateAppChatAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkAppChatCreateRequest request, WeChatWorkAppChatCreateRequest request,
@ -35,17 +39,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/appchat/create"); urlBuilder.Append("/cgi-bin/appchat/create");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkAppChatCreateResponse>();
} }
public async static Task<HttpResponseMessage> UpdateAppChatAsync( public async static Task<WeChatWorkResponse> UpdateAppChatAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
WeChatWorkAppChatUpdateRequest request, WeChatWorkAppChatUpdateRequest request,
@ -55,13 +61,14 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/appchat/update"); urlBuilder.Append("/cgi-bin/appchat/update");
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await client.SendAsync(httpRequest, cancellationToken); return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
} }

18
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Media.cs

@ -20,12 +20,12 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("?access_token={0}", accessToken);
urlBuilder.AppendFormat("&media_id={0}", mediaId); urlBuilder.AppendFormat("&media_id={0}", mediaId);
var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString()); using var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); return await client.SendAsync(httpRequest, cancellationToken);
} }
public async static Task<HttpResponseMessage> UploadMediaAsync( public async static Task<WeChatWorkMediaResponse> UploadMediaAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string type, string type,
WeChatWorkMediaRequest request, WeChatWorkMediaRequest request,
@ -37,17 +37,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("&type={0}", type); urlBuilder.AppendFormat("&type={0}", type);
var fileBytes = await request.Content.GetStream().GetAllBytesAsync(); var fileBytes = await request.Content.GetStream().GetAllBytesAsync();
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = WeChatWorkHttpContentBuildHelper.BuildUploadMediaContent("media", fileBytes, request.Content.FileName) Content = WeChatWorkHttpContentBuildHelper.BuildUploadMediaContent("media", fileBytes, request.Content.FileName)
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkMediaResponse>();
} }
public async static Task<HttpResponseMessage> UploadImageAsync( public async static Task<WeChatWorkImageResponse> UploadImageAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
WeChatWorkMediaRequest request, WeChatWorkMediaRequest request,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
@ -57,13 +59,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.AppendFormat("?access_token={0}", request.AccessToken); urlBuilder.AppendFormat("?access_token={0}", request.AccessToken);
var fileBytes = await request.Content.GetStream().GetAllBytesAsync(); var fileBytes = await request.Content.GetStream().GetAllBytesAsync();
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = WeChatWorkHttpContentBuildHelper.BuildUploadMediaContent("file", fileBytes, request.Content.FileName) Content = WeChatWorkHttpContentBuildHelper.BuildUploadMediaContent("file", fileBytes, request.Content.FileName)
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkImageResponse>();
} }
} }

36
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Message.cs

@ -1,5 +1,7 @@
using LINGYUN.Abp.WeChat.Work.Messages; using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.Messages;
using LINGYUN.Abp.WeChat.Work.Messages.Request; using LINGYUN.Abp.WeChat.Work.Messages.Request;
using LINGYUN.Abp.WeChat.Work.Messages.Response;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -8,7 +10,7 @@ namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> SendMessageAsync( public async static Task<WeChatWorkMessageResponse> SendMessageAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
WeChatWorkMessageRequest<WeChatWorkMessage> request, WeChatWorkMessageRequest<WeChatWorkMessage> request,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
@ -17,17 +19,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/message/send"); urlBuilder.Append("/cgi-bin/message/send");
urlBuilder.AppendFormat("?access_token={0}", request.AccessToken); urlBuilder.AppendFormat("?access_token={0}", request.AccessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.Message.SerializeToJson()) Content = new StringContent(request.Message.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkMessageResponse>();
} }
public async static Task<HttpResponseMessage> SendMessageAsync( public async static Task<WeChatWorkResponse> SendMessageAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
WeChatWorkMessageRequest<WeChatWorkAppChatMessage> request, WeChatWorkMessageRequest<WeChatWorkAppChatMessage> request,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
@ -36,17 +40,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/appchat/send"); urlBuilder.Append("/cgi-bin/appchat/send");
urlBuilder.AppendFormat("?access_token={0}", request.AccessToken); urlBuilder.AppendFormat("?access_token={0}", request.AccessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.Message.SerializeToJson()) Content = new StringContent(request.Message.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> ReCallMessageAsync( public async static Task<WeChatWorkResponse> ReCallMessageAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
WeChatWorkMessageReCallRequest request, WeChatWorkMessageReCallRequest request,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
@ -55,17 +61,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/message/recall"); urlBuilder.Append("/cgi-bin/message/recall");
urlBuilder.AppendFormat("?access_token={0}", request.AccessToken); urlBuilder.AppendFormat("?access_token={0}", request.AccessToken);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
public async static Task<HttpResponseMessage> SendMessageAsync( public async static Task<WeChatWorkResponse> SendMessageAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string webhookKey, string webhookKey,
WeChatWorkWebhookMessage request, WeChatWorkWebhookMessage request,
@ -75,13 +83,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions
urlBuilder.Append("/cgi-bin/webhook/send"); urlBuilder.Append("/cgi-bin/webhook/send");
urlBuilder.AppendFormat("?key={0}", webhookKey); urlBuilder.AppendFormat("?key={0}", webhookKey);
var httpRequest = new HttpRequestMessage( using var httpRequest = new HttpRequestMessage(
HttpMethod.Post, HttpMethod.Post,
urlBuilder.ToString()) urlBuilder.ToString())
{ {
Content = new StringContent(request.SerializeToJson()) Content = new StringContent(request.SerializeToJson())
}; };
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkResponse>();
} }
} }

11
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Security.cs

@ -1,17 +1,20 @@
using System.Threading; using LINGYUN.Abp.WeChat.Work.Security.Models;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace System.Net.Http; namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetServerDomainIpAsync( public async static Task<WeChatServerDomainResponse> GetServerDomainIpAsync(
this HttpMessageInvoker client, this HttpMessageInvoker client,
string accessToken, string accessToken,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var httpRequest = new HttpRequestMessage(HttpMethod.Get, using var httpRequest = new HttpRequestMessage(HttpMethod.Get,
$"/cgi-bin/security/get_server_domain_ip?access_token={accessToken}"); ; $"/cgi-bin/security/get_server_domain_ip?access_token={accessToken}"); ;
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatServerDomainResponse>();
} }
} }

8
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs

@ -7,15 +7,17 @@ namespace System.Net.Http;
internal static partial class HttpClientWeChatWorkRequestExtensions internal static partial class HttpClientWeChatWorkRequestExtensions
{ {
public async static Task<HttpResponseMessage> GetTokenAsync(this HttpMessageInvoker client, WeChatWorkTokenRequest request, CancellationToken cancellationToken = default) public async static Task<WeChatWorkTokenResponse> GetTokenAsync(this HttpMessageInvoker client, WeChatWorkTokenRequest request, CancellationToken cancellationToken = default)
{ {
var urlBuilder = new StringBuilder(); var urlBuilder = new StringBuilder();
urlBuilder.Append("/cgi-bin/gettoken"); urlBuilder.Append("/cgi-bin/gettoken");
urlBuilder.AppendFormat("?corpid={0}", request.CorpId); urlBuilder.AppendFormat("?corpid={0}", request.CorpId);
urlBuilder.AppendFormat("&corpsecret={0}", request.CorpSecret); urlBuilder.AppendFormat("&corpsecret={0}", request.CorpSecret);
var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString()); using var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString());
return await client.SendAsync(httpRequest, cancellationToken); using var httpResponse = await client.SendAsync(httpRequest, cancellationToken);
return await httpResponse.DeserializeObjectAsync<WeChatWorkTokenResponse>();
} }
} }

Loading…
Cancel
Save