Skip to content

Commit f3f3800

Browse files
committed
feat(tenpayv3): 新增品牌红包相关接口
1 parent 3d52f35 commit f3f3800

27 files changed

Lines changed: 970 additions & 5 deletions

File tree

docs/WechatTenpayV3/Basic_ModelDefinition.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
|| 运营工具:电子发票 | 直连商户 & 合作伙伴 | |
5959
|| 运营工具:点金计划 | 合作伙伴 | |
6060
| × | <del>运营工具:现金红包</del> | 直连商户 & 合作伙伴 | 官方未提供 v3 API |
61+
|| 运营工具:品牌红包 | 直连商户 | |
6162
|| 扩展工具:分账 | 直连商户 & 合作伙伴 | |
6263
|| 扩展工具:连锁品牌分账 | 合作伙伴 | |
6364
|| 扩展工具:消费者投诉 2.0 | 直连商户 & 合作伙伴 | |
@@ -209,7 +210,6 @@
209210

210211
- 微信单号查询电子回单:`GetFundAppMerchantTransferElecsignByTransferBillNumber`
211212

212-
213213
- 商家转账到 QQ 钱包
214214

215215
- 发起转账到 QQ 钱包:`CreateFundAppMerchantTransferToQQWalletBill`
@@ -488,6 +488,18 @@
488488

489489
- 将电子发票插入微信用户卡包:`CreateNewTaxControlFapiaoApplicationCard`
490490

491+
- 品牌红包
492+
493+
- 品牌商户发放红包:`CreateFundAppBrandRedPacketBrandMerchantBatch`
494+
495+
- 商家批次单号查询批次单:`GetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumber`
496+
497+
- 商家明细单号查询明细单:`GetFundAppBrandRedPacketBrandMerchantBatchDetailByOutDetailNumber`
498+
499+
- 微信支付批次单号查询批次单:`GetFundAppBrandRedPacketBrandMerchantBatchByBatchNumber`
500+
501+
- 微信支付明细单号查询明细单:`GetFundAppBrandRedPacketBrandMerchantBatchDetailByDetailNumber`
502+
491503
- 商家充值
492504

493505
- 申请银行转账充值:`ApplyBankTransferRecharge`

