feat(tenpayv3): 新增微信全数电发票相关接口

This commit is contained in:
Fu Diwei
2025-09-24 20:55:14 +08:00
parent d2c1a8bb55
commit 449d605c98
35 changed files with 1522 additions and 213 deletions

View File

@@ -485,7 +485,7 @@
- 获取用户填写的抬头:`GetNewTaxControlFapiaoUserTitle`
- 区块链电子发票 API
- 区块链电子发票
- 获取商户开票基础信息:`GetNewTaxControlFapiaoMerchantBaseInformation`
@@ -1271,6 +1271,10 @@
- 开具电子发票:`CreateNewTaxControlFapiaoApplication`
- 开具通用行业电子发票:`CreateNewTaxControlFapiaoApplicationIssueGeneral`
- 开具不动产租赁行业电子发票:`CreateNewTaxControlFapiaoApplicationRealEstateLeasing`
- 上传电子发票文件:`UploadNewTaxControlFapiaoApplicationFapiaoFile`
- 查询电子发票:`GetNewTaxControlFapiaoApplicationByFapiaoApplyId`
@@ -1283,6 +1287,12 @@
- 下载发票文件:`DownloadNewTaxControlFapiaoApplicationFile`
- 电子发票服务商邀请
- 获取邀请商户开通服务商电子发票能力:`GetNewTaxControlFapiaoMerchantServicePartnerInviteUrl`
- 获取邀请开通的商户信息:`QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchants`
- 电子发票商户信息
- 获取商户开票基础信息:`GetNewTaxControlFapiaoMerchantBaseInformation`
@@ -1293,7 +1303,7 @@
- 获取商品和服务税收分类对照表:`QueryNewTaxControlFapiaoMerchantTaxCodes`
- 检查子商户开票功能状态:`CheckNewTaxControlFapiaoMerchant`
- 检查子商户开票功能状态:`CheckNewTaxControlFapiaoMerchant` / `CheckNewTaxControlFapiaoMerchantStatus`
- 用户抬头

View File

@@ -75,8 +75,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (request.FileName is null)
request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png";
if (request.FileDigest is null)
request.FileDigest = EncodedString.ToHexString(Utilities.SHA256Utility.Hash(request.FileBytes)).Value!.ToUpper();
if (request.FileHash is null)
request.FileHash = EncodedString.ToHexString(Utilities.SHA256Utility.Hash(request.FileBytes)).Value!.ToUpper();
if (request.FileContentType is null)
request.FileContentType = MimeTypes.GetMimeMapping(request.FileName!);

View File

