From 370dd3fe88a22de378a326a0054b2becd2a953a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8F=82=E6=BA=90?= <623417969@qq.com> Date: Mon, 29 Mar 2021 16:59:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=80=81=E7=94=A8=E6=88=B7=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Apis/User/Dtos/CreateTagApiResult.cs | 25 ++++++++ .../Apis/User/Dtos/CreateTagInput.cs | 19 ++++++ .../Apis/User/Dtos/GetTagsApiResult.cs | 23 +++++++ .../Apis/User/Dtos/GetUserApiResult.cs | 25 ++++++++ .../Apis/User/Dtos/UpdateRemarkInput.cs | 19 ++++++ .../Apis/User/Dtos/UserInfoApiResult.cs | 61 +++++++++++++++++++ .../Apis/User/ITagsApi.cs | 27 ++++++++ .../Apis/User/IUserApi.cs | 36 +++++++++++ .../Extentions.cs | 3 + .../ApiTests/TagsApiTest.cs | 39 ++++++++++++ .../ApiTests/UserApiTest.cs | 43 +++++++++++++ 11 files changed, 320 insertions(+) create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserApiResult.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateRemarkInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UserInfoApiResult.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs create mode 100644 tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs create mode 100644 tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs new file mode 100644 index 0000000..29c9062 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class CreateTagApiResult : ApiResultBase + { + [JsonProperty("tag")] + public CreateTagResultModel Tag { get; set; } + } + + public class CreateTagResultModel + { + /// + /// 标签id,由微信分配 + /// + [JsonProperty("id")] + public int Id { get; set; } + + /// + /// 标签名,UTF8编码 + /// + [JsonProperty("name")] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagInput.cs new file mode 100644 index 0000000..6fb4154 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagInput.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class CreateTagInput + { + [JsonProperty("tag")] + public CreateTagModel Tag { get; set; } + } + + public class CreateTagModel + { + /// + /// 标签名(30个字符以内) + /// + [JsonProperty("name")] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs new file mode 100644 index 0000000..84b79e6 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs @@ -0,0 +1,23 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class GetTagsApiResult : ApiResultBase + { + [JsonProperty("tags")] + public IEnumerable Tags { get; set; } + } + + public class GetTagModel + { + [JsonProperty("id")] + public int Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("count")] + public int Count { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserApiResult.cs new file mode 100644 index 0000000..fbcd80c --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserApiResult.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class GetUserApiResult : ApiResultBase + { + [JsonProperty("total")] + public int Total { get; set; } + + [JsonProperty("count")] + public int Count { get; set; } + + [JsonProperty("data")] + public DataModel Data { get; set; } + + [JsonProperty("next_openid")] + public string NextOpenId { get; set; } + + public class DataModel + { + [JsonProperty("openid")] + public string[] OpenIds { get; set; } + } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateRemarkInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateRemarkInput.cs new file mode 100644 index 0000000..26d077b --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateRemarkInput.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class UpdateRemarkInput + { + /// + /// 用户标识 + /// + [JsonProperty("openid")] + public string OpenId { get; set; } + + /// + /// 新的备注名,长度必须小于30字符 + /// + [JsonProperty("remark")] + public string Remark { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UserInfoApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UserInfoApiResult.cs new file mode 100644 index 0000000..ffc8adc --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UserInfoApiResult.cs @@ -0,0 +1,61 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + /// + /// https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId + /// + public class UserInfoApiResult : ApiResultBase + { + [JsonProperty("subscribe")] + public int Subscribe { get; set; } + + [JsonProperty("openid")] + public string OpenId { get; set; } + + [JsonProperty("nickname")] + public string Nickname { get; set; } + + [JsonProperty("sex")] + public int Sex { get; set; } + + [JsonProperty("language")] + public string Language { get; set; } + + [JsonProperty("city")] + public string City { get; set; } + + [JsonProperty("province")] + public string Province { get; set; } + + [JsonProperty("country")] + public string Country { get; set; } + + [JsonProperty("headimgurl")] + public string Headimgurl { get; set; } + + [JsonProperty("subscribe_time")] + public int SubscribeTime { get; set; } + + [JsonProperty("unionid")] + public string UnionId { get; set; } + + [JsonProperty("remark")] + public string Remark { get; set; } + + [JsonProperty("groupid")] + public int GroupId { get; set; } + + [JsonProperty("tagid_list")] + public int[] TagIdList { get; set; } + + [JsonProperty("subscribe_scene")] + public string SubscribeScene { get; set; } + + [JsonProperty("qr_scene")] + public int QrScene { get; set; } + + [JsonProperty("qr_scene_str")] + public string QrSceneStr { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs new file mode 100644 index 0000000..be31421 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs @@ -0,0 +1,27 @@ +using Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos; +using System.Threading.Tasks; +using WebApiClientCore.Attributes; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User +{ + /// + /// 用户标签管理 + /// + [HttpHost("https://api.weixin.qq.com/cgi-bin/tags/")] + public interface ITagsApi : IWxApiWithAccessTokenFilter + { + /// + /// 创建标签 + /// + /// + [HttpPost("create")] + Task CreateAsync([JsonNetContent(CharSet = "utf-8")] CreateTagInput input); + + /// + /// 获取公众号已创建的标签 + /// + /// + [HttpGet("get")] + Task GetAsync(); + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs new file mode 100644 index 0000000..d6df8e4 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs @@ -0,0 +1,36 @@ +using Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos; +using Newtonsoft.Json; +using System.Threading.Tasks; +using WebApiClientCore.Attributes; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User +{ + /// + /// 用户管理 + /// + [HttpHost("https://api.weixin.qq.com/cgi-bin/user/")] + public interface IUserApi : IWxApiWithAccessTokenFilter + { + /// + /// 获取用户基本信息(UnionID机制) + /// + /// + [HttpGet("info")] + Task InfoAsync(string openId, string lang = "zh_CN"); + + /// + /// 设置用户备注名 + /// + /// + [HttpPost("info/updateremark")] + Task UpdateRemarkAsync([JsonNetContent(CharSet = "utf-8")] UpdateRemarkInput input); + + /// + /// 获取用户列表 + /// + /// 第一个拉取的OPENID,不填默认从头开始拉取 + /// + [HttpGet("get")] + Task GetAsync([JsonProperty("next_openid")] string nextOpenId = null); + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Extentions.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Extentions.cs index acf64ad..0c8ead0 100644 --- a/src/Magicodes.Wx.PublicAccount.Sdk/Extentions.cs +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Extentions.cs @@ -5,6 +5,7 @@ using Magicodes.Wx.PublicAccount.Sdk.Apis.Menu; using Magicodes.Wx.PublicAccount.Sdk.Apis.Message; using Magicodes.Wx.PublicAccount.Sdk.Apis.Sns; using Magicodes.Wx.PublicAccount.Sdk.Apis.Token; +using Magicodes.Wx.PublicAccount.Sdk.Apis.User; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -34,6 +35,8 @@ namespace Magicodes.Wx.PublicAccount.Sdk services.AddSingleton(); services.AddHttpApi(); services.AddHttpApi(); + services.AddHttpApi(); + services.AddHttpApi(); return services; } diff --git a/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs new file mode 100644 index 0000000..070a535 --- /dev/null +++ b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs @@ -0,0 +1,39 @@ +using Magicodes.Wx.PublicAccount.Sdk.Apis.User; +using Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +namespace Magicodes.Wx.PublicAccount.Sdk.Test.ApiTests +{ + public class TagsApiTest : TestBase, IClassFixture + { + private readonly ITagsApi tagsApi; + + public TagsApiTest(TestWebApplicationFactory webApplicationFactory, ITestOutputHelper output) : base( + webApplicationFactory, output) + { + tagsApi = GetRequiredService(); + } + + [Fact] + public async Task CreateAsync_Test() + { + var result = await tagsApi.CreateAsync(new CreateTagInput + { + Tag = new CreateTagModel + { + Name = "Magicodes good" + } + }); + result.EnsureSuccess(); + } + + [Fact] + public async Task GetAsync_Test() + { + var result = await tagsApi.GetAsync(); + result.EnsureSuccess(); + } + } +} \ No newline at end of file diff --git a/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs new file mode 100644 index 0000000..8426ec6 --- /dev/null +++ b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs @@ -0,0 +1,43 @@ +using Magicodes.Wx.PublicAccount.Sdk.Apis.User; +using Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +namespace Magicodes.Wx.PublicAccount.Sdk.Test.ApiTests +{ + public class UserApiTest : TestBase, IClassFixture + { + private readonly IUserApi userApi; + + public UserApiTest(TestWebApplicationFactory webApplicationFactory, ITestOutputHelper output) : base(webApplicationFactory, output) + { + userApi = GetRequiredService(); + } + + [Fact] + public async Task InfoAsync_Test() + { + var result = await userApi.InfoAsync("007"); + result.EnsureSuccess(); + } + + [Fact] + public async Task UpdateRemarkAsync_Test() + { + var result = await userApi.UpdateRemarkAsync(new UpdateRemarkInput + { + OpenId = "oDF3iY9ffA-hqb2vVvbr7qxf6A0Q", + Remark = "Magicodes" + }); + result.EnsureSuccess(); + } + + [Fact] + public async Task GetAsync_Test() + { + var result = await userApi.GetAsync(); + result.EnsureSuccess(); + } + } +} \ No newline at end of file -- Gitee From 7df76b3ac6629a0e01cd696e21c25f9d6f7b1b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8F=82=E6=BA=90?= <623417969@qq.com> Date: Mon, 29 Mar 2021 17:54:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Apis/User/Dtos/BatchTaggingInput.cs | 16 +++++ .../Apis/User/Dtos/BatchUnTaggingInput.cs | 6 ++ .../Apis/User/Dtos/CreateTagApiResult.cs | 4 +- .../Apis/User/Dtos/DeleteTagInput.cs | 16 +++++ .../Apis/User/Dtos/GetIdListApiResult.cs | 13 ++++ .../Apis/User/Dtos/GetIdListInput.cs | 10 ++++ .../Apis/User/Dtos/GetTagsApiResult.cs | 4 +- .../Apis/User/Dtos/GetUserByTagInput.cs | 16 +++++ .../Apis/User/Dtos/UpdateTagInput.cs | 19 ++++++ .../Apis/User/ITagsApi.cs | 43 +++++++++++++- .../Apis/User/IUserApi.cs | 7 +++ .../ApiTests/TagsApiTest.cs | 59 +++++++++++++++++++ .../ApiTests/UserApiTest.cs | 11 ++++ 13 files changed, 218 insertions(+), 6 deletions(-) create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchTaggingInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchUnTaggingInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/DeleteTagInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListApiResult.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserByTagInput.cs create mode 100644 src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateTagInput.cs diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchTaggingInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchTaggingInput.cs new file mode 100644 index 0000000..5950f05 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchTaggingInput.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class BatchTaggingInput + { + /// + /// 粉丝列表 + /// + [JsonProperty("openid_list")] + public string[] OpenIdList { get; set; } + + [JsonProperty("tagid")] + public int TagId { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchUnTaggingInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchUnTaggingInput.cs new file mode 100644 index 0000000..793578f --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/BatchUnTaggingInput.cs @@ -0,0 +1,6 @@ +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class BatchUnTaggingInput : BatchTaggingInput + { + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs index 29c9062..493ca1a 100644 --- a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/CreateTagApiResult.cs @@ -5,10 +5,10 @@ namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos public class CreateTagApiResult : ApiResultBase { [JsonProperty("tag")] - public CreateTagResultModel Tag { get; set; } + public CreateTagResultInfo Tag { get; set; } } - public class CreateTagResultModel + public class CreateTagResultInfo { /// /// 标签id,由微信分配 diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/DeleteTagInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/DeleteTagInput.cs new file mode 100644 index 0000000..6c45b2f --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/DeleteTagInput.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class DeleteTagInput + { + [JsonProperty("tag")] + public DeleteTagInfo Tag { get; set; } + } + + public class DeleteTagInfo + { + [JsonProperty("id")] + public int Id { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListApiResult.cs new file mode 100644 index 0000000..6010e74 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListApiResult.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class GetIdListApiResult : ApiResultBase + { + /// + /// 被置上的标签列表 + /// + [JsonProperty("tagid_list")] + public int[] TagIdList { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListInput.cs new file mode 100644 index 0000000..c6e0524 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetIdListInput.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class GetIdListInput + { + [JsonProperty("openid")] + public string OpenId { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs index 84b79e6..5afff80 100644 --- a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetTagsApiResult.cs @@ -6,10 +6,10 @@ namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos public class GetTagsApiResult : ApiResultBase { [JsonProperty("tags")] - public IEnumerable Tags { get; set; } + public IEnumerable Tags { get; set; } } - public class GetTagModel + public class GetTagInfo { [JsonProperty("id")] public int Id { get; set; } diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserByTagInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserByTagInput.cs new file mode 100644 index 0000000..b0a2469 --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/GetUserByTagInput.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class GetUserByTagInput + { + [JsonProperty("tagid")] + public int TagId { get; set; } + + /// + /// 第一个拉取的OPENID,不填默认从头开始拉取 + /// + [JsonProperty("next_openid")] + public string NextOpenId { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateTagInput.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateTagInput.cs new file mode 100644 index 0000000..10f35ef --- /dev/null +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/Dtos/UpdateTagInput.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User.Dtos +{ + public class UpdateTagInput + { + [JsonProperty("tag")] + public UpdateTagInfo Tag { get; set; } + } + + public class UpdateTagInfo + { + [JsonProperty("id")] + public int Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs index be31421..846d60c 100644 --- a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/ITagsApi.cs @@ -11,17 +11,56 @@ namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User public interface ITagsApi : IWxApiWithAccessTokenFilter { /// - /// 创建标签 + /// 1.创建标签 /// /// [HttpPost("create")] Task CreateAsync([JsonNetContent(CharSet = "utf-8")] CreateTagInput input); /// - /// 获取公众号已创建的标签 + /// 2.获取公众号已创建的标签 /// /// [HttpGet("get")] Task GetAsync(); + + /// + /// 3.编辑标签 + /// + /// + [HttpPost("update")] + Task UpdateAsync([JsonNetContent(CharSet = "utf-8")] UpdateTagInput input); + + /// + /// 4.删除标签 + /// + /// + /// + [HttpPost("delete")] + Task DeleteAsync([JsonNetContent(CharSet = "utf-8")] DeleteTagInput input); + + /// + /// 批量为用户打标签 + /// + /// + /// + [HttpPost("members/batchtagging")] + Task BatchTaggingAsync([JsonNetContent(CharSet = "utf-8")] BatchTaggingInput input); + + /// + /// 批量为用户取消标签 + /// + /// + /// + [HttpPost("members/batchuntagging")] + Task BatchUnTaggingAsync([JsonNetContent(CharSet = "utf-8")] BatchUnTaggingInput input); + + /// + /// 获取用户身上的标签列表 + /// + /// + /// + [HttpPost("getidlist")] + Task GetIdListAsync([JsonNetContent(CharSet = "utf-8")] GetIdListInput input); } } \ No newline at end of file diff --git a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs index d6df8e4..f1cfab5 100644 --- a/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs +++ b/src/Magicodes.Wx.PublicAccount.Sdk/Apis/User/IUserApi.cs @@ -32,5 +32,12 @@ namespace Magicodes.Wx.PublicAccount.Sdk.Apis.User /// [HttpGet("get")] Task GetAsync([JsonProperty("next_openid")] string nextOpenId = null); + + /// + /// 获取标签下粉丝列表 + /// + /// + [HttpPost("tag/get")] + Task GetUserByTagAsync([JsonProperty("next_openid")] GetUserByTagInput input); } } \ No newline at end of file diff --git a/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs index 070a535..45fa9f3 100644 --- a/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs +++ b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/TagsApiTest.cs @@ -35,5 +35,64 @@ namespace Magicodes.Wx.PublicAccount.Sdk.Test.ApiTests var result = await tagsApi.GetAsync(); result.EnsureSuccess(); } + + [Fact] + public async Task UpdateAsync_Test() + { + var result = await tagsApi.UpdateAsync(new UpdateTagInput + { + Tag = new UpdateTagInfo + { + Id = 103, + Name = "Magicodes good 1" + } + }); + result.EnsureSuccess(); + } + + [Fact] + public async Task DeleteAsync_Test() + { + var result = await tagsApi.DeleteAsync(new DeleteTagInput + { + Tag = new DeleteTagInfo + { + Id = 103 + } + }); + result.EnsureSuccess(); + } + + [Fact] + public async Task BatchTaggingAsync_Test() + { + var result = await tagsApi.BatchTaggingAsync(new BatchTaggingInput + { + OpenIdList = new[] { "o6l4Nv5rjCXOCkbaCDOAmH1Eoxl4" }, + TagId = 102 + }); + result.EnsureSuccess(); + } + + [Fact] + public async Task BatchUnTaggingAsync_Test() + { + var result = await tagsApi.BatchUnTaggingAsync(new BatchUnTaggingInput + { + OpenIdList = new[] { "o6l4Nv5rjCXOCkbaCDOAmH1Eoxl4" }, + TagId = 102 + }); + result.EnsureSuccess(); + } + + [Fact] + public async Task GetIdListAsync_Test() + { + var result = await tagsApi.GetIdListAsync(new GetIdListInput + { + OpenId = "o6l4Nv5rjCXOCkbaCDOAmH1Eoxl4" + }); + result.EnsureSuccess(); + } } } \ No newline at end of file diff --git a/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs index 8426ec6..3791859 100644 --- a/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs +++ b/tests/Magicodes.Wx.PublicAccount.Sdk.Test/ApiTests/UserApiTest.cs @@ -39,5 +39,16 @@ namespace Magicodes.Wx.PublicAccount.Sdk.Test.ApiTests var result = await userApi.GetAsync(); result.EnsureSuccess(); } + + [Fact] + public async Task GetUserByTagAsync_Test() + { + var result = await userApi.GetUserByTagAsync(new GetUserByTagInput + { + TagId = 103, + NextOpenId = string.Empty + }); + result.EnsureSuccess(); + } } } \ No newline at end of file -- Gitee