feat(tenpayv3): 新增服务商优惠费率活动相关接口

This commit is contained in:
Fu Diwei 2023-03-30 22:56:22 +08:00
parent 61a5169c15
commit bdd1ccac59
15 changed files with 413 additions and 4 deletions

View File

@ -64,6 +64,7 @@
| × | <del>其他能力:清关报关</del> | 直连商户 | 官方未提供 v3 API |
| √ | 其他能力:图片上传 | 直连商户 & 服务商 | |
| √ | 其他能力:视频上传 | 直连商户 & 服务商 | |
| √ | 其他能力:优惠费率活动 | 服务商 | |
| √ | 境外支付:子商户进件 | 服务商 | |
| √ | 境外支付:融合钱包 | 服务商 | |
| √ | 境外支付:报关 | 服务商 | |

View File

@ -0,0 +1,72 @@
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
/// <summary>
/// 为 <see cref="WechatTenpayClient"/> 提供优惠费率活动相关的 API 扩展方法。
/// </summary>
public static class WechatTenpayClientExecuteRateActivityExtensions
{
/// <summary>
/// <para>异步调用 [POST] /rate-activity/applications 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter4_7_1.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateRateActivityApplicationResponse> ExecuteCreateRateActivityApplicationAsync(this WechatTenpayClient client, Models.CreateRateActivityApplicationRequest 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, "rate-activity", "applications");
return await client.SendRequestWithJsonAsync<Models.CreateRateActivityApplicationResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [GET] /rate-activity/applications/id/{application_id} 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter4_7_2.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetRateActivityApplicationByApplicationIdResponse> ExecuteGetRateActivityApplicationByApplicationIdAsync(this WechatTenpayClient client, Models.GetRateActivityApplicationByApplicationIdRequest 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.Get, "rate-activity", "applications", "id", request.ApplicationId);
return await client.SendRequestWithJsonAsync<Models.GetRateActivityApplicationByApplicationIdResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [PATCH] /rate-activity/applications/id/{application_id} 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter4_7_3.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.UpdateRateActivityApplicationResponse> ExecuteUpdateRateActivityApplicationAsync(this WechatTenpayClient client, Models.UpdateRateActivityApplicationRequest 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, new HttpMethod("PATCH"), "rate-activity", "applications", "id", request.ApplicationId);
return await client.SendRequestWithJsonAsync<Models.UpdateRateActivityApplicationResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
}
}

View File

@ -75,7 +75,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
public string? State { get; set; }
}
public class AdditionalInfo
public class AdditionalInfomation
{
public static class Types
{
@ -237,6 +237,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// </summary>
[Newtonsoft.Json.JsonProperty("additional_info")]
[System.Text.Json.Serialization.JsonPropertyName("additional_info")]
public Types.AdditionalInfo? AdditionalInfo { get; set; }
public Types.AdditionalInfomation? AdditionalInfomation { get; set; }
}
}

View File

@ -26,7 +26,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
}
public class AdditionalInfo : GetMerchantServiceComplaintByComplaintIdResponse.Types.AdditionalInfo
public class AdditionalInfomation : GetMerchantServiceComplaintByComplaintIdResponse.Types.AdditionalInfomation
{
}
}
@ -160,7 +160,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// </summary>
[Newtonsoft.Json.JsonProperty("additional_info")]
[System.Text.Json.Serialization.JsonPropertyName("additional_info")]
public Types.AdditionalInfo? AdditionalInfo { get; set; }
public Types.AdditionalInfomation? AdditionalInfomation { get; set; }
}
}

View File