@@ -6,6 +6,8 @@ using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
using SKIT.FlurlHttpClient.Primitives;
public static class WechatTenpayClientExecuteNewTaxControlFapiaoExtensions
{
#region CardTemplate
@@ -14,7 +16,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012529382 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474026 ]]>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474026 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792562 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
@@ -33,6 +36,309 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
}
#endregion
#region FapiaoApplications
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538301 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474060 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateNewTaxControlFapiaoApplicationResponse> ExecuteCreateNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationRequest 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, "new-tax-control-fapiao", "fapiao-applications");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateNewTaxControlFapiaoApplicationResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/issue-general 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792574 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateNewTaxControlFapiaoApplicationIssueGeneralResponse> ExecuteCreateNewTaxControlFapiaoApplicationIssueGeneralAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationIssueGeneralRequest 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, "new-tax-control-fapiao", "fapiao-applications", "issue-general");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateNewTaxControlFapiaoApplicationIssueGeneralResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/real-estate-leasing 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015941740 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse> ExecuteCreateNewTaxControlFapiaoApplicationRealEstateLeasingAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest 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, "new-tax-control-fapiao", "fapiao-applications", "real-estate-leasing");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538327 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474062 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792575 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ReverseNewTaxControlFapiaoApplicationResponse> ExecuteReverseNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.ReverseNewTaxControlFapiaoApplicationRequest 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, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "reverse");
return await client.SendFlurlRequestAsJsonAsync<Models.ReverseNewTaxControlFapiaoApplicationResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012531753 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012489258 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792567 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse> ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest 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.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId)
.SetQueryParam("sub_mchid", request.SubMerchantId)
.SetQueryParam("fapiao_id", request.FapiaoId);
return await client.SendFlurlRequestAsJsonAsync<Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538335 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474067 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792576 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetNewTaxControlFapiaoApplicationFilesResponse> ExecuteGetNewTaxControlFapiaoApplicationFilesAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationFilesRequest 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.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "fapiao-files")
.SetQueryParam("sub_mchid", request.SubMerchantId)
.SetQueryParam("fapiao_id", request.FapiaoId);
return await client.SendFlurlRequestAsJsonAsync<Models.GetNewTaxControlFapiaoApplicationFilesResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /{download_url} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012286040 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012071750 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792569 ]]>
/// </para>
/// <para><i>(请注意此接口不受构造 <see cref="WechatTenpayClient" /> 时指定的 <see cref="WechatTenpayClientOptions.Endpoint"/> 参数控制。)</i></para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.DownloadNewTaxControlFapiaoApplicationFileResponse> ExecuteDownloadNewTaxControlFapiaoApplicationFileAsync(this WechatTenpayClient client, Models.DownloadNewTaxControlFapiaoApplicationFileRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Get, request.DownloadUrl)
.WithUrl(request.DownloadUrl)
.SetQueryParam("mchid", request.MerchantId)
.SetQueryParam("sub_mchid", request.SubMerchantId)
.SetQueryParam("openid", request.OpenId)
.SetQueryParam("fapiao_id", request.FapiaoId)
.SetQueryParam("invoice_code", request.FapiaoCode)
.SetQueryParam("invoice_no", request.FapiaoNumber);
return await client.SendFlurlRequestAsJsonAsync<Models.DownloadNewTaxControlFapiaoApplicationFileResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012556605 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012696830 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792580 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.UploadNewTaxControlFapiaoApplicationFapiaoFileResponse> ExecuteUploadNewTaxControlFapiaoApplicationFapiaoFileAsync(this WechatTenpayClient client, Models.UploadNewTaxControlFapiaoApplicationFapiaoFileRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.FileHashAlgorithm is null)
{
request.FileHashAlgorithm = "SM3";
}
if (request.FileHash is null)
{
switch (request.FileHashAlgorithm)
{
case "SM3":
request.FileHash = EncodedString.ToHexString(Utilities.SM3Utility.Hash(request.FileBytes)).Value!.ToLower();
break;
}
}
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "new-tax-control-fapiao", "fapiao-applications", "upload-fapiao-file");
using var httpContent = Utilities.HttpContentBuilder.BuildWithFile(fileName: "file.pdf", fileBytes: request.FileBytes, fileContentType: "application/pdf", fileMetaJson: client.JsonSerializer.Serialize(request));
return await client.SendFlurlRequestAsync<Models.UploadNewTaxControlFapiaoApplicationFapiaoFileResponse>(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538365 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474078 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792579 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateNewTaxControlFapiaoApplicationCardResponse> ExecuteCreateNewTaxControlFapiaoApplicationCardAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationCardRequest 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, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "insert-cards");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateNewTaxControlFapiaoApplicationCardResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region FapiaoMerchant
/// <summary>
/// <para>异步调用 [GET] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015941495 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse> ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest 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.Get, "new-tax-control-fapiao", "fapiaomerchant", "getspinviteurl")
.SetQueryParam("operation_type", request.OperationType)
.SetQueryParam("operate_user", request.OperateUser)
.SetQueryParam("fapiao_mode", request.FapiaoMode)
.SetQueryParam("fapiao_ability_type_list", request.FapiaoAbilityTypeList is not null ? string.Join(",", request.FapiaoAbilityTypeList) : null)
.SetQueryParam("invite_channel", request.InviteChannel)
.SetQueryParam("invite_code", request.InviteCode)
.SetQueryParam("sub_mchid", request.SubMerchantId);
return await client.SendFlurlRequestAsJsonAsync<Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /new-tax-control-fapiao/fapiaomerchant/listspinvitemchinfo 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015941524 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse> ExecuteQueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsAsync(this WechatTenpayClient client, Models.QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest 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.Get, "new-tax-control-fapiao", "fapiaomerchant", "getspinviteurl")
.SetQueryParam("query_time_start", request.QueryStartTime.HasValue ? request.QueryStartTime.Value.ToString("yyyy-MM-dd'T'HH:mm:sszzz") : null)
.SetQueryParam("query_time_end", request.QueryEndTime.HasValue ? request.QueryEndTime.Value.ToString("yyyy-MM-dd'T'HH:mm:sszzz") : null)
.SetQueryParam("invite_code", request.InviteCode)
.SetQueryParam("mch_invite_status", request.InviteCode)
.SetQueryParam("offset", request.Offset)
.SetQueryParam("limit", request.Limit);
return await client.SendFlurlRequestAsJsonAsync<Models.QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region Merchant
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check 接口。</para>
@@ -56,6 +362,28 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendFlurlRequestAsJsonAsync<Models.CheckNewTaxControlFapiaoMerchantResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check-status 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792561 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CheckNewTaxControlFapiaoMerchantStatusResponse> ExecuteCheckNewTaxControlFapiaoMerchantStatusAsync(this WechatTenpayClient client, Models.CheckNewTaxControlFapiaoMerchantStatusRequest 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, "new-tax-control-fapiao", "merchant", request.SubMerchantId, "check-status");
return await client.SendFlurlRequestAsJsonAsync<Models.CheckNewTaxControlFapiaoMerchantStatusResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口。</para>
/// <para>
@@ -108,7 +436,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538180 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474053 ]]>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474053 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015792563 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
@@ -160,7 +489,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538106 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474040 ]]>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474040 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015770776 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
@@ -194,7 +524,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538112 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474048 ]]>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474048 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015784260 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
@@ -215,184 +546,5 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendFlurlRequestAsJsonAsync<Models.GetNewTaxControlFapiaoUserTitleResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region FapiaoApplication
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538301 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474060 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateNewTaxControlFapiaoApplicationResponse> ExecuteCreateNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationRequest 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, "new-tax-control-fapiao", "fapiao-applications");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateNewTaxControlFapiaoApplicationResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/reverse 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538327 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474062 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ReverseNewTaxControlFapiaoApplicationResponse> ExecuteReverseNewTaxControlFapiaoApplicationAsync(this WechatTenpayClient client, Models.ReverseNewTaxControlFapiaoApplicationRequest 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, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "reverse");
return await client.SendFlurlRequestAsJsonAsync<Models.ReverseNewTaxControlFapiaoApplicationResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012531753 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012489258 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse> ExecuteGetNewTaxControlFapiaoApplicationByFapiaoApplyIdAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdRequest 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.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId)
.SetQueryParam("sub_mchid", request.SubMerchantId)
.SetQueryParam("fapiao_id", request.FapiaoId);
return await client.SendFlurlRequestAsJsonAsync<Models.GetNewTaxControlFapiaoApplicationByFapiaoApplyIdResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/fapiao-files 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538335 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474067 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetNewTaxControlFapiaoApplicationFilesResponse> ExecuteGetNewTaxControlFapiaoApplicationFilesAsync(this WechatTenpayClient client, Models.GetNewTaxControlFapiaoApplicationFilesRequest 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.Get, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "fapiao-files")
.SetQueryParam("sub_mchid", request.SubMerchantId)
.SetQueryParam("fapiao_id", request.FapiaoId);
return await client.SendFlurlRequestAsJsonAsync<Models.GetNewTaxControlFapiaoApplicationFilesResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /{download_url} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012286040 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012071750 ]]>
/// </para>
/// <para><i>(请注意此接口不受构造 <see cref="WechatTenpayClient" /> 时指定的 <see cref="WechatTenpayClientOptions.Endpoint"/> 参数控制。)</i></para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.DownloadNewTaxControlFapiaoApplicationFileResponse> ExecuteDownloadNewTaxControlFapiaoApplicationFileAsync(this WechatTenpayClient client, Models.DownloadNewTaxControlFapiaoApplicationFileRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Get, request.DownloadUrl)
.WithUrl(request.DownloadUrl)
.SetQueryParam("mchid", request.MerchantId)
.SetQueryParam("sub_mchid", request.SubMerchantId)
.SetQueryParam("openid", request.OpenId)
.SetQueryParam("fapiao_id", request.FapiaoId)
.SetQueryParam("invoice_code", request.FapiaoCode)
.SetQueryParam("invoice_no", request.FapiaoNumber);
return await client.SendFlurlRequestAsJsonAsync<Models.DownloadNewTaxControlFapiaoApplicationFileResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/upload-fapiao-file 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012556605 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012696830 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.UploadNewTaxControlFapiaoApplicationFapiaoFileResponse> ExecuteUploadNewTaxControlFapiaoApplicationFapiaoFileAsync(this WechatTenpayClient client, Models.UploadNewTaxControlFapiaoApplicationFapiaoFileRequest 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, "new-tax-control-fapiao", "fapiao-applications", "upload-fapiao-file");
using var httpContent = Utilities.HttpContentBuilder.BuildWithFile(fileName: "file.pdf", fileBytes: request.FileBytes, fileContentType: "application/pdf", fileMetaJson: client.JsonSerializer.Serialize(request));
return await client.SendFlurlRequestAsync<Models.UploadNewTaxControlFapiaoApplicationFapiaoFileResponse>(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}/insert-cards 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/merchant/4012538365 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012474078 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateNewTaxControlFapiaoApplicationCardResponse> ExecuteCreateNewTaxControlFapiaoApplicationCardAsync(this WechatTenpayClient client, Models.CreateNewTaxControlFapiaoApplicationCardRequest 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, "new-tax-control-fapiao", "fapiao-applications", request.FapiaoApplyId, "insert-cards");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateNewTaxControlFapiaoApplicationCardResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
}
}

