Compare commits

...

3 Commits

Author SHA1 Message Date
Fu Diwei
f39a644a00 feat(tenpayv2): bump version to v3.4.0
Some checks failed
CodeQL / Analyze (csharp) (push) Has been cancelled
CodeLint / Lint (push) Has been cancelled
2025-09-30 12:12:25 +08:00
Fu Diwei
0c3f4dcc4c feat(tenpayv2): 新增企业微信查询向员工付款记录接口 2025-09-30 12:08:35 +08:00
Fu Diwei
89fd0a658b feat(tenpayv2): 新增企业微信查询红包记录接口 2025-09-30 12:01:01 +08:00
19 changed files with 432 additions and 11 deletions

View File

@@ -735,6 +735,14 @@
<summary>[展开查看]</summary>
- Release 3.4.0 (2025-09-30)
- **新增**:新增企业微信查询红包发放记录、查询向员工付款接口等接口。
- **变更**:升级依赖 `BouncyCastle.Cryptography` 至 v2.6.2。
- **修复**:修复酒店押金支付接口响应模型 `IsSuccessful()` 判断错误的问题。_via_ [GitHub #203](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/issues/203)
- Release 3.3.0 (2025-06-04)
- **新增**补充统一下单接口场景信息字段。_via_ [GitHub #193](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/pull/193)

View File

@@ -651,6 +651,10 @@
- 发放企业红包:`SendPayMarketingTransfersWeWorkRedPack`
- 查询红包记录:`GetPayMarketingTransfersWeWorkRedPack`
- 向员工付款:
- 向员工付款:`CreatePayMarketingTransfersPromotionWeWorkTransfer`
- 查询付款记录:`GetPayMarketingTransfersPromotionWeWorkTransfers`

View File

@@ -562,7 +562,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
/// <summary>
/// 获取或设置投诉进度列表。
/// <para>等效于 <see cref="Types.EventData.ComplaintHistory"/> </para>
/// </summary>
[Newtonsoft.Json.JsonProperty("history")]
[Newtonsoft.Json.JsonConverter(typeof(Converters.EventPropertyComplaintHistoryListNewtonsoftJsonConverter))]

View File

@@ -136,6 +136,28 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2
return await client.SendFlurlRequestAsXmlAsync<Models.SendPayMarketingTransfersWeWorkRedPackResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /mmpaymkttransfers/queryworkwxredpack 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developer.work.weixin.qq.com/document/path/90276 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetPayMarketingTransfersWeWorkRedPackResponse> ExecuteGetPayMarketingTransfersWeWorkRedPackAsync(this WechatTenpayClient client, Models.GetPayMarketingTransfersWeWorkRedPackRequest 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
.CreateFlurlRequest(request, HttpMethod.Post, "mmpaymkttransfers", "queryworkwxredpack");
return await client.SendFlurlRequestAsXmlAsync<Models.GetPayMarketingTransfersWeWorkRedPackResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
}
}

View File

@@ -110,6 +110,28 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2
return await client.SendFlurlRequestAsXmlAsync<Models.CreatePayMarketingTransfersPromotionWeWorkTransferResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /mmpaymkttransfers/promotion/querywwsptrans2pocket 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developer.work.weixin.qq.com/document/path/90279 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetPayMarketingTransfersPromotionWeWorkTransferResponse> ExecuteGetPayMarketingTransfersPromotionWeWorkTransferAsync(this WechatTenpayClient client, Models.GetPayMarketingTransfersPromotionWeWorkTransferRequest 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
.CreateFlurlRequest(request, HttpMethod.Post, "mmpaymkttransfers", "promotion", "querywwsptrans2pocket");
return await client.SendFlurlRequestAsXmlAsync<Models.GetPayMarketingTransfersPromotionWeWorkTransferResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
}
}

View File

