diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinLicenseExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinLicenseExtensions.cs index 4eb789ab..571b9ee7 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinLicenseExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinLicenseExtensions.cs @@ -442,6 +442,48 @@ namespace SKIT.FlurlHttpClient.Wechat.Work } #endregion + #region PayJob + /// + /// 异步调用 [POST] /cgi-bin/license/submit_pay_job 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/99415 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinLicenseSubmitPayJobAsync(this WechatWorkClient client, Models.CgibinLicenseSubmitPayJobRequest 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, "cgi-bin", "license", "submit_pay_job") + .SetQueryParam("provider_access_token", request.ProviderAccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/license/pay_job_result 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/99415 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinLicensePayJobResultAsync(this WechatWorkClient client, Models.CgibinLicensePayJobResultRequest 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, "cgi-bin", "license", "pay_job_result") + .SetQueryParam("provider_access_token", request.ProviderAccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + #endregion + /// /// 异步调用 [POST] /cgi-bin/license/support_policy_query 接口。 /// REF: https://developer.work.weixin.qq.com/document/path/96515 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicensePayJobResultRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicensePayJobResultRequest.cs new file mode 100644 index 00000000..7e405a0e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicensePayJobResultRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/license/pay_job_result 接口的请求。 + /// + public class CgibinLicensePayJobResultRequest : WechatWorkRequest + { + /// + /// 获取或设置服务商 AccessToken。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ProviderAccessToken { get; set; } = string.Empty; + + /// + /// 获取或设置支付任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("jobid")] + [System.Text.Json.Serialization.JsonPropertyName("jobid")] + public string JobId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicensePayJobResultResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicensePayJobResultResponse.cs new file mode 100644 index 00000000..c52b8455 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicensePayJobResultResponse.cs @@ -0,0 +1,76 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/license/pay_job_result 接口的响应。 + /// + public class CgibinLicensePayJobResultResponse : WechatWorkResponse + { + public static class Types + { + public class JobResult + { + public static class Types + { + public class FailedCorp + { + /// + /// 获取或设置企业 ID。 + /// + [Newtonsoft.Json.JsonProperty("corpid")] + [System.Text.Json.Serialization.JsonPropertyName("corpid")] + public string CorpId { get; set; } = default!; + + /// + /// 获取或设置错误码。 + /// + [Newtonsoft.Json.JsonProperty("errcode")] + [System.Text.Json.Serialization.JsonPropertyName("errcode")] + public int ErrorCode { get; set; } + + /// + /// 获取或设置错误码描述。 + /// + [Newtonsoft.Json.JsonProperty("errmsg")] + [System.Text.Json.Serialization.JsonPropertyName("errmsg")] + public string? ErrorMessage { get; set; } + } + } + + /// + /// 获取或设置错误码。 + /// + [Newtonsoft.Json.JsonProperty("errcode")] + [System.Text.Json.Serialization.JsonPropertyName("errcode")] + public int ErrorCode { get; set; } + + /// + /// 获取或设置错误码描述。 + /// + [Newtonsoft.Json.JsonProperty("errmsg")] + [System.Text.Json.Serialization.JsonPropertyName("errmsg")] + public string? ErrorMessage { get; set; } + + /// + /// 获取或设置支付失败的企业列表。 + /// + [Newtonsoft.Json.JsonProperty("fail_corp_list")] + [System.Text.Json.Serialization.JsonPropertyName("fail_corp_list")] + public Types.FailedCorp[]? FailedCorpList { get; set; } + } + } + + /// + /// 获取或设置支付任务状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public int JobStatus { get; set; } + + /// + /// 获取或设置支付任务结果。 + /// + [Newtonsoft.Json.JsonProperty("pay_job_result")] + [System.Text.Json.Serialization.JsonPropertyName("pay_job_result")] + public Types.JobResult JobResult { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobRequest.cs new file mode 100644 index 00000000..170b5278 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobRequest.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/license/submit_pay_job 接口的请求。 + /// + public class CgibinLicenseSubmitPayJobRequest : WechatWorkRequest + { + /// + /// 获取或设置服务商 AccessToken。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ProviderAccessToken { get; set; } = string.Empty; + + /// + /// 获取或设置支付人成员账号。 + /// + [Newtonsoft.Json.JsonProperty("payer_userid")] + [System.Text.Json.Serialization.JsonPropertyName("payer_userid")] + public string PayerUserId { get; set; } = string.Empty; + + /// + /// 获取或设置订单 ID。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobResponse.cs new file mode 100644 index 00000000..01c34044 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/license/submit_pay_job 接口的响应。 + /// + public class CgibinLicenseSubmitPayJobResponse : WechatWorkResponse + { + /// + /// 获取或设置支付任务 ID。 + /// + [Newtonsoft.Json.JsonProperty("jobid")] + [System.Text.Json.Serialization.JsonPropertyName("jobid")] + public string JobId { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicensePayJobResultRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicensePayJobResultRequest.json new file mode 100644 index 00000000..ea8ec7e8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicensePayJobResultRequest.json @@ -0,0 +1,3 @@ +{ + "jobid": "JOBID" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicensePayJobResultResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicensePayJobResultResponse.json new file mode 100644 index 00000000..6bb8f863 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicensePayJobResultResponse.json @@ -0,0 +1,16 @@ +{ + "errcode": 0, + "errmsg": "ok", + "status": 3, + "pay_job_result": { + "errcode": 700001, + "errmsg": "xxx", + "fail_corp_list": [ + { + "corpid": "wwxxx", + "errcode": 700002, + "errmsg": "xxx" + } + ] + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobRequest.json new file mode 100644 index 00000000..3ffd5aac --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobRequest.json @@ -0,0 +1,4 @@ +{ + "payer_userid": "USERID", + "order_id": "ORDERID" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobResponse.json new file mode 100644 index 00000000..3ae7240d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinLicense/PayJob/CgibinLicenseSubmitPayJobResponse.json @@ -0,0 +1,5 @@ +{ + "errcode": 0, + "errmsg": "ok", + "jobid": "JOBID" +}