View File

@@ -6,6 +6,8 @@ using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
using SKIT.FlurlHttpClient.Primitives;
public static class WechatTenpayClientExecuteTaxiInvoiceExtensions
{
#region TaxiCompany
@@ -219,6 +221,21 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.FileHashAlgorithm is null)
{
request.FileHashAlgorithm = "SM3";
}
if (request.FileHash is null)
{
switch (request.FileHashAlgorithm)
{
case "SM3":
request.FileHash = EncodedString.ToHexString(Utilities.SM3Utility.Hash(request.FileBytes)).Value!.ToLower();
break;
}
}
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "taxi-invoice", "cards", "upload-file");

View File

@@ -0,0 +1,163 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /new-tax-control-fapiao/fapiao-applications/issue-general 接口的请求。</para>
/// </summary>
[WechatTenpaySensitive]
public class CreateNewTaxControlFapiaoApplicationIssueGeneralRequest : WechatTenpayRequest
{
public static class Types
{
public class Buyer : CreateNewTaxControlFapiaoApplicationRequest.Types.Buyer
{
}
public class FapiaoInfo
{
public static class Types
{
public class Item : CreateNewTaxControlFapiaoApplicationRequest.Types.Fapiao.Types.Item
{
/// <summary>
/// 获取或设置优惠政策标识。
/// </summary>
[Newtonsoft.Json.JsonProperty("preferential_policy_code")]
[System.Text.Json.Serialization.JsonPropertyName("preferential_policy_code")]
public int? PreferentialPolicyCode { get; set; }
}
public class Transaction
{
/// <summary>
/// 获取或设置支付渠道。
/// </summary>
[Newtonsoft.Json.JsonProperty("pay_channel")]
[System.Text.Json.Serialization.JsonPropertyName("pay_channel")]
public string PayChannel { get; set; } = string.Empty;
/// <summary>
/// 获取或设置微信支付交易单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("transaction_id")]
[System.Text.Json.Serialization.JsonPropertyName("transaction_id")]
public string? TransactionId { get; set; }
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_trade_no")]
public string? OutTradeNumber { get; set; }
/// <summary>
/// 获取或设置交易金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public int Amount { get; set; }
}
}
/// <summary>
/// 获取或设置商户发票单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_id")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_id")]
public string FapiaoId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置总价税合计(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("total_amount")]
[System.Text.Json.Serialization.JsonPropertyName("total_amount")]
public int TotalAmount { get; set; }
/// <summary>
/// 获取或设置发票行列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("items")]
[System.Text.Json.Serialization.JsonPropertyName("items")]
public IList<Types.Item>? ItemList { get; set; }
/// <summary>
/// 获取或设置交易信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("transaction_information")]
[System.Text.Json.Serialization.JsonPropertyName("transaction_information")]
public IList<Types.Transaction>? TransactionList { get; set; }
/// <summary>
/// 获取或设置出口业务适用政策代码。
/// </summary>
[Newtonsoft.Json.JsonProperty("export_business_policy_code")]
[System.Text.Json.Serialization.JsonPropertyName("export_business_policy_code")]
public int? ExportBusinessPolicyCode { get; set; }
/// <summary>
/// 获取或设置增值税即征即退代码。
/// </summary>
[Newtonsoft.Json.JsonProperty("vat_refund_levy_code")]
[System.Text.Json.Serialization.JsonPropertyName("vat_refund_levy_code")]
public int? VATRefundLevyCode { get; set; }
/// <summary>
/// 获取或设置开票人 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("billing_person_id")]
[System.Text.Json.Serialization.JsonPropertyName("billing_person_id")]
public string BillingPersonId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置开票人姓名。
/// </summary>
[Newtonsoft.Json.JsonProperty("billing_person")]
[System.Text.Json.Serialization.JsonPropertyName("billing_person")]
public string? BillingPersonName { get; set; }
/// <summary>
/// 获取或设置开具发票类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_bill_type")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")]
public string? FapiaoBillType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置备注信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("remark")]
[System.Text.Json.Serialization.JsonPropertyName("remark")]
public string? Remark { get; set; }
}
}
/// <summary>
/// 获取或设置子商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string? SubMerchantId { get; set; }
/// <summary>
/// 获取或设置发票申请单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_apply_id")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_apply_id")]
public string FapiaoApplyId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置购买方信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("buyer_information")]
[System.Text.Json.Serialization.JsonPropertyName("buyer_information")]
public Types.Buyer Buyer { get; set; } = new Types.Buyer();
/// <summary>
/// 获取或设置电子发票信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_information")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_information")]
public Types.FapiaoInfo FapiaoInfo { get; set; } = new Types.FapiaoInfo();
}
}

