From 4240d83c32442b1875d0849915026c4aa38510ee Mon Sep 17 00:00:00 2001 From: Jeffrey Su Date: Mon, 5 Jun 2023 17:41:56 +0800 Subject: [PATCH 1/6] Update readme.en.md --- readme.en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.en.md b/readme.en.md index 1c76b22452..cccf506988 100644 --- a/readme.en.md +++ b/readme.en.md @@ -27,7 +27,6 @@ If you like and hope us to continue to optimize this project, please give us a S > ⚡ Sample has already supported for .NET 6.0, [Click Here](Samples/net6-mvc) !
> 🍦 [file.api.weixin.qq.com Domain name officially disabled(2020.9.15)](https://developers.weixin.qq.com/community/develop/doc/0002245dcdc8c06f36fa6a47d56400), please update to the latest version!
- ## Start:Separate document by module @@ -39,7 +38,8 @@ Entripise Account (Work) | https://sdk.weixin.senparc.com/Docs/Work/ TenPay V3 (Recommended) | https://sdk.weixin.senparc.com/Docs/TenPayV3/ 微信支付 V2 (Not Recommended) | https://sdk.weixin.senparc.com/Docs/TenPayV2/ -> 说明:所有模块的配置、注册、接口调用方法均一致,只要学会其中一个模块开发,就可以举一反三,以下以公众号为例。 + + Index ---------------- From 18534f5c838ab87604a9dfb591a97452c26227f6 Mon Sep 17 00:00:00 2001 From: Jeffrey Su Date: Mon, 5 Jun 2023 17:42:12 +0800 Subject: [PATCH 2/6] Update readme.en.md --- readme.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.en.md b/readme.en.md index cccf506988..1e25935bb1 100644 --- a/readme.en.md +++ b/readme.en.md @@ -36,7 +36,7 @@ Official Accounty (MP) | https://sdk.weixin.senparc.com/Docs/MP/ Mini Program (WxOpen) | https://sdk.weixin.senparc.com/Docs/WxOpen/ Entripise Account (Work) | https://sdk.weixin.senparc.com/Docs/Work/ TenPay V3 (Recommended) | https://sdk.weixin.senparc.com/Docs/TenPayV3/ -微信支付 V2 (Not Recommended) | https://sdk.weixin.senparc.com/Docs/TenPayV2/ +TenPay V2 (Not Recommended) | https://sdk.weixin.senparc.com/Docs/TenPayV2/ From f3e4c24f02faadb27d3d0782f72ef4f63bf58deb Mon Sep 17 00:00:00 2001 From: chinanhb <760833928@qq.com> Date: Mon, 5 Jun 2023 18:59:52 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=8F=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdvancedAPIs/WorkBench/WorkBenchApi.cs | 159 ++++++++++++++++++ .../GetWorkBenchTemplateJsonResult.cs | 41 +++++ .../GetWorkBenchTemplateModel.cs | 19 +++ .../WorkBenchJson/SetWorkBenchDataModel.cs | 19 +++ .../SetWorkBenchTemplateJsonResult.cs | 16 ++ .../SetWorkBenchTemplateModel.cs | 43 +++++ .../WorkBenchJson/WorkBenchImageModel.cs | 27 +++ .../WorkBenchJson/WorkBenchKeyDataModel.cs | 38 +++++ .../WorkBenchJson/WorkBenchListModel.cs | 31 ++++ .../WorkBenchJson/WorkBenchWebViewModel.cs | 40 +++++ ...questMessageEvent_Switch_WorkBench_Mode.cs | 24 +++ .../Senparc.Weixin.Work/Enums.cs | 4 + .../Async/WorkMessageHandler.Async.cs | 9 + .../MessageHandlers/WorkMessageHandler.cs | 10 +- .../Senparc.Weixin.Work.net6.csproj | 4 +- .../Senparc.Weixin.WxOpen.net6.csproj | 1 - 16 files changed, 480 insertions(+), 5 deletions(-) create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchApi.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateJsonResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchDataModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateJsonResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchImageModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchKeyDataModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchListModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchWebViewModel.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_Switch_WorkBench_Mode.cs diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchApi.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchApi.cs new file mode 100644 index 0000000000..3dc846c753 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchApi.cs @@ -0,0 +1,159 @@ +#region Apache License Version 2.0 +/*---------------------------------------------------------------- + +Copyright 2023 chinanhb & Suzhou Senparc Network Technology Co.,Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the +License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See the License for the specific language governing permissions +and limitations under the License. + +Detail: https://github.com/JeffreySu/WeiXinMPSDK/blob/master/license.md + +----------------------------------------------------------------*/ +/*---------------------------------------------------------------- + Copyright (C) 2023 Senparc + + 文件名:WorkBenchApi + 文件功能描述:自定义工作台相关接口 + + + 创建标识:chinanhb - 20230603 +----------------------------------------------------------------*/ + +/* + API:https://developer.work.weixin.qq.com/document/path/92535 + + */ +#endregion Apache License Version 2.0 +using Senparc.CO2NET.Helpers.Serializers; +using Senparc.CO2NET.Helpers; +using Senparc.CO2NET.Trace; +using Senparc.NeuChar; +using Senparc.Weixin.CommonAPIs; +using Senparc.Weixin.Entities; +using Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Mime; +using System.Text; +using System.Threading.Tasks; +using Senparc.CO2NET.HttpUtility; +using Senparc.Weixin.Exceptions; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench +{ + /// + /// 自定义工作台接口 + /// + [NcApiBind(NeuChar.PlatformType.WeChat_Work, true)] + public class WorkBenchApi + { + #region 同步方法 + /// + /// 指定应用自定义模版类型 + /// + /// AccessToken或AppId(推荐使用AppId,需要先注册) + /// 请求参数 + /// 代理请求超时时间(毫秒) + /// + public static SetWorkBenchTemplateJsonResult SetWorkBenchTemplate(string accessTokenOrAppKey,SetWorkBenchTemplateModel data,int timeOut=Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/agent/set_workbench_template?access_token={0}", accessToken); + return CommonJsonSend.Send(null, url, data,CommonJsonSendType.POST, timeOut: timeOut); + }, accessTokenOrAppKey); + } + /// + /// 获取应用在工作台展示的模版 + /// + /// AccessToken或AppId(推荐使用AppId,需要先注册) + /// 请求参数 + /// 代理请求超时时间(毫秒) + /// + public static GetWorkBenchTemplateJsonResult GetWorkBenchTemplate(string accessTokenOrAppKey, GetWorkBenchTemplateModel data, int timeOut=Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/agent/get_workbench_template?access_token={0}", accessToken); + return CommonJsonSend.Send(accessToken, url, data, CommonJsonSendType.POST, timeOut: timeOut); + }, accessTokenOrAppKey); + } + /// + /// 设置应用在用户工作台展示的数据 + /// + /// AccessToken或AppId(推荐使用AppId,需要先注册) + /// 请求参数 + /// 代理请求超时时间(毫秒) + /// + public static WorkJsonResult SetWorkBenchData(string accessTokenOrAppKey,SetWorkBenchDataModel data,int timeOut=Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/agent/set_workbench_data?access_token={0}", accessToken); + return CommonJsonSend.Send(accessToken, url, data, CommonJsonSendType.POST, timeOut: timeOut); + }, accessTokenOrAppKey); + } + #endregion + + #region 异步方法 + /// + /// 【异步方法】指定应用自定义模版类型 + /// + /// AccessToken或AppId(推荐使用AppId,需要先注册) + /// 请求参数 + /// 代理请求超时时间(毫秒) + /// + public static async Task SetWorkBenchTemplateAsync(string accessTokenOrAppKey, SetWorkBenchTemplateModel data, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/agent/set_workbench_template?access_token={0}", accessToken); + return await CommonJsonSend.SendAsync(accessToken, url, data, CommonJsonSendType.POST, timeOut: timeOut); + }, accessTokenOrAppKey); + } + /// + /// 【异步方法】获取应用在工作台展示的模版 + /// + /// AccessToken或AppId(推荐使用AppId,需要先注册) + /// 请求参数 + /// 代理请求超时时间(毫秒) + /// + public static async Task GetWorkBenchTemplateAsync(string accessTokenOrAppKey, int agentid, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/agent/get_workbench_template?access_token={0}", accessToken); + var data = new + { + agentid, + }; + return await CommonJsonSend.SendAsync(accessToken, url, data, CommonJsonSendType.GET, timeOut: timeOut); + }, accessTokenOrAppKey); + } + /// + /// 【异步方法】设置应用在用户工作台展示的数据 + /// + /// AccessToken或AppId(推荐使用AppId,需要先注册) + /// 请求参数 + /// 代理请求超时时间(毫秒) + /// + public static async Task SetWorkBenchDataAsync(string accessTokenOrAppKey, SetWorkBenchDataModel data, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/agent/set_workbench_data?access_token={0}", accessToken); + return await CommonJsonSend.SendAsync(accessToken, url, data, CommonJsonSendType.POST, timeOut: timeOut); + }, accessTokenOrAppKey); + } + #endregion + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateJsonResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateJsonResult.cs new file mode 100644 index 0000000000..484ffa5d5c --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateJsonResult.cs @@ -0,0 +1,41 @@ +using Senparc.Weixin.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + public class GetWorkBenchTemplateJsonResult : WorkJsonResult + { + /// + /// 模版类型,目前支持的自定义类型包括 "keydata"、 "image"、 "list"、 "webview" 。若设置的type为 "normal",则相当于从自定义模式切换为普通宫格或者列表展示模式 + /// + public string type { get; set; } + /// + /// 应用id + /// + public int agentid { get; set; } + /// + /// 若type指定为 "keydata",且需要设置企业级别默认数据,则需要设置关键数据型模版数据,数据结构参考“关键数据型” + /// + public WorkBenchKeyDataModel keydata { get; set; } + /// + /// 若type指定为 "image",且需要设置企业级别默认数据,则需要设置图片型模版数据,数据结构参考“图片型” + /// + public WorkBenchImageModel image { get; set; } + /// + /// 若type指定为 "list",且需要设置企业级别默认数据,则需要设置列表型模版数据,数据结构参考“列表型” + /// + public WorkBenchListModel list { get; set; } + /// + /// 若type指定为 "webview",且需要设置企业级别默认数据,则需要设置webview型模版数据,数据结构参考“webview型” + /// + public WorkBenchWebViewModel webview { get; set; } + /// + /// 是否覆盖用户工作台的数据。设置为true的时候,会覆盖企业所有用户当前设置的数据。若设置为false,则不会覆盖用户当前设置的所有数据。默认为false + /// + public bool replace_useer_data { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateModel.cs new file mode 100644 index 0000000000..083ca681c4 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/GetWorkBenchTemplateModel.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 获取工作台展示模板参数 + /// + public class GetWorkBenchTemplateModel + { + /// + /// 应用id + /// + public int agentid { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchDataModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchDataModel.cs new file mode 100644 index 0000000000..53bd68729b --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchDataModel.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 应用在用户工作台展示的数据参数 + /// + public class SetWorkBenchDataModel:SetWorkBenchTemplateModel + { + /// + /// 需要设置的用户的userid + /// + public string userid { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateJsonResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateJsonResult.cs new file mode 100644 index 0000000000..1c0056ebec --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateJsonResult.cs @@ -0,0 +1,16 @@ +using Senparc.Weixin.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 指定应用自定义模版返回参数 + /// + public class SetWorkBenchTemplateJsonResult:WorkJsonResult + { + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateModel.cs new file mode 100644 index 0000000000..725eae1001 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/SetWorkBenchTemplateModel.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 指定应用自定义模版类型 + /// + public class SetWorkBenchTemplateModel + { + /// + /// 模版类型,目前支持的自定义类型包括 "keydata"、 "image"、 "list"、 "webview" 。若设置的type为 "normal",则相当于从自定义模式切换为普通宫格或者列表展示模式 + /// + public string type { get; set; } + /// + /// 应用id + /// + public int agentid { get; set; } + /// + /// 若type指定为 "keydata",且需要设置企业级别默认数据,则需要设置关键数据型模版数据,数据结构参考“关键数据型” + /// + public WorkBenchKeyDataModel keydata { get; set; } + /// + /// 若type指定为 "image",且需要设置企业级别默认数据,则需要设置图片型模版数据,数据结构参考“图片型” + /// + public WorkBenchImageModel image { get; set; } + /// + /// 若type指定为 "list",且需要设置企业级别默认数据,则需要设置列表型模版数据,数据结构参考“列表型” + /// + public WorkBenchListModel list { get; set; } + /// + /// 若type指定为 "webview",且需要设置企业级别默认数据,则需要设置webview型模版数据,数据结构参考“webview型” + /// + public WorkBenchWebViewModel webview { get; set; } + /// + /// 是否覆盖用户工作台的数据。设置为true的时候,会覆盖企业所有用户当前设置的数据。若设置为false,则不会覆盖用户当前设置的所有数据。默认为false + /// + public bool replace_user_data { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchImageModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchImageModel.cs new file mode 100644 index 0000000000..92bdef27f9 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchImageModel.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 图片型参数 type为"image" + /// + public class WorkBenchImageModel + { + /// + /// 图片url。图片的最佳比例为3.35:1 + /// + public string url { get; set; } + /// + /// 点击跳转url。若不填且应用设置了主页url,则跳转到主页url,否则跳到应用会话窗口 + /// + public string jump_url { get; set; } + /// + /// 若应用为小程序类型,该字段填小程序pagepath,若未设置,跳到小程序主页 + /// + public string pagepath { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchKeyDataModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchKeyDataModel.cs new file mode 100644 index 0000000000..466a9f7a8c --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchKeyDataModel.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 关键数据型参数,type为"keydata" + /// + public class WorkBenchKeyDataModel + { + /// + /// 关键数据型数组,不超过4个 + /// + public List items { get; set; } + } + public class WorkBenchKeyDataItemModel + { + /// + /// 关键数据名称,需要设置在模版中 + /// + public string key { get; set; } + /// + /// 关键数据 + /// + public string data { get; set; } + /// + /// 点击跳转url,若不填且应用设置了主页url,则跳转到主页url,否则跳到应用会话窗口 + /// + public string jump_url { get; set; } + /// + /// 若应用为小程序类型,该字段填小程序pagepath,若未设置,跳到小程序主页 + /// + public string pagepath { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchListModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchListModel.cs new file mode 100644 index 0000000000..6379b15b8a --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchListModel.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// 列表型数组,不超过3个,type类型为"list" + /// + public class WorkBenchListModel + { + public List items = new List(); + } + public class WorkBenchListItemModel + { + /// + /// 列表显示文字,不超过128个字节 + /// + public string title { get; set; } + /// + /// 点击跳转url,若不填且应用设置了主页url,则跳转到主页url,否则跳到应用会话窗口 + /// + public string jump_url { get; set; } + /// + /// 若应用为小程序类型,该字段填小程序pagepath,若未设置,跳到小程序主页 + /// + public string pagepath { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchWebViewModel.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchWebViewModel.cs new file mode 100644 index 0000000000..010f37f415 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/WorkBench/WorkBenchJson/WorkBenchWebViewModel.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.AdvancedAPIs.WorkBench.WorkBenchJson +{ + /// + /// webview型参数,type为"webview" + /// + public class WorkBenchWebViewModel + { + /// + /// 渲染展示的url + /// + public string url { get; set; } + /// + /// 点击跳转url。若不填且应用设置了主页url,则跳转到主页url,否则跳到应用会话窗口。如果enable_webview_click为true,则jump_url失效,点击不再跳转。 + /// + public string jump_url { get; set; } + /// + /// 若应用为小程序类型,该字段填小程序pagepath,若未设置,跳到小程序主页 + /// + public string pagepath { get; set; } + /// + /// 高度。可以有两种选择:single_row与double_row。当为single_row时,高度与关键数据型一致,当为double_row时,高度固定为170px。默认值为double_row + /// + public string height { get; set; } + /// + /// 是否要隐藏展示了应用名称的标题部分,默认值为false + /// + public bool hide_title { get; set; } + /// + /// 是否开启webview内的链接跳转能力,默认值为false。注意:开启之后,会使jump_url失效。链接跳转仅支持以下schema方式:wxwork://openurl?url=xxxx,注意url需要进行编码。 + /// 参考示例:今日要闻 + /// + public bool enable_webview_click { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_Switch_WorkBench_Mode.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_Switch_WorkBench_Mode.cs new file mode 100644 index 0000000000..93835fb040 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_Switch_WorkBench_Mode.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.Entities.Request.Event +{ + public class RequestMessageEvent_Switch_WorkBench_Mode:RequestMessageEventBase,IRequestMessageEventBase + { + public override Work.Event Event + { + get { return Work.Event.switch_workbench_mode; } + } + /// + /// 1表示开启工作台自定义模式,0表示关闭工作台自定义模式 + /// + public int Mode { get; set; } + /// + /// 企业应用的id,整型。可在应用的设置页面查看 + /// + public int AgentID { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs index 8626f479f6..55fce6fcf9 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs @@ -181,6 +181,10 @@ public enum Event /// 直播回调事件 /// LIVING_STATUS_CHANGE, + /// + /// 切换工作台自定义模式推送 + /// + switch_workbench_mode, #region 审批事件 /// diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs index 016b56710b..07d0e0cb5c 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs @@ -673,6 +673,15 @@ public virtual async Task OnEvent_Living_Status_Change { return await Task.Run(() => OnEvent_Living_Status_ChangeRequest(requestMessage)).ConfigureAwait(false); } + /// + /// 修改设置工作台自定义开关事件推送 + /// + /// + /// + public virtual async Task OnEvent_SwitchWorkbenchModel(RequestMessageEvent_Switch_WorkBench_Mode requestMessage) + { + return await Task.Run(()=>OnEvent_SwitchWorkBenchMode(requestMessage)).ConfigureAwait (false); + } #region 审批事件 diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs index 171ae8fe05..f503fd28d2 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs @@ -798,7 +798,15 @@ public virtual IWorkResponseMessageBase OnEvent_Living_Status_ChangeRequest( { return DefaultResponseMessage(requestMessage); } - + /// + /// 修改设置工作台自定义开关事件推送 + /// + /// + /// + public virtual IWorkResponseMessageBase OnEvent_SwitchWorkBenchMode(RequestMessageEvent_Switch_WorkBench_Mode requestMessage) + { + return DefaultResponseMessage(requestMessage); + } #region 审批事件 /// /// 系统审批申请状态变化回调通知 diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net6.csproj b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net6.csproj index db2569229e..5834128bc8 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net6.csproj +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net6.csproj @@ -236,9 +236,7 @@ - - - + diff --git a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net6.csproj b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net6.csproj index 8b8d6b2854..0b3f6ec3e5 100644 --- a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net6.csproj +++ b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net6.csproj @@ -216,7 +216,6 @@ - From f541532c72ffc2564742d8b0d47e0bf2771bb308 Mon Sep 17 00:00:00 2001 From: Jeffrey Su Date: Mon, 5 Jun 2023 23:29:40 +0800 Subject: [PATCH 4/6] Update readme.md --- readme.md | 74 +++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/readme.md b/readme.md index 3ff01d0446..490a7a81c6 100644 --- a/readme.md +++ b/readme.md @@ -20,7 +20,7 @@ Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最 如果你喜欢并希望我们继续优化这个项目,请给我们一个 ★Star :) -## 公告 +## 🔔 公告 > ⚡ Sample 已支持 .NET 7.0(向下兼容),[点击这里查看](/Samples/All/net7-mvc)!
> 🔒 [微信支付 V3 模块](https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3)已上线!
@@ -29,7 +29,7 @@ Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最 -## Start:分模块独立文档 +## 🌟 Start:分模块独立文档 模块 | 地址 ----|---- @@ -41,7 +41,7 @@ Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最 > 说明:所有模块的配置、注册、接口调用方法均一致,只要学会其中一个模块开发,就可以举一反三,以下以公众号为例。 -## Hello World :用 3 句代码开启你的微信开发之旅! +## 🚀 Hello World :用 3 句代码开启你的微信开发之旅! > 说明:
> 下述源码位于 [`/Samples/MP/`](/Samples/MP/) 文件夹,以微信公众号为例。学会公众号就可以举一反三使用其他模块,基本用法一致(小程序、企业微信、微信支付等)。
@@ -159,24 +159,24 @@ app.UseMessageHandlerForMp("/WeixinAsync", -## 更多介绍索引 - -* [各模块类库](#各模块类库) -* [源码项目文件夹说明(src文件夹下)](#源码项目文件夹说明src文件夹下) -* [Samples 文件夹说明(Samples文件夹下)](#samples-文件夹说明samples文件夹下) -* [资源](#资源) -* [:book: Senparc 官方图书教程](#senparc-官方图书教程) -* [:computer: Senparc 官方视频教程](#senparc-官方视频教程) -* [贡献代码](#贡献代码) -* [关注测试账号(SenparcRobot)](#关注测试账号体验功能senparcrobot) -* [如何使用 .NET Core 开发](#如何使用-net-core-开发) -* [使用Nuget安装到项目中](#使用nuget安装到项目中) -* [如何部署](#如何部署) -* [各重要分支说明](#各重要分支说明) -* [感谢贡献者](#感谢贡献者) -* [捐助](#捐助) -* [Star 数量统计](#star-数量统计) -* [License](#license) +## 📇 更多介绍索引 + +* [各模块类库](#-各模块类库) +* [源码项目文件夹说明(src文件夹下)](#-源码项目文件夹说明src文件夹下) +* [Samples 文件夹说明(Samples文件夹下)](#%EF%B8%8F-samples-文件夹说明samples文件夹下) +* [资源](#-资源) +* [:book: Senparc 官方图书教程](#-senparc-官方图书教程) +* [:computer: Senparc 官方视频教程](#-senparc-官方视频教程) +* [贡献代码](#-贡献代码) +* [关注测试账号(SenparcRobot)](#-关注测试账号体验功能senparcrobot) +* [如何使用 .NET Core 开发](#-如何使用-net-core-开发) +* [使用Nuget安装到项目中](#%EF%B8%8F-使用nuget安装到项目中) +* [如何部署](#-如何部署) +* [各重要分支说明](#-各重要分支说明) +* [感谢贡献者](#-感谢贡献者) +* [捐助](#-捐助) +* [Star 数量统计](#-star-数量统计) +* [License](#-license) 本库包含了 .NET Framework/.NET Standard 2.0/.NET Core/.NET 6 多个版本的源代码(核心逻辑完全一致): @@ -184,7 +184,7 @@ app.UseMessageHandlerForMp("/WeixinAsync", * 使用 Visual Studio 2019 或更高版本打开 .NET Framework Demo:[Senparc.Weixin.MP.Sample.Net45.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/Developer/Samples/All/net45-mvc/)(不包含源码,仅引用类库) * 使用 Visual Studio 2019 或更高版本打开命令行 Console Demo(.NET Core):[Senparc.Weixin.MP.Sample.Consoles.vs2019.sln](https://github.com/JeffreySu/WeiXinMPSDK/tree/Developer/Samples/All/console) -## 各模块类库 +## 🏹 各模块类库 | # | 模块功能 | DLL | Nuget | 支持 .NET 版本 |---|----------------------------------------------------|-------------------------------------------------|---------------------------------------|-------------------------------------- @@ -289,7 +289,7 @@ app.UseMessageHandlerForMp("/WeixinAsync", > 1.目前官方的 API 都已完美集成,除非有特殊说明,所有升级都会尽量确保向下兼容,所以已经发布的版本请放心使用或直接升级(覆盖)最新的 dll,建议使用 [Nuget](https://www.nuget.org/) 进行更新。
> 2. 您也可以自行修改并编译代码,打开 [Senparc.Weixin.Sample.Net6.sln](/Samples/All/net6-mvc/) 或 [Senparc.Weixin.Sample.Net7.sln](/Samples/All/net7-mvc/) 解决方案即可看到所有源码。当编译模式为 `Release` 时,将自动生成本地 Nuget 包(默认生成到 `/src/BuildOutPut/` 文件夹下)。 -## 源码项目文件夹说明(src文件夹下) +## 💾 源码项目文件夹说明(src文件夹下)
展开 @@ -314,7 +314,7 @@ app.UseMessageHandlerForMp("/WeixinAsync", [进入文件夹](/src/) -## Samples 文件夹说明(Samples文件夹下) +## 🖥️ Samples 文件夹说明(Samples文件夹下) Senparc.Weixin SDK 所有的模块的用法都保持了高度的一致,包括配置过程、AccessToken 管理、消息处理、服务消息、接口调用,等等。您只需参考任意一个模块的用法(推荐从`公众号`或`小程序`开始),就可以举一反三使用其他模块。 @@ -351,7 +351,7 @@ Web 版: @@ -399,7 +399,7 @@ Web 版: 目前视频已经在网易云课堂上线,课程制作精良、内容充实,被选为“A”级课程,[【观看视频】](https://book.weixin.senparc.com/book/videolinknetease?code=github-homepage),[【查看课程代码及课件】](https://github.com/JeffreySu/WechatVideoCourse)。 -### 关注测试账号体验功能(SenparcRobot): +## 🧪 关注测试账号体验功能(SenparcRobot): |盛派网络小助手公众号|盛派网络小助手小程序|BookHelper| |--|--|--| | | | | -## 贡献代码 +## ✋ 贡献代码 > 如果需要使用或修改此项目的源代码,建议先Fork。也欢迎将您修改的通用版本Pull Request过来。 @@ -563,7 +563,7 @@ namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler --> -## 如何使用 .NET Core 开发 +## 👩‍🏫 如何使用 .NET Core 开发 > 当前分支包含了 .NET Framework 3.5 / 4.0 / 4.5 / 4.6.2 及 .NET Core 2.0 + 2.1 / .NET 5.0 + 6.0 的全版本代码(已经不更新的版本请查看 [release](https://github.com/JeffreySu/WeiXinMPSDK/releases) 快照)。
> 其中 .NET Framework 的 Demo 位于 `/src/Samples/All/net45-mvc` 目录下,
@@ -572,11 +572,11 @@ namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler > 1. 以上 Sample 中,`net7-mvc` 中的 Sample 直接引用了每个模块的源码,使用 `Release` 编译后可生成兼容不同版本的 Senaprc.Weixin SDK 库。
> 2. 您也可以使用 .NET 6.0(向下兼容 .NET 5.0 及 .NET Core 3.1 等更低版本) 的 Demo 位于 `/Samples/All/net6-mvc` 目录下。 -## 使用Nuget安装到项目中 +## ↕️ 使用Nuget安装到项目中 各个模块的 Nuget 安装方式:《[使用 Nuget 将 SDK 安装到项目中](https://github.com/JeffreySu/WeiXinMPSDK/wiki/%E4%BD%BF%E7%94%A8-Nuget-%E5%B0%86-SDK-%E5%AE%89%E8%A3%85%E5%88%B0%E9%A1%B9%E7%9B%AE%E4%B8%AD)》 -## 如何部署 +## 🏬 如何部署 ### 1) 部署到 Azure App Service @@ -664,7 +664,7 @@ namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler 欢迎开发者对未完成或需要补充的模块进行 Pull Request! --> -## 各重要分支说明 +## 🍴 各重要分支说明 |  分支   |     说明         @@ -678,11 +678,11 @@ namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler | Developer-Senparc.SDK | 此分支仅用于 Senparc 团队内部测试,可忽略。 -## 感谢贡献者 +## 🍟 感谢贡献者 感谢为此项目做出贡献的开发者,你们不光完善了这个项目,也为中国开源事业出了一份力,感谢你们!名单[点击这里](https://github.com/JeffreySu/WeiXinMPSDK/blob/master/Contributors.md)查看。 -## 捐助 +## 💰 捐助 如果这个项目对您有用,我们欢迎各方任何形式的捐助,也包括参与到项目代码更新或意见反馈中来。谢谢! @@ -690,11 +690,11 @@ namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler [![donate](http://sdk.weixin.senparc.com/Images/T1nAXdXb0jXXXXXXXX_s.png)](http://sdk.weixin.senparc.com#donate) -## Star 数量统计 +## ⭐ Star 数量统计 [![starcharts stargazers over time](https://starchart.cc/JeffreySu/WeiXinMPSDK.svg)](https://starchart.cc/JeffreySu/WeiXinMPSDK) -## License +## 📎 License Apache License Version 2.0 From 4a83be31d26fd70f9aa896ae040a618ac519a50c Mon Sep 17 00:00:00 2001 From: Jeffrey Su Date: Mon, 5 Jun 2023 23:36:32 +0800 Subject: [PATCH 5/6] Update readme.md --- readme.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/readme.md b/readme.md index 490a7a81c6..06370805bb 100644 --- a/readme.md +++ b/readme.md @@ -161,22 +161,22 @@ app.UseMessageHandlerForMp("/WeixinAsync", ## 📇 更多介绍索引 -* [各模块类库](#-各模块类库) -* [源码项目文件夹说明(src文件夹下)](#-源码项目文件夹说明src文件夹下) -* [Samples 文件夹说明(Samples文件夹下)](#%EF%B8%8F-samples-文件夹说明samples文件夹下) -* [资源](#-资源) +* [🏹 各模块类库](#-各模块类库) +* [💾 源码项目文件夹说明(src文件夹下)](#-源码项目文件夹说明src文件夹下) +* [🖥️ Samples 文件夹说明(Samples文件夹下)](#%EF%B8%8F-samples-文件夹说明samples文件夹下) +* [🎨 资源](#-资源) * [:book: Senparc 官方图书教程](#-senparc-官方图书教程) * [:computer: Senparc 官方视频教程](#-senparc-官方视频教程) -* [贡献代码](#-贡献代码) -* [关注测试账号(SenparcRobot)](#-关注测试账号体验功能senparcrobot) -* [如何使用 .NET Core 开发](#-如何使用-net-core-开发) -* [使用Nuget安装到项目中](#%EF%B8%8F-使用nuget安装到项目中) -* [如何部署](#-如何部署) -* [各重要分支说明](#-各重要分支说明) -* [感谢贡献者](#-感谢贡献者) -* [捐助](#-捐助) -* [Star 数量统计](#-star-数量统计) -* [License](#-license) +* [🧪 关注测试账号(SenparcRobot)](#-关注测试账号体验功能senparcrobot) +* [✋ 贡献代码](#-贡献代码) +* [👩‍🏫 如何使用 .NET Core 开发](#-如何使用-net-core-开发) +* [↕️ 使用 Nuget 安装到项目中](#%EF%B8%8F-使用-nuget安装到项目中) +* [🏬 如何部署](#-如何部署) +* [🍴 各重要分支说明](#-各重要分支说明) +* [🍟 感谢贡献者](#-感谢贡献者) +* [💰 捐助](#-捐助) +* [⭐ Star 数量统计](#-star-数量统计) +* [📎 License](#-license) 本库包含了 .NET Framework/.NET Standard 2.0/.NET Core/.NET 6 多个版本的源代码(核心逻辑完全一致): From b45bd3c1ef7349ac7b828c2e93093775a7c60b76 Mon Sep 17 00:00:00 2001 From: JeffreySu Date: Mon, 5 Jun 2023 23:42:18 +0800 Subject: [PATCH 6/6] =?UTF-8?q?Work=20v3.15.19=20=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=B7=A5=E4=BD=9C=E5=8F=B0=E6=8E=A5=E5=8F=A3=EF=BC=88?= =?UTF-8?q?PR=20#2840=EF=BC=89=20=E6=84=9F=E8=B0=A2=20@NiuHongBo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Senparc.Weixin.Work/Senparc.Weixin.Work.net7.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net7.csproj b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net7.csproj index df533d3e0d..552819684a 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net7.csproj +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net7.csproj @@ -2,7 +2,7 @@ net462;netstandard2.0;netstandard2.1 $(Net35FrameworkPathOverride) - 3.15.18.1 + 3.15.19 10.0 Senparc.Weixin.Work Senparc.Weixin.Work @@ -199,6 +199,7 @@ v3.15.17 添加“邮箱获取 userid”接口 v3.15.17.1 修改 RequestMessageEvent_OpenApprovalChange 中 OpenTemplateId 参数类型为 string v3.15.18.1 GetMomentListLocation.latitude / longitude 设置为 long 类型 (Issue #2823) + v3.15.19 自定义工作台接口(PR #2840) https://github.com/JeffreySu/WeiXinMPSDK False