@@ -1,4 +1,4 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
{
/// <summary>
/// <para>表示 [POST] /mmpaymkttransfers/gethbinfo 接口的请求。</para>
@@ -24,7 +24,7 @@
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_billno")]
[System.Text.Json.Serialization.JsonPropertyName("mch_billno")]
public string MerchantBillId { get; set; } = string.Empty;
public string MerchantBillNumber { get; set; } = string.Empty;
/// <summary>
/// 获取或设置订单类型。

View File

@@ -22,14 +22,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
public class ReceiverItem
{
/// <summary>
/// 获取或设置用户的 OpenId。
/// 获取或设置领取用户的 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置金额(单位:分)。
/// 获取或设置领取金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
@@ -70,11 +70,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
#pragma warning restore CS8618
/// <summary>
/// 获取或设置商户单号。
/// 获取或设置商户单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_billno")]
[System.Text.Json.Serialization.JsonPropertyName("mch_billno")]
public string PartnerTradeNumber { get; set; } = default!;
public string MerchantBillNumber { get; set; } = default!;
/// <summary>
/// 获取或设置微信红包订单号。

View File

@@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
{
/// <summary>
/// <para>表示 [POST] /mmpaymkttransfers/queryworkwxredpack 接口的请求。</para>
/// </summary>
public class GetPayMarketingTransfersWeWorkRedPackRequest : WechatTenpaySignableRequest
{
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_id")]
[System.Text.Json.Serialization.JsonPropertyName("mch_id")]
public override string? MerchantId { get; set; }
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("appid")]
[System.Text.Json.Serialization.JsonPropertyName("appid")]
public override string? AppId { get; set; }
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_billno")]
[System.Text.Json.Serialization.JsonPropertyName("mch_billno")]
public string MerchantBillNumber { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,159 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
{
/// <summary>
/// <para>表示 [POST] /mmpaymkttransfers/queryworkwxredpack 接口的响应。</para>
/// </summary>
public class GetPayMarketingTransfersWeWorkRedPackResponse : WechatTenpaySignableResponse
{
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_id")]
[System.Text.Json.Serialization.JsonPropertyName("mch_id")]
#pragma warning disable CS8618
#pragma warning disable CS8765
public override string MerchantId { get; set; }
#pragma warning restore CS8765
#pragma warning restore CS8618
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("appid")]
[System.Text.Json.Serialization.JsonPropertyName("appid")]
#pragma warning disable CS8618
#pragma warning disable CS8765
public override string AppId { get; set; }
#pragma warning restore CS8765
#pragma warning restore CS8618
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_billno")]
[System.Text.Json.Serialization.JsonPropertyName("mch_billno")]
public string MerchantBillNumber { get; set; } = default!;
/// <summary>
/// 获取或设置红包单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("detail_id")]
[System.Text.Json.Serialization.JsonPropertyName("detail_id")]
public string DetailId { get; set; } = default!;
/// <summary>
/// 获取或设置红包状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public string Status { get; set; } = default!;
/// <summary>
/// 获取或设置发放类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("send_type")]
[System.Text.Json.Serialization.JsonPropertyName("send_type")]
public string SendType { get; set; } = default!;
/// <summary>
/// 获取或设置红包金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("total_amount")]
[System.Text.Json.Serialization.JsonPropertyName("total_amount")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public int TotalAmount { get; set; }
/// <summary>
/// 获取或设置红包祝福语。
/// </summary>
[Newtonsoft.Json.JsonProperty("wishing")]
[System.Text.Json.Serialization.JsonPropertyName("wishing")]
public string? Wishing { get; set; }
/// <summary>
/// 获取或设置活动名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("act_name")]
[System.Text.Json.Serialization.JsonPropertyName("act_name")]
public string? ActivityName { get; set; }
/// <summary>
/// 获取或设置备注。
/// </summary>
[Newtonsoft.Json.JsonProperty("remark")]
[System.Text.Json.Serialization.JsonPropertyName("remark")]
public string? Remark { get; set; }
/// <summary>
/// 获取或设置红包发送时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("send_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("send_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
public DateTimeOffset SendTime { get; set; }
/// <summary>
/// 获取或设置红包退款时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("refund_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
public DateTimeOffset? RefundTime { get; set; }
/// <summary>
/// 获取或设置红包退款金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_amount")]
[System.Text.Json.Serialization.JsonPropertyName("refund_amount")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public int RefundAmount { get; set; }
/// <summary>
/// 获取或设置失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("reason")]
[System.Text.Json.Serialization.JsonPropertyName("reason")]
public string? FailReason { get; set; }
/// <summary>
/// 获取或设置红包发送者名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("sender_name")]
[System.Text.Json.Serialization.JsonPropertyName("sender_name")]
public string? SenderName { get; set; }
/// <summary>
/// 获取或设置红包发送者头像 MediaId。
/// </summary>
[Newtonsoft.Json.JsonProperty("sender_header_media_id")]
[System.Text.Json.Serialization.JsonPropertyName("sender_header_media_id")]
public string? SenderHeadImageMediaId { get; set; }
/// <summary>
/// 获取或设置领取红包的用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置领取金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public int Amount { get; set; }
/// <summary>
/// 获取或设置领取时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("rcv_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("rcv_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
public DateTimeOffset ReceiveTime { get; set; }
}
}

View File

@@ -27,7 +27,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
public string PartnerTradeNumber { get; set; } = string.Empty;
/// <summary>
/// 获取或设置用户的 OpenId。
/// 获取或设置收款用户的 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]

View File

@@ -59,7 +59,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
public string? Description { get; set; }
/// <summary>
/// 获取或设置用户的 OpenId。
/// 获取或设置收款用户的 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]

View File

@@ -27,7 +27,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
public string PartnerTradeNumber { get; set; } = string.Empty;
/// <summary>
/// 获取或设置用户的 OpenId。
/// 获取或设置收款用户的 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]

View File

@@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
{
/// <summary>
/// <para>表示 [POST] /mmpaymkttransfers/promotion/querywwsptrans2pocket 接口的请求。</para>
/// </summary>
public class GetPayMarketingTransfersPromotionWeWorkTransferRequest : WechatTenpaySignableRequest
{
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_id")]
[System.Text.Json.Serialization.JsonPropertyName("mch_id")]
public override string? MerchantId { get; set; }
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("appid")]
[System.Text.Json.Serialization.JsonPropertyName("appid")]
public override string? AppId { get; set; }
/// <summary>
/// 获取或设置商户付款单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("partner_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("partner_trade_no")]
public string PartnerTradeNumber { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,98 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models
{
/// <summary>
/// <para>表示 [POST] /mmpaymkttransfers/promotion/querywwsptrans2pocket 接口的响应。</para>
/// </summary>
public class GetPayMarketingTransfersPromotionWeWorkTransferResponse : WechatTenpaySignableResponse
{
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_id")]
[System.Text.Json.Serialization.JsonPropertyName("mch_id")]
#pragma warning disable CS8618
#pragma warning disable CS8765
public override string MerchantId { get; set; }
#pragma warning restore CS8765
#pragma warning restore CS8618
/// <summary>
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("appid")]
[System.Text.Json.Serialization.JsonPropertyName("appid")]
#pragma warning disable CS8618
#pragma warning disable CS8765
public override string AppId { get; set; }
#pragma warning restore CS8765
#pragma warning restore CS8618
/// <summary>
/// 获取或设置商户付款单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("partner_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("partner_trade_no")]
public string PartnerTradeNumber { get; set; } = default!;
/// <summary>
/// 获取或设置微信付款单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("detail_id")]
[System.Text.Json.Serialization.JsonPropertyName("detail_id")]
public string PaymentNumber { get; set; } = default!;
/// <summary>
/// 获取或设置金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("payment_amount")]
[System.Text.Json.Serialization.JsonPropertyName("payment_amount")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public int Amount { get; set; }
/// <summary>
/// 获取或设置终端设备号。
/// </summary>
[Newtonsoft.Json.JsonProperty("desc")]
[System.Text.Json.Serialization.JsonPropertyName("desc")]
public string? Description { get; set; }
/// <summary>
/// 获取或设置收款用户的 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置收款用户姓名。
/// </summary>
[Newtonsoft.Json.JsonProperty("transfer_name")]
[System.Text.Json.Serialization.JsonPropertyName("transfer_name")]
public string? UserName { get; set; }
/// <summary>
/// 获取或设置转账状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public string Status { get; set; } = default!;
/// <summary>
/// 获取或设置转账时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("transfer_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("transfer_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
public DateTimeOffset TransferTime { get; set; }
/// <summary>
/// 获取或设置失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("reason")]
[System.Text.Json.Serialization.JsonPropertyName("reason")]
public string? FailReason { get; set; }
}
}

View File

@@ -14,7 +14,7 @@
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat</PackageProjectUrl>
<PackageTags>Flurl.Http Wechat Weixin MicroMessage Tenpay WechatPay WeixinPay Wxpay 微信 微信支付 微信商户</PackageTags>
<Version>3.3.0</Version>
<Version>3.4.0</Version>
<Description>基于 Flurl.Http 的微信支付 API v2 版客户端,支持普通商户、境内服务商、银行服务商、跨境支付模式,仅包含微信支付未提供 v3 版 API 的部分功能,同时支持企业微信中企业支付相关的部分功能。如需微信支付 v3 版 API 客户端,欢迎使用 `SKIT.FlurlHttpClient.Wechat.TenpayV3`。</Description>
<Authors>Fu Diwei</Authors>
<RepositoryType>git</RepositoryType>

View File

@@ -0,0 +1,7 @@
{
"nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS",
"sign": "C380BEC2BFD727A4B6845133519F3AD6",
"mch_billno": "123456",
"mch_id": "10000098",
"appid": "wx8888888888888888"
}

View File

@@ -0,0 +1,22 @@
{
"return_code": "SUCCESS",
"return_msg": "ok",
"sign": "C380BEC2BFD727A4B6845133519F3AD6",
"result_code": "SUCCESS",
"mch_billno": "123456",
"mch_id": "10000098",
"detail_id": "43235678654322356",
"status": "RECEIVED",
"send_type": "API",
"total_amount": "5000",
"reason": "余额不足",
"send_time": "2017-07-20 22:45:12",
"wishing": "新年快乐",
"remark": "新年红包",
"act_name": "新年红包",
"openid": "ohO4GtzOAAYMp2yapORH3dQB3W18",
"amount": "100",
"rcv_time": "2017-07-20 22:46:59",
"sender_name": "XX活动",
"sender_header_media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0"
}

View File

@@ -0,0 +1,7 @@
{
"sign": "E1EE61A91C8E90F299DE6AE075D60A2D",
"partner_trade_no": "0010010404201411170000046545",
"mch_id": "10000097",
"appid": "wxe062425f740c8888",
"nonce_str": "50780e0cca98c8c8e814883e5caa672e"
}

View File

@@ -0,0 +1,15 @@
{
"return_code": "SUCCESS",
"return_msg": "获取成功",
"result_code": "SUCCESS",
"mch_id": "10000098",
"appid": "wxe062425f740c30d8",
"detail_id": "1000000000201503283103439304",
"partner_trade_no": "0010010404201411170000046545",
"status": "SUCCESS",
"payment_amount": "100",
"openid": "oxTWIuGaIt6gTKsQRLau2M0yL16E",
"transfer_time": "2017-07-22 20:10:15",
"transfer_name": "测试",
"desc": "付款测试"
}