View File

@@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /new-tax-control-fapiao/fapiao-applications/issue-general 接口的响应。</para>
/// </summary>
public class CreateNewTaxControlFapiaoApplicationIssueGeneralResponse : WechatTenpayResponse
{
}
}

View File

@@ -0,0 +1,205 @@
using System;
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /new-tax-control-fapiao/fapiao-applications/real-estate-leasing 接口的请求。</para>
/// </summary>
[WechatTenpaySensitive]
public class CreateNewTaxControlFapiaoApplicationRealEstateLeasingRequest : WechatTenpayRequest
{
public static class Types
{
public class Buyer : CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.Types.Buyer
{
}
public class FapiaoInfo
{
public static class Types
{
public class Item : CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.Types.FapiaoInfo.Types.Item
{
public static class Types
{
public class RealEstateLeasingInformation
{
/// <summary>
/// 获取或设置省份。
/// </summary>
[Newtonsoft.Json.JsonProperty("province")]
[System.Text.Json.Serialization.JsonPropertyName("province")]
public string? Province { get; set; }
/// <summary>
/// 获取或设置城市。
/// </summary>
[Newtonsoft.Json.JsonProperty("city")]
[System.Text.Json.Serialization.JsonPropertyName("city")]
public string? City { get; set; }
/// <summary>
/// 获取或设置详细地址。
/// </summary>
[Newtonsoft.Json.JsonProperty("address")]
[System.Text.Json.Serialization.JsonPropertyName("address")]
public string Address { get; set; } = string.Empty;
/// <summary>
/// 获取或设置是否跨市。
/// </summary>
[Newtonsoft.Json.JsonProperty("cross_city_flag")]
[System.Text.Json.Serialization.JsonPropertyName("cross_city_flag")]
public bool IsCrossCity { get; set; }
/// <summary>
/// 获取或设置租赁起始日期。
/// </summary>
[Newtonsoft.Json.JsonProperty("lease_period_start")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("lease_period_start")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
public DateTimeOffset LeasePeriodStartDate { get; set; }
/// <summary>
/// 获取或设置租赁截止日期。
/// </summary>
[Newtonsoft.Json.JsonProperty("lease_period_end")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("lease_period_end")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
public DateTimeOffset LeasePeriodEndDate { get; set; }
/// <summary>
/// 获取或设置产权证或不动产权证号(需使用平台公钥/证书加密)。
/// </summary>
[Newtonsoft.Json.JsonProperty("certificate_no")]
[System.Text.Json.Serialization.JsonPropertyName("certificate_no")]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string? CertificateNumber { get; set; }
/// <summary>
/// 获取或设置车牌号列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("plate_no")]
[System.Text.Json.Serialization.JsonPropertyName("plate_no")]
public IList<string>? PlateNumberList { get; set; }
}
}
/// <summary>
/// 获取或设置不动产租赁特定行业额外信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("real_estate_leasing_information")]
[System.Text.Json.Serialization.JsonPropertyName("real_estate_leasing_information")]
public Types.RealEstateLeasingInformation? RealEstateLeasingInformation { get; set; }
}
public class Transaction : CreateNewTaxControlFapiaoApplicationIssueGeneralRequest.Types.FapiaoInfo.Types.Transaction
{
}
}
/// <summary>
/// 获取或设置商户发票单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_id")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_id")]
public string FapiaoId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置总价税合计(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("total_amount")]
[System.Text.Json.Serialization.JsonPropertyName("total_amount")]
public int TotalAmount { get; set; }
/// <summary>
/// 获取或设置发票行列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("items")]
[System.Text.Json.Serialization.JsonPropertyName("items")]
public IList<Types.Item>? ItemList { get; set; }
/// <summary>
/// 获取或设置交易信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("transaction_information")]
[System.Text.Json.Serialization.JsonPropertyName("transaction_information")]
public IList<Types.Transaction>? TransactionList { get; set; }
/// <summary>
/// 获取或设置出口业务适用政策代码。
/// </summary>
[Newtonsoft.Json.JsonProperty("export_business_policy_code")]
[System.Text.Json.Serialization.JsonPropertyName("export_business_policy_code")]
public int? ExportBusinessPolicyCode { get; set; }
/// <summary>
/// 获取或设置增值税即征即退代码。
/// </summary>
[Newtonsoft.Json.JsonProperty("vat_refund_levy_code")]
[System.Text.Json.Serialization.JsonPropertyName("vat_refund_levy_code")]
public int? VATRefundLevyCode { get; set; }
/// <summary>
/// 获取或设置开票人 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("billing_person_id")]
[System.Text.Json.Serialization.JsonPropertyName("billing_person_id")]
public string BillingPersonId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置开票人姓名。
/// </summary>
[Newtonsoft.Json.JsonProperty("billing_person")]
[System.Text.Json.Serialization.JsonPropertyName("billing_person")]
public string? BillingPersonName { get; set; }
/// <summary>
/// 获取或设置开具发票类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_bill_type")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")]
public string? FapiaoBillType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置备注信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("remark")]
[System.Text.Json.Serialization.JsonPropertyName("remark")]
public string? Remark { get; set; }
}
}
/// <summary>
/// 获取或设置子商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string? SubMerchantId { get; set; }
/// <summary>
/// 获取或设置发票申请单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_apply_id")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_apply_id")]
public string FapiaoApplyId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置购买方信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("buyer_information")]
[System.Text.Json.Serialization.JsonPropertyName("buyer_information")]
public Types.Buyer Buyer { get; set; } = new Types.Buyer();
/// <summary>
/// 获取或设置电子发票信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_information")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_information")]
public Types.FapiaoInfo FapiaoInfo { get; set; } = new Types.FapiaoInfo();
}
}

