feat(wxapi): 新增微信小店群礼物超时自动退售后单相关接口

This commit is contained in:
Fu Diwei 2025-04-07 20:36:32 +08:00
parent 2c407fc59d
commit 820bf185e3
13 changed files with 420 additions and 2 deletions

View File

@ -4,7 +4,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
/// <para>表示 EVENT.channels_ec_aftersale_update 事件的数据。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developers.weixin.qq.com/doc/channels/API/aftersale/ec_callback/channels_ec_aftersale_update.html ]]>
/// <![CDATA[ https://developers.weixin.qq.com/doc/channels/API/aftersale/ec_callback/channels_ec_aftersale_update.html ]]> <br>
/// <![CDATA[ https://developers.weixin.qq.com/doc/store/shop/API/aftersale/ec_callback/channels_ec_aftersale_update.html ]]>
/// </para>
/// </summary>
public class ChannelsECAftersaleUpdateEvent : WechatApiEvent
@ -22,7 +23,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
[System.Xml.Serialization.XmlElement("after_sale_order_id")]
public long AftersaleOrderId { get; set; }
/// <summary>
/// 获取或设置订单 ID。
/// </summary>

View File

@ -0,0 +1,52 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Events
{
/// <summary>
/// <para>表示 EVENT.channels_ec_present_aftersale_update 事件的数据。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developers.weixin.qq.com/doc/store/shop/API/aftersale/ec_callback/channels_ec_present_aftersale_update.html ]]>
/// </para>
/// </summary>
public class ChannelsECPresentAftersaleUpdateEvent : WechatApiEvent
{
public static class Types
{
public class AftersaleOrder
{
/// <summary>
/// 获取或设置售后单 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("after_sale_order_id")]
[System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
[System.Xml.Serialization.XmlElement("after_sale_order_id")]
public long AftersaleOrderId { get; set; }
/// <summary>
/// 获取或设置订单 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("order_id")]
[System.Text.Json.Serialization.JsonPropertyName("order_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
[System.Xml.Serialization.XmlElement("order_id")]
public long OrderId { get; set; }
/// <summary>
/// 获取或设置售后单状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
[System.Xml.Serialization.XmlElement("status")]
public string Status { get; set; } = default!;
}
}
/// <summary>
/// 获取或设置售后单信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("finder_shop_present_aftersale_status_update")]
[System.Text.Json.Serialization.JsonPropertyName("finder_shop_present_aftersale_status_update")]
[System.Xml.Serialization.XmlElement("finder_shop_present_aftersale_status_update")]
public Types.AftersaleOrder AftersaleOrder { get; set; } = default!;
}
}

View File

@ -274,6 +274,54 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
}
#endregion
#region ECAftersale/Present
/// <summary>
/// <para>异步调用 [POST] /channels/ec/aftersale/getpresentaftersalelist 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developers.weixin.qq.com/doc/store/shop/API/aftersale/getpresentaftersalelist.html ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ChannelsECAftersaleGetPresentAftersaleListResponse> ExecuteChannelsECAftersaleGetPresentAftersaleListAsync(this WechatApiClient client, Models.ChannelsECAftersaleGetPresentAftersaleListRequest 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, "channels", "ec", "aftersale", "getpresentaftersalelist")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendFlurlRequestAsJsonAsync<Models.ChannelsECAftersaleGetPresentAftersaleListResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /channels/ec/aftersale/getpresentaftersaleorder 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developers.weixin.qq.com/doc/store/shop/API/aftersale/getpresentaftersaleorder.html ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ChannelsECAftersaleGetPresentAftersaleOrderResponse> ExecuteChannelsECAftersaleGetPresentAftersaleOrderAsync(this WechatApiClient client, Models.ChannelsECAftersaleGetPresentAftersaleOrderRequest 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, "channels", "ec", "aftersale", "getpresentaftersaleorder")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendFlurlRequestAsJsonAsync<Models.ChannelsECAftersaleGetPresentAftersaleOrderResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region ECAftersale/Reason
/// <summary>
/// <para>异步调用 [POST] /channels/ec/aftersale/reason/get 接口。</para>

View File

@ -345,6 +345,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置买家用户 UnionId。
/// </summary>
[Newtonsoft.Json.JsonProperty("unionid")]
[System.Text.Json.Serialization.JsonPropertyName("unionid")]
public string? UnionId { get; set; }
/// <summary>
/// 获取或设置退款原因。
/// </summary>

View File

@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/aftersale/getpresentaftersalelist 接口的请求。</para>
/// </summary>
public class ChannelsECAftersaleGetPresentAftersaleListRequest : WechatApiRequest, IInferable<ChannelsECAftersaleGetPresentAftersaleListRequest, ChannelsECAftersaleGetPresentAftersaleListResponse>
{
/// <summary>
/// 获取或设置创建时间开始时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("begin_create_time")]
[System.Text.Json.Serialization.JsonPropertyName("begin_create_time")]
public long StartCreateTimestamp { get; set; }
/// <summary>
/// 获取或设置创建时间结束时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("end_create_time")]
[System.Text.Json.Serialization.JsonPropertyName("end_create_time")]
public long EndCreateTimestamp { get; set; }
/// <summary>
/// 获取或设置翻页标记。
/// </summary>
[Newtonsoft.Json.JsonProperty("next_key")]
[System.Text.Json.Serialization.JsonPropertyName("next_key")]
public string? Cursor { get; set; }
}
}

View File

@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/aftersale/getpresentaftersalelist 接口的响应。</para>
/// </summary>
public class ChannelsECAftersaleGetPresentAftersaleListResponse : WechatApiResponse
{
/// <summary>
/// 获取或设置售后单 ID 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("after_sale_order_id_list")]
[System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id_list")]
public string[] AftersaleOrderIdList { get; set; } = default!;
/// <summary>
/// 获取或设置翻页标记。
/// </summary>
[Newtonsoft.Json.JsonProperty("next_key")]
[System.Text.Json.Serialization.JsonPropertyName("next_key")]
public string? NextCursor { get; set; }
/// <summary>
/// 获取或设置是否还有更多。
/// </summary>
[Newtonsoft.Json.JsonProperty("has_more")]
[System.Text.Json.Serialization.JsonPropertyName("has_more")]
public bool HasMore { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/aftersale/getpresentaftersaleorder 接口的请求。</para>
/// </summary>
public class ChannelsECAftersaleGetPresentAftersaleOrderRequest : WechatApiRequest, IInferable<ChannelsECAftersaleGetPresentAftersaleOrderRequest, ChannelsECAftersaleGetPresentAftersaleOrderResponse>
{
/// <summary>
/// 获取或设置售后单 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("after_sale_order_id")]
[System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")]
public string AftersaleOrderId { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,153 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /channels/ec/aftersale/getpresentaftersaleorder 接口的响应。</para>
/// </summary>
public class ChannelsECAftersaleGetPresentAftersaleOrderResponse : WechatApiResponse
{
public static class Types
{
public class AftersaleOrder
{
public static class Types
{
public class Order
{
public static class Types
{
public class Product
{
/// <summary>
/// 获取或设置商品 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_id")]
[System.Text.Json.Serialization.JsonPropertyName("product_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public long ProductId { get; set; }
/// <summary>
/// 获取或设置 SKU ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("sku_id")]
[System.Text.Json.Serialization.JsonPropertyName("sku_id")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public long SKUId { get; set; }
/// <summary>
/// 获取或设置商品数量。
/// </summary>
[Newtonsoft.Json.JsonProperty("count")]
[System.Text.Json.Serialization.JsonPropertyName("count")]
public int Count { get; set; }
/// <summary>
/// 获取或设置退款信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_info")]
[System.Text.Json.Serialization.JsonPropertyName("refund_info")]
public Refund? Refund { get; set; }
}
}
/// <summary>
/// 获取或设置订单 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("order_id")]
[System.Text.Json.Serialization.JsonPropertyName("order_id")]
public string OrderId { get; set; } = default!;
/// <summary>
/// 获取或设置退款信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_info")]
[System.Text.Json.Serialization.JsonPropertyName("refund_info")]
public Refund? Refund { get; set; }
/// <summary>
/// 获取或设置商品列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("product_info_list")]
[System.Text.Json.Serialization.JsonPropertyName("product_info_list")]
public Types.Product[] ProductList { get; set; } = default!;
}
public class Refund : ChannelsECAftersaleGetAftersaleOrderResponse.Types.AftersaleOrder.Types.Refund
{
}
}
/// <summary>
/// 获取或设置售后单 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("after_sale_order_id")]
[System.Text.Json.Serialization.JsonPropertyName("after_sale_order_id")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringReadOnlyConverter))]
public string AftersaleOrderId { get; set; } = default!;
/// <summary>
/// 获取或设置礼物订单 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("present_order_id")]
[System.Text.Json.Serialization.JsonPropertyName("present_order_id")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringReadOnlyConverter))]
public string PresentOrderId { get; set; } = default!;
/// <summary>
/// 获取或设置售后单状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public string Status { get; set; } = default!;
/// <summary>
/// 获取或设置买家用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置买家用户 UnionId。
/// </summary>
[Newtonsoft.Json.JsonProperty("unionid")]
[System.Text.Json.Serialization.JsonPropertyName("unionid")]
public string? UnionId { get; set; }
/// <summary>
/// 获取或设置订单信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("order_info_list")]
[System.Text.Json.Serialization.JsonPropertyName("order_info_list")]
public Types.Order[] OrderList { get; set; } = default!;
/// <summary>
/// 获取或设置退款信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_info")]
[System.Text.Json.Serialization.JsonPropertyName("refund_info")]
public Types.Refund? Refund { get; set; }
/// <summary>
/// 获取或设置更新时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("update_time")]
[System.Text.Json.Serialization.JsonPropertyName("update_time")]
public long UpdateTimestamp { get; set; }
/// <summary>
/// 获取或设置创建时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("create_time")]
[System.Text.Json.Serialization.JsonPropertyName("create_time")]
public long CreateTimestamp { get; set; }
}
}
/// <summary>
/// 获取或设置售后单信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("after_sale_order")]
[System.Text.Json.Serialization.JsonPropertyName("after_sale_order")]
public Types.AftersaleOrder AftersaleOrder { get; set; } = default!;
}
}

View File

@ -0,0 +1,12 @@
{
"ToUserName": "gh_*",
"FromUserName": "OpenID",
"CreateTime": 1662480000,
"MsgType": "event",
"Event": "channels_ec_present_aftersale_update",
"finder_shop_present_aftersale_status_update": {
"status": "PLATFORM_REFUNDING",
"after_sale_order_id": "1234567",
"order_id": "12345"
}
}

View File

@ -0,0 +1,5 @@
{
"begin_create_time": 1658911158,
"end_create_time": 1658912158,
"next_key": "THE_NEXT_KEY"
}

View File

@ -0,0 +1,16 @@
{
"errcode": 0,
"errmsg": "ok",
"after_sale_order_id_list": [
"1934164653012121",
"1934161104780121",
"1934886755899121",
"1934380526967121",
"1934588095124121",
"1934923837729121",
"1934806194319121",
"1934790256816121"
],
"has_more": true,
"next_key": "THE_NEXT_KEY_NEW"
}

View File

@ -0,0 +1,49 @@
{
"errcode": 0,
"after_sale_order": {
"after_sale_order_id": "6000000000000001",
"present_order_id": "4200000000000001",
"status": "MERCHANT_REFUND_SUCCESS",
"openid": "OPENID",
"unionid": "UNIONID",
"create_time": 1591319454,
"update_time": 1612754444,
"refund_info": {
"amount": 100
},
"order_info_list": [
{
"order_id": "3700000000000001",
"refund_info": {
"amount": 51
},
"product_info_list": [
{
"product_id": "1111",
"sku_id": "2222",
"count": 1,
"refund_info": {
"amount": 51
}
}
]
},
{
"order_id": "3700000000000002",
"refund_info": {
"amount": 49
},
"product_info_list": [
{
"product_id": "3333",
"sku_id": "4444",
"count": 1,
"refund_info": {
"amount": 49
}
}
]
}
]
}
}