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"
+}