View File

@@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /new-tax-control-fapiao/fapiao-applications/real-estate-leasing 接口的响应。</para>
/// </summary>
public class CreateNewTaxControlFapiaoApplicationRealEstateLeasingResponse : WechatTenpayResponse
{
}
}

View File

@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
@@ -79,6 +78,34 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string? UserEmail { get; set; }
/// <summary>
/// 获取或设置订单金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public int? Amount { get; set; }
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_trade_no")]
public string? OutTradeNumber { get; set; }
/// <summary>
/// 获取或设置开具发票类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_bill_type")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")]
public string? FapiaoBillType { get; set; }
/// <summary>
/// 获取或设置用户留言信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("user_apply_message")]
[System.Text.Json.Serialization.JsonPropertyName("user_apply_message")]
public string? UserApplyMessage { get; set; }
}
public class Fapiao

View File

@@ -160,6 +160,34 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string? UserEmail { get; set; }
/// <summary>
/// 获取或设置订单金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public int? Amount { get; set; }
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_trade_no")]
public string? OutTradeNumber { get; set; }
/// <summary>
/// 获取或设置开具发票类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_bill_type")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")]
public string? FapiaoBillType { get; set; }
/// <summary>
/// 获取或设置用户留言信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("user_apply_message")]
[System.Text.Json.Serialization.JsonPropertyName("user_apply_message")]
public string? UserApplyMessage { get; set; }
}
public class Seller : GetNewTaxControlFapiaoMerchantBaseInformationResponse.Types.Seller
@@ -368,6 +396,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[Newtonsoft.Json.JsonProperty("remark")]
[System.Text.Json.Serialization.JsonPropertyName("remark")]
public string? Remark { get; set; }
/// <summary>
/// 获取或设置开票失败错误码。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_error_code")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_error_code")]
public string? FapiaoErrorCode { get; set; }
/// <summary>
/// 获取或设置开票失败错误信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_error_message")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_error_message")]
public string? FapiaoErrorMessage { get; set; }
}
}

View File

@@ -31,16 +31,17 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// <summary>
/// 获取或设置文件内容哈希算法。
/// <para>默认值:"SM3"</para>
/// </summary>
[Newtonsoft.Json.JsonProperty("digest_alogrithm")]
[System.Text.Json.Serialization.JsonPropertyName("digest_alogrithm")]
public string FileHashAlgorithm { get; set; } = string.Empty;
public string FileHashAlgorithm { get; set; } = "SM3";
/// <summary>
/// 获取或设置文件内容哈希值。
/// 获取或设置文件内容哈希值。如果不指定将由系统自动生成。
/// </summary>
[Newtonsoft.Json.JsonProperty("digest")]
[System.Text.Json.Serialization.JsonPropertyName("digest")]
public string FileHashValue { get; set; } = string.Empty;
public string? FileHash { get; set; }
}
}

View File

@@ -0,0 +1,62 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl 接口的请求。</para>
/// </summary>
[WechatTenpaySensitive]
public class GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置操作类型。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string OperationType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置操作人员(需使用平台公钥/证书加密)。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string? OperateUser { get; set; }
/// <summary>
/// 获取或设置开票模式。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string FapiaoMode { get; set; } = string.Empty;
/// <summary>
/// 获取或设置发票能力类型。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public IList<string>? FapiaoAbilityTypeList { get; set; }
/// <summary>
/// 获取或设置服务商邀请渠道。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string? InviteChannel { get; set; }
/// <summary>
/// 获取或设置邀请码。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string InviteCode { get; set; } = string.Empty;
/// <summary>
/// 获取或设置受邀商户号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string? SubMerchantId { get; set; }
}
}

View File

@@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl 接口的响应。</para>
/// </summary>
public class GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置邀请开通二维码链接。
/// </summary>
[Newtonsoft.Json.JsonProperty("invite_url")]
[System.Text.Json.Serialization.JsonPropertyName("invite_url")]
public string InviteUrl { get; set; } = default!;
/// <summary>
/// 获取或设置开通小程序 AppId。
/// </summary>
[Newtonsoft.Json.JsonProperty("miniprogram_appid")]
[System.Text.Json.Serialization.JsonPropertyName("miniprogram_appid")]
public string MiniProgramAppId { get; set; } = default!;
/// <summary>
/// 获取或设置开通小程序页面路径。
/// </summary>
[Newtonsoft.Json.JsonProperty("miniprogram_path")]
[System.Text.Json.Serialization.JsonPropertyName("miniprogram_path")]
public string MiniProgramPagePath { get; set; } = default!;
}
}

View File

@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /new-tax-control-fapiao/fapiaomerchant/listspinvitemchinfo 接口的请求。</para>
/// </summary>
public class QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置查询起始时间。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public DateTimeOffset? QueryStartTime { get; set; }
/// <summary>
/// 获取或设置查询截止时间。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public DateTimeOffset? QueryEndTime { get; set; }
/// <summary>
/// 获取或设置分页大小。
/// <para>默认值0</para>
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public int Limit { get; set; } = 0;
/// <summary>
/// 获取或设置分页开始位置。
/// <para>默认值10</para>
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public int Offset { get; set; } = 10;
/// <summary>
/// 获取或设置邀请码。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string? InviteCode { get; set; }
/// <summary>
/// 获取或设置商户邀请状态。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string? MerchantInviteStatus { get; set; }
}
}

View File

