diff --git a/docs/WechatApi/Basic_ModelDefinition.md b/docs/WechatApi/Basic_ModelDefinition.md index 399f0505..98032cb4 100644 --- a/docs/WechatApi/Basic_ModelDefinition.md +++ b/docs/WechatApi/Basic_ModelDefinition.md @@ -162,6 +162,7 @@ | :-: | :----------------: | :--: | | √ | 视频号小店开放接口 | | | √ | 视频号助手开放接口 | | +| √ | 接口管理 | | diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaAuth/NotifyThirdPartyWxaAuthEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaAuth/NotifyThirdPartyWxaAuthEvent.cs new file mode 100644 index 00000000..77f27f33 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaAuth/NotifyThirdPartyWxaAuthEvent.cs @@ -0,0 +1,69 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Events +{ + /// + /// 表示 INFO.notify_3rd_wxa_auth 事件的数据。 + /// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_wxaauth.html + /// + public class NotifyThirdPartyWxaAuthEvent : WechatApiEvent, WechatApiEvent.Serialization.IXmlSerializable + { + public static class Types + { + public class DispatchInfo + { + /// + /// 获取或设置审核机构名称。 + /// + [System.Xml.Serialization.XmlElement("provider")] + public string Provider { get; set; } = default!; + + /// + /// 获取或设置审核机构联系方式。 + /// + [System.Xml.Serialization.XmlElement("contact")] + public string Contact { get; set; } = default!; + + /// + /// 获取或设置派单时间戳。 + /// + [System.Xml.Serialization.XmlElement("dispatch_time")] + public long DispatchTimestamp { get; set; } + } + } + + /// + /// 获取或设置小程序 AppId。 + /// + [System.Xml.Serialization.XmlElement("appid")] + public string AuthorizerAppId { get; set; } = default!; + + /// + /// 获取或设置认证任务 ID。 + /// + [System.Xml.Serialization.XmlElement("taskid")] + public string TaskId { get; set; } = default!; + + /// + /// 获取或设置认证任务状态。 + /// + [System.Xml.Serialization.XmlElement("task_status")] + public int TaskStatus { get; set; } + + /// + /// 获取或设置申请单状态。 + /// + [System.Xml.Serialization.XmlElement("apply_status")] + public int ApplyStatus { get; set; } + + /// + /// 获取或设置提醒消息内容。 + /// + [System.Xml.Serialization.XmlElement("message", IsNullable = true)] + public string? Message { get; set; } + + /// + /// 获取或设置派单信息。 + /// + [System.Xml.Serialization.XmlElement("dispatch_info", IsNullable = true)] + public Types.DispatchInfo? DispatchInfo { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaAuth/NotifyThirdPartyWxaVerifyEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaAuth/NotifyThirdPartyWxaVerifyEvent.cs new file mode 100644 index 00000000..23086fa2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Events/WxaAuth/NotifyThirdPartyWxaVerifyEvent.cs @@ -0,0 +1,27 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Events +{ + /// + /// 表示 INFO.notify_3rd_wxa_wxverify 事件的数据。 + /// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_wxaauth.html + /// + public class NotifyThirdPartyWxaVerifyEvent : WechatApiEvent, WechatApiEvent.Serialization.IXmlSerializable + { + /// + /// 获取或设置小程序 AppId。 + /// + [System.Xml.Serialization.XmlElement("appid")] + public string AuthorizerAppId { get; set; } = default!; + + /// + /// 获取或设置认证过期时间戳。 + /// + [System.Xml.Serialization.XmlElement("expired")] + public long ExpireTimestamp { get; set; } + + /// + /// 获取或设置提醒消息内容。 + /// + [System.Xml.Serialization.XmlElement("message", IsNullable = true)] + public string? Message { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaSecExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaSecExtensions.cs index 9e78eb03..fc509163 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaSecExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaSecExtensions.cs @@ -9,6 +9,109 @@ namespace SKIT.FlurlHttpClient.Wechat.Api { public static class WechatApiClientExecuteWxaSecExtensions { + #region Auth + /// + /// 异步调用 [POST] /wxa/sec/wxaauth 接口。 + /// REF: https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_wxaauth.html + /// + /// + /// + /// + /// + public static async Task ExecuteWxaSecWxaAuthAsync(this WechatApiClient client, Models.WxaSecWxaAuthRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "wxa", "sec", "wxaauth") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /wxa/sec/reauth 接口。 + /// REF: https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_reauth.html + /// + /// + /// + /// + /// + public static async Task ExecuteWxaSecReauthAsync(this WechatApiClient client, Models.WxaSecReauthRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "wxa", "sec", "reauth") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /wxa/sec/queryauth 接口。 + /// REF: https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_queryauth.html + /// + /// + /// + /// + /// + public static async Task ExecuteWxaSecQueryAuthAsync(this WechatApiClient client, Models.WxaSecQueryAuthRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "wxa", "sec", "queryauth") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /wxa/sec/uploadauthmaterial 接口。 + /// REF: https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_uploadauthmaterial.html + /// + /// + /// + /// + /// + public static async Task ExecuteWxaSecUploadAuthMaterialAsync(this WechatApiClient client, Models.WxaSecUploadAuthMaterialRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "wxa", "sec", "uploadauthmaterial") + .SetQueryParam("access_token", request.AccessToken); + + using var httpContent = Utilities.FileHttpContentBuilder.Build(fileName: "media.png", fileBytes: request.FileBytes, fileContentType: "image/png", formDataName: "media"); + return await client.SendRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /wxa/sec/authidentitytree 接口。 + /// REF: https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/weapp-wxverify/secwxaapi_authidentitytree.html + /// + /// + /// + /// + /// + public static async Task ExecuteWxaSecAuthIdentityTreeAsync(this WechatApiClient client, Models.WxaSecAuthIdentityTreeRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "wxa", "sec", "authidentitytree") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + #region Order /// /// 异步调用 [POST] /wxa/sec/order/upload_shipping_info 接口。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecAuthIdentityTreeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecAuthIdentityTreeRequest.cs new file mode 100644 index 00000000..350c8113 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecAuthIdentityTreeRequest.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/authidentitytree 接口的请求。 + /// + public class WxaSecAuthIdentityTreeRequest : WechatApiRequest, IInferable + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecAuthIdentityTreeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecAuthIdentityTreeResponse.cs new file mode 100644 index 00000000..0f6f57f7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecAuthIdentityTreeResponse.cs @@ -0,0 +1,79 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/authidentitytree 接口的响应。 + /// + public class WxaSecAuthIdentityTreeResponse : WechatApiResponse + { + public static class Types + { + public class IdentityTreeNode + { + public static class Types + { + public class RootInfo + { + /// + /// 获取或设置类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public int Type { get; set; } + } + + public class LeafInfo + { + /// + /// 获取或设置需求。 + /// + [Newtonsoft.Json.JsonProperty("requirement")] + [System.Text.Json.Serialization.JsonPropertyName("requirement")] + public string? Requirement { get; set; } + } + } + + /// + /// 获取或设置节点 ID。 + /// + [Newtonsoft.Json.JsonProperty("node_id")] + [System.Text.Json.Serialization.JsonPropertyName("node_id")] + public int NodeId { get; set; } + + /// + /// 获取或设置节点名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string NodeName { get; set; } = default!; + + /// + /// 获取或设置子节点列表。 + /// + [Newtonsoft.Json.JsonProperty("node_list")] + [System.Text.Json.Serialization.JsonPropertyName("node_list")] + public IdentityTreeNode[]? NodeList { get; set; } + + /// + /// 获取或设置根节点信息。 + /// + [Newtonsoft.Json.JsonProperty("root_info")] + [System.Text.Json.Serialization.JsonPropertyName("root_info")] + public Types.RootInfo? RootInfo { get; set; } + + /// + /// 获取或设置叶子节点信息。 + /// + [Newtonsoft.Json.JsonProperty("leaf_info")] + [System.Text.Json.Serialization.JsonPropertyName("leaf_info")] + public Types.LeafInfo? LeafInfo { get; set; } + } + } + + /// + /// 获取或设置职业树节点列表。 + /// + [Newtonsoft.Json.JsonProperty("identity_tree_list")] + [System.Text.Json.Serialization.JsonPropertyName("identity_tree_list")] + public Types.IdentityTreeNode[] IdentityTreeList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecQueryAuthRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecQueryAuthRequest.cs new file mode 100644 index 00000000..f1a32eee --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecQueryAuthRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/queryauth 接口的请求。 + /// + public class WxaSecQueryAuthRequest : WechatApiRequest, IInferable + { + /// + /// 获取或设置认证任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("taskid")] + [System.Text.Json.Serialization.JsonPropertyName("taskid")] + public string TaskId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecQueryAuthResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecQueryAuthResponse.cs new file mode 100644 index 00000000..ad8b4c6d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecQueryAuthResponse.cs @@ -0,0 +1,43 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/queryauth 接口的响应。 + /// + public class WxaSecQueryAuthResponse : WechatApiResponse + { + /// + /// 获取或设置认证任务状态。 + /// + [Newtonsoft.Json.JsonProperty("task_status")] + [System.Text.Json.Serialization.JsonPropertyName("task_status")] + public int TaskStatus { get; set; } + + /// + /// 获取或设置审核单状态。 + /// + [Newtonsoft.Json.JsonProperty("apply_status")] + [System.Text.Json.Serialization.JsonPropertyName("apply_status")] + public int ApplyStatus { get; set; } + + /// + /// 获取或设置小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置打回重填原因。 + /// + [Newtonsoft.Json.JsonProperty("refill_reason")] + [System.Text.Json.Serialization.JsonPropertyName("refill_reason")] + public string? RefillReason { get; set; } + + /// + /// 获取或设置审核失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecReauthRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecReauthRequest.cs new file mode 100644 index 00000000..2e2d8f8b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecReauthRequest.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/reauth 接口的请求。 + /// + public class WxaSecReauthRequest : WxaSecWxaAuthRequest, IInferable + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecReauthResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecReauthResponse.cs new file mode 100644 index 00000000..e0fc0246 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecReauthResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/reauth 接口的响应。 + /// + public class WxaSecReauthResponse : WxaSecWxaAuthResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecUploadAuthMaterialRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecUploadAuthMaterialRequest.cs new file mode 100644 index 00000000..9650fc79 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecUploadAuthMaterialRequest.cs @@ -0,0 +1,17 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/uploadauthmaterial 接口的请求。 + /// + public class WxaSecUploadAuthMaterialRequest : WechatApiRequest, IInferable + { + /// + /// 获取或设置文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = Array.Empty(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecUploadAuthMaterialResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecUploadAuthMaterialResponse.cs new file mode 100644 index 00000000..d2569070 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecUploadAuthMaterialResponse.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/uploadauthmaterial 接口的响应。 + /// + public class WxaSecUploadAuthMaterialResponse : WechatApiResponse + { + /// + /// 获取或设置类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string? Type { get; set; } + + /// + /// 获取或设置 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("mediaid")] + [System.Text.Json.Serialization.JsonPropertyName("mediaid")] + public string MediaId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecWxaAuthRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecWxaAuthRequest.cs new file mode 100644 index 00000000..2003f912 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecWxaAuthRequest.cs @@ -0,0 +1,286 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/wxaauth 接口的请求。 + /// + public class WxaSecWxaAuthRequest : WechatApiRequest, IInferable + { + public static class Types + { + public class AuthData + { + public static class Types + { + public class Contact + { + /// + /// 获取或设置认证联系人姓名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置认证联系人邮箱。 + /// + [Newtonsoft.Json.JsonProperty("email")] + [System.Text.Json.Serialization.JsonPropertyName("email")] + public string Email { get; set; } = string.Empty; + } + + public class Invoice + { + public static class Types + { + public class ElectronicInfo + { + /// + /// 获取或设置纳税识别号。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public string TaxNumber { get; set; } = string.Empty; + + /// + /// 获取或设置发票备注。 + /// + [Newtonsoft.Json.JsonProperty("desc")] + [System.Text.Json.Serialization.JsonPropertyName("desc")] + public string? Description { get; set; } + } + + public class VATInfo + { + /// + /// 获取或设置纳税识别号。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public string TaxNumber { get; set; } = string.Empty; + + /// + /// 获取或设置企业电话。 + /// + [Newtonsoft.Json.JsonProperty("enterprise_phone")] + [System.Text.Json.Serialization.JsonPropertyName("enterprise_phone")] + public string EnterprisePhoneNumber { get; set; } = string.Empty; + + /// + /// 获取或设置企业注册地址。 + /// + [Newtonsoft.Json.JsonProperty("enterprise_address")] + [System.Text.Json.Serialization.JsonPropertyName("enterprise_address")] + public string EnterpriseAddress { get; set; } = string.Empty; + + /// + /// 获取或设置企业开户银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string BankName { get; set; } = string.Empty; + + /// + /// 获取或设置企业银行账号。 + /// + [Newtonsoft.Json.JsonProperty("bank_account")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account")] + public string BankAccount { get; set; } = string.Empty; + + /// + /// 获取或设置邮寄地址邮编。 + /// + [Newtonsoft.Json.JsonProperty("mailing_address")] + [System.Text.Json.Serialization.JsonPropertyName("mailing_address")] + public string? MailingPostcode { get; set; } + + /// + /// 获取或设置邮寄地址省份。 + /// + [Newtonsoft.Json.JsonProperty("province")] + [System.Text.Json.Serialization.JsonPropertyName("province")] + public string? MailingProvince { get; set; } + + /// + /// 获取或设置邮寄地址城市。 + /// + [Newtonsoft.Json.JsonProperty("city")] + [System.Text.Json.Serialization.JsonPropertyName("city")] + public string? MailingCity { get; set; } + + /// + /// 获取或设置邮寄地址区县。 + /// + [Newtonsoft.Json.JsonProperty("district")] + [System.Text.Json.Serialization.JsonPropertyName("district")] + public string? MailingDistrict { get; set; } + + /// + /// 获取或设置邮寄地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? MailingAddress { get; set; } + + /// + /// 获取或设置邮寄联系人。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? MailingContactName { get; set; } + + /// + /// 获取或设置邮寄联系电话。 + /// + [Newtonsoft.Json.JsonProperty("phone")] + [System.Text.Json.Serialization.JsonPropertyName("phone")] + public string? MailingContactPhoneNumber { get; set; } + + /// + /// 获取或设置发票备注。 + /// + [Newtonsoft.Json.JsonProperty("desc")] + [System.Text.Json.Serialization.JsonPropertyName("desc")] + public string? Description { get; set; } + } + } + + /// + /// 获取或设置发票类型。 + /// + [Newtonsoft.Json.JsonProperty("invoice_type")] + [System.Text.Json.Serialization.JsonPropertyName("invoice_type")] + public int InvoiceType { get; set; } + + /// + /// 获取或设置发票抬头。 + /// + [Newtonsoft.Json.JsonProperty("invoice_title")] + [System.Text.Json.Serialization.JsonPropertyName("invoice_title")] + public string? InvoiceTitle { get; set; } + + /// + /// 获取或设置电子发票开票信息。 + /// + [Newtonsoft.Json.JsonProperty("electronic")] + [System.Text.Json.Serialization.JsonPropertyName("electronic")] + public Types.ElectronicInfo? ElectronicInfo { get; set; } + + /// + /// 获取或设置增值税专票开票信息。 + /// + [Newtonsoft.Json.JsonProperty("vat")] + [System.Text.Json.Serialization.JsonPropertyName("vat")] + public Types.VATInfo? VATInfo { get; set; } + } + } + + /// + /// 获取或设置客户类型。 + /// + [Newtonsoft.Json.JsonProperty("customer_type")] + [System.Text.Json.Serialization.JsonPropertyName("customer_type")] + public int CustomerType { get; set; } + + /// + /// 获取或设置认证任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("taskid")] + [System.Text.Json.Serialization.JsonPropertyName("taskid")] + public string? TaskId { get; set; } + + /// + /// 获取或设置联系人信息。 + /// + [Newtonsoft.Json.JsonProperty("contact_info")] + [System.Text.Json.Serialization.JsonPropertyName("contact_info")] + public Types.Contact Contact { get; set; } = new Types.Contact(); + + /// + /// 获取或设置主体资质材料 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("qualification")] + [System.Text.Json.Serialization.JsonPropertyName("qualification")] + public string? QualificationMediaId { get; set; } + + /// + /// 获取或设置主体资质其他材料 MediaId 列表。 + /// + [Newtonsoft.Json.JsonProperty("qualification_other")] + [System.Text.Json.Serialization.JsonPropertyName("qualification_other")] + public IList? QualificationOtherMediaIdList { get; set; } + + /// + /// 获取或设置小程序账号名称。 + /// + [Newtonsoft.Json.JsonProperty("account_name")] + [System.Text.Json.Serialization.JsonPropertyName("account_name")] + public string AccountName { get; set; } = string.Empty; + + /// + /// 获取或设置小程序账号名称命名类型。 + /// + [Newtonsoft.Json.JsonProperty("account_name_type")] + [System.Text.Json.Serialization.JsonPropertyName("account_name_type")] + public int AccountNameType { get; set; } + + /// + /// 获取或设置名称命中关键词补充材料 MediaId 列表。 + /// + [Newtonsoft.Json.JsonProperty("account_supplemental")] + [System.Text.Json.Serialization.JsonPropertyName("account_supplemental")] + public IList? AccountSupplementalMediaIdList { get; set; } + + /// + /// 获取或设置支付方式。 + /// + [Newtonsoft.Json.JsonProperty("pay_type")] + [System.Text.Json.Serialization.JsonPropertyName("pay_type")] + public int PayType { get; set; } + + /// + /// 获取或设置发票信息。 + /// + [Newtonsoft.Json.JsonProperty("invoice_info")] + [System.Text.Json.Serialization.JsonPropertyName("invoice_info")] + public Types.Invoice? Invoice { get; set; } + + /// + /// 获取或设置要认证的身份。 + /// + [Newtonsoft.Json.JsonProperty("auth_identification")] + [System.Text.Json.Serialization.JsonPropertyName("auth_identification")] + public string? AuthIdentification { get; set; } + + /// + /// 获取或设置身份证明材料 MediaId 列表。 + /// + [Newtonsoft.Json.JsonProperty("auth_ident_material")] + [System.Text.Json.Serialization.JsonPropertyName("auth_ident_material")] + public IList? AuthIdentificationMaterialIdList { get; set; } + + /// + /// 获取或设置第三方联系电话。 + /// + [Newtonsoft.Json.JsonProperty("third_party_phone")] + [System.Text.Json.Serialization.JsonPropertyName("third_party_phone")] + public string? ThirdPartyPhoneNumber { get; set; } + + /// + /// 获取或设置服务市场 AppId。 + /// + [Newtonsoft.Json.JsonProperty("service_appid")] + [System.Text.Json.Serialization.JsonPropertyName("service_appid")] + public string? ServiceAppId { get; set; } + } + } + + /// + /// 获取或设置认证信息。 + /// + [Newtonsoft.Json.JsonProperty("auth_data")] + [System.Text.Json.Serialization.JsonPropertyName("auth_data")] + public Types.AuthData AuthData { get; set; } = new Types.AuthData(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecWxaAuthResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecWxaAuthResponse.cs new file mode 100644 index 00000000..35bd8eaa --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaSec/Auth/WxaSecWxaAuthResponse.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /wxa/sec/wxaauth 接口的响应。 + /// + public class WxaSecWxaAuthResponse : WechatApiResponse + { + /// + /// 获取或设置认证任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("taskid")] + [System.Text.Json.Serialization.JsonPropertyName("taskid")] + public string TaskId { get; set; } = default!; + + /// + /// 获取或设置授权链接。 + /// + [Newtonsoft.Json.JsonProperty("auth_url")] + [System.Text.Json.Serialization.JsonPropertyName("auth_url")] + public string? AuthUrl { get; set; } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaAuth/NotifyThirdPartyWxaAuthEvent.xml b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaAuth/NotifyThirdPartyWxaAuthEvent.xml new file mode 100644 index 00000000..edee42a5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaAuth/NotifyThirdPartyWxaAuthEvent.xml @@ -0,0 +1,15 @@ + + + 1700634212 + + + 0 + + + 0 + + + + 1700619300 + + diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaAuth/NotifyThirdPartyWxaVerifyEvent.xml b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaAuth/NotifyThirdPartyWxaVerifyEvent.xml new file mode 100644 index 00000000..05e6306c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/EventSamples/WxaAuth/NotifyThirdPartyWxaVerifyEvent.xml @@ -0,0 +1,12 @@ + + + 1700634212 + + + 1704162245 + + + + diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecAuthIdentityTreeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecAuthIdentityTreeResponse.json new file mode 100644 index 00000000..a76d3974 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecAuthIdentityTreeResponse.json @@ -0,0 +1,54 @@ +{ + "identity_tree_list": [ + { + "name": "职业身份认证", + "node_id": 1, + "node_list": [ + { + "name": "娱乐", + "node_id": 2, + "node_list": [ + { + "name": "影视", + "node_id": 3, + "node_list": [ + { + "leaf_info": { + "requirement": "认证需上传本人有效身份证件,同时提供以下任一材料1、获得导演相关职称..." + }, + "name": "导演", + "node_id": 4 + }, + { + "leaf_info": { + "requirement": "认证需上传本人有效身份证件,同时提供以下任一材料..." + }, + "name": "编导", + "node_id": 5 + } + ] + }, + { + "name": "音乐", + "node_id": 17, + "node_list": [ + { + "leaf_info": { + "requirement": "认证需上传本人有效身份证件,同时提供以下任一材料1、唱片公司或演艺公司签约歌手..." + }, + "name": "歌手", + "node_id": 18 + } + ] + } + ] + } + ], + "root_info": { + "type": 1 + } + } + ], + "errcode": 0, + "errmsg": "" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecQueryAuthRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecQueryAuthRequest.json new file mode 100644 index 00000000..92408ace --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecQueryAuthRequest.json @@ -0,0 +1,3 @@ +{ + "taskid": "xxxx" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecQueryAuthResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecQueryAuthResponse.json new file mode 100644 index 00000000..33b02c8c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecQueryAuthResponse.json @@ -0,0 +1,7 @@ +{ + "errcode": 0, + "errmsg": "", + "task_status": 15, + "apply_status": 0, + "appid": "wx123123123123123" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecReauthRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecReauthRequest.json new file mode 100644 index 00000000..49bcc7d8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecReauthRequest.json @@ -0,0 +1,42 @@ +{ + + "auth_data": { + "taskid": "xxxxxx", + "account_name": "", + "account_name_type": 0, + "account_supplemental": [ "", "" ], + "auth_ident_material": [ "", "" ], + "auth_identification": "", + "contact_info": { + "email": "认证联系人电子信箱", + "name": "认证联系人姓名" + }, + "invoice_info": { + "electronic": { + "desc": "电子发票信息-发票备注(选填)", + "id": "电子发票信息-纳税识别号(15位、17、18或20位)" + }, + "invoice_type": 0, + "vat": { + "address": "增值税专票-街道地址(xx省xx市xx区xxxx)", + "bank_account": "增值税专票-企业银行账号", + "bank_name": "增值税专票-企业开户银行", + "enterprise_address": "增值税专票-企业注册地址", + "enterprise_phone": "增值税专票-企业电话", + "id": "增值税专票-纳税识别号(15位、17、18或20位)", + "mailing_address": "增值税专票-发票邮寄地址邮编", + "name": "增值税专票-联系人", + "phone": "增值税专票-联系电话", + "province": "广东省", + "city": "广州市", + "district": "海珠区", + "desc": "发票备注,选填" + + } + }, + "pay_type": 0, + "qualification": "", + "qualification_other": [ "", "" ], + "third_party_phone": "" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecReauthResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecReauthResponse.json new file mode 100644 index 00000000..1acfe081 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecReauthResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "", + "taskid": "" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecUploadAuthMaterialResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecUploadAuthMaterialResponse.json new file mode 100644 index 00000000..949a0c02 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecUploadAuthMaterialResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "ok", + "mediaid": "xxxxxxxxxxxxxxxxx" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecWxaAuthRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecWxaAuthRequest.json new file mode 100644 index 00000000..0e59db15 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecWxaAuthRequest.json @@ -0,0 +1,41 @@ +{ + "auth_data": { + "account_name": "", + "account_name_type": 0, + "account_supplemental": [ "", "" ], + "auth_ident_material": [ "", "" ], + "auth_identification": "", + "customer_type": 15, + "contact_info": { + "email": "认证联系人电子信箱", + "name": "认证联系人姓名" + }, + "invoice_info": { + "electronic": { + "desc": "电子发票信息-发票备注(选填)", + "id": "电子发票信息-纳税识别号(15位、17、18或20位)" + }, + "invoice_type": 0, + "vat": { + "address": "增值税专票-街道地址(xx省xx市xx区xxxx)", + "bank_account": "增值税专票-企业银行账号", + "bank_name": "增值税专票-企业开户银行", + "enterprise_address": "增值税专票-企业注册地址", + "enterprise_phone": "增值税专票-企业电话", + "id": "增值税专票-纳税识别号(15位、17、18或20位)", + "mailing_address": "增值税专票-发票邮寄地址邮编", + "name": "增值税专票-联系人", + "phone": "增值税专票-联系电话", + "province": "广东省", + "city": "广州市", + "district": "海珠区", + "desc": "发票备注,选填" + } + }, + "pay_type": 0, + "qualification": "", + "qualification_other": [ "", "" ], + "service_appid": "", + "third_party_phone": "" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecWxaAuthResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecWxaAuthResponse.json new file mode 100644 index 00000000..4835a6be --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/WxaSec/Auth/WxaSecWxaAuthResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "", + "taskid": "" +}