diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index 82637e42..128d4d9c 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -46,13 +46,15 @@ | √ | 经营能力:点金计划 | 服务商 | | | √ | 经营能力:区块链电子发票 | 直连商户 | | | √ | 经营能力:出租车电子发票 | 服务商 | | +| √ | 经营能力:微信支付分停车服务 | 直连商户 & 服务商 | | +| √ | 经营能力:租用充电宝隔夜归还 | 直连商户 | | +| √ | 经营能力:ETC 扣费 | 服务商 | | +| √ | 经营能力:教育续费通 | 直连商户 | | +| √ | 经营能力:校园轻松付 | 服务商 | | | √ | 行业方案:电商收付通 | 服务商 | | | √ | 行业方案:智慧商圈 | 直连商户 & 服务商 | | -| √ | 行业方案:微信支付分停车服务 | 直连商户 & 服务商 | | -| √ | 行业方案:租用充电宝隔夜归还 | 直连商户 | | | √ | 行业方案:微信点餐订单 | 服务商 | | | √ | 行业方案:微信寄快递 | 服务商 | | -| √ | 行业方案:ETC 扣费 | 服务商 | | | √ | 营销工具:代金券 | 直连商户 & 服务商 | | | √ | 营销工具:商家券 | 直连商户 & 服务商 | | | √ | 营销工具:委托营销 | 直连商户 & 服务商 | | @@ -75,7 +77,6 @@ | √ | 其他能力:图片上传 | 直连商户 & 服务商 | | | √ | 其他能力:视频上传 | 直连商户 & 服务商 | | | √ | 其他能力:优惠费率活动 | 服务商 | | -| √ | 其他能力:校园续费通 | 直连商户 | | | √ | 境外支付:子商户进件 | 服务商 | | | √ | 境外支付:融合钱包 | 服务商 | | | √ | 境外支付:委托代扣 | 直连商户 & 服务商 | | @@ -275,6 +276,34 @@ - 预扣费通知:`NotifyPAPPayContract` + - 微信支付分停车服务 + + - 查询车牌服务开通信息:`GetVehicleParkingService` + + - 创建停车入场:`CreateVehicleParking` + + - 扣费受理:`CreateVehicleTransactionParking` + + - 查询订单:`GetVehicleTransactionByOutTradeNumber` + + - 教育续费通: + + - 预签约:`PresignEducationPAPPayContract` + + - 通过协议号查询签约:`GetEducationPAPPayContractByContractId` + + - 通过用户标识查询签约:`QueryEducationPAPPayUserContracts` + + - 解约:`TerminateEducationPAPPayContract` + + - 发送扣款预通知:`SendEducationPAPPayContractNotification` + + - 教育通扣款受理:`CreateEducationPAPPayTransaction` + + - 微信订单号查单:`GetEducationPAPPayTransactionById` + + - 商户订单号查单:`GetEducationPAPPayTransactionByOutTradeNumber` + - 行业方案 - 智慧商圈 @@ -287,16 +316,6 @@ - 商圈会员停车状态同步:`NotifyBusinessCircleParkings` - - 微信支付分停车服务 - - - 查询车牌服务开通信息:`GetVehicleParkingService` - - - 创建停车入场:`CreateVehicleParking` - - - 扣费受理:`CreateVehicleTransactionParking` - - - 查询订单:`GetVehicleTransactionByOutTradeNumber` - - 营销工具 - 代金券 @@ -505,24 +524,6 @@ - 查询支行列表:`QueryCapitalBanksBranches` - - 校园续费通: - - - 预签约:`PresignEducationPAPPayContract` - - - 通过协议号查询签约:`GetEducationPAPPayContractByContractId` - - - 通过用户标识查询签约:`QueryEducationPAPPayUserContracts` - - - 解约:`TerminateEducationPAPPayContract` - - - 发送扣款预通知:`SendEducationPAPPayContractNotification` - - - 教育通扣款受理:`CreateEducationPAPPayTransaction` - - - 微信订单号查单:`GetEducationPAPPayTransactionById` - - - 商户订单号查单:`GetEducationPAPPayTransactionByOutTradeNumber` - --- @@ -741,6 +742,34 @@ - 预扣费通知:`NotifyPartnerPAPPayContract` + - 微信支付分停车服务 + + - 查询车牌服务开通信息:`GetVehicleParkingService` + + - 创建停车入场:`CreateVehicleParking` + + - 扣费受理:`CreateVehicleTransactionParking` + + - 查询订单:`GetVehicleTransactionByOutTradeNumber` + + - 校园轻松付: + + - 预签约:`PresignEducationSchoolPayContract` + + - 通过协议号查询签约:`GetEducationSchoolPayContractByContractId` + + - 商户主动解约:`TerminateEducationSchoolPayContract` + + - 查询用户签约列表:`QueryEducationSchoolPayUserContracts` + + - 扣款:`CreateEducationSchoolPayTransaction` + + - 微信支付订单号查单:`GetEducationSchoolPayTransactionById` + + - 商户订单号查单:`GetEducationSchoolPayTransactionByOutTradeNumber` + + - 商户查询用户欠款状态:`GetEducationSchoolPayUserDebtState` + - 行业方案 - 电商收付通(商户进件) @@ -891,16 +920,6 @@ - 商圈会员停车状态同步:`NotifyBusinessCircleParkings` - - 微信支付分停车服务 - - - 查询车牌服务开通信息:`GetVehicleParkingService` - - - 创建停车入场:`CreateVehicleParking` - - - 扣费受理:`CreateVehicleTransactionParking` - - - 查询订单:`GetVehicleTransactionByOutTradeNumber` - - 营销工具 - 代金券 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEducationSchoolPayExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEducationSchoolPayExtensions.cs new file mode 100644 index 00000000..50cfa605 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEducationSchoolPayExtensions.cs @@ -0,0 +1,177 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + public static class WechatTenpayClientExecuteEducationSchoolPayExtensions + { + /// + /// 异步调用 [POST] /eduschoolpay/contracts/presign 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecutePresignEducationSchoolPayContractAsync(this WechatTenpayClient client, Models.PresignEducationSchoolPayContractRequest 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, "eduschoolpay", "contracts", "presign"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /eduschoolpay/contracts/{contract_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEducationSchoolPayContractByContractIdAsync(this WechatTenpayClient client, Models.GetEducationSchoolPayContractByContractIdRequest 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, "eduschoolpay", "contracts", request.ContractId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /eduschoolpay/users/{openid}/contracts 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryEducationSchoolPayUserContractsAsync(this WechatTenpayClient client, Models.QueryEducationSchoolPayUserContractsRequest 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, "eduschoolpay", "users", request.OpenId, "contracts") + .SetQueryParam("plan_id", request.PlanId) + .SetQueryParam("contract_status", request.ContractStatus); ; + + if (request.Limit != null) + flurlReq.SetQueryParam("limit", request.Limit.Value); + + if (request.Offset != null) + flurlReq.SetQueryParam("offset", request.Offset.Value); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /eduschoolpay/contracts/{contract_id}/terminate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteTerminateEducationSchoolPayContractAsync(this WechatTenpayClient client, Models.TerminateEducationSchoolPayContractRequest 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, "eduschoolpay", "contracts", request.ContractId, "terminate"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /eduschoolpay/transactions 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEducationSchoolPayTransactionAsync(this WechatTenpayClient client, Models.CreateEducationSchoolPayTransactionRequest 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, "eduschoolpay", "transactions"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /eduschoolpay/transactions/out-trade-no/{out_trade_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_8.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEducationSchoolPayTransactionByOutTradeNumberAsync(this WechatTenpayClient client, Models.GetEducationSchoolPayTransactionByOutTradeNumberRequest 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, "eduschoolpay", "transactions", "out-trade-no", request.OutTradeNumber); + + if (request.SubMerchantId != null) + flurlReq.SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /eduschoolpay/transactions/id/{transaction_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEducationSchoolPayTransactionByIdAsync(this WechatTenpayClient client, Models.GetEducationSchoolPayTransactionByIdRequest 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, "eduschoolpay", "transactions", "id", request.TransactionId); + + if (request.SubMerchantId != null) + flurlReq.SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /eduschoolpay/users/{openid}/debt-state 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter5_3_9.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEducationSchoolPayUserDebtStateAsync(this WechatTenpayClient client, Models.GetEducationSchoolPayUserDebtStateRequest 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, "eduschoolpay", "users", request.OpenId, "debt-state"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/CreateEducationPAPPayTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/CreateEducationPAPPayTransactionRequest.cs index a4e5445e..378343ac 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/CreateEducationPAPPayTransactionRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/CreateEducationPAPPayTransactionRequest.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/GetEducationPAPPayContractByContractIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/GetEducationPAPPayContractByContractIdResponse.cs index 60f5dba6..146418b6 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/GetEducationPAPPayContractByContractIdResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/GetEducationPAPPayContractByContractIdResponse.cs @@ -29,10 +29,10 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置签约时间。 /// [Newtonsoft.Json.JsonProperty("create_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("create_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] - public DateTimeOffset? CreateTime { get; set; } + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CreateTime { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/PresignEducationPAPPayContractRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/PresignEducationPAPPayContractRequest.cs index 1dfe01b1..567fa13b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/PresignEducationPAPPayContractRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/PresignEducationPAPPayContractRequest.cs @@ -31,7 +31,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("user_id")] [System.Text.Json.Serialization.JsonPropertyName("user_id")] - public string UserDisplayName { get; set; } = string.Empty; + public string UserDisplayId { get; set; } = string.Empty; /// /// 获取或设置首次扣款日期字符串(格式:yyyy-MM-dd)。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/QueryEducationPAPPayUserContractsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/QueryEducationPAPPayUserContractsResponse.cs index 8118e191..af8bc596 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/QueryEducationPAPPayUserContractsResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EducationPAPPay/QueryEducationPAPPayUserContractsResponse.cs @@ -1,5 +1,3 @@ -using System; - namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Code/ImportMarketingMemberCardOpenCardPhoneRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Code/ImportMarketingMemberCardOpenCardPhoneRequest.cs index 89179f20..7cb2b61d 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Code/ImportMarketingMemberCardOpenCardPhoneRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Code/ImportMarketingMemberCardOpenCardPhoneRequest.cs @@ -20,7 +20,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("encrypted_phone_number")] [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 EncryptedPhoneNumber { get; set; } = string.Empty; + public string MobileNumber { get; set; } = string.Empty; /// /// 获取或设置会员卡 Code。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs index 3db28e59..2ec845c5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/ETC/PreopenVehicleETCRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/ETC/PreopenVehicleETCRequest.cs index fc858740..ba369251 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/ETC/PreopenVehicleETCRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/ETC/PreopenVehicleETCRequest.cs @@ -19,7 +19,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("encrypted_real_name")] [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 EncryptedRealName { get; set; } = string.Empty; + public string RealName { get; set; } = string.Empty; /// /// 获取或设置证件号码(需使用平台公钥/证书加密)。 @@ -28,7 +28,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("encrypted_credential_id")] [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 EncryptedCredentialNumber { get; set; } = string.Empty; + public string CredentialNumber { get; set; } = string.Empty; /// /// 获取或设置证件类型。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/ProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/ProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs index 405de0a1..2059d8da 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/ProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/Ecommerce/ProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs @@ -32,7 +32,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// [Newtonsoft.Json.JsonProperty("name")] [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } + public string? MerchantName { get; set; } /// /// 获取或设置接收方个人姓名(需使用平台公钥/证书加密)。 @@ -41,7 +41,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("encrypted_name")] [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? EncryptedName { get; set; } + public string? UserName { get; set; } /// /// 获取或设置与分账方的关系类型。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionRequest.cs new file mode 100644 index 00000000..15d2b93e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionRequest.cs @@ -0,0 +1,142 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /eduschoolpay/transactions 接口的请求。 + /// + public class CreateEducationSchoolPayTransactionRequest : WechatTenpayRequest + { + public static class Types + { + public class Amount : CreateEducationPAPPayTransactionRequest.Types.Amount + { + } + + public class Scene + { + /// + /// 获取或设置消费时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset StartTime { get; set; } + + /// + /// 获取或设置学校编号。 + /// + [Newtonsoft.Json.JsonProperty("school_id")] + [System.Text.Json.Serialization.JsonPropertyName("school_id")] + public string SchoolId { get; set; } = string.Empty; + + /// + /// 获取或设置消费场景类型。 + /// + [Newtonsoft.Json.JsonProperty("scene_type")] + [System.Text.Json.Serialization.JsonPropertyName("scene_type")] + public string SceneType { get; set; } = string.Empty; + } + + public class Device : CreateEducationPAPPayTransactionRequest.Types.Device + { + } + + public class Settlement : CreatePayPartnerTransactionAppRequest.Types.Settlement + { + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } = string.Empty; + + /// + /// 获取或设置签约协议号。 + /// + [Newtonsoft.Json.JsonProperty("contract_id")] + [System.Text.Json.Serialization.JsonPropertyName("contract_id")] + public string ContractId { get; set; } = string.Empty; + + /// + /// 获取或设置商户用户账号。 + /// + [Newtonsoft.Json.JsonProperty("user_id")] + [System.Text.Json.Serialization.JsonPropertyName("user_id")] + public string UserDisplayId { get; set; } = string.Empty; + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = new Types.Amount(); + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene Scene { get; set; } = new Types.Scene(); + + /// + /// 获取或设置设备信息。 + /// + [Newtonsoft.Json.JsonProperty("device_info")] + [System.Text.Json.Serialization.JsonPropertyName("device_info")] + public Types.Device? Device { get; set; } + + /// + /// 获取或设置结算信息。 + /// + [Newtonsoft.Json.JsonProperty("settle_info")] + [System.Text.Json.Serialization.JsonPropertyName("settle_info")] + public Types.Settlement? Settlement { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionResponse.cs new file mode 100644 index 00000000..379a49f7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /eduschoolpay/transactions 接口的响应。 + /// + public class CreateEducationSchoolPayTransactionResponse : GetEducationSchoolPayTransactionByOutTradeNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdRequest.cs new file mode 100644 index 00000000..350df357 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/contracts/{contract_id} 接口的请求。 + /// + public class GetEducationSchoolPayContractByContractIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置签约协议号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ContractId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdResponse.cs new file mode 100644 index 00000000..e8c7af65 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdResponse.cs @@ -0,0 +1,68 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/contracts/{contract_id} 接口的响应。 + /// + public class GetEducationSchoolPayContractByContractIdResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("plan_id")] + [System.Text.Json.Serialization.JsonPropertyName("plan_id")] + public string PlanId { get; set; } = default!; + + /// + /// 获取或设置商户签约号。 + /// + [Newtonsoft.Json.JsonProperty("out_contract_code")] + [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")] + public string OutContractCode { get; set; } = default!; + + /// + /// 获取或设置签约协议号。 + /// + [Newtonsoft.Json.JsonProperty("contract_id")] + [System.Text.Json.Serialization.JsonPropertyName("contract_id")] + public string ContractId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置签约状态。 + /// + [Newtonsoft.Json.JsonProperty("contract_status")] + [System.Text.Json.Serialization.JsonPropertyName("contract_status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置签约时间。 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CreateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdRequest.cs new file mode 100644 index 00000000..6309c69e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/transactions/id/{transaction_id} 接口的请求。 + /// + public class GetEducationSchoolPayTransactionByIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SubMerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdResponse.cs new file mode 100644 index 00000000..07f862db --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/transactions/id/{transaction_id} 接口的响应。 + /// + public class GetEducationSchoolPayTransactionByIdResponse : GetEducationSchoolPayTransactionByOutTradeNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberRequest.cs new file mode 100644 index 00000000..2a7281e9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/transactions/out-trade-no/{out_trade_no} 接口的请求。 + /// + public class GetEducationSchoolPayTransactionByOutTradeNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SubMerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberResponse.cs new file mode 100644 index 00000000..335f6c8d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberResponse.cs @@ -0,0 +1,149 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/transactions/out-trade-no/{out_trade_no} 接口的响应。 + /// + public class GetEducationSchoolPayTransactionByOutTradeNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Payer : GetEducationPAPPayTransactionByOutTradeNumberResponse.Types.Payer + { + /// + /// 获取或设置用户在子商户下唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("sub_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] + public string? SubOpenId { get; set; } + } + + public class Amount : GetEducationPAPPayTransactionByOutTradeNumberResponse.Types.Amount + { + } + + public class Device : GetEducationPAPPayTransactionByOutTradeNumberResponse.Types.Device + { + } + + public class Promotion : GetEducationPAPPayTransactionByOutTradeNumberResponse.Types.Promotion + { + } + } + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } = default!; + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } = default!; + + /// + /// 获取或设置交易类型。 + /// + [Newtonsoft.Json.JsonProperty("trade_type")] + [System.Text.Json.Serialization.JsonPropertyName("trade_type")] + public string TradeType { get; set; } = default!; + + /// + /// 获取或设置交易状态。 + /// + [Newtonsoft.Json.JsonProperty("trade_state")] + [System.Text.Json.Serialization.JsonPropertyName("trade_state")] + public string TradeState { get; set; } = default!; + + /// + /// 获取或设置交易状态描述。 + /// + [Newtonsoft.Json.JsonProperty("trade_state_desc")] + [System.Text.Json.Serialization.JsonPropertyName("trade_state_desc")] + public string TradeStateDescription { get; set; } = default!; + + /// + /// 获取或设置付款银行类型。 + /// + [Newtonsoft.Json.JsonProperty("bank_type")] + [System.Text.Json.Serialization.JsonPropertyName("bank_type")] + public string? BankType { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置支付完成时间。 + /// + [Newtonsoft.Json.JsonProperty("success_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("success_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? SuccessTime { get; set; } + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("payer")] + [System.Text.Json.Serialization.JsonPropertyName("payer")] + public Types.Payer? Payer { get; set; } + + /// + /// 获取或设置金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + + /// + /// 获取或设置设备信息。 + /// + [Newtonsoft.Json.JsonProperty("device_info")] + [System.Text.Json.Serialization.JsonPropertyName("device_info")] + public Types.Device? Device { get; set; } + + /// + /// 获取或设置优惠信息。 + /// + [Newtonsoft.Json.JsonProperty("promotion_detail")] + [System.Text.Json.Serialization.JsonPropertyName("promotion_detail")] + public Types.Promotion[]? PromotionList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateRequest.cs new file mode 100644 index 00000000..7a619340 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/users/{openid}/debt-state 接口的请求。 + /// + public class GetEducationSchoolPayUserDebtStateRequest : WechatTenpayRequest + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateResponse.cs new file mode 100644 index 00000000..04a98ea3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateResponse.cs @@ -0,0 +1,47 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/users/{openid}/debt-state 接口的响应。 + /// + public class GetEducationSchoolPayUserDebtStateResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置欠款笔数。 + /// + [Newtonsoft.Json.JsonProperty("debt_count")] + [System.Text.Json.Serialization.JsonPropertyName("debt_count")] + public int DebtCount { get; set; } + + /// + /// 获取或设置更新时间。 + /// + [Newtonsoft.Json.JsonProperty("update_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("update_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset UpdateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractRequest.cs new file mode 100644 index 00000000..e8df0743 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractRequest.cs @@ -0,0 +1,145 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /eduschoolpay/contracts/presign 接口的请求。 + /// + [WechatTenpaySensitive] + public class PresignEducationSchoolPayContractRequest : WechatTenpayRequest + { + public static class Types + { + public class Identity + { + /// + /// 获取或设置真实姓名(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonProperty("real_name")] + [System.Text.Json.Serialization.JsonPropertyName("real_name")] + [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 RealName { get; set; } = string.Empty; + + /// + /// 获取或设置证件号码(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_card_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_number")] + [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? CredentialNumber { get; set; } + + /// + /// 获取或设置证件类型。 + /// + [Newtonsoft.Json.JsonProperty("credential_type")] + [System.Text.Json.Serialization.JsonPropertyName("credential_type")] + public string? CredentialType { get; set; } + } + + public class BankCard + { + /// + /// 获取或设置银行类型。 + /// + [Newtonsoft.Json.JsonProperty("bank_type")] + [System.Text.Json.Serialization.JsonPropertyName("bank_type")] + public string? BankType { get; set; } + + /// + /// 获取或设置银行卡号(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonProperty("bank_card_no")] + [System.Text.Json.Serialization.JsonPropertyName("bank_card_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 BankCardNumber { get; set; } = string.Empty; + + /// + /// 获取或设置银行卡有效期字符串(单位:MM/yy)。 + /// + [Newtonsoft.Json.JsonProperty("valid_thru")] + [System.Text.Json.Serialization.JsonPropertyName("valid_thru")] + public string? ValidDateString { get; set; } + + /// + /// 获取或设置银行卡开卡预留手机号(需使用平台公钥/证书加密)。 + /// + [Newtonsoft.Json.JsonProperty("phone")] + [System.Text.Json.Serialization.JsonPropertyName("phone")] + [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 MobileNumber { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("plan_id")] + [System.Text.Json.Serialization.JsonPropertyName("plan_id")] + public string PlanId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置商户用户账号。 + /// + [Newtonsoft.Json.JsonProperty("user_id")] + [System.Text.Json.Serialization.JsonPropertyName("user_id")] + public string UserDisplayId { get; set; } = string.Empty; + + /// + /// 获取或设置学校编号。 + /// + [Newtonsoft.Json.JsonProperty("school_id")] + [System.Text.Json.Serialization.JsonPropertyName("school_id")] + public string SchoolId { get; set; } = string.Empty; + + /// + /// 获取或设置商户签约号。 + /// + [Newtonsoft.Json.JsonProperty("out_contract_code")] + [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")] + public string OutContractCode { get; set; } = string.Empty; + + /// + /// 获取或设置签约模式。 + /// + [Newtonsoft.Json.JsonProperty("contract_mode")] + [System.Text.Json.Serialization.JsonPropertyName("contract_mode")] + public string? ContractMode { get; set; } + + /// + /// 获取或设置是否允许降级为普通签约模式。 + /// + [Newtonsoft.Json.JsonProperty("downgrade_default_contract")] + [System.Text.Json.Serialization.JsonPropertyName("downgrade_default_contract")] + public bool? AllowDowngradeDefaultContract { get; set; } + + /// + /// 获取或设置实名信息。 + /// + [Newtonsoft.Json.JsonProperty("identity")] + [System.Text.Json.Serialization.JsonPropertyName("identity")] + public Types.Identity? Identity { get; set; } + + /// + /// 获取或设置银行卡信息。 + /// + [Newtonsoft.Json.JsonProperty("bank_card")] + [System.Text.Json.Serialization.JsonPropertyName("bank_card")] + public Types.BankCard? BankCard { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractResponse.cs new file mode 100644 index 00000000..fdd89b64 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractResponse.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /eduschoolpay/contracts/presign 接口的响应。 + /// + public class PresignEducationSchoolPayContractResponse : WechatTenpayResponse + { + /// + /// 获取或设置预签约码。 + /// + [Newtonsoft.Json.JsonProperty("presign_token")] + [System.Text.Json.Serialization.JsonPropertyName("presign_token")] + public string PresignToken { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsRequest.cs new file mode 100644 index 00000000..8e74b76a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsRequest.cs @@ -0,0 +1,44 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/users/{openid}/contracts 接口的请求。 + /// + public class QueryEducationSchoolPayUserContractsRequest : WechatTenpayRequest + { + /// + /// 获取或设置模板 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string PlanId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置签约状态。 + /// 默认值:ALL + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ContractStatus { get; set; } = "ALL"; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int? Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int? Offset { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsResponse.cs new file mode 100644 index 00000000..03c830e2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsResponse.cs @@ -0,0 +1,102 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /eduschoolpay/users/{openid}/contracts 接口的响应。 + /// + public class QueryEducationSchoolPayUserContractsResponse : WechatTenpayResponse + { + public static class Types + { + public class UserContract + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("plan_id")] + [System.Text.Json.Serialization.JsonPropertyName("plan_id")] + public string PlanId { get; set; } = default!; + + /// + /// 获取或设置商户签约号。 + /// + [Newtonsoft.Json.JsonProperty("out_contract_code")] + [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")] + public string OutContractCode { get; set; } = default!; + + /// + /// 获取或设置签约协议号。 + /// + [Newtonsoft.Json.JsonProperty("contract_id")] + [System.Text.Json.Serialization.JsonPropertyName("contract_id")] + public string ContractId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置签约状态。 + /// + [Newtonsoft.Json.JsonProperty("contract_status")] + [System.Text.Json.Serialization.JsonPropertyName("contract_status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置签约时间。 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CreateTime { get; set; } + } + } + + /// + /// 获取或设置签约列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.UserContract[] UserContractList { get; set; } = default!; + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置数据总条数。 + /// + [Newtonsoft.Json.JsonProperty("total_count")] + [System.Text.Json.Serialization.JsonPropertyName("total_count")] + public int TotalCount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/TerminateEducationSchoolPayContractRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/TerminateEducationSchoolPayContractRequest.cs new file mode 100644 index 00000000..85129425 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/TerminateEducationSchoolPayContractRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /eduschoolpay/contracts/{contract_id}/terminate 接口的请求。 + /// + public class TerminateEducationSchoolPayContractRequest : WechatTenpayRequest + { + /// + /// 获取或设置签约协议号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ContractId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/TerminateEducationSchoolPayContractResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/TerminateEducationSchoolPayContractResponse.cs new file mode 100644 index 00000000..f6419399 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/EducationSchoolPay/TerminateEducationSchoolPayContractResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /eduschoolpay/contracts/{contract_id}/terminate 接口的响应。 + /// + public class TerminateEducationSchoolPayContractResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs index 067df8b5..1ea99d87 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj index 6841d34b..bc0af1e6 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj @@ -15,7 +15,7 @@ https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat Flurl.Http Wechat Weixin MicroMessage Tenpay WechatPay WeixinPay Wxpay 微信 微信支付 微信商户 2.18.0 - 基于 Flurl.Http 的微信支付 API v3 版客户端,支持直连商户、服务商模式,支持基础支付、代金券、商家券、委托营销、消费卡、支付有礼、银行定向促活、微信支付分、微信先享卡、支付即服务、点金计划、智慧商圈、电商收付通、二级商户进件、小微商户进件、消费者投诉、商户违规通知、批量转账到零钱、银行组件、海关报关、融合钱包、微工卡、电子发票、车主平台、教育续费通等功能。 + 基于 Flurl.Http 的微信支付 API v3 版客户端,支持直连商户、服务商模式,支持基础支付、代金券、商家券、委托营销、消费卡、支付有礼、银行定向促活、微信支付分、微信先享卡、支付即服务、点金计划、智慧商圈、电商收付通、二级商户进件、小微商户进件、消费者投诉、商户违规通知、批量转账到零钱、银行组件、海关报关、融合钱包、微工卡、电子发票、车主平台、教育续费通、校园轻松付等功能。 Fu Diwei git https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionRequest.json new file mode 100644 index 00000000..c7f52287 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionRequest.json @@ -0,0 +1,24 @@ +{ + "appid": "wx8888888888888888", + "sub_mchid": "1900000109", + "sub_appid": "wx8888888888888888", + "description": "中山大学-第二食堂-海鲜炒饭", + "attach": "自定义数据", + "out_trade_no": "121775250124070332", + "goods_tag": "test", + "contract_id": "2045011120563805041758214605", + "user_id": "20200330tony", + "amount": { + "total": 888, + "currency": "CNY" + }, + "scene_info": { + "start_time": "2017-08-26T09:43:39+08:00", + "school_id": "18260256813396", + "scene_type": "CANTEEN" + }, + "device_info": { + "device_id": "12343232", + "device_ip": "123.12.12.123" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionResponse.json new file mode 100644 index 00000000..786f45ec --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/CreateEducationSchoolPayTransactionResponse.json @@ -0,0 +1,41 @@ +{ + "mchid": "1230000109", + "appid": "wx8888888888888888", + "sub_mchid": "1900000109", + "sub_appid": "wx8888888888888888", + "out_trade_no": "201407033233368018", + "transaction_id": "25012014070332333018", + "trade_type": "AUTH", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "bank_type": "ICBC_DEBIT", + "attach": "自定义数据", + "success_time": "2020-03-26T10:43:39+08:00", + "payer": { + "openid": "oUpF8uMuAJOM2pxb1Q", + "sub_openid": "oUpF8uMuAJOM2pxb1Q" + }, + "amount": { + "total": 888, + "payer_total": 888, + "discount_total": 100, + "currency": "CNY" + }, + "device_info": { + "device_id": "12343232", + "device_ip": "123.12.12.123" + }, + "promotion_detail": [ + { + "coupon_id": "109519", + "name": "单品惠-6", + "scope": "GLOBALSINGLE", + "type": "DISCOUNTCOUPON", + "amount": 5, + "stock_id": "931386", + "wechatpay_contribute": 0, + "merchant_contribute": 0, + "other_contribute": 0 + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdResponse.json new file mode 100644 index 00000000..421aa9a9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayContractByContractIdResponse.json @@ -0,0 +1,10 @@ +{ + "contract_id": "2045011120563805041758214605", + "mchid": "1230000109", + "appid": "wx8888888888888888", + "openid": "oUpF8uMuAJOM2pxb1Q", + "plan_id": "101164396123311331", + "contract_status": "ADD", + "create_time": "2017-08-26T09:43:39+08:00", + "out_contract_code": "20190806125346" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdResponse.json new file mode 100644 index 00000000..786f45ec --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByIdResponse.json @@ -0,0 +1,41 @@ +{ + "mchid": "1230000109", + "appid": "wx8888888888888888", + "sub_mchid": "1900000109", + "sub_appid": "wx8888888888888888", + "out_trade_no": "201407033233368018", + "transaction_id": "25012014070332333018", + "trade_type": "AUTH", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "bank_type": "ICBC_DEBIT", + "attach": "自定义数据", + "success_time": "2020-03-26T10:43:39+08:00", + "payer": { + "openid": "oUpF8uMuAJOM2pxb1Q", + "sub_openid": "oUpF8uMuAJOM2pxb1Q" + }, + "amount": { + "total": 888, + "payer_total": 888, + "discount_total": 100, + "currency": "CNY" + }, + "device_info": { + "device_id": "12343232", + "device_ip": "123.12.12.123" + }, + "promotion_detail": [ + { + "coupon_id": "109519", + "name": "单品惠-6", + "scope": "GLOBALSINGLE", + "type": "DISCOUNTCOUPON", + "amount": 5, + "stock_id": "931386", + "wechatpay_contribute": 0, + "merchant_contribute": 0, + "other_contribute": 0 + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberResponse.json new file mode 100644 index 00000000..786f45ec --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayTransactionByOutTradeNumberResponse.json @@ -0,0 +1,41 @@ +{ + "mchid": "1230000109", + "appid": "wx8888888888888888", + "sub_mchid": "1900000109", + "sub_appid": "wx8888888888888888", + "out_trade_no": "201407033233368018", + "transaction_id": "25012014070332333018", + "trade_type": "AUTH", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "bank_type": "ICBC_DEBIT", + "attach": "自定义数据", + "success_time": "2020-03-26T10:43:39+08:00", + "payer": { + "openid": "oUpF8uMuAJOM2pxb1Q", + "sub_openid": "oUpF8uMuAJOM2pxb1Q" + }, + "amount": { + "total": 888, + "payer_total": 888, + "discount_total": 100, + "currency": "CNY" + }, + "device_info": { + "device_id": "12343232", + "device_ip": "123.12.12.123" + }, + "promotion_detail": [ + { + "coupon_id": "109519", + "name": "单品惠-6", + "scope": "GLOBALSINGLE", + "type": "DISCOUNTCOUPON", + "amount": 5, + "stock_id": "931386", + "wechatpay_contribute": 0, + "merchant_contribute": 0, + "other_contribute": 0 + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateResponse.json new file mode 100644 index 00000000..06ab202a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/GetEducationSchoolPayUserDebtStateResponse.json @@ -0,0 +1,7 @@ +{ + "appid": "wx8888888888888888", + "openid": "oUpF8uMuAJOM2pxb1Q", + "state": "FORBIDDEN", + "debt_count": 2, + "update_time": "2017-08-26T09:43:39+08:00" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractRequest.json new file mode 100644 index 00000000..7407f280 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractRequest.json @@ -0,0 +1,21 @@ +{ + "appid": "wx8888888888888888", + "openid": "oUpF8uMuAJOM2pxb1Q", + "plan_id": "101164396123311331", + "user_id": "20200330tony", + "school_id": "18260256813396", + "out_contract_code": "20190806125346", + "contract_mode": "LIMIT_BANK_CARD", + "downgrade_default_contract": false, + "identity": { + "real_name": "6TqLAZvNZ4AXLNHLMbjA1yKq2k5krHM09m3tCuR", + "credential_type": "IDENTITY_CARD", + "id_card_number": "6TqLAZvNZ4AXLNHLMbjA1yKq2k5krHM09m3tCuR" + }, + "bank_card": { + "bank_card_no": "6TqLAZvNZ4AXLNHLMbjA1yKq2k5krHM09m3tCuR", + "valid_thru": "08/21", + "phone": "j6PlFRRJ4nvGSbtDZzXbXScACvDSnIny67zk3BgT5uIbK4VfGmcjPBEk2mt5ASZ6UUHB4Gy0IZpbuanF9", + "bank_type": "CMC" + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractResponse.json new file mode 100644 index 00000000..ef8d030f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/PresignEducationSchoolPayContractResponse.json @@ -0,0 +1,3 @@ +{ + "presign_token": "0044de6c799739c2e8534b" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsResponse.json new file mode 100644 index 00000000..1100147f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_Partner/EducationSchoolPay/QueryEducationSchoolPayUserContractsResponse.json @@ -0,0 +1,17 @@ +{ + "data": [ + { + "contract_id": "2045011120563805041758214605", + "mchid": "1230000109", + "appid": "wx8888888888888888", + "openid": "oUpF8uMuAJOM2pxb1Q", + "plan_id": "101164396123311331", + "contract_status": "ADD", + "create_time": "2017-08-26T09:43:39+08:00", + "out_contract_code": "20190806125346" + } + ], + "offset": 10, + "limit": 20, + "total_count": 1234 +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs index f6176b26..50fef8d3 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RequestEncryptionTests.cs @@ -487,14 +487,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests { return new Models.AddEcommerceProfitSharingReceiverRequest() { - EncryptedName = MOCK_PLAIN_STR + UserName = MOCK_PLAIN_STR }; } static void AssertMockRequestModel(Models.AddEcommerceProfitSharingReceiverRequest request, Func decryptor) { - Assert.NotEqual(MOCK_PLAIN_STR, request.EncryptedName!); - Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.EncryptedName!)); + Assert.NotEqual(MOCK_PLAIN_STR, request.UserName!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.UserName!)); Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); } @@ -515,6 +515,56 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /eduschoolpay/contracts/presign)")] + public async Task TestEncryptRequestSensitiveProperty_PresignEducationSchoolPayContractRequest() + { + static Models.PresignEducationSchoolPayContractRequest GenerateMockRequestModel() + { + return new Models.PresignEducationSchoolPayContractRequest() + { + Identity = new Models.PresignEducationSchoolPayContractRequest.Types.Identity() + { + RealName = MOCK_PLAIN_STR, + CredentialNumber = MOCK_PLAIN_STR + }, + BankCard = new Models.PresignEducationSchoolPayContractRequest.Types.BankCard() + { + BankCardNumber = MOCK_PLAIN_STR, + MobileNumber = MOCK_PLAIN_STR + } + }; + } + + static void AssertMockRequestModel(Models.PresignEducationSchoolPayContractRequest request, Func decryptor) + { + Assert.NotEqual(MOCK_PLAIN_STR, request.Identity!.RealName!); + Assert.NotEqual(MOCK_PLAIN_STR, request.Identity!.CredentialNumber!); + Assert.NotEqual(MOCK_PLAIN_STR, request.BankCard!.BankCardNumber!); + Assert.NotEqual(MOCK_PLAIN_STR, request.BankCard!.MobileNumber!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Identity!.RealName!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Identity!.CredentialNumber!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.BankCard!.BankCardNumber!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.BankCard!.MobileNumber!)); + Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); + } + + var reqA1 = GenerateMockRequestModel(); + CreateMockClientUseRSA(autoEncrypt: false).EncryptRequestSensitiveProperty(reqA1); + AssertMockRequestModel(reqA1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqA2 = GenerateMockRequestModel(); + CreateMockClientUseSM2(autoEncrypt: false).EncryptRequestSensitiveProperty(reqA2); + AssertMockRequestModel(reqA2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + + var reqB1 = GenerateMockRequestModel(); + await CreateMockClientUseRSA(autoEncrypt: true).ExecutePresignEducationSchoolPayContractAsync(reqB1); + AssertMockRequestModel(reqB1, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, cipher)); + + var reqB2 = GenerateMockRequestModel(); + await CreateMockClientUseSM2(autoEncrypt: true).ExecutePresignEducationSchoolPayContractAsync(reqB2); + AssertMockRequestModel(reqB2, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, cipher)); + } + [Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /marketing/membercard-open/cards/{card_id}/phone-membercard/import)")] public async Task TestEncryptRequestSensitiveProperty_ImportMarketingMemberCardOpenCardPhoneRequest() { @@ -522,14 +572,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests { return new Models.ImportMarketingMemberCardOpenCardPhoneRequest() { - EncryptedPhoneNumber = MOCK_PLAIN_STR + MobileNumber = MOCK_PLAIN_STR }; } static void AssertMockRequestModel(Models.ImportMarketingMemberCardOpenCardPhoneRequest request, Func decryptor) { - Assert.NotEqual(MOCK_PLAIN_STR, request.EncryptedPhoneNumber!); - Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.EncryptedPhoneNumber!)); + Assert.NotEqual(MOCK_PLAIN_STR, request.MobileNumber!); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.MobileNumber!)); Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); } @@ -1083,8 +1133,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests { Identify = new Models.PreopenVehicleETCRequest.Types.Identify() { - EncryptedRealName = MOCK_PLAIN_STR, - EncryptedCredentialNumber = MOCK_PLAIN_STR + RealName = MOCK_PLAIN_STR, + CredentialNumber = MOCK_PLAIN_STR }, BankCardNumber = MOCK_PLAIN_STR }; @@ -1092,11 +1142,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests static void AssertMockRequestModel(Models.PreopenVehicleETCRequest request, Func decryptor) { - Assert.NotEqual(MOCK_PLAIN_STR, request.Identify!.EncryptedRealName!); - Assert.NotEqual(MOCK_PLAIN_STR, request.Identify!.EncryptedCredentialNumber!); + Assert.NotEqual(MOCK_PLAIN_STR, request.Identify!.RealName!); + Assert.NotEqual(MOCK_PLAIN_STR, request.Identify!.CredentialNumber!); Assert.NotEqual(MOCK_PLAIN_STR, request.BankCardNumber!); - Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Identify!.EncryptedRealName!)); - Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Identify!.EncryptedCredentialNumber!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Identify!.RealName!)); + Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Identify!.CredentialNumber!)); Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.BankCardNumber!)); Assert.Equal(MOCK_CERT_SN, request.WechatpayCertificateSerialNumber!, ignoreCase: true); }