@@ -0,0 +1,103 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /new-tax-control-fapiao/fapiaomerchant/listspinvitemchinfo 接口的响应。</para>
/// </summary>
public class QueryNewTaxControlFapiaoMerchantServicePartnerInvitedMerchantsResponse : WechatTenpayResponse
{
public static class Types
{
public class MerchantInviteResult
{
/// <summary>
/// 获取或设置受邀商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string? SubMerchantId { get; set; }
/// <summary>
/// 获取或设置商户邀请状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_invite_status")]
[System.Text.Json.Serialization.JsonPropertyName("mch_invite_status")]
public string MerchantInviteStatus { get; set; } = default!;
/// <summary>
/// 获取或设置商户名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("ep_name")]
[System.Text.Json.Serialization.JsonPropertyName("ep_name")]
public string MerchantName { get; set; } = default!;
/// <summary>
/// 获取或设置商户税号。
/// </summary>
[Newtonsoft.Json.JsonProperty("tax_id")]
[System.Text.Json.Serialization.JsonPropertyName("tax_id")]
public string TaxId { get; set; } = default!;
/// <summary>
/// 获取或设置邀请码。
/// </summary>
[Newtonsoft.Json.JsonProperty("invite_code")]
[System.Text.Json.Serialization.JsonPropertyName("invite_code")]
public string InviteCode { get; set; } = default!;
/// <summary>
/// 获取或设置操作时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("operate_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("operate_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
public DateTimeOffset OperateTime { get; set; }
/// <summary>
/// 获取或设置邀请失败错误码。
/// </summary>
[Newtonsoft.Json.JsonProperty("invite_failed_code")]
[System.Text.Json.Serialization.JsonPropertyName("invite_failed_code")]
public string? InviteFailCode { get; set; }
/// <summary>
/// 获取或设置邀请失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("invite_failed_reason")]
[System.Text.Json.Serialization.JsonPropertyName("invite_failed_reason")]
public string? InviteFailReason { get; set; }
}
}
/// <summary>
/// 获取或设置邀请的商户结果列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("mch_invite_result_list")]
[System.Text.Json.Serialization.JsonPropertyName("mch_invite_result_list")]
public Types.MerchantInviteResult[] MerchantInviteResultList { get; set; } = default!;
/// <summary>
/// 获取或设置总数量。
/// </summary>
[Newtonsoft.Json.JsonProperty("total_count")]
[System.Text.Json.Serialization.JsonPropertyName("total_count")]
[System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)]
public int TotalCount { get; set; }
/// <summary>
/// 获取或设置分页大小。
/// </summary>
[Newtonsoft.Json.JsonProperty("limit")]
[System.Text.Json.Serialization.JsonPropertyName("limit")]
public int Limit { get; set; }
/// <summary>
/// 获取或设置分页开始位置。
/// </summary>
[Newtonsoft.Json.JsonProperty("offset")]
[System.Text.Json.Serialization.JsonPropertyName("offset")]
public int Offset { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check-status 接口的请求。</para>
/// </summary>
public class CheckNewTaxControlFapiaoMerchantStatusRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置子商户号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string SubMerchantId { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,137 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /new-tax-control-fapiao/merchant/{sub_mchid}/check-status 接口的响应。</para>
/// </summary>
public class CheckNewTaxControlFapiaoMerchantStatusResponse : WechatTenpayResponse
{
public static class Types
{
public class ThirdPartyMode
{
/// <summary>
/// 获取或设置接入状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public string Status { get; set; } = default!;
}
public class DigitalTaxMode
{
public static class Types
{
public class BillingPerson
{
/// <summary>
/// 获取或设置开票人 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("id")]
[System.Text.Json.Serialization.JsonPropertyName("id")]
public string Id { get; set; } = default!;
/// <summary>
/// 获取或设置开票人姓名。
/// </summary>
[Newtonsoft.Json.JsonProperty("name")]
[System.Text.Json.Serialization.JsonPropertyName("name")]
public string Name { get; set; } = default!;
}
public class Ability
{
/// <summary>
/// 获取或设置能力类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("type")]
[System.Text.Json.Serialization.JsonPropertyName("type")]
public string Type { get; set; } = default!;
/// <summary>
/// 获取或设置授权状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public string AuthorizeStatus { get; set; } = default!;
/// <summary>
/// 获取或设置授权失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("authorize_fail_reason")]
[System.Text.Json.Serialization.JsonPropertyName("authorize_fail_reason")]
public string? AuthorizeFailReason { 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("billing_person_info")]
[System.Text.Json.Serialization.JsonPropertyName("billing_person_info")]
public Types.BillingPerson[]? BillingPersonList { get; set; }
/// <summary>
/// 获取或设置接入时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("access_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("access_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
public DateTimeOffset? AccessTime { get; set; }
/// <summary>
/// 获取或设置过期时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("expired_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("expired_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
public DateTimeOffset? ExpireTime { get; set; }
/// <summary>
/// 获取或设置接入失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("access_fail_reason")]
[System.Text.Json.Serialization.JsonPropertyName("access_fail_reason")]
public string? AccessFailReason { get; set; }
/// <summary>
/// 获取或设置能力信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("ability_info")]
[System.Text.Json.Serialization.JsonPropertyName("ability_info")]
public Types.Ability[]? AbilityList { get; set; }
}
}
/// <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("third_mode")]
[System.Text.Json.Serialization.JsonPropertyName("third_mode")]
public Types.ThirdPartyMode? ThirdPartyMode { get; set; }
/// <summary>
/// 获取或设置数电发票模式相关信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("digital_tax_mode")]
[System.Text.Json.Serialization.JsonPropertyName("digital_tax_mode")]
public Types.DigitalTaxMode? DigitalTaxMode { get; set; }
}
}

View File

@@ -10,6 +10,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// </summary>
[Newtonsoft.Json.JsonProperty("callback_url")]
[System.Text.Json.Serialization.JsonPropertyName("callback_url")]
public string CallbackUrl { get; set; } = default!;
public string? CallbackUrl { get; set; }
/// <summary>
/// 获取或设置是否展示开发票入口开关。
/// </summary>
[Newtonsoft.Json.JsonProperty("show_fapiao_cell")]
[System.Text.Json.Serialization.JsonPropertyName("show_fapiao_cell")]
public bool? RequireShowFapiaoCell { get; set; }
/// <summary>
/// 获取或设置是否支持开电子专票。
/// </summary>
[Newtonsoft.Json.JsonProperty("support_vat_fapiao")]
[System.Text.Json.Serialization.JsonPropertyName("support_vat_fapiao")]
public bool? IsSupportVATFapiao { get; set; }
}
}

View File

@@ -10,14 +10,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mch_code")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mch_code")]
public string? SubMerchantId { get; set; }
public string SubMerchantId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置回调地址。
/// </summary>
[Newtonsoft.Json.JsonProperty("callback_url")]
[System.Text.Json.Serialization.JsonPropertyName("callback_url")]
public string CallbackUrl { get; set; } = string.Empty;
public string? CallbackUrl { get; set; }
/// <summary>
/// 获取或设置是否展示开发票入口开关。
@@ -25,5 +25,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[Newtonsoft.Json.JsonProperty("show_fapiao_cell")]
[System.Text.Json.Serialization.JsonPropertyName("show_fapiao_cell")]
public bool? RequireShowFapiaoCell { get; set; }
/// <summary>
/// 获取或设置是否支持开电子专票。
/// </summary>
[Newtonsoft.Json.JsonProperty("support_vat_fapiao")]
[System.Text.Json.Serialization.JsonPropertyName("support_vat_fapiao")]
public bool? IsSupportVATFapiao { get; set; }
}
}

