diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteBillCommentExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteBillCommentExtensions.cs
new file mode 100644
index 00000000..3d58bf3b
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteBillCommentExtensions.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV2
+{
+ public static class WechatTenpayClientExecuteBillCommentExtensions
+ {
+ ///
+ /// 异步调用 [POST] /billcommentsp/batchquerycomment 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_17
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteBatchQueryBillCommentAsync(this WechatTenpayClient client, Models.BatchQueryBillCommentRequest 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, "billcommentsp", "batchquerycomment");
+
+ return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/BillComment/BatchQueryBillCommentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/BillComment/BatchQueryBillCommentRequest.cs
new file mode 100644
index 00000000..f9cd5d3e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/BillComment/BatchQueryBillCommentRequest.cs
@@ -0,0 +1,66 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
+{
+ ///
+ /// 表示 [POST] /billcommentsp/batchquerycomment 接口的请求。
+ ///
+ public class BatchQueryBillCommentRequest : WechatTenpaySignableRequest
+ {
+ ///
+ ///
+ ///
+ [Newtonsoft.Json.JsonProperty("mch_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("mch_id")]
+ public override string? MerchantId { get; set; }
+
+ ///
+ ///
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public override string? AppId { get; set; }
+
+ ///
+ ///
+ /// 默认值:
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_type")]
+#pragma warning disable CS8765
+ public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256;
+#pragma warning restore CS8765
+
+ ///
+ /// 获取或设置开始时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("begin_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("begin_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextDateTimeOffsetConverter))]
+ public DateTimeOffset BeginTime { get; set; }
+
+ ///
+ /// 获取或设置结束时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("end_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextDateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("end_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextDateTimeOffsetConverter))]
+ public DateTimeOffset EndTime { get; set; }
+
+ ///
+ /// 获取或设置分页起始位置。
+ ///
+ [Newtonsoft.Json.JsonProperty("offset")]
+ [System.Text.Json.Serialization.JsonPropertyName("offset")]
+ public int Offset { get; set; }
+
+ ///
+ /// 获取或设置分页每页数量。
+ ///
+ [Newtonsoft.Json.JsonProperty("limit")]
+ [System.Text.Json.Serialization.JsonPropertyName("limit")]
+ public int? Limit { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/BillComment/BatchQueryBillCommentResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/BillComment/BatchQueryBillCommentResponse.cs
new file mode 100644
index 00000000..58f8ab97
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/BillComment/BatchQueryBillCommentResponse.cs
@@ -0,0 +1,27 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
+{
+ ///
+ /// 表示 [POST] /billcommentsp/batchquerycomment 接口的响应。
+ ///
+ public class BatchQueryBillCommentResponse : WechatTenpayResponse
+ {
+ ///
+ ///
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? MerchantId { get; set; }
+
+ ///
+ ///
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public override string? AppId { get; set; }
+
+ public override bool IsSuccessful()
+ {
+ return base.IsSuccessful() && RawBytes?.Length > 0;
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/BillComment/BatchQueryBillCommentRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/BillComment/BatchQueryBillCommentRequest.json
new file mode 100644
index 00000000..f0b984fe
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/BillComment/BatchQueryBillCommentRequest.json
@@ -0,0 +1,11 @@
+{
+ "appid": "wxe062425f740c30d8",
+ "mch_id": "1900000109",
+ "nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS",
+ "offset": 0,
+ "limit": 100,
+ "begin_time": "20170724000000",
+ "end_time": "20170725000000",
+ "sign_type": "HMAC-SHA256",
+ "sign": "3AE1368BD96B4644FA5823E024CFE938F1B852EFA87919EDDEE324AE24C8C04F"
+}