src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteFundAppExtensions.cs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,5 +258,121 @@ public static class WechatTenpayClientExecuteFundAppExtensions
258258
}
259259
#endregion
260260
#endregion
261+
262+
#region BrandRedPacket
263+
/// <summary>
264+
/// <para>异步调用 [POST] /fund-app/brand-redpacket/brand-merchant-batches 接口。</para>
265+
/// <para>
266+
/// REF: <br/>
267+
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4014310358 ]]>
268+
/// </para>
269+
/// </summary>
270+
/// <param name="client"></param>
271+
/// <param name="request"></param>
272+
/// <param name="cancellationToken"></param>
273+
/// <returns></returns>
274+
public static async Task<Models.CreateFundAppBrandRedPacketBrandMerchantBatchResponse> ExecuteCreateFundAppBrandRedPacketBrandMerchantBatchAsync(this WechatTenpayClient client, Models.CreateFundAppBrandRedPacketBrandMerchantBatchRequest request, CancellationToken cancellationToken = default)
275+
{
276+
if (client is null) throw new ArgumentNullException(nameof(client));
277+
if (request is null) throw new ArgumentNullException(nameof(request));
278+
279+
IFlurlRequest flurlReq = client
280+
.CreateFlurlRequest(request, HttpMethod.Post, "fund-app", "brand-redpacket", "brand-merchant-batches");
281+
282+
return await client.SendFlurlRequestAsJsonAsync<Models.CreateFundAppBrandRedPacketBrandMerchantBatchResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
283+
}
284+
285+
/// <summary>
286+
/// <para>异步调用 [GET] /fund-app/brand-redpacket/brand-merchant-out-batches/{out_batch_no} 接口。</para>
287+
/// <para>
288+
/// REF: <br/>
289+
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4014310378 ]]>
290+
/// </para>
291+
/// </summary>
292+
/// <param name="client"></param>
293+
/// <param name="request"></param>
294+
/// <param name="cancellationToken"></param>
295+
/// <returns></returns>
296+
public static async Task<Models.GetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumberResponse> ExecuteGetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumberAsync(this WechatTenpayClient client, Models.GetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumberRequest request, CancellationToken cancellationToken = default)
297+
{
298+
if (client is null) throw new ArgumentNullException(nameof(client));
299+
if (request is null) throw new ArgumentNullException(nameof(request));
300+
301+
IFlurlRequest flurlReq = client
302+
.CreateFlurlRequest(request, HttpMethod.Get, "fund-app", "brand-redpacket", "brand-merchant-out-batches", request.OutBatchNumber)
303+
.SetQueryParam("need_query_detail", request.RequireQueryDetail)
304+
.SetQueryParam("detail_state", request.DetailState);
305+
306+
return await client.SendFlurlRequestAsJsonAsync<Models.GetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
307+
}
308+
309+
/// <summary>
310+
/// <para>异步调用 [GET] /fund-app/brand-redpacket/brand-merchant-batches/{batch_no} 接口。</para>
311+
/// <para>
312+
/// REF: <br/>
313+
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4014310369 ]]>
314+
/// </para>
315+
/// </summary>
316+
/// <param name="client"></param>
317+
/// <param name="request"></param>
318+
/// <param name="cancellationToken"></param>
319+
/// <returns></returns>
320+
public static async Task<Models.GetFundAppBrandRedPacketBrandMerchantBatchByBatchNumberResponse> ExecuteGetFundAppBrandRedPacketBrandMerchantBatchByBatchNumberAsync(this WechatTenpayClient client, Models.GetFundAppBrandRedPacketBrandMerchantBatchByBatchNumberRequest request, CancellationToken cancellationToken = default)
321+
{
322+
if (client is null) throw new ArgumentNullException(nameof(client));
323+
if (request is null) throw new ArgumentNullException(nameof(request));
324+
325+
IFlurlRequest flurlReq = client
326+
.CreateFlurlRequest(request, HttpMethod.Get, "fund-app", "brand-redpacket", "brand-merchant-batches", request.BatchNumber)
327+
.SetQueryParam("need_query_detail", request.RequireQueryDetail)
328+
.SetQueryParam("detail_state", request.DetailState);
329+
330+
return await client.SendFlurlRequestAsJsonAsync<Models.GetFundAppBrandRedPacketBrandMerchantBatchByBatchNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
331+
}
332+
333+
/// <summary>
334+
/// <para>异步调用 [GET] /fund-app/brand-redpacket/brand-merchant-out-batches/{out_batch_no}/out-details/{out_detail_no} 接口。</para>
335+
/// <para>
336+
/// REF: <br/>
337+
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4014310391 ]]>
338+
/// </para>
339+
/// </summary>
340+
/// <param name="client"></param>
341+
/// <param name="request"></param>
342+
/// <param name="cancellationToken"></param>
343+
/// <returns></returns>
344+
public static async Task<Models.GetFundAppBrandRedPacketBrandMerchantBatchDetailByOutDetailNumberResponse> ExecuteGetFundAppBrandRedPacketBrandMerchantBatchDetailByOutDetailNumberAsync(this WechatTenpayClient client, Models.GetFundAppBrandRedPacketBrandMerchantBatchDetailByOutDetailNumberRequest request, CancellationToken cancellationToken = default)
345+
{
346+
if (client is null) throw new ArgumentNullException(nameof(client));
347+
if (request is null) throw new ArgumentNullException(nameof(request));
348+
349+
IFlurlRequest flurlReq = client
350+
.CreateFlurlRequest(request, HttpMethod.Get, "fund-app", "brand-redpacket", "brand-merchant-out-batches", request.OutBatchNumber, "out-details", request.OutDetailNumber);
351+
352+
return await client.SendFlurlRequestAsJsonAsync<Models.GetFundAppBrandRedPacketBrandMerchantBatchDetailByOutDetailNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
353+
}
354+
355+
/// <summary>
356+
/// <para>异步调用 [GET] /fund-app/brand-redpacket/brand-merchant-batches/{batch_no}/details/{detail_no} 接口。</para>
357+
/// <para>
358+
/// REF: <br/>
359+
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4014310384 ]]>
360+
/// </para>
361+
/// </summary>
362+
/// <param name="client"></param>
363+
/// <param name="request"></param>
364+
/// <param name="cancellationToken"></param>
365+
/// <returns></returns>
366+
public static async Task<Models.GetFundAppBrandRedPacketBrandMerchantBatchDetailByDetailNumberResponse> ExecuteGetFundAppBrandRedPacketBrandMerchantBatchDetailByDetailNumberAsync(this WechatTenpayClient client, Models.GetFundAppBrandRedPacketBrandMerchantBatchDetailByDetailNumberRequest request, CancellationToken cancellationToken = default)
367+
{
368+
if (client is null) throw new ArgumentNullException(nameof(client));
369+
if (request is null) throw new ArgumentNullException(nameof(request));
370+
371+
IFlurlRequest flurlReq = client
372+
.CreateFlurlRequest(request, HttpMethod.Get, "fund-app", "brand-redpacket", "brand-merchant-batches", request.BatchNumber, "out-details", request.DetailNumber);
373+
374+
return await client.SendFlurlRequestAsJsonAsync<Models.GetFundAppBrandRedPacketBrandMerchantBatchDetailByDetailNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
375+
}
376+
#endregion
261377
}
262378
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
using System.Collections.Generic;
2+
3+
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
4+
{
5+
/// <summary>
6+
/// <para>表示 [POST] /fund-app/brand-redpacket/brand-merchant-batches 接口的请求。</para>
7+
/// </summary>
8+
[WechatTenpaySensitive]
9+
public class CreateFundAppBrandRedPacketBrandMerchantBatchRequest : WechatTenpayRequest
10+
{
11+
public static class Types
12+
{
13+
public class TransferDetail
14+
{
15+
/// <summary>
16+
/// 获取或设置商家明细单号。
17+
/// </summary>
18+
[Newtonsoft.Json.JsonProperty("out_detail_no")]
19+
[System.Text.Json.Serialization.JsonPropertyName("out_detail_no")]
20+
public string OutDetailNumber { get; set; } = string.Empty;
21+
22+
/// <summary>
23+
/// 获取或设置红包金额(单位:分)。
24+
/// </summary>
25+
[Newtonsoft.Json.JsonProperty("amount")]
26+
[System.Text.Json.Serialization.JsonPropertyName("amount")]
27+
public int Amount { get; set; }
28+
29+
/// <summary>
30+
/// 获取或设置接收红包 OpenId。
31+
/// </summary>
32+
[Newtonsoft.Json.JsonProperty("openid")]
33+
[System.Text.Json.Serialization.JsonPropertyName("openid")]
34+
public string OpenId { get; set; } = string.Empty;
35+
36+
/// <summary>
37+
/// 获取或设置接收红包用户姓名(需使用平台公钥/证书加密)。
38+
/// </summary>
39+
[Newtonsoft.Json.JsonProperty("user_name")]
40+
[System.Text.Json.Serialization.JsonPropertyName("user_name")]
41+
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
42+
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
43+
public string? UserName { get; set; }
44+
45+
/// <summary>
46+
/// 获取或设置红包备注。
47+
/// </summary>
48+
[Newtonsoft.Json.JsonProperty("remark")]
49+
[System.Text.Json.Serialization.JsonPropertyName("remark")]
50+
public string? Remark { get; set; }
51+
}
52+
}
53+
54+
/// <summary>
55+
/// 获取或设置品牌 ID。
56+
/// </summary>
57+
[Newtonsoft.Json.JsonProperty("brand_id")]
58+
[System.Text.Json.Serialization.JsonPropertyName("brand_id")]
59+
public int BrandId { get; set; }
60+
61+
/// <summary>
62+
/// 获取或设置品牌微信 AppId。
63+
/// </summary>
64+
[Newtonsoft.Json.JsonProperty("brand_appid")]
65+
[System.Text.Json.Serialization.JsonPropertyName("brand_appid")]
66+
public string BrandAppId { get; set; } = string.Empty;
67+
68+
/// <summary>
69+
/// 获取或设置品牌红包模板 ID。
70+
/// </summary>
71+
[Newtonsoft.Json.JsonProperty("template_id")]
72+
[System.Text.Json.Serialization.JsonPropertyName("template_id")]
73+
public string TemplateId { get; set; } = string.Empty;
74+
75+
/// <summary>
76+
/// 获取或设置商家批次单号。
77+
/// </summary>
78+
[Newtonsoft.Json.JsonProperty("out_batch_no")]
79+
[System.Text.Json.Serialization.JsonPropertyName("out_batch_no")]
80+
public string OutBatchNumber { get; set; } = string.Empty;
81+
82+
/// <summary>
83+
/// 获取或设置批次名称。
84+
/// </summary>
85+
[Newtonsoft.Json.JsonProperty("batch_name")]
86+
[System.Text.Json.Serialization.JsonPropertyName("batch_name")]
87+
public string BatchName { get; set; } = string.Empty;
88+
89+
/// <summary>
90+
/// 获取或设置红包总金额(单位:分)。
91+
/// </summary>
92+
[Newtonsoft.Json.JsonProperty("total_amount")]
93+
[System.Text.Json.Serialization.JsonPropertyName("total_amount")]
94+
public int TotalAmount { get; set; }
95+
96+
/// <summary>
97+
/// 获取或设置红包总笔数。
98+
/// </summary>
99+
[Newtonsoft.Json.JsonProperty("total_num")]
100+
[System.Text.Json.Serialization.JsonPropertyName("total_num")]
101+
public int TotalNumber { get; set; }
102+
103+
/// <summary>
104+
/// 获取或设置批次备注。
105+
/// </summary>
106+
[Newtonsoft.Json.JsonProperty("batch_remark")]
107+
[System.Text.Json.Serialization.JsonPropertyName("batch_remark")]
108+
public string BatchRemark { get; set; } = string.Empty;
109+
110+
/// <summary>
111+
/// 获取或设置品牌红包发放场景。
112+
/// </summary>
113+
[Newtonsoft.Json.JsonProperty("scene")]
114+
[System.Text.Json.Serialization.JsonPropertyName("scene")]
115+
public string Scene { get; set; } = string.Empty;
116+
117+
/// <summary>
118+
/// 获取或设置品牌红包明细列表。
119+
/// </summary>
120+
[Newtonsoft.Json.JsonProperty("detail_list")]
121+
[System.Text.Json.Serialization.JsonPropertyName("detail_list")]
122+
public IList<Types.TransferDetail>? TransferDetailList { get; set; }
123+
}
124+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
3+
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
4+
{
5+
/// <summary>
6+
/// <para>表示 [POST] /fund-app/brand-redpacket/brand-merchant-batches 接口的响应。</para>
7+
/// </summary>
8+
public class CreateFundAppBrandRedPacketBrandMerchantBatchResponse : WechatTenpayResponse
9+
{
10+
/// <summary>
11+
/// 获取或设置商家批次单号。
12+
/// </summary>
13+
[Newtonsoft.Json.JsonProperty("out_batch_no")]
14+
[System.Text.Json.Serialization.JsonPropertyName("out_batch_no")]
15+
public string OutBatchNumber { get; set; } = default!;
16+
17+
/// <summary>
18+
/// 获取或设置微信批次单号。
19+
/// </summary>
20+
[Newtonsoft.Json.JsonProperty("batch_no")]
21+
[System.Text.Json.Serialization.JsonPropertyName("batch_no")]
22+
public string BatchNumber { get; set; } = default!;
23+
24+
/// <summary>
25+
/// 获取或设置批次状态。
26+
/// </summary>
27+
[Newtonsoft.Json.JsonProperty("batch_state")]
28+
[System.Text.Json.Serialization.JsonPropertyName("batch_state")]
29+
public string BatchState { get; set; } = default!;
30+
31+
/// <summary>
32+
/// 获取或设置批次创建时间。
33+
/// </summary>
34+
[Newtonsoft.Json.JsonProperty("create_time")]
35+
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
36+
[System.Text.Json.Serialization.JsonPropertyName("create_time")]
37+
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
38+
public DateTimeOffset CreateTime { get; set; }
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
2+
{
3+
/// <summary>
4+
/// <para>表示 [GET] /fund-app/brand-redpacket/brand-merchant-batches/{batch_no} 接口的请求。</para>
5+
/// </summary>
6+
public class GetFundAppBrandRedPacketBrandMerchantBatchByBatchNumberRequest : WechatTenpayRequest
7+
{
8+
/// <summary>
9+
/// 获取或设置微信批次单号。
10+
/// </summary>
11+
[Newtonsoft.Json.JsonIgnore]
12+
[System.Text.Json.Serialization.JsonIgnore]
13+
public string BatchNumber { get; set; } = string.Empty;
14+
15+
/// <summary>
16+
/// 获取或设置是否查询红包明细单。
17+
/// </summary>
18+
[Newtonsoft.Json.JsonIgnore]
19+
[System.Text.Json.Serialization.JsonIgnore]
20+
public bool RequireQueryDetail { get; set; }
21+
22+
/// <summary>
23+
/// 获取或设置明细状态。
24+
/// </summary>
25+
[Newtonsoft.Json.JsonIgnore]
26+
[System.Text.Json.Serialization.JsonIgnore]
27+
public string? DetailState { get; set; }
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
2+
{
3+
/// <summary>
4+
/// <para>表示 [GET] /fund-app/brand-redpacket/brand-merchant-batches/{batch_no} 接口的响应。</para>
5+
/// </summary>
6+
public class GetFundAppBrandRedPacketBrandMerchantBatchByBatchNumberResponse : GetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumberResponse
7+
{
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
2+
{
3+
/// <summary>
4+
/// <para>表示 [GET] /fund-app/brand-redpacket/brand-merchant-out-batches/{out_batch_no} 接口的请求。</para>
5+
/// </summary>
6+
public class GetFundAppBrandRedPacketBrandMerchantBatchByOutBatchNumberRequest : WechatTenpayRequest
7+
{
8+
/// <summary>
9+
/// 获取或设置商家批次单号。
10+
/// </summary>
11+
[Newtonsoft.Json.JsonIgnore]
12+
[System.Text.Json.Serialization.JsonIgnore]
13+
public string OutBatchNumber { get; set; } = string.Empty;
14+
15+
/// <summary>
16+
/// 获取或设置是否查询红包明细单。
17+
/// </summary>
18+
[Newtonsoft.Json.JsonIgnore]
19+
[System.Text.Json.Serialization.JsonIgnore]
20+
public bool RequireQueryDetail { get; set; }
21+
22+
/// <summary>
23+
/// 获取或设置明细状态。
24+
/// </summary>
25+
[Newtonsoft.Json.JsonIgnore]
26+
[System.Text.Json.Serialization.JsonIgnore]
27+
public string? DetailState { get; set; }
28+
}
29+
}

0 commit comments

Comments
 (0)