View File

@@ -3,13 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// <summary>
/// <para>表示 [PATCH] /new-tax-control-fapiao/merchant/development-config 接口的响应。</para>
/// </summary>
public class ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse : WechatTenpayResponse
public class ModifyNewTaxControlFapiaoMerchantDevelopmentConfigResponse : GetNewTaxControlFapiaoMerchantDevelopmentConfigResponse
{
/// <summary>
/// 获取或设置回调地址。
/// </summary>
[Newtonsoft.Json.JsonProperty("callback_url")]
[System.Text.Json.Serialization.JsonPropertyName("callback_url")]
public string CallbackUrl { get; set; } = default!;
}
}

View File

@@ -72,5 +72,33 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string? UserEmail { get; set; }
/// <summary>
/// 获取或设置订单金额(单位:分)。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public int? Amount { get; set; }
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_trade_no")]
public string? OutTradeNumber { get; set; }
/// <summary>
/// 获取或设置开具发票类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("fapiao_bill_type")]
[System.Text.Json.Serialization.JsonPropertyName("fapiao_bill_type")]
public string? FapiaoBillType { get; set; }
/// <summary>
/// 获取或设置用户留言信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("user_apply_message")]
[System.Text.Json.Serialization.JsonPropertyName("user_apply_message")]
public string? UserApplyMessage { get; set; }
}
}

View File

@@ -20,10 +20,10 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
public string MiniProgramPagePath { get; set; } = default!;
/// <summary>
/// 获取或设置小程序用户名
/// 获取或设置小程序账号
/// </summary>
[Newtonsoft.Json.JsonProperty("miniprogram_user_name")]
[System.Text.Json.Serialization.JsonPropertyName("miniprogram_user_name")]
public string? MiniProgramUsername { get; set; } = default!;
public string? MiniProgramUsername { get; set; }
}
}

View File

@@ -33,7 +33,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// </summary>
[Newtonsoft.Json.JsonProperty("file_digest")]
[System.Text.Json.Serialization.JsonPropertyName("file_digest")]
public string? FileDigest { get; set; }
public string? FileHash { get; set; }
/// <summary>
/// 获取或设置文件 Conent-Type。如果不指定将由系统自动生成。

View File

@@ -16,17 +16,18 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
/// <summary>
/// 获取或设置文件内容哈希算法。
/// <para>默认值:"SM3"</para>
/// </summary>
[Newtonsoft.Json.JsonProperty("digest_algorithm")]
[System.Text.Json.Serialization.JsonPropertyName("digest_algorithm")]
public string FileHashAlgorithm { get; set; } = string.Empty;
public string FileHashAlgorithm { get; set; } = "SM3";
/// <summary>
/// 获取或设置文件内容哈希值。
/// 获取或设置文件内容哈希值。如果不指定将由系统自动生成。
/// </summary>
[Newtonsoft.Json.JsonProperty("digest")]
[System.Text.Json.Serialization.JsonPropertyName("digest")]
public string FileHashValue { get; set; } = string.Empty;
public string? FileHash { get; set; }
/// <summary>
/// 获取或设置公司商户号。

View File