@ -0,0 +1,109 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /rate-activity/applications 接口的请求。</para>
/// </summary>
public class CreateRateActivityApplicationRequest : WechatTenpayRequest
{
public static class Types
{
public class ActivityDetail
{
public static class Types
{
public class Material
{
/// <summary>
/// 获取或设置材料 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("apply_material_id")]
[System.Text.Json.Serialization.JsonPropertyName("apply_material_id")]
public string? MaterialId { get; set; }
/// <summary>
/// 获取或设置材料 MediaId 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("apply_material_information")]
[System.Text.Json.Serialization.JsonPropertyName("apply_material_information")]
public IList<string>? MaterialMediaIdList { get; set; }
}
}
/// <summary>
/// 获取或设置活动 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_id")]
[System.Text.Json.Serialization.JsonPropertyName("activity_id")]
public string ActivityId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置活动费率字符串。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_rate")]
[System.Text.Json.Serialization.JsonPropertyName("activity_rate")]
public string? ActivityRateString { get; set; }
/// <summary>
/// 获取或设置申请材料列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_apply_information")]
[System.Text.Json.Serialization.JsonPropertyName("activity_apply_information")]
public IList<Types.Material>? MaterialList { get; set; }
}
public class AdditionalInfomation
{
/// <summary>
/// 获取或设置补充说明。
/// </summary>
[Newtonsoft.Json.JsonProperty("additional_message")]
[System.Text.Json.Serialization.JsonPropertyName("additional_message")]
public string? AdditionalMessage { get; set; }
/// <summary>
/// 获取或设置补充材料 MediaId 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("additional_material")]
[System.Text.Json.Serialization.JsonPropertyName("additional_material")]
public IList<string>? AdditionalMaterialMediaIdList { get; set; }
}
}
/// <summary>
/// 获取或设置从业机构号。
/// </summary>
[Newtonsoft.Json.JsonProperty("acquiring_bank_id")]
[System.Text.Json.Serialization.JsonPropertyName("acquiring_bank_id")]
public string AcquiringBankId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置渠道商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("channel_id")]
[System.Text.Json.Serialization.JsonPropertyName("channel_id")]
public string ChannelId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置从业机构特约商户号 。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string SubMerchantId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置报名活动详情。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_detail")]
[System.Text.Json.Serialization.JsonPropertyName("activity_detail")]
public Types.ActivityDetail ActivityDetail { get; set; } = new Types.ActivityDetail();
/// <summary>
/// 获取或设置补充信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("additional_information")]
[System.Text.Json.Serialization.JsonPropertyName("additional_information")]
public Types.AdditionalInfomation? AdditionalInfomation { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /rate-activity/applications 接口的响应。</para>
/// </summary>
public class CreateRateActivityApplicationResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("application_id")]
[System.Text.Json.Serialization.JsonPropertyName("application_id")]
public string ApplicationId { get; set; } = default!;
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /rate-activity/applications/id/{application_id} 接口的请求。</para>
/// </summary>
public class GetRateActivityApplicationByApplicationIdRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string ApplicationId { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,47 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /rate-activity/applications/id/{application_id} 接口的响应。</para>
/// </summary>
public class GetRateActivityApplicationByApplicationIdResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("application_state")]
[System.Text.Json.Serialization.JsonPropertyName("application_state")]
public string ApplicationState { get; set; } = default!;
/// <summary>
/// 获取或设置从业机构特约商户号 。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string SubMerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置驳回参数。
/// </summary>
[Newtonsoft.Json.JsonProperty("reject_parameter")]
[System.Text.Json.Serialization.JsonPropertyName("reject_parameter")]
public string? RejectParameter { get; set; }
/// <summary>
/// 获取或设置驳回原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("reject_reason")]
[System.Text.Json.Serialization.JsonPropertyName("reject_reason")]
public string? RejectReason { get; set; }
/// <summary>
/// 获取或设置审核通过时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("pass_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("pass_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
public DateTimeOffset? PassTime { get; set; }
}
}

View File

@ -0,0 +1,62 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [PATCH] /rate-activity/applications/id/{application_id} 接口的请求。</para>
/// </summary>
public class UpdateRateActivityApplicationRequest : WechatTenpayRequest
{
public static class Types
{
public class ActivityDetail
{
public static class Types
{
public class Material : CreateRateActivityApplicationRequest.Types.ActivityDetail.Types.Material
{
}
}
/// <summary>
/// 获取或设置活动费率字符串。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_rate")]
[System.Text.Json.Serialization.JsonPropertyName("activity_rate")]
public string? ActivityRateString { get; set; }
/// <summary>
/// 获取或设置申请材料列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_apply_information")]
[System.Text.Json.Serialization.JsonPropertyName("activity_apply_information")]
public IList<Types.Material>? MaterialList { get; set; }
}
public class AdditionalInfomation : CreateRateActivityApplicationRequest.Types.AdditionalInfomation
{
}
}
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string ApplicationId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置报名活动详情。
/// </summary>
[Newtonsoft.Json.JsonProperty("activity_detail_modification")]
[System.Text.Json.Serialization.JsonPropertyName("activity_detail_modification")]
public Types.ActivityDetail? ActivityDetail { get; set; }
/// <summary>
/// 获取或设置补充信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("additional_information")]
[System.Text.Json.Serialization.JsonPropertyName("additional_information")]
public Types.AdditionalInfomation? AdditionalInfomation { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [PATCH] /rate-activity/applications/id/{application_id} 接口的响应。</para>
/// </summary>
public class UpdateRateActivityApplicationResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("application_id")]
[System.Text.Json.Serialization.JsonPropertyName("application_id")]
public string ApplicationId { get; set; } = default!;
}
}

View File

@ -0,0 +1,32 @@
{
"acquiring_bank_id": "1356485",
"additional_information": {
"additional_message": "特殊情况,说明原因",
"additional_material": [
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo",
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo"
]
},
"activity_detail": {
"activity_id": "schoolcanteen_001",
"activity_rate": "0.6",
"activity_apply_information": [
{
"apply_material_id": "SCHOOL_QUALIFICATION_PROOF",
"apply_material_information": [
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo",
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo"
]
},
{
"apply_material_id": "CANTEEN_FRONT_PHOTO",
"apply_material_information": [
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo",
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo"
]
}
]
},
"sub_mchid": "1346578",
"channel_id": "20001111"
}

View File

@ -0,0 +1,3 @@
{
"application_id": "20000000011111"
}

View File

@ -0,0 +1,7 @@
{
"application_state": "APPLICATION_STATE_PASSED",
"sub_mchid": "1346578",
"reject_parameter": "merchant_name",
"reject_reason": "公司名称与工商局登记不一致",
"pass_time": "2015-05-20T13:29:35+08:00"
}

View File

@ -0,0 +1,28 @@
{
"additional_information": {
"additional_message": "特殊情况,说明原因",
"additional_material": [
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo",
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo"
]
},
"activity_detail_modification": {
"activity_rate": "0.6",
"activity_apply_information": [
{
"apply_material_id": "SCHOOL_QUALIFICATION_PROOF",
"apply_material_information": [
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo",
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo"
]
},
{
"apply_material_id": "CANTEEN_FRONT_PHOTO",
"apply_material_information": [
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo",
"0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo"
]
}
]
}
}

View File

@ -0,0 +1,3 @@
{
"application_id": "20000000011111"
}