diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardClick.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardClick.cs deleted file mode 100644 index 71f8a11a6d..0000000000 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardClick.cs +++ /dev/null @@ -1,33 +0,0 @@ -/*---------------------------------------------------------------- - Copyright (C) 2024 Senparc - - 文件名:RequestMessageEvent_TemplateCardClick.cs - 文件功能描述:模板卡片点击回调事件 - - - 创建标识:LofyLiu - 20240315 -----------------------------------------------------------------*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Senparc.Weixin.Work.Entities -{ - public class RequestMessageEvent_TemplateCardClick : RequestMessageEventBase, IRequestMessageEventBase, IRequestMessageEventKey - { - /// - /// 事件类型 - /// - public override Event Event - { - get { return Event.TEMPLATE_CARD_CLICK; } - } - - /// - /// 事件KEY值,与自定义菜单接口中KEY值对应 - /// - public string EventKey { get; set; } - } -} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardEvent.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardEvent.cs new file mode 100644 index 0000000000..0da50f7092 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardEvent.cs @@ -0,0 +1,79 @@ +/*---------------------------------------------------------------- + Copyright (C) 2024 Senparc + + 文件名:RequestMessageEvent_TemplateCardEvent.cs + 文件功能描述:企业微信-模板卡片事件推送 + + + 创建标识:IcedMango - 20241114 + +----------------------------------------------------------------*/ + +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace Senparc.Weixin.Work.Entities +{ + /// + /// 企业微信-模板卡片事件推送 + /// + public class RequestMessageEvent_TemplateCardEvent : RequestMessageEventBase, IRequestMessageEventBase, IRequestMessageEventKey + { + /// + /// 事件类型(template_card_event,点击模板卡片按钮) + /// + public override Event Event => Event.TEMPLATE_CARD_EVENT; + + /// + /// 与发送模板卡片消息时指定的按钮btn:key值相同 + /// + public string EventKey { get; set; } + + /// + /// 与发送模板卡片消息时指定的task_id相同 + /// + public string TaskId { get; set; } + + /// + /// 通用模板卡片的类型 + /// + public TemplateCard_CardTypeEnum CardType { get; set; } + + /// + /// 用于调用更新卡片接口的ResponseCode,72小时内有效,且只能使用一次 + /// + public string ResponseCode { get; set; } + + /// + /// + /// + [XmlArray("SelectedItems")] + [XmlArrayItem("SelectedItem")] + public List SelectedItems { get; set; } + } + + /// + /// 通用模板卡片的类型 + /// + public enum TemplateCard_CardTypeEnum + { + text_notice, + news_notice, + button_interaction, + vote_interaction, + multiple_interaction + } + + public class TemplateCard_SelectedItem + { + /// + /// 问题的key值 + /// + [XmlElement("QuestionKey")] + public string QuestionKey { get; set; } + + [XmlArray("OptionIds")] + [XmlArrayItem("OptionId")] + public List OptionIds { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardMenuEvent.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardMenuEvent.cs new file mode 100644 index 0000000000..ddc049ccc3 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TemplateCardMenuEvent.cs @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------- + Copyright (C) 2024 Senparc + + 文件名:RequestMessageEvent_TemplateCardMenuEvent.cs + 文件功能描述:通用模板卡片右上角菜单事件推送 + + + 创建标识:IcedMango - 20241114 + +----------------------------------------------------------------*/ + +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace Senparc.Weixin.Work.Entities +{ + /// + /// 企业微信-模板卡片事件推送 + /// + public class RequestMessageEvent_TemplateCardMenuEvent : RequestMessageEventBase, IRequestMessageEventBase, IRequestMessageEventKey + { + /// + /// 事件类型(template_card_menu_event,通用模板卡片右上角菜单事件推送) + /// + public override Event Event => Event.TEMPLATE_CARD_MENU_EVENT; + + /// + /// 与发送模板卡片消息时指定的按钮btn:key值相同 + /// + public string EventKey { get; set; } + + /// + /// 与发送模板卡片消息时指定的task_id相同 + /// + public string TaskId { get; set; } + + /// + /// 通用模板卡片的类型 + /// + public TemplateCard_CardTypeEnum CardType { get; set; } + + /// + /// 用于调用更新卡片接口的ResponseCode,72小时内有效,且只能使用一次 + /// + public string ResponseCode { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs index ffd8e7e6bf..fdf6cc37a9 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs @@ -60,6 +60,9 @@ GroupTaskSentStatus 枚举 修改标识:LofyLiu - 20240315 修改描述:添加枚举“模板卡片点击回调事件” + + 修改标识: IcedMango - 20241114 + 修改描述: 添加: 通用模板卡片右上角菜单事件推送; 修复不正确的通用模板卡片事件推送类型 ----------------------------------------------------------------*/ using static System.Net.WebRequestMethods; @@ -218,9 +221,14 @@ public enum Event MSGAUDIT_NOTIFY, /// - /// 模板卡片点击回调事件 + /// 模板卡片事件推送 + /// + TEMPLATE_CARD_EVENT, + + /// + /// 通用模板卡片右上角菜单事件 /// - TEMPLATE_CARD_CLICK, + TEMPLATE_CARD_MENU_EVENT, } public enum TencentGender diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageContext/DefaultWorkMessageContext.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageContext/DefaultWorkMessageContext.cs index 76cfe70fbc..89939d0efe 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageContext/DefaultWorkMessageContext.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageContext/DefaultWorkMessageContext.cs @@ -238,8 +238,11 @@ public override IWorkRequestMessageBase GetRequestEntityMappingResult(RequestMsg case "MSGAUDIT_NOTIFY": requestMessage = new RequestMessageEvent_MsgAuditNotify(); break; - case "TEMPLATE_CARD_EVENT": //模板卡片回调事件 - requestMessage = new RequestMessageEvent_TemplateCardClick(); + case "TEMPLATE_CARD_EVENT": // 模板卡片事件推送 + requestMessage = new RequestMessageEvent_TemplateCardEvent(); + break; + case "TEMPLATE_CARD_MENU_EVENT": // 通用模板卡片右上角菜单事件 + requestMessage = new RequestMessageEvent_TemplateCardMenuEvent(); break; default://其他意外类型(也可以选择抛出异常) requestMessage = new RequestMessageEventBase(); 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 010ce52a62..aac49bd451 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 @@ -1,23 +1,26 @@ /*---------------------------------------------------------------- Copyright (C) 2024 Senparc - + 文件名:WorkMessageHandler.cs 文件功能描述:企业号请求的集中处理方法 - - + + 创建标识:Senparc - 20150313 - + 修改标识:ccccccmd - 20220227 修改描述:v3.14.10 添加异步方法 - + 修改标识:Senparc - 20230914 修改描述:v3.16.4 企业微信三方代开发处理事件: 修复 Async 方法循环调用的 Bug - + 修改标识:IcedMango - 20240229 修改描述:添加: 企业微信会话存档-产生会话回调事件 修改标识:LofyLiu - 20240315 修改描述:添加: 模板卡片点击回调事件 + + 修改标识: IcedMango - 20241114 + 修改描述: 添加: 通用模板卡片右上角菜单事件推送; 修复不正确的通用模板卡片事件推送类型 ----------------------------------------------------------------*/ using Senparc.NeuChar.Context; @@ -38,7 +41,6 @@ public abstract partial class WorkMessageHandler { public override async Task BuildResponseMessageAsync(CancellationToken cancellationToken) { - switch (RequestMessage.MsgType) { case RequestMsgType.Unknown: //第三方回调 @@ -53,15 +55,16 @@ public override async Task BuildResponseMessageAsync(CancellationToken cancellat throw new WeixinException("没有找到合适的消息类型。"); } } - break; + break; //以下是普通信息 case RequestMsgType.Text: { var requestMessage = RequestMessage as RequestMessageText; + ResponseMessage = await OnTextOrEventRequestAsync(requestMessage) ?? await OnTextRequestAsync(requestMessage); } - break; + break; case RequestMsgType.Location: ResponseMessage = await OnLocationRequestAsync(RequestMessage as RequestMessageLocation); break; @@ -83,10 +86,11 @@ public override async Task BuildResponseMessageAsync(CancellationToken cancellat case RequestMsgType.Event: { var requestMessageText = (RequestMessage as IRequestMessageEventBase).ConvertToRequestMessageText(); + ResponseMessage = await OnTextOrEventRequestAsync(requestMessageText) ?? await OnEventRequestAsync(RequestMessage as IRequestMessageEventBase); } - break; + break; default: throw new UnknownRequestMsgTypeException("未知的MsgType请求类型", null); } @@ -182,6 +186,7 @@ public virtual async Task OnEventRequestAsync(IRequest { var strongRequestMessage = RequestMessage as IRequestMessageEventBase; IWorkResponseMessageBase responseMessage = null; + switch (strongRequestMessage.Event) { case Event.CLICK: //菜单点击 @@ -192,7 +197,7 @@ public virtual async Task OnEventRequestAsync(IRequest break; case Event.PIC_PHOTO_OR_ALBUM: //弹出拍照或者相册发图 responseMessage = await OnEvent_PicPhotoOrAlbumRequestAsync( - RequestMessage as RequestMessageEvent_Pic_Photo_Or_Album); + RequestMessage as RequestMessageEvent_Pic_Photo_Or_Album); break; case Event.SCANCODE_PUSH: //扫码推事件 responseMessage = @@ -236,6 +241,7 @@ public virtual async Task OnEventRequestAsync(IRequest break; case Event.change_contact: var ccRequestMessage = RequestMessage as IRequestMessageEvent_Change_Contact_Base; + switch (ccRequestMessage.ChangeType) { case ContactChangeType.create_user: @@ -281,6 +287,7 @@ public virtual async Task OnEventRequestAsync(IRequest //外部联系人事件相关 case Event.CHANGE_EXTERNAL_CONTACT: var cecRequestMessage = RequestMessage as IRequestMessageEvent_Change_ExternalContact_Base; + switch (cecRequestMessage.ChangeType) { case ExternalContactChangeType.add_external_contact: @@ -319,6 +326,7 @@ public virtual async Task OnEventRequestAsync(IRequest break; case Event.CHANGE_EXTERNAL_CHAT: //客户群变更事件 var cechat = RequestMessage as RequestMessageEvent_Change_External_Chat_Base; + switch (cechat.ChangeType) { case ExternalChatChangeType.create: @@ -344,6 +352,7 @@ public virtual async Task OnEventRequestAsync(IRequest break; case Event.CHANGE_EXTERNAL_TAG: //企业客户标签变更事件 var tag = RequestMessage as RequestMessageEvent_Change_External_Tag_Base; + switch (tag.ChangeType) { case ExternalTagChangeType.create: @@ -387,16 +396,21 @@ public virtual async Task OnEventRequestAsync(IRequest OnEvent_Open_Approval_Change_Status_ChangeRequestAsync( RequestMessage as RequestMessageEvent_OpenApprovalChange); break; - + case Event.MSGAUDIT_NOTIFY: //企业微信会话存档-产生会话回调事件 responseMessage = await OnEvent_MsgAuditNotifyRequestAsync( RequestMessage as RequestMessageEvent_MsgAuditNotify); break; - case Event.TEMPLATE_CARD_CLICK://模板卡片点击回调事件 - responseMessage = await - OnEvent_TemplateCardEventClickRequestAsync( - RequestMessage as RequestMessageEvent_TemplateCardClick); + case Event.TEMPLATE_CARD_EVENT: // 企业微信-模板卡片事件推送 + responseMessage = await + OnEvent_TemplateCardEventRequestAsync( + RequestMessage as RequestMessageEvent_TemplateCardEvent); + break; + case Event.TEMPLATE_CARD_MENU_EVENT: // 通用模板卡片右上角菜单事件推送 + responseMessage = await + OnEvent_TemplateCardMenuEventRequestAsync( + RequestMessage as RequestMessageEvent_TemplateCardMenuEvent); break; default: throw new UnknownRequestMsgTypeException("未知的Event下属请求信息", null); @@ -718,6 +732,7 @@ public virtual async Task OnEvent_ChangeExternalChatDi } #region 企业客户标签事件 + /// /// 企业客户标签-创建 /// @@ -762,6 +777,7 @@ public virtual async Task OnEvent_ChangeExternalTagShu { return await Task.Run(() => OnEvent_ChangeExternalTagShuffleRequest(requestMessage)).ConfigureAwait(false); } + #endregion public virtual async Task OnEvent_Living_Status_ChangeRequestAsync( @@ -769,12 +785,14 @@ 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) + public virtual async Task OnEvent_SwitchWorkbenchModel( + RequestMessageEvent_Switch_WorkBench_Mode requestMessage) { return await Task.Run(() => OnEvent_SwitchWorkBenchMode(requestMessage)).ConfigureAwait(false); } @@ -806,26 +824,40 @@ public virtual async Task OnEvent_Open_Approval_Change } #endregion - + /// /// 企业微信会话存档-产生会话回调事件 /// /// /// - public virtual async Task OnEvent_MsgAuditNotifyRequestAsync(RequestMessageEvent_MsgAuditNotify requestMessage) + public virtual async Task OnEvent_MsgAuditNotifyRequestAsync( + RequestMessageEvent_MsgAuditNotify requestMessage) { return await Task.Run(() => OnEvent_MsgAuditNotifyRequest(requestMessage)).ConfigureAwait(false); } /// - /// 模板卡片点击回调事件 + /// 企业微信-模板卡片事件推送 + /// + /// + /// + public virtual async Task OnEvent_TemplateCardEventRequestAsync( + RequestMessageEvent_TemplateCardEvent requestMessage) + { + return await Task.Run(() => OnEvent_TemplateCardEventRequest(requestMessage)).ConfigureAwait(false); + } + + /// + /// 通用模板卡片右上角菜单事件推送 /// /// /// - public virtual async Task OnEvent_TemplateCardEventClickRequestAsync(RequestMessageEvent_TemplateCardClick requestMessage) + public virtual async Task OnEvent_TemplateCardMenuEventRequestAsync( + RequestMessageEvent_TemplateCardMenuEvent requestMessage) { - return await Task.Run(() => OnEvent_TemplateCardEventClickRequest(requestMessage)).ConfigureAwait(false); + return await Task.Run(() => OnEvent_TemplateCardMenuEventRequest(requestMessage)).ConfigureAwait(false); } + #endregion //Event 下属分类 #endregion @@ -849,10 +881,12 @@ private Task OnThirdPartyEventAsync(IThirdPartyInfoBase thirdPartyInfo) case ThirdPartyInfo.REGISTER_CORP: return OnThirdPartyEvent_Register_CorpAsync((RequestMessager_Register_Corp)thirdPartyInfo); case ThirdPartyInfo.RESET_PERMANENT_CODE: - return OnThirdPartEvent_Reset_Permanent_CodeAsync((RequestMessageInfo_Reset_Permanent_Code)thirdPartyInfo); + return OnThirdPartEvent_Reset_Permanent_CodeAsync( + (RequestMessageInfo_Reset_Permanent_Code)thirdPartyInfo); case ThirdPartyInfo.CHANGE_EXTERNAL_CONTACT: { var cecRequestMessage = RequestMessage as IRequestMessageEvent_Change_ExternalContact_Base; + switch (cecRequestMessage.ChangeType) { case ExternalContactChangeType.add_external_contact: @@ -926,7 +960,8 @@ protected virtual async Task OnThirdPartyEvent_Suite_TicketAsync( return await Task.Run(() => OnThirdPartyEvent_Suite_Ticket(thirdPartyInfo)).ConfigureAwait(false); } - protected virtual async Task OnThirdPartEvent_Reset_Permanent_CodeAsync(RequestMessageInfo_Reset_Permanent_Code thirdPartyInfo) + protected virtual async Task OnThirdPartEvent_Reset_Permanent_CodeAsync( + RequestMessageInfo_Reset_Permanent_Code thirdPartyInfo) { return await Task.Run(() => OnThirdPartEvent_ResetPermanentCode(thirdPartyInfo)).ConfigureAwait(false); } 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 7df6acf9aa..61b3e9654f 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs @@ -74,6 +74,9 @@ OnThirdPartyEvent_Contact_Sync 改名为 OnThirdPartyEvent_Change_Contact() 修改标识:LofyLiu - 20240315 修改描述:添加: 模板卡片点击回调事件 + + 修改标识: IcedMango - 20241114 + 修改描述: 添加: 通用模板卡片右上角菜单事件推送; 修复不正确的通用模板卡片事件推送类型 ----------------------------------------------------------------*/ using System; @@ -901,11 +904,21 @@ public virtual IWorkResponseMessageBase OnEvent_MsgAuditNotifyRequest(RequestMes } /// - /// 模板卡片点击回调事件 + /// 模板卡片事件推送 + /// + /// + /// + public virtual IWorkResponseMessageBase OnEvent_TemplateCardEventRequest(RequestMessageEvent_TemplateCardEvent requestMessage) + { + return DefaultResponseMessage(requestMessage); + } + + /// + /// 通用模板卡片右上角菜单事件推送 /// /// /// - public virtual IWorkResponseMessageBase OnEvent_TemplateCardEventClickRequest(RequestMessageEvent_TemplateCardClick requestMessage) + public virtual IWorkResponseMessageBase OnEvent_TemplateCardMenuEventRequest(RequestMessageEvent_TemplateCardMenuEvent requestMessage) { return DefaultResponseMessage(requestMessage); } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net8.csproj b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net8.csproj index c0ae7ccd39..68e7e86348 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net8.csproj +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.net8.csproj @@ -1,28 +1,28 @@ - - net462;netstandard2.0;netstandard2.1 - 3.23.3 - 10.0 - Senparc.Weixin.Work - Senparc.Weixin.Work - true - + + net462;netstandard2.0;netstandard2.1 + 3.24.0 + 10.0 + Senparc.Weixin.Work + Senparc.Weixin.Work + true + 微信 SDK - 企业微信 模块 Senparc.Weixin SDK 开源项目: https://github.com/JeffreySu/WeiXinMPSDK - Senparc Copyright © 2004~2024 - 微信,weixin,公众号,企业微信,WeChat,Senparc,盛派,SDK,C#,JSSDK,微信支付,分布式,小程序,企业号 - Jeffrey Su - Senparc - Apache-2.0 - https://github.com/JeffreySu/WeiXinMPSDK - Senparc.Weixin.Work.dll - 微信 SDK for .NET / C# - https://github.com/JeffreySu/WeiXinMPSDK - icon.jpg - + Senparc Copyright © 2004~2024 + 微信,weixin,公众号,企业微信,WeChat,Senparc,盛派,SDK,C#,JSSDK,微信支付,分布式,小程序,企业号 + Jeffrey Su + Senparc + Apache-2.0 + https://github.com/JeffreySu/WeiXinMPSDK + Senparc.Weixin.Work.dll + 微信 SDK for .NET / C# + https://github.com/JeffreySu/WeiXinMPSDK + icon.jpg + v0.1.0 完成从Senparc.Weixin.Work.dll的初步移植,添加Work(企业微信)中的新接口 v0.2.0 整理类名,MessageHandler跑通 @@ -171,102 +171,103 @@ v3.14.3 修正“批量获取客户详情”接口传入参数 v3.14.6 添加“审批申请状态变化回调通知”接口 v3.14.7 添加“自建应用>审批流程引擎”接口及 Sample - v3.14.8 为 JsApiTicket 提供 IsAgentConfig 参数 - v3.14.10 添加异步方法 - v3.14.11 优化OAuth相关接口 - v3.15.1 修复 LoginCheckResultJson 缺少 open_userid - v3.15.2 添加“用户标签管理”接口 - v3.15.4 添加 MailList.Member 下的 biz_mail 属性 - v3.15.5 调整批量获取客户详情返回值 - v3.15.7 - 1、添加“创建企业群发”接口 - 2、添加“获取企业的全部群发记录”接口 - 3、添加“发送新客户欢迎语”接口 - v3.15.8 支持“发送应用消息”的“模板卡片消息”类型(MassApi.SendTemplateCard() 方法) - v3.15.9 - 1、补充完整“客户联系「联系我」管理”接口 - 2、添加“客户群「加入群聊」管理”接口 - v3.15.13 ThirdParty_AuthCorpInfo 增加 3 个属性:corp_scale、corp_industry、corp_sub_industry - v3.15.15 - 1、添加:重置永久授权码通知枚举:ThirdpartyInfo.RESET_PERMANENT_CODE - 2、丰富 Webhook 接口:SendTemplateCard, SendFile - v3.15.16 - 1、添加应用“消息撤回”(PR #2793) - 2、添加“上下游及互联企业”相关接口、“获取下级/下游企业小程序session”接口(PR #2794) - 3、添加“审批”接口 - 4、添加“客户标签管理Api”接口,添加“任务卡片事件推送”事件(待完善)(PR #2414) - 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) - v3.15.20 增加更新模版卡片消息(PR #2580) - v3.15.21 添加获取子部门ID列表方法,包含同步及异步(PR #2858) - v3.15.22 v3.15.22 JSSDKHelper.GetNoncestr() 弃用 MD5 加密方法 - v3.16.0 MessageHandler 和客服接口支持长文本自动切割后连续发送 - v3.16.4 企业微信三方代开发处理事件: 修复 Async 方法循环调用的 Bug - v3.17.0 成员对外联系 > 客户消息通知处理 - v3.18.1 - 1、Work v3.18.1 新加企业微信企业客户标签回调事件(PR #2948) - 2、修复:ApprovalCreateTemplateRequest.template_names 命名更正为:template_name(Issue #2949) - v3.19.0 企业微信中间件增加:会话存档-产生会话回调事件回调 (PR #2993) - v3.20.0 模板卡片点击回调事件(PR #2997) - [2024-08-06] v3.21.4 更新基础库,包括 Senparc.CO2NET 相关库、Senparc.AI - [2024-08-12] v3.22.2 Work:增加获客链接管理接口 #3060 - [2024-09-29] v3.23.0 更新并同意 BuildingKey 方法,构建一致的 AppKey - - https://github.com/JeffreySu/WeiXinMPSDK - False - - - ..\..\BuildOutPut - $(DefineConstants);RELEASE - - - ..\..\BuildOutPut - $(DefineConstants);RELEASE - ..\..\BuildOutPut\Senparc.Weixin.Work.XML - true - pdbonly - prompt - MinimumRecommendedRules.ruleset - - - ..\..\BuildOutPut\ - ..\..\BuildOutPut\net462\Senparc.Weixin.Work.xml - - - ..\..\BuildOutPut\ - ..\..\BuildOutPut\netstandard2.0\Senparc.Weixin.Work.xml - - - ..\..\BuildOutPut\ - ..\..\BuildOutPut\netstandard2.1\Senparc.Weixin.Work.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - + v3.14.8 为 JsApiTicket 提供 IsAgentConfig 参数 + v3.14.10 添加异步方法 + v3.14.11 优化OAuth相关接口 + v3.15.1 修复 LoginCheckResultJson 缺少 open_userid + v3.15.2 添加“用户标签管理”接口 + v3.15.4 添加 MailList.Member 下的 biz_mail 属性 + v3.15.5 调整批量获取客户详情返回值 + v3.15.7 + 1、添加“创建企业群发”接口 + 2、添加“获取企业的全部群发记录”接口 + 3、添加“发送新客户欢迎语”接口 + v3.15.8 支持“发送应用消息”的“模板卡片消息”类型(MassApi.SendTemplateCard() 方法) + v3.15.9 + 1、补充完整“客户联系「联系我」管理”接口 + 2、添加“客户群「加入群聊」管理”接口 + v3.15.13 ThirdParty_AuthCorpInfo 增加 3 个属性:corp_scale、corp_industry、corp_sub_industry + v3.15.15 + 1、添加:重置永久授权码通知枚举:ThirdpartyInfo.RESET_PERMANENT_CODE + 2、丰富 Webhook 接口:SendTemplateCard, SendFile + v3.15.16 + 1、添加应用“消息撤回”(PR #2793) + 2、添加“上下游及互联企业”相关接口、“获取下级/下游企业小程序session”接口(PR #2794) + 3、添加“审批”接口 + 4、添加“客户标签管理Api”接口,添加“任务卡片事件推送”事件(待完善)(PR #2414) + 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) + v3.15.20 增加更新模版卡片消息(PR #2580) + v3.15.21 添加获取子部门ID列表方法,包含同步及异步(PR #2858) + v3.15.22 v3.15.22 JSSDKHelper.GetNoncestr() 弃用 MD5 加密方法 + v3.16.0 MessageHandler 和客服接口支持长文本自动切割后连续发送 + v3.16.4 企业微信三方代开发处理事件: 修复 Async 方法循环调用的 Bug + v3.17.0 成员对外联系 > 客户消息通知处理 + v3.18.1 + 1、Work v3.18.1 新加企业微信企业客户标签回调事件(PR #2948) + 2、修复:ApprovalCreateTemplateRequest.template_names 命名更正为:template_name(Issue #2949) + v3.19.0 企业微信中间件增加:会话存档-产生会话回调事件回调 (PR #2993) + v3.20.0 模板卡片点击回调事件(PR #2997) + [2024-08-06] v3.21.4 更新基础库,包括 Senparc.CO2NET 相关库、Senparc.AI + [2024-08-12] v3.22.2 Work:增加获客链接管理接口 #3060 + [2024-09-29] v3.23.0 更新并同意 BuildingKey 方法,构建一致的 AppKey + [2024-11-14] v3.24.0 企微回调: 移除不正确的通用模板卡片事件; 增加通用模板卡片事件推送; 增加通用模板卡片右上角菜单事件推送(PR #3096) + + https://github.com/JeffreySu/WeiXinMPSDK + False + + + ..\..\BuildOutPut + $(DefineConstants);RELEASE + + + ..\..\BuildOutPut + $(DefineConstants);RELEASE + ..\..\BuildOutPut\Senparc.Weixin.Work.XML + true + pdbonly + prompt + MinimumRecommendedRules.ruleset + + + ..\..\BuildOutPut\ + ..\..\BuildOutPut\net462\Senparc.Weixin.Work.xml + + + ..\..\BuildOutPut\ + ..\..\BuildOutPut\netstandard2.0\Senparc.Weixin.Work.xml + + + ..\..\BuildOutPut\ + ..\..\BuildOutPut\netstandard2.1\Senparc.Weixin.Work.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeApi.cs b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeApi.cs index f4d7b3002d..764721b595 100644 --- a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeApi.cs +++ b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeApi.cs @@ -6,7 +6,10 @@ 创建标识:Senparc - 20210118 - + + 修改标识:Senparc - 20241114 + 修改描述:v3.22.0 添加 NCF UrlScheme 接口 #3093 感谢 @mojinxun + ----------------------------------------------------------------*/ using Senparc.NeuChar; @@ -56,6 +59,37 @@ public static GenerateSchemeJsonResult GenerateScheme(string accessTokenOrAppId, }, accessTokenOrAppId); } + /// + /// 获取 NFC 的小程序 scheme + /// 该接口用于获取用于 NFC 的小程序 scheme 码,适用于 NFC 拉起小程序的业务场景。目前仅针对国内非个人主体的小程序开放,详见 NFC 标签打开小程序 + /// 详见 + /// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-scheme/generateNFCScheme.html + /// + /// + /// (必填)跳转到的目标小程序信息。 + /// (非必填)生成的scheme码类型,到期失效:true,永久有效:false。 + /// (非必填)到期失效的scheme码的失效时间,为Unix时间戳。生成的到期失效scheme码在该时间前有效。生成到期失效的scheme时必填。 + /// + /// + public static GenerateNFCSchemeJsonResult GenerateNFCScheme(string accessTokenOrAppId, GenerateNFCSchemeJumpWxa jumpWxa = null, string model_id = "", + string sn = null, int timeOut = Config.TIME_OUT) + { + return WxOpenApiHandlerWapper.TryCommonApi(accessToken => + { + string urlFormat = Config.ApiMpHost + "/wxa/generatenfcscheme?access_token={0}"; + + var data = new + { + jump_wxa = jumpWxa, + model_id = model_id, + sn = sn + }; + + return CommonJsonSend.Send(accessToken, urlFormat, data, timeOut: timeOut, + jsonSetting: new CO2NET.Helpers.Serializers.JsonSetting(true)); + }, accessTokenOrAppId); + } + #endregion #region 异步方法 @@ -90,6 +124,37 @@ public static async Task GenerateSchemeAsync(string ac jsonSetting: new CO2NET.Helpers.Serializers.JsonSetting(true)); }, accessTokenOrAppId).ConfigureAwait(false); } + + /// + /// 获取 NFC 的小程序 scheme + /// 该接口用于获取用于 NFC 的小程序 scheme 码,适用于 NFC 拉起小程序的业务场景。目前仅针对国内非个人主体的小程序开放,详见 NFC 标签打开小程序 + /// 详见 + /// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-scheme/generateNFCScheme.html + /// + /// + /// (必填)跳转到的目标小程序信息。 + /// (非必填)生成的scheme码类型,到期失效:true,永久有效:false。 + /// (非必填)到期失效的scheme码的失效时间,为Unix时间戳。生成的到期失效scheme码在该时间前有效。生成到期失效的scheme时必填。 + /// + /// + public static async Task GenerateNFCSchemeAsync(string accessTokenOrAppId, GenerateNFCSchemeJumpWxa jumpWxa = null, string model_id = "", + string sn = null, int timeOut = Config.TIME_OUT) + { + return await WxOpenApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + string urlFormat = Config.ApiMpHost + "/wxa/generatenfcscheme?access_token={0}"; + + var data = new + { + jump_wxa = jumpWxa, + model_id = model_id, + sn = sn + }; + + return CommonJsonSend.Send(accessToken, urlFormat, data, timeOut: timeOut, + jsonSetting: new CO2NET.Helpers.Serializers.JsonSetting(true)); + }, accessTokenOrAppId).ConfigureAwait(false); + } #endregion } } diff --git a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeJson/GenerateNFCSchemeJsonResult.cs b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeJson/GenerateNFCSchemeJsonResult.cs new file mode 100644 index 0000000000..2758b37adf --- /dev/null +++ b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeJson/GenerateNFCSchemeJsonResult.cs @@ -0,0 +1,26 @@ +/*---------------------------------------------------------------- + Copyright (C) 2024 Senparc + + 文件名:GenerateNFCSchemeJsonResult.cs + 文件功能描述:GenerateNFCScheme() 接口返回参数 + + + 创建标识:Senparc - 20241114 + +----------------------------------------------------------------*/ + +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.WxOpen.AdvancedAPIs.UrlScheme +{ + /// + /// GenerateNFCScheme() 接口返回参数 + /// + public class GenerateNFCSchemeJsonResult : WxJsonResult + { + /// + /// 小程序scheme码 + /// + public string openlink { get; set; } + } +} diff --git a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeJson/GenerateNFCSchemeJumpWxa.cs b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeJson/GenerateNFCSchemeJumpWxa.cs new file mode 100644 index 0000000000..10083119f0 --- /dev/null +++ b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/AdvancedAPIs/WxApp/UrlScheme/UrlSchemeJson/GenerateNFCSchemeJumpWxa.cs @@ -0,0 +1,66 @@ +#region Apache License Version 2.0 +/*---------------------------------------------------------------- + +Copyright 2024 Jeffrey Su & 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 + +----------------------------------------------------------------*/ +#endregion Apache License Version 2.0 + +/*---------------------------------------------------------------- + Copyright (C) 2024 Senparc + + 文件名:GenerateNFCSchemeJumpWxa.cs + 文件功能描述:GenerateNFCScheme() 接口中的 jumpWxa 参数 + + 创建标识:Senparc - 20241114 + +----------------------------------------------------------------*/\ + + + +namespace Senparc.Weixin.WxOpen.AdvancedAPIs.UrlScheme +{ + /// + /// GenerateNFCScheme() 接口中的 jumpWxa 参数 + /// + public class GenerateNFCSchemeJumpWxa + { + /// + /// (必填)通过scheme码进入的小程序页面路径,必须是已经发布的小程序存在的页面,不可携带query。path为空时会跳转小程序主页。 + /// + public string path { get; set; } + /// + /// (必填)通过scheme码进入小程序时的query,最大128个字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~ + /// + public string query { get; set; } + /// + /// (选填)默认值"release"。要打开的小程序版本。正式版为"release",体验版为"trial",开发版为"develop",仅在微信外打开时生效。 + /// + public string env_version { get; set; } + + /// + /// GenerateScheme() 接口中的 jumpWxa 参数 + /// + /// + /// + /// + public GenerateNFCSchemeJumpWxa(string path, string query, string env_version = null) + { + this.path = path ?? ""; + this.query = query ?? ""; + this.env_version = env_version ?? "release"; + } + } +} diff --git a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net8.csproj b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net8.csproj index 4cb8b7f33d..06f1ff5607 100644 --- a/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net8.csproj +++ b/src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen.net8.csproj @@ -1,28 +1,28 @@ - - net462;netstandard2.0;netstandard2.1 - 3.21.2 - 9.0 - Senparc.Weixin.WxOpen - Senparc.Weixin.WxOpen - true - + + net462;netstandard2.0;netstandard2.1 + 3.22.0 + 9.0 + Senparc.Weixin.WxOpen + Senparc.Weixin.WxOpen + true + 微信 SDK - 微信小程序 模块 Senparc.Weixin SDK 开源项目: https://github.com/JeffreySu/WeiXinMPSDK - Senparc Copyright © 2004~2024 - 微信,weixin,小程序,wxopen,MiniProgram,公众号,WeChat,Senparc,盛派,SDK,C#,JSSDK,微信支付,分布式 - Jeffrey Su - Senparc - Apache-2.0 - https://github.com/JeffreySu/WeiXinMPSDK - Senparc.Weixin.WxOpen.dll - 微信 SDK for .NET / C# - https://github.com/JeffreySu/WeiXinMPSDK - icon.jpg - + Senparc Copyright © 2004~2024 + 微信,weixin,小程序,wxopen,MiniProgram,公众号,WeChat,Senparc,盛派,SDK,C#,JSSDK,微信支付,分布式 + Jeffrey Su + Senparc + Apache-2.0 + https://github.com/JeffreySu/WeiXinMPSDK + Senparc.Weixin.WxOpen.dll + 微信 SDK for .NET / C# + https://github.com/JeffreySu/WeiXinMPSDK + icon.jpg + v0.1.0 添加基础解决方案,包括模板消息API v0.1.0 添加基础库,已包含模板消息API @@ -150,91 +150,92 @@ v3.8.512 添加解密到实例信息方法 v3.10.101 新增 WxOpen 专属 AccessTokenContainer,解决没有提供 name 参数的情况下,Register 过程和公众号注册信息发生冲突的问题 v3.10.102 修正 UniformSendData.Mp_Template_Msg.Miniprogram 参数 pagepath -> page - v3.10.103 修正 WxOpenApiHandlerWapper 正确引用 AccessTokenContainer - v3.10.104 添加 WxAppApi.GenerateScheme() 接口 - v3.10.401 升级 MessageApi.SendSubscribe() 方法参数 - v3.11.100 修改完善“附近的小程序”接口 - v3.13.500-preview4.1 添加“Short Link”接口 - v3.14 添加 ExpressApi 接口 - v3.14.2 添加“小程序违规和申诉管理”消息事件 - v3.14.3 添加 UrlLinkApi.Generate() 接口 - v3.14.4 添加 BusinessApi.GetUserPhoneNumber() 接口 - v3.14.5 修改“下发小程序和公众号统一的服务消息”接口参数,提升兼容性 - v3.14.10.1 修复 WxAppApi.GetWxaCodeUnlimitAsync() 接口参数错误 - v3.15.2 添加小程序隐私接口 - v3.15.3 添加商户客户参数(BusinessId) - v3.15.4 添加小程序客服管理接口 - v3.15.6 添加“异步校验图片/音频是否含有违法违规内容”接口 - v3.15.7 - 1、添加 OnEvent_MediaCheckRequest() 方法:内容安全回调 - wxa_media_check 推送结果 - 2、修复 RequestMsgType.Event 返回值没有正确赋值的问题 - v3.15.10 EncryptHelper.DecodeEncryptedData() 方法添加 keySize 参数 - v3.15.12 添加小程序类目审核结果事件推送 - v3.15.13 添加“文本内容安全识别”接口 PR #2786 - v3.15.15 添加物流服务相关接口和事件推送 PR #2834 - v3.15.15.1 获取小程序服务GenerateScheme模型增加env_version字段 PR #2861 - v3.16.0 客服接口支持长文本自动切割后连续发送 - v3.16.4 微信已于2023 年 9 月 20 日收回下发统一消息接口,标注过时 PR #2921 - v3.17.1 添加 CodeApi.RevertCodeRelease() 方法的 appVersion 参数 - v3.17.2 添加“小程序虚拟支付”功能 PR #2961 / Issue #2951 - v3.17.3 添加小程序分类审核异步通知事件 / PR #2969 - v3.17.5 新增小程序认证年审事件接口 / PR #2979 - v3.17.6 虚拟支付增加了接口从1.0.7~1.0.10,同步完善 / PR #2987 - v3.19.0 添加小程序发货信息管理服务-查询小程序是否已完成交易结算管理确认接口 / PR #3030 - [2024-08-06] v3.19.2 更新基础库,包括 Senparc.CO2NET 相关库、Senparc.AI - [2024-09-02] v3.20.2 WxOpen 支持小程序付费能力的用量告警事件 - [2024-10-08] v3.21.0 WxOpen 添加“查询购买资源包的用量情况”接口 #3078 - [2024-10-20] v3.21.2 修正 first_save_flag 类型错误,应为 int; 同时增加 FirstSaveFlag 属性, 用于 bool 类型判断是否首次充值 #2986 感谢 @WanderingGrass - - https://github.com/JeffreySu/WeiXinMPSDK - - - ..\..\..\..\BuildOutPut - TRACE - - - ..\..\..\..\..\..\BuildOutPut - $(DefineConstants);RELEASE - ..\..\..\..\..\..\BuildOutPut\Senparc.Weixin.WxOpen.XML - true - pdbonly - prompt - MinimumRecommendedRules.ruleset - - - ..\..\..\..\BuildOutPut\ - ..\..\..\..\BuildOutPut\netstandard2.0\Senparc.Weixin.WxOpen.xml - - - ..\..\..\..\BuildOutPut\ - ..\..\..\..\BuildOutPut\netstandard2.1\Senparc.Weixin.WxOpen.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + v3.10.103 修正 WxOpenApiHandlerWapper 正确引用 AccessTokenContainer + v3.10.104 添加 WxAppApi.GenerateScheme() 接口 + v3.10.401 升级 MessageApi.SendSubscribe() 方法参数 + v3.11.100 修改完善“附近的小程序”接口 + v3.13.500-preview4.1 添加“Short Link”接口 + v3.14 添加 ExpressApi 接口 + v3.14.2 添加“小程序违规和申诉管理”消息事件 + v3.14.3 添加 UrlLinkApi.Generate() 接口 + v3.14.4 添加 BusinessApi.GetUserPhoneNumber() 接口 + v3.14.5 修改“下发小程序和公众号统一的服务消息”接口参数,提升兼容性 + v3.14.10.1 修复 WxAppApi.GetWxaCodeUnlimitAsync() 接口参数错误 + v3.15.2 添加小程序隐私接口 + v3.15.3 添加商户客户参数(BusinessId) + v3.15.4 添加小程序客服管理接口 + v3.15.6 添加“异步校验图片/音频是否含有违法违规内容”接口 + v3.15.7 + 1、添加 OnEvent_MediaCheckRequest() 方法:内容安全回调 - wxa_media_check 推送结果 + 2、修复 RequestMsgType.Event 返回值没有正确赋值的问题 + v3.15.10 EncryptHelper.DecodeEncryptedData() 方法添加 keySize 参数 + v3.15.12 添加小程序类目审核结果事件推送 + v3.15.13 添加“文本内容安全识别”接口 PR #2786 + v3.15.15 添加物流服务相关接口和事件推送 PR #2834 + v3.15.15.1 获取小程序服务GenerateScheme模型增加env_version字段 PR #2861 + v3.16.0 客服接口支持长文本自动切割后连续发送 + v3.16.4 微信已于2023 年 9 月 20 日收回下发统一消息接口,标注过时 PR #2921 + v3.17.1 添加 CodeApi.RevertCodeRelease() 方法的 appVersion 参数 + v3.17.2 添加“小程序虚拟支付”功能 PR #2961 / Issue #2951 + v3.17.3 添加小程序分类审核异步通知事件 / PR #2969 + v3.17.5 新增小程序认证年审事件接口 / PR #2979 + v3.17.6 虚拟支付增加了接口从1.0.7~1.0.10,同步完善 / PR #2987 + v3.19.0 添加小程序发货信息管理服务-查询小程序是否已完成交易结算管理确认接口 / PR #3030 + [2024-08-06] v3.19.2 更新基础库,包括 Senparc.CO2NET 相关库、Senparc.AI + [2024-09-02] v3.20.2 WxOpen 支持小程序付费能力的用量告警事件 + [2024-10-08] v3.21.0 WxOpen 添加“查询购买资源包的用量情况”接口 #3078 + [2024-10-20] v3.21.2 修正 first_save_flag 类型错误,应为 int; 同时增加 FirstSaveFlag 属性, 用于 bool 类型判断是否首次充值 #2986 感谢 @WanderingGrass + [2024-11-14] v3.22.0 添加 NCF UrlScheme 接口 #3093 感谢 @mojinxun + + https://github.com/JeffreySu/WeiXinMPSDK + + + ..\..\..\..\BuildOutPut + TRACE + + + ..\..\..\..\..\..\BuildOutPut + $(DefineConstants);RELEASE + ..\..\..\..\..\..\BuildOutPut\Senparc.Weixin.WxOpen.XML + true + pdbonly + prompt + MinimumRecommendedRules.ruleset + + + ..\..\..\..\BuildOutPut\ + ..\..\..\..\BuildOutPut\netstandard2.0\Senparc.Weixin.WxOpen.xml + + + ..\..\..\..\BuildOutPut\ + ..\..\..\..\BuildOutPut\netstandard2.1\Senparc.Weixin.WxOpen.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file