@@ -9,7 +9,11 @@
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "18507550000",
"email": "123110@qq.com"
"email": "123110@qq.com",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"fapiao_card_information": [
{

View File

@@ -0,0 +1,50 @@
{
"sub_mchid": "example_sub_mchid",
"fapiao_apply_id": "example_fapiao_apply_id",
"buyer_information": {
"type": "INDIVIDUAL",
"name": "深圳市南山区测试企业",
"taxpayer_id": "202003261233701778",
"address": "深圳市南山区深南大道10000号",
"telephone": "075512345678",
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw==",
"email": "NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw==",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"fapiao_information": {
"fapiao_id": "20200701123456",
"total_amount": 382895,
"items": [
{
"tax_code": "3010101020203000000",
"goods_name": "*xxx*服务",
"specification": "米",
"unit": "米",
"quantity": 100000000,
"total_amount": 429900,
"tax_rate": 1300,
"discount": false,
"preferential_policy_code": 1
}
],
"export_business_policy_code": 1,
"vat_refund_levy_code": 1,
"billing_person_id": "128279891283",
"billing_person": "example_billing_person",
"fapiao_bill_type": "COMM_FAPIAO",
"transaction_information": [
{
"pay_channel": "WECHAT_PAY",
"transaction_id": "4200000008202508080512076713",
"out_trade_no": "order_20200701_123456",
"amount": 382895
}
],
"remark": "备注"
}
}

View File

@@ -0,0 +1,62 @@
{
"sub_mchid": "1900000109",
"fapiao_apply_id": "4200000444201910177461284488",
"buyer_information": {
"type": "INDIVIDUAL",
"name": "深圳市南山区测试企业",
"taxpayer_id": "202003261233701778",
"address": "深圳市南山区深南大道10000号",
"telephone": "075512345678",
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw==",
"email": "NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw==",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"fapiao_information": {
"fapiao_id": "20200701123456",
"total_amount": 382895,
"items": [
{
"tax_code": "3010101020203000000",
"goods_name": "*经营租赁*车辆停放服务",
"specification": "米",
"unit": "METER",
"quantity": 100000000,
"total_amount": 429900,
"tax_rate": 1300,
"discount": false,
"preferential_policy_code": 1,
"real_estate_leasing_information": {
"province": "重庆市",
"city": "涪陵区",
"address": "xx街道xx小区",
"lease_period_start": "2025-01-01T10:00:00+08:00",
"lease_period_end": "2025-07-01T12:00:00+08:00",
"cross_city_flag": true,
"certificate_no": "OVgc/slzCvzSebaz46sUA4tJmm5GbNC0Tkp0oKmuHev9aTDzzcNIy5fKuywKWa0aYIWPyitr3wCYVPUw5Bnw1VUr6jn9eCeQPQye2t+zNuuCM0vmr1NNhdI3a2FNIx5HxkBrdM0XuiLt2/46UaWuzcUbZ52CCtZGgRzxeuj6oF/RKVG+dzT2HOm3kbYi1cUM10hARPKN+kV84I5WnFglX1cPM7s+OHkWvj38xEAfJBJfj3lf0UTRo",
"plate_no": [
"渝A12345"
]
}
}
],
"export_business_policy_code": 1,
"vat_refund_levy_code": 1,
"billing_person_id": "187776276864872",
"billing_person": "张伟",
"fapiao_bill_type": "COMM_FAPIAO",
"transaction_information": [
{
"pay_channel": "WECHAT_PAY",
"transaction_id": "4200000008202508080512076713",
"out_trade_no": "order_20200701_123456",
"amount": 382895
}
],
"remark": "备注"
}
}

View File

@@ -45,7 +45,11 @@
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6zB",
"email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za"
"email": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPttdY+aQ6za",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
},
"extra_information": {
"payee": "张三",
@@ -68,7 +72,9 @@
"discount": false
}
],
"remark": "备注"
"remark": "备注",
"fapiao_error_code": "BIZ_ERROR",
"fapiao_error_message": "开票失败。授信额度不足,请联系主管税务机关或者登录电子税务局提额/申报。"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"invite_url": "https://wxacurl.cn?xxx=",
"miniprogram_appid": "wxb1170446a4c0a5a2",
"miniprogram_path": "pages/xxxPage"
}

View File

@@ -0,0 +1,17 @@
{
"total_count": 50,
"offset": 10,
"limit": 1,
"mch_invite_result_list": [
{
"sub_mchid": "1999192837",
"mch_invite_status": "MCH_INVITE_SUCC",
"ep_name": "示例(深圳)有限公司",
"tax_id": "9144050071126766XG",
"invite_code": "code_20200101_123",
"operate_time": "2020-07-01T00:00:00",
"invite_failed_code": "UNKNOWN_TAX_INFO",
"invite_failed_reason": "示例失败原因"
}
]
}

View File

@@ -0,0 +1,25 @@
{
"sub_mchid": "1900000109",
"third_mode": {
"status": "ENABLED"
},
"digital_tax_mode": {
"status": "ENABLED",
"billing_person_info": [
{
"id": "187776276864872",
"name": "张伟"
}
],
"access_time": "2020-07-01T12:00:00+08:00",
"expired_time": "2020-07-02T12:00:00+08:00",
"access_fail_reason": "失败原因",
"ability_info": [
{
"type": "BASE_ABILITY",
"status": "AUTHORIZED",
"authorize_fail_reason": "失败原因"
}
]
}
}

View File

@@ -1,5 +1,6 @@
{
"callback_url": "https://pay.weixin.qq.com/callback",
"sub_mch_code": "1900000109",
"show_fapiao_cell": false
"show_fapiao_cell": false,
"support_vat_fapiao": false
}

View File

@@ -1,3 +1,5 @@
{
"callback_url": "https://pay.weixin.qq.com/callback"
"callback_url": "https://pay.weixin.qq.com/callback",
"show_fapiao_cell": false,
"support_vat_fapiao": false
}

View File

@@ -7,5 +7,9 @@
"bank_name": "测试银行",
"bank_account": "62001234567890",
"phone": "18507550000",
"email": "123110@qq.com"
"email": "123110@qq.com",
"amount": 1000,
"out_trade_no": "order_20200701_123456",
"fapiao_bill_type": "COMM_FAPIAO",
"user_apply_message": "用户留言"
}

View File

@@ -1693,6 +1693,59 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /new-tax-control-fapiao/fapiaomerchant/getspinviteurl")]
public async Task TestEncryptRequestSensitiveProperty_GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest()
{
static Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest GenerateMockRequestModel()
{
return new Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest()
{
OperateUser = MOCK_PLAIN_STR
};
}
static void AssertMockRequestModel(Models.GetNewTaxControlFapiaoMerchantServicePartnerInviteUrlRequest request, Func<string, string> decryptor)
{
Assert.NotEqual(MOCK_PLAIN_STR, request.OperateUser!);
Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.OperateUser!));
Assert.Equal(MOCK_CERT_SN, request.WechatpaySerialNumber!, ignoreCase: true);
}
if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
{
using (var client = CreateMockClientUseRSA(autoEncrypt: false))
{
var request = GenerateMockRequestModel();
client.EncryptRequestSensitiveProperty(request);
AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
using (var client = CreateMockClientUseRSA(autoEncrypt: true))
{
var request = GenerateMockRequestModel();
await client.ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(request);
AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
}
if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
{
using (var client = CreateMockClientUseSM2(autoEncrypt: false))
{
var request = GenerateMockRequestModel();
client.EncryptRequestSensitiveProperty(request);
AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
using (var client = CreateMockClientUseSM2(autoEncrypt: true))
{
var request = GenerateMockRequestModel();
await client.ExecuteGetNewTaxControlFapiaoMerchantServicePartnerInviteUrlAsync(request);
AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
}
}
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /papay/insurance-sign/contracts/pre-entrust-sign/h5")]
public async Task TestEncryptRequestSensitiveProperty_PresignPAPayInsuranceSignContractEntrustH5Request()
{