From 5b13f3f558f1d9ae8ca1a7b9e8826185f3ad5bac Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 10 May 2021 15:30:00 +0800 Subject: [PATCH] init commit --- .gitignore | 193 ++++ LICENSE | 21 + README.md | 39 + SKIT.FlurlHttpClient.Wechat.sln | 60 ++ docs/WechatApi/README.md | 3 + .../Advanced_CallbackDataDecryption.md | 27 + .../Advanced_IHttpClientFactory.md | 50 ++ .../WechatTenpayV3/Advanced_JsonSerializer.md | 46 + .../Advanced_MerchantCertSerialNumber.md | 9 + .../Advanced_ModelDefinition.md | 789 +++++++++++++++++ docs/WechatTenpayV3/Advanced_Payment.md | 35 + .../Advanced_ResponseDataDecryption.md | 28 + .../Advanced_ResponseSignatureVerification.md | 25 + docs/WechatTenpayV3/README.md | 168 ++++ .../FlurlHttpRequestOptionsExtensions.cs | 21 + .../WechatApiClientExecuteCgibinExtensions.cs | 103 +++ ...hatApiClientExecuteCgibinTagsExtensions.cs | 245 ++++++ ...hatApiClientExecuteCgibinUserExtensions.cs | 103 +++ .../WechatApiClientExecuteSnsExtensions.cs | 131 +++ .../Cgibin/CgibinGetApiDomainIpRequest.cs | 12 + .../Cgibin/CgibinGetApiDomainIpResponse.cs | 18 + .../Cgibin/CgibinGetCallbackIpRequest.cs | 12 + .../Cgibin/CgibinGetCallbackIpResponse.cs | 18 + .../Cgibin/CgibinTicketGetTicketRequest.cs | 16 + .../Cgibin/CgibinTicketGetTicketResponse.cs | 25 + .../Models/Cgibin/CgibinTokenRequest.cs | 16 + .../Models/Cgibin/CgibinTokenResponse.cs | 25 + .../CgibinTags/CgibinTagsCreateRequest.cs | 31 + .../CgibinTags/CgibinTagsCreateResponse.cs | 38 + .../CgibinTags/CgibinTagsDeleteRequest.cs | 31 + .../CgibinTags/CgibinTagsDeleteResponse.cs | 12 + .../Models/CgibinTags/CgibinTagsGetRequest.cs | 12 + .../CgibinTags/CgibinTagsGetResponse.cs | 45 + .../CgibinTags/CgibinTagsUpdateRequest.cs | 38 + .../CgibinTags/CgibinTagsUpdateResponse.cs | 12 + .../CgibinTags/CgibinUserTagGetRequest.cs | 25 + .../CgibinTags/CgibinUserTagGetResponse.cs | 45 + .../Members/CgibinTagsGetIdListRequest.cs | 18 + .../Members/CgibinTagsGetIdListResponse.cs | 18 + .../CgibinTagsMembersBatchTaggingRequest.cs | 25 + .../CgibinTagsMembersBatchTaggingResponse.cs | 12 + .../CgibinTagsMembersBatchUntaggingRequest.cs | 25 + ...CgibinTagsMembersBatchUntaggingResponse.cs | 12 + .../CgibinTagsMembersBatchBlackListRequest.cs | 18 + ...CgibinTagsMembersBatchBlackListResponse.cs | 12 + ...gibinTagsMembersBatchUnblackListRequest.cs | 18 + ...ibinTagsMembersBatchUnblackListResponse.cs | 12 + .../CgibinTagsMembersGetBlackListRequest.cs | 18 + .../CgibinTagsMembersGetBlackListResponse.cs | 52 ++ .../CgibinUserInfoBatchGetRequest.cs | 39 + .../CgibinUserInfoBatchGetResponse.cs | 143 +++ .../CgibinUser/CgibinUserInfoRequest.cs | 22 + .../CgibinUser/CgibinUserInfoResponse.cs | 130 +++ .../CgibinUserInfoUpdateRemarkRequest.cs | 25 + .../CgibinUserInfoUpdateRemarkResponse.cs | 12 + .../Models/CgibinUser/CgibinUserRequest.cs | 16 + .../Models/CgibinUser/CgibinUserResponse.cs | 52 ++ .../Models/Sns/SnsAuthRequest.cs | 21 + .../Models/Sns/SnsAuthResponse.cs | 12 + .../Models/Sns/SnsJsCode2SessionRequest.cs | 21 + .../Models/Sns/SnsJsCode2SessionResponse.cs | 32 + .../Models/Sns/SnsOAuth2AccessTokenRequest.cs | 21 + .../Sns/SnsOAuth2AccessTokenResponse.cs | 46 + .../Sns/SnsOAuth2RefreshTokenRequest.cs | 21 + .../Sns/SnsOAuth2RefreshTokenResponse.cs | 12 + .../Models/Sns/SnsUserInfoRequest.cs | 27 + .../Models/Sns/SnsUserInfoResponse.cs | 74 ++ .../SKIT.FlurlHttpClient.Wechat.Api.csproj | 26 + .../WechatApiClient.cs | 123 +++ .../WechatApiClientOptions.cs | 32 + .../WechatApiEndpoints.cs | 36 + .../WechatApiException.cs | 27 + .../WechatApiRequest.cs | 25 + .../WechatApiResponse.cs | 55 ++ .../Constants/EncryptionAlgorithms.cs | 9 + .../Constants/SignTypes.cs | 9 + .../CommonDateTimeOffsetConverter.cs | 32 + .../CommonNullableDateTimeOffsetConverter.cs | 57 ++ ...ithoutSeparatorsDateTimeOffsetConverter.cs | 32 + ...paratorsNullableDateTimeOffsetConverter.cs | 57 ++ .../StringTypedStringArrayConverter.cs | 52 ++ .../StringTypedStringIListConverter.cs | 44 + .../StringTypedStringListConverter.cs | 46 + .../CommonDateTimeOffsetConverter.cs | 22 + .../CommonNullableDateTimeOffsetConverter.cs | 42 + ...ithoutSeparatorsDateTimeOffsetConverter.cs | 22 + ...paratorsNullableDateTimeOffsetConverter.cs | 42 + .../StringTypedStringArrayConverter.cs | 42 + .../StringTypedStringIListConverter.cs | 34 + .../StringTypedStringListConverter.cs | 36 + ...WechatTenpayCallbackDecryptionException.cs | 24 + .../WechatTenpayRequestSignatureException.cs | 24 + ...WechatTenpayResponseDecryptionException.cs | 24 + ...chatTenpayResponseVerificationException.cs | 24 + .../FlurlHttpRequestOptionsExtensions.cs | 27 + ...ClientCallbackDeserializationExtensions.cs | 80 ++ ...entExecuteApplyForSubMerchantExtensions.cs | 118 +++ ...yClientExecuteApplyForSubjectExtensions.cs | 139 +++ ...WechatTenpayClientExecuteBillExtensions.cs | 129 +++ ...ientExecuteBrandProfitSharingExtensions.cs | 226 +++++ ...ayClientExecuteBusinessCircleExtensions.cs | 63 ++ ...npayClientExecuteCertificatesExtensions.cs | 37 + ...ientExecuteCombineTransactionExtensions.cs | 202 +++++ ...npayClientExecuteDiscountCardExtensions.cs | 77 ++ ...entExecuteEcommerceApplymentsExtensions.cs | 77 ++ ...payClientExecuteEcommerceBillExtensions.cs | 43 + ...ntExecuteEcommerceFundBalanceExtensions.cs | 62 ++ ...tExecuteEcommerceFundWithdrawExtensions.cs | 79 ++ ...ExecuteEcommerceProfitSharingExtensions.cs | 206 +++++ ...ClientExecuteEcommerceRefundsExtensions.cs | 120 +++ ...ientExecuteEcommerceSubsidiesExtensions.cs | 77 ++ ...atTenpayClientExecuteGoldPlanExtensions.cs | 117 +++ ...ientExecuteMarketingBusifavorExtensions.cs | 438 +++++++++ ...ayClientExecuteMarketingFavorExtensions.cs | 383 ++++++++ ...ayClientExecuteMarketingMediaExtensions.cs | 66 ++ ...tExecuteMarketingPartnershipsExtensions.cs | 93 ++ ...ecuteMarketingPayGiftActivityExtensions.cs | 208 +++++ ...entExecuteMerchantFundBalanceExtensions.cs | 58 ++ ...ntExecuteMerchantFundWithdrawExtensions.cs | 101 +++ ...payClientExecuteMerchantMediaExtensions.cs | 126 +++ ...yClientExecuteMerchantServiceExtensions.cs | 277 ++++++ ...ExecutePayPartnerTransactionsExtensions.cs | 202 +++++ ...entExecutePayScorePermissionsExtensions.cs | 120 +++ ...ntExecutePayScoreServiceOrderExtensions.cs | 203 +++++ ...yClientExecutePayTransactionsExtensions.cs | 193 ++++ ...chatTenpayClientExecuteRefundExtensions.cs | 84 ++ ...TenpayClientExecuteSmartGuideExtensions.cs | 120 +++ .../WechatTenpayClientParameterExtensions.cs | 117 +++ ...enpayClientResponseDecryptionExtensions.cs | 268 ++++++ ...hatTenpayClientResponseVerifyExtensions.cs | 81 ++ .../Interceptors/WechatTenpayAuthenticator.cs | 75 ++ ...eateApplyForSubMerchantApplymentRequest.cs | 829 ++++++++++++++++++ ...ateApplyForSubMerchantApplymentResponse.cs | 18 + ...ubMerchantApplymentByApplymentIdRequest.cs | 18 + ...bMerchantApplymentByApplymentIdResponse.cs | 12 + ...bMerchantApplymentByBusinessCodeRequest.cs | 18 + ...MerchantApplymentByBusinessCodeResponse.cs | 87 ++ ...GetApplyForSubMerchantSettlementRequest.cs | 18 + ...etApplyForSubMerchantSettlementResponse.cs | 60 ++ ...ifyApplyForSubMerchantSettlementRequest.cs | 60 ++ ...fyApplyForSubMerchantSettlementResponse.cs | 12 + ...ForSubjectApplymentByApplymentIdRequest.cs | 18 + ...orSubjectApplymentByApplymentIdResponse.cs | 12 + ...orSubjectApplymentByBusinessCodeRequest.cs | 18 + ...rSubjectApplymentByBusinessCodeResponse.cs | 12 + .../CreateApplyForSubjectApplymentRequest.cs | 342 ++++++++ .../CreateApplyForSubjectApplymentResponse.cs | 18 + ...ForSubjectApplymentByApplymentIdRequest.cs | 18 + ...orSubjectApplymentByApplymentIdResponse.cs | 12 + ...orSubjectApplymentByBusinessCodeRequest.cs | 18 + ...rSubjectApplymentByBusinessCodeResponse.cs | 39 + ...ForSubjectApplymentMerchantStateRequest.cs | 18 + ...orSubjectApplymentMerchantStateResponse.cs | 18 + .../Models/Bill/DownloadBillFileRequest.cs | 18 + .../Models/Bill/DownloadBillFileResponse.cs | 16 + .../Models/Bill/GetBillFundflowBillRequest.cs | 32 + .../Bill/GetBillFundflowBillResponse.cs | 12 + .../Models/Bill/GetBillTradeBillRequest.cs | 39 + .../Models/Bill/GetBillTradeBillResponse.cs | 32 + ...etBrandProfitSharingOrderAmountsRequest.cs | 18 + ...tBrandProfitSharingOrderAmountsResponse.cs | 25 + .../GetBrandProfitBrandConfigsRequest.cs | 18 + .../GetBrandProfitBrandConfigsResponse.cs | 25 + .../CreateBrandProfitSharingOrderRequest.cs | 108 +++ .../CreateBrandProfitSharingOrderResponse.cs | 46 + ...ateBrandProfitSharingReturnOrderRequest.cs | 60 ++ ...teBrandProfitSharingReturnOrderResponse.cs | 12 + ...ofitSharingOrderByOutOrderNumberRequest.cs | 32 + ...fitSharingOrderByOutOrderNumberResponse.cs | 124 +++ ...rofitSharingReturnOrderByOrderIdRequest.cs | 32 + ...ofitSharingReturnOrderByOrderIdResponse.cs | 12 + ...aringReturnOrderByOutOrderNumberRequest.cs | 32 + ...ringReturnOrderByOutOrderNumberResponse.cs | 83 ++ .../AddBrandProfitSharingReceiverRequest.cs | 60 ++ .../AddBrandProfitSharingReceiverResponse.cs | 32 + ...DeleteBrandProfitSharingReceiverRequest.cs | 46 + ...eleteBrandProfitSharingReceiverResponse.cs | 32 + ...SetBrandProfitSharingOrderFinishRequest.cs | 39 + ...etBrandProfitSharingOrderFinishResponse.cs | 39 + ...sCircleUserAuthorizationByOpenIdRequest.cs | 32 + ...CircleUserAuthorizationByOpenIdResponse.cs | 43 + .../NotifyBusinessCirclePointsRequest.cs | 76 ++ .../NotifyBusinessCirclePointsResponse.cs | 12 + .../Certificates/QueryCertificatesRequest.cs | 12 + .../Certificates/QueryCertificatesResponse.cs | 90 ++ .../CloseCombineTransactionRequest.cs | 59 ++ .../CloseCombineTransactionResponse.cs | 12 + .../CreateCombineTransactionAppRequest.cs | 197 +++++ .../CreateCombineTransactionAppResponse.cs | 12 + .../CreateCombineTransactionH5Request.cs | 129 +++ .../CreateCombineTransactionH5Response.cs | 12 + .../CreateCombineTransactionJsapiRequest.cs | 93 ++ .../CreateCombineTransactionJsapiResponse.cs | 12 + .../CreateCombineTransactionNativeRequest.cs | 82 ++ .../CreateCombineTransactionNativeResponse.cs | 12 + ...ansactionByCombineOutTradeNumberRequest.cs | 18 + ...nsactionByCombineOutTradeNumberResponse.cs | 184 ++++ .../GetDiscountCardByOutCardCodeRequest.cs | 18 + .../GetDiscountCardByOutCardCodeResponse.cs | 400 +++++++++ .../PrepareDiscountCardRequest.cs | 39 + .../PrepareDiscountCardResponse.cs | 18 + .../AddDiscountCardUserRecordRequest.cs | 158 ++++ .../AddDiscountCardUserRecordResponse.cs | 12 + .../CreateEcommerceApplymentRequest.cs | 382 ++++++++ .../CreateEcommerceApplymentResponse.cs | 25 + ...tEcommerceApplymentByApplymentIdRequest.cs | 18 + ...EcommerceApplymentByApplymentIdResponse.cs | 12 + ...merceApplymentByOutRequestNumberRequest.cs | 18 + ...erceApplymentByOutRequestNumberResponse.cs | 169 ++++ .../GetEcommerceBillFundflowBillRequest.cs | 39 + .../GetEcommerceBillFundflowBillResponse.cs | 73 ++ .../GetEcommerceFundBalanceRequest.cs | 25 + .../GetEcommerceFundBalanceResponse.cs | 39 + .../GetEcommerceFundDayendBalanceRequest.cs | 25 + .../GetEcommerceFundDayendBalanceResponse.cs | 32 + .../CreateEcommerceFundWithdrawRequest.cs | 46 + .../CreateEcommerceFundWithdrawResponse.cs | 32 + ...ceFundWithdrawByOutRequestNumberRequest.cs | 25 + ...eFundWithdrawByOutRequestNumberResponse.cs | 92 ++ ...commerceFundWithdrawByWithdrawIdRequest.cs | 25 + ...ommerceFundWithdrawByWithdrawIdResponse.cs | 12 + ...ommerceProfitSharingOrderAmountsRequest.cs | 18 + ...mmerceProfitSharingOrderAmountsResponse.cs | 25 + ...reateEcommerceProfitSharingOrderRequest.cs | 94 ++ ...eateEcommerceProfitSharingOrderResponse.cs | 39 + ...commerceProfitSharingReturnOrderRequest.cs | 60 ++ ...ommerceProfitSharingReturnOrderResponse.cs | 12 + ...ofitSharingOrderByOutOrderNumberRequest.cs | 32 + ...fitSharingOrderByOutOrderNumberResponse.cs | 131 +++ ...rofitSharingReturnOrderByOrderIdRequest.cs | 32 + ...ofitSharingReturnOrderByOrderIdResponse.cs | 12 + ...aringReturnOrderByOutOrderNumberRequest.cs | 32 + ...ringReturnOrderByOutOrderNumberResponse.cs | 83 ++ ...ddEcommerceProfitSharingReceiverRequest.cs | 53 ++ ...dEcommerceProfitSharingReceiverResponse.cs | 25 + ...teEcommerceProfitSharingReceiverRequest.cs | 32 + ...eEcommerceProfitSharingReceiverResponse.cs | 25 + ...commerceProfitSharingOrderFinishRequest.cs | 39 + ...ommerceProfitSharingOrderFinishResponse.cs | 39 + .../CreateEcommerceRefundRequest.cs | 115 +++ .../CreateEcommerceRefundResponse.cs | 12 + ...EcommerceRefundByOutRefundNumberRequest.cs | 25 + ...commerceRefundByOutRefundNumberResponse.cs | 178 ++++ .../GetEcommerceRefundByRefundIdRequest.cs | 25 + .../GetEcommerceRefundByRefundIdResponse.cs | 12 + ...eateEcommerceRefundReturnAdvanceRequest.cs | 25 + ...ateEcommerceRefundReturnAdvanceResponse.cs | 12 + .../GetEcommerceRefundReturnAdvanceRequest.cs | 25 + ...GetEcommerceRefundReturnAdvanceResponse.cs | 76 ++ .../CancelEcommerceSubsidyRequest.cs | 32 + .../CancelEcommerceSubsidyResponse.cs | 39 + .../CreateEcommerceSubsidyRequest.cs | 53 ++ .../CreateEcommerceSubsidyResponse.cs | 62 ++ .../CreateEcommerceSubsidyReturnRequest.cs | 53 ++ .../CreateEcommerceSubsidyReturnResponse.cs | 76 ++ .../ChangeGoldPlanCustomPageStatusRequest.cs | 25 + .../ChangeGoldPlanCustomPageStatusResponse.cs | 18 + .../GoldPlan/ChangeGoldPlanStatusRequest.cs | 25 + .../GoldPlan/ChangeGoldPlanStatusResponse.cs | 18 + .../CloseGoldPlanAdvertisingShowRequest.cs | 18 + .../CloseGoldPlanAdvertisingShowResponse.cs | 12 + .../OpenGoldPlanAdvertisingShowRequest.cs | 25 + .../OpenGoldPlanAdvertisingShowResponse.cs | 12 + ...oldPlanAdvertisingIndustryFilterRequest.cs | 25 + ...ldPlanAdvertisingIndustryFilterResponse.cs | 12 + .../GetMarketingBusifavorCallbackRequest.cs | 18 + .../GetMarketingBusifavorCallbackResponse.cs | 25 + ...UpdateMarketingBusifavorCallbackRequest.cs | 25 + ...pdateMarketingBusifavorCallbackResponse.cs | 34 + ...ssociateMarketingBusifavorCouponRequest.cs | 39 + ...sociateMarketingBusifavorCouponResponse.cs | 20 + ...teMarketingBusifavorCouponReturnRequest.cs | 32 + ...eMarketingBusifavorCouponReturnResponse.cs | 20 + ...activateMarketingBusifavorCouponRequest.cs | 39 + ...ctivateMarketingBusifavorCouponResponse.cs | 20 + ...ssociateMarketingBusifavorCouponRequest.cs | 12 + ...sociateMarketingBusifavorCouponResponse.cs | 20 + .../SendMarketingBusifavorCouponRequest.cs | 48 + .../SendMarketingBusifavorCouponResponse.cs | 18 + .../SetMarketingBusifavorCouponUsedRequest.cs | 55 ++ ...SetMarketingBusifavorCouponUsedResponse.cs | 34 + .../CreateMarketingBusifavorStockRequest.cs | 493 +++++++++++ .../CreateMarketingBusifavorStockResponse.cs | 27 + ...MarketingBusifavorStockByStockIdRequest.cs | 18 + ...arketingBusifavorStockByStockIdResponse.cs | 569 ++++++++++++ ...ketingBusifavorSubsidyPayReceiptRequest.cs | 67 ++ ...etingBusifavorSubsidyPayReceiptResponse.cs | 12 + ...ingBusifavorSubsidyReturnReceiptRequest.cs | 74 ++ ...ngBusifavorSubsidyReturnReceiptResponse.cs | 120 +++ ...sidyPayReceiptBySubsidyReceiptIdRequest.cs | 18 + ...idyPayReceiptBySubsidyReceiptIdResponse.cs | 106 +++ ...ateMarketingBusifavorStockBudgetRequest.cs | 53 ++ ...teMarketingBusifavorStockBudgetResponse.cs | 25 + .../UpdateMarketingBusifavorStockRequest.cs | 137 +++ .../UpdateMarketingBusifavorStockResponse.cs | 12 + ...rketingBusifavorStockCouponCodesRequest.cs | 32 + ...ketingBusifavorStockCouponCodesResponse.cs | 103 +++ ...gBusifavorUserCouponByCouponCodeRequest.cs | 32 + ...BusifavorUserCouponByCouponCodeResponse.cs | 167 ++++ ...eryMarketingBusifavorUserCouponsRequest.cs | 74 ++ ...ryMarketingBusifavorUserCouponsResponse.cs | 203 +++++ .../UpdateMarketingFavorCallbackRequest.cs | 32 + .../UpdateMarketingFavorCallbackResponse.cs | 27 + .../CreateMarketingFavorStockRequest.cs | 346 ++++++++ .../CreateMarketingFavorStockResponse.cs | 27 + .../GetMarketingFavorStockByStockIdRequest.cs | 25 + ...GetMarketingFavorStockByStockIdResponse.cs | 241 +++++ ...GetMarketingFavorStockRefundFlowRequest.cs | 12 + ...etMarketingFavorStockRefundFlowResponse.cs | 12 + .../GetMarketingFavorStockUseFlowRequest.cs | 18 + .../GetMarketingFavorStockUseFlowResponse.cs | 32 + .../PauseMarketingFavorStockRequest.cs | 12 + .../PauseMarketingFavorStockResponse.cs | 12 + .../QueryMarketingFavorStockItemsRequest.cs | 39 + .../QueryMarketingFavorStockItemsResponse.cs | 46 + ...ueryMarketingFavorStockMerchantsRequest.cs | 39 + ...eryMarketingFavorStockMerchantsResponse.cs | 46 + .../QueryMarketingFavorStocksRequest.cs | 53 ++ .../QueryMarketingFavorStocksResponse.cs | 178 ++++ .../RestartMarketingFavorStockRequest.cs | 12 + .../RestartMarketingFavorStockResponse.cs | 12 + .../StartMarketingFavorStockRequest.cs | 25 + .../StartMarketingFavorStockResponse.cs | 27 + ...rketingFavorUserCouponByCouponIdRequest.cs | 32 + ...ketingFavorUserCouponByCouponIdResponse.cs | 159 ++++ .../QueryMarketingFavorUserCouponsRequest.cs | 74 ++ .../QueryMarketingFavorUserCouponsResponse.cs | 241 +++++ .../SendMarketingFavorUserCouponRequest.cs | 60 ++ .../SendMarketingFavorUserCouponResponse.cs | 18 + .../UploadMarketingMediaImageRequest.cs | 39 + .../UploadMarketingMediaImageResponse.cs | 18 + .../BuildMarketingPartnershipRequest.cs | 83 ++ .../BuildMarketingPartnershipResponse.cs | 70 ++ .../QueryMarketingPartnershipsRequest.cs | 90 ++ .../QueryMarketingPartnershipsResponse.cs | 153 ++++ .../TerminateMarketingPartnershipRequest.cs | 43 + .../TerminateMarketingPartnershipResponse.cs | 20 + ...tActivityUniqueThresholdActivityRequest.cs | 276 ++++++ ...ActivityUniqueThresholdActivityResponse.cs | 27 + ...etingPayGiftActivityByActivityIdRequest.cs | 18 + ...tingPayGiftActivityByActivityIdResponse.cs | 360 ++++++++ ...eryMarketingPayGiftActivityGoodsRequest.cs | 32 + ...ryMarketingPayGiftActivityGoodsResponse.cs | 77 ++ ...MarketingPayGiftActivityMerchantRequest.cs | 32 + ...arketingPayGiftActivityMerchantResponse.cs | 54 ++ ...MarketingPayGiftActivityMerchantRequest.cs | 32 + ...arketingPayGiftActivityMerchantResponse.cs | 27 + ...arketingPayGiftActivityMerchantsRequest.cs | 32 + ...rketingPayGiftActivityMerchantsResponse.cs | 84 ++ .../QueryMarketingPayGiftActivitiesRequest.cs | 46 + ...QueryMarketingPayGiftActivitiesResponse.cs | 152 ++++ ...erminateMarketingPayGiftActivityRequest.cs | 18 + ...rminateMarketingPayGiftActivityResponse.cs | 27 + .../GetMerchantFundBalanceRequest.cs | 18 + .../GetMerchantFundBalanceResponse.cs | 25 + .../GetMerchantFundDayendBalanceRequest.cs | 25 + .../GetMerchantFundDayendBalanceResponse.cs | 25 + .../GetMerchantFundWithdrawBillRequest.cs | 32 + .../GetMerchantFundWithdrawBillResponse.cs | 32 + .../CreateMerchantFundWithdrawRequest.cs | 46 + .../CreateMerchantFundWithdrawResponse.cs | 25 + ...ntFundWithdrawByOutRequestNumberRequest.cs | 18 + ...tFundWithdrawByOutRequestNumberResponse.cs | 92 ++ ...MerchantFundWithdrawByWithdrawIdRequest.cs | 18 + ...erchantFundWithdrawByWithdrawIdResponse.cs | 12 + .../UploadMerchantMediaImageRequest.cs | 39 + .../UploadMerchantMediaImageResponse.cs | 18 + .../UploadMerchantMediaVideoRequest.cs | 39 + .../UploadMerchantMediaVideoResponse.cs | 12 + ...hantServiceComplaintNotificationRequest.cs | 18 + ...antServiceComplaintNotificationResponse.cs | 12 + ...hantServiceComplaintNotificationRequest.cs | 12 + ...antServiceComplaintNotificationResponse.cs | 12 + ...hantServiceComplaintNotificationRequest.cs | 12 + ...antServiceComplaintNotificationResponse.cs | 25 + ...hantServiceComplaintNotificationRequest.cs | 18 + ...antServiceComplaintNotificationResponse.cs | 12 + ...MerchantServiceComplaintResponseRequest.cs | 39 + ...erchantServiceComplaintResponseResponse.cs | 12 + ...antServiceComplaintByComplaintIdRequest.cs | 18 + ...ntServiceComplaintByComplaintIdResponse.cs | 117 +++ ...iceComplaintNegotiationHistoriesRequest.cs | 32 + ...ceComplaintNegotiationHistoriesResponse.cs | 89 ++ .../QueryMerchantServiceComplaintsRequest.cs | 46 + .../QueryMerchantServiceComplaintsResponse.cs | 144 +++ ...MerchantServiceComplaintCompleteRequest.cs | 25 + ...erchantServiceComplaintCompleteResponse.cs | 12 + .../UploadMerchantServiceImageRequest.cs | 39 + .../UploadMerchantServiceImageResponse.cs | 18 + .../ClosePayPartnerTransactionRequest.cs | 25 + .../ClosePayPartnerTransactionResponse.cs | 12 + .../CreatePayPartnerTransactionAppRequest.cs | 39 + .../CreatePayPartnerTransactionAppResponse.cs | 12 + .../CreatePayPartnerTransactionH5Request.cs | 39 + .../CreatePayPartnerTransactionH5Response.cs | 12 + ...CreatePayPartnerTransactionJsapiRequest.cs | 66 ++ ...reatePayPartnerTransactionJsapiResponse.cs | 12 + ...reatePayPartnerTransactionNativeRequest.cs | 39 + ...eatePayPartnerTransactionNativeResponse.cs | 12 + .../GetPayPartnerTransactionByIdRequest.cs | 25 + .../GetPayPartnerTransactionByIdResponse.cs | 12 + ...rtnerTransactionByOutTradeNumberRequest.cs | 25 + ...tnerTransactionByOutTradeNumberResponse.cs | 157 ++++ .../ApplyPayScorePermissionsRequest.cs | 39 + .../ApplyPayScorePermissionsResponse.cs | 18 + ...rePermissionsByAuthorizationCodeRequest.cs | 25 + ...ePermissionsByAuthorizationCodeResponse.cs | 78 ++ .../GetPayScorePermissionsByOpenIdRequest.cs | 32 + .../GetPayScorePermissionsByOpenIdResponse.cs | 12 + ...rePermissionsByAuthorizationCodeRequest.cs | 32 + ...ePermissionsByAuthorizationCodeResponse.cs | 12 + ...inatePayScorePermissionsByOpenIdRequest.cs | 39 + ...natePayScorePermissionsByOpenIdResponse.cs | 12 + .../CancelPayScoreServiceOrderRequest.cs | 39 + .../CancelPayScoreServiceOrderResponse.cs | 46 + ...yScoreServiceOrderDirectCompleteRequest.cs | 159 ++++ ...ScoreServiceOrderDirectCompleteResponse.cs | 153 ++++ .../CreatePayScoreServiceOrderRequest.cs | 239 +++++ .../CreatePayScoreServiceOrderResponse.cs | 146 +++ ...coreServiceOrderByOutOrderNumberRequest.cs | 32 + ...oreServiceOrderByOutOrderNumberResponse.cs | 362 ++++++++ ...GetPayScoreServiceOrderByQueryIdRequest.cs | 32 + ...etPayScoreServiceOrderByQueryIdResponse.cs | 12 + .../ModifyPayScoreServiceOrderRequest.cs | 71 ++ .../ModifyPayScoreServiceOrderResponse.cs | 12 + .../SetPayScoreServiceOrderCompleteRequest.cs | 106 +++ ...SetPayScoreServiceOrderCompleteResponse.cs | 12 + .../SetPayScoreServiceOrderPayRequest.cs | 53 ++ .../SetPayScoreServiceOrderPayResponse.cs | 46 + .../SetPayScoreServiceOrderSyncRequest.cs | 61 ++ .../SetPayScoreServiceOrderSyncResponse.cs | 12 + .../ClosePayTransactionRequest.cs | 25 + .../ClosePayTransactionResponse.cs | 12 + .../CreatePayTransactionAppRequest.cs | 257 ++++++ .../CreatePayTransactionAppResponse.cs | 18 + .../CreatePayTransactionH5Request.cs | 163 ++++ .../CreatePayTransactionH5Response.cs | 18 + .../CreatePayTransactionJsapiRequest.cs | 133 +++ .../CreatePayTransactionJsapiResponse.cs | 18 + .../CreatePayTransactionNativeRequest.cs | 116 +++ .../CreatePayTransactionNativeResponse.cs | 18 + .../GetPayTransactionByIdRequest.cs | 25 + .../GetPayTransactionByIdResponse.cs | 12 + ...etPayTransactionByOutTradeNumberRequest.cs | 25 + ...tPayTransactionByOutTradeNumberResponse.cs | 286 ++++++ .../CreateRefundDomesticRefundRequest.cs | 146 +++ .../CreateRefundDomesticRefundResponse.cs | 12 + ...dDomesticRefundByOutRefundNumberRequest.cs | 25 + ...DomesticRefundByOutRefundNumberResponse.cs | 254 ++++++ .../SmartGuide/AssignSmartGuideRequest.cs | 32 + .../SmartGuide/AssignSmartGuideResponse.cs | 12 + .../SmartGuide/CreateSmartGuideRequest.cs | 74 ++ .../SmartGuide/CreateSmartGuideResponse.cs | 18 + .../SmartGuide/QuerySmartGuidesRequest.cs | 60 ++ .../SmartGuide/QuerySmartGuidesResponse.cs | 88 ++ .../SmartGuide/UpdateSmartGuideRequest.cs | 60 ++ .../SmartGuide/UpdateSmartGuideResponse.cs | 12 + .../BusinessCircle/MallRefundResource.cs | 90 ++ .../BusinessCircle/MallTransactionResource.cs | 83 ++ .../CombineTransactionResource.cs | 68 ++ .../DiscountCard/DiscountCardResource.cs | 139 +++ .../MarketingBusifavorCouponResource.cs | 131 +++ .../MarketingFavorCouponResource.cs | 167 ++++ .../MerchantService/ComplaintResource.cs | 26 + .../PartnerRefundResource.cs | 92 ++ .../PartnerTransactionResource.cs | 144 +++ .../PayScorePermissionsResource.cs | 70 ++ .../PayScoreServiceOrderResource.cs | 243 +++++ .../PayTransactions/TransactionResource.cs | 130 +++ .../Resources/Refund/RefundResource.cs | 85 ++ ...KIT.FlurlHttpClient.Wechat.TenpayV3.csproj | 34 + .../Utilities/AesUtil.cs | 69 ++ .../Utilities/RsaUtil.cs | 274 ++++++ .../Utilities/Sha256Util.cs | 42 + .../WechatTenpayAuthSchemes.cs | 15 + .../WechatTenpayCallback.cs | 100 +++ .../WechatTenpayClient.cs | 161 ++++ .../WechatTenpayClientOptions.cs | 61 ++ .../WechatTenpayEndpoints.cs | 25 + .../WechatTenpayException.cs | 27 + .../WechatTenpayRequest.cs | 25 + .../WechatTenpayResponse.cs | 97 ++ .../RFC3339DateTimeOffsetConverter.cs | 33 + .../RFC3339NullableDateTimeOffsetConverter.cs | 58 ++ .../RFC3339DateTimeOffsetConverter.cs | 23 + .../RFC3339NullableDateTimeOffsetConverter.cs | 43 + .../StringTypedBooleanConverter.cs | 23 + .../StringTypedNullableBooleanConverter.cs | 48 + .../FlurlHttpRequestVerbExtensions.cs | 43 + .../IWechatClient.cs | 33 + .../IWechatRequest.cs | 17 + .../IWechatResponse.cs | 38 + .../SKIT.FlurlHttpClient.Wechat.csproj | 28 + .../FlurlNewtonsoftJsonSerializer.cs | 75 ++ .../FlurlSystemTextJsonSerializer.cs | 77 ++ .../WechatClientBase.cs | 116 +++ .../WechatClientSettings.cs | 43 + .../WechatExceptionBase.cs | 27 + .../.gitignore | 1 + .../Cgibin/CgibinGetApiDomainIpRequest.json | 1 + .../Cgibin/CgibinGetApiDomainIpResponse.json | 3 + .../Cgibin/CgibinGetCallbackIpRequest.json | 1 + .../Cgibin/CgibinGetCallbackIpResponse.json | 3 + .../Cgibin/CgibinTicketGetTicketRequest.json | 1 + .../Cgibin/CgibinTicketGetTicketResponse.json | 6 + .../Cgibin/CgibinTokenRequest.json | 1 + .../Cgibin/CgibinTokenResponse.json | 4 + .../CgibinTags/CgibinTagsCreateRequest.json | 5 + .../CgibinTags/CgibinTagsCreateResponse.json | 6 + .../CgibinTags/CgibinTagsDeleteRequest.json | 5 + .../CgibinTags/CgibinTagsDeleteResponse.json | 4 + .../CgibinTags/CgibinTagsGetRequest.json | 1 + .../CgibinTags/CgibinTagsGetResponse.json | 19 + .../CgibinTags/CgibinTagsUpdateRequest.json | 6 + .../CgibinTags/CgibinTagsUpdateResponse.json | 4 + .../CgibinTags/CgibinUserTagGetRequest.json | 4 + .../CgibinTags/CgibinUserTagGetResponse.json | 10 + .../Members/CgibinTagsGetIdListRequest.json | 3 + .../Members/CgibinTagsGetIdListResponse.json | 3 + .../CgibinTagsMembersBatchTaggingRequest.json | 7 + ...CgibinTagsMembersBatchTaggingResponse.json | 4 + ...gibinTagsMembersBatchUntaggingRequest.json | 7 + ...ibinTagsMembersBatchUntaggingResponse.json | 4 + ...gibinTagsMembersBatchBlackListRequest.json | 3 + ...ibinTagsMembersBatchBlackListResponse.json | 4 + ...binTagsMembersBatchUnblackListRequest.json | 3 + ...inTagsMembersBatchUnblackListResponse.json | 4 + .../CgibinTagsMembersGetBlackListRequest.json | 3 + ...CgibinTagsMembersGetBlackListResponse.json | 12 + .../CgibinUserInfoBatchGetRequest.json | 12 + .../CgibinUserInfoBatchGetResponse.json | 31 + .../CgibinUser/CgibinUserInfoRequest.json | 1 + .../CgibinUser/CgibinUserInfoResponse.json | 19 + .../CgibinUserInfoUpdateRemarkRequest.json | 4 + .../CgibinUserInfoUpdateRemarkResponse.json | 4 + .../CgibinUser/CgibinUserRequest.json | 1 + .../CgibinUser/CgibinUserResponse.json | 8 + .../ModelSamples/Sns/SnsAuthRequest.json | 1 + .../ModelSamples/Sns/SnsAuthResponse.json | 4 + .../Sns/SnsJsCode2SessionRequest.json | 1 + .../Sns/SnsJsCode2SessionResponse.json | 5 + .../Sns/SnsOAuth2AccessTokenRequest.json | 1 + .../Sns/SnsOAuth2AccessTokenResponse.json | 7 + .../Sns/SnsOAuth2RefreshTokenRequest.json | 1 + .../Sns/SnsOAuth2RefreshTokenResponse.json | 7 + .../ModelSamples/Sns/SnsUserInfoRequest.json | 1 + .../ModelSamples/Sns/SnsUserInfoResponse.json | 11 + ...lurlHttpClient.Wechat.Api.UnitTests.csproj | 32 + .../TestClients.cs | 14 + .../TestConfigs.cs | 28 + .../WechatApiDefinitionTests.cs | 292 ++++++ ...hatApiExecuteCgibinWithAccessTokenTests.cs | 141 +++ ...echatApiExecuteCgibinWithAppSecretTests.cs | 20 + ...WechatApiExecuteSnsWithAccessTokenTests.cs | 38 + .../WechatApiExecuteSnsWithAppSecretTests.cs | 51 ++ .../appsettings.json | 8 + .../.gitignore | 1 + ...teApplyForSubMerchantApplymentRequest.json | 149 ++++ ...eApplyForSubMerchantApplymentResponse.json | 3 + ...MerchantApplymentByApplymentIdRequest.json | 1 + ...erchantApplymentByApplymentIdResponse.json | 15 + ...erchantApplymentByBusinessCodeRequest.json | 1 + ...rchantApplymentByBusinessCodeResponse.json | 15 + ...tApplyForSubMerchantSettlementRequest.json | 1 + ...ApplyForSubMerchantSettlementResponse.json | 8 + ...yApplyForSubMerchantSettlementRequest.json | 8 + ...ApplyForSubMerchantSettlementResponse.json | 1 + ...rSubjectApplymentByApplymentIdRequest.json | 1 + ...SubjectApplymentByApplymentIdResponse.json | 1 + ...SubjectApplymentByBusinessCodeRequest.json | 1 + ...ubjectApplymentByBusinessCodeResponse.json | 1 + ...CreateApplyForSubjectApplymentRequest.json | 51 ++ ...reateApplyForSubjectApplymentResponse.json | 3 + ...rSubjectApplymentByApplymentIdRequest.json | 1 + ...SubjectApplymentByApplymentIdResponse.json | 6 + ...SubjectApplymentByBusinessCodeRequest.json | 1 + ...ubjectApplymentByBusinessCodeResponse.json | 6 + ...rSubjectApplymentMerchantStateRequest.json | 1 + ...SubjectApplymentMerchantStateResponse.json | 3 + .../Bill/DownloadBillFileRequest.json | 1 + .../Bill/DownloadBillFileResponse.json | 1 + .../Bill/GetBillFundflowBillRequest.json | 1 + .../Bill/GetBillFundflowBillResponse.json | 5 + .../Bill/GetBillTradeBillRequest.json | 1 + .../Bill/GetBillTradeBillResponse.json | 5 + ...BrandProfitSharingOrderAmountsRequest.json | 1 + ...randProfitSharingOrderAmountsResponse.json | 4 + .../GetBrandProfitBrandConfigsRequest.json | 1 + .../GetBrandProfitBrandConfigsResponse.json | 4 + .../CreateBrandProfitSharingOrderRequest.json | 17 + ...CreateBrandProfitSharingOrderResponse.json | 7 + ...eBrandProfitSharingReturnOrderRequest.json | 8 + ...BrandProfitSharingReturnOrderResponse.json | 12 + ...itSharingOrderByOutOrderNumberRequest.json | 1 + ...tSharingOrderByOutOrderNumberResponse.json | 29 + ...fitSharingReturnOrderByOrderIdRequest.json | 1 + ...itSharingReturnOrderByOrderIdResponse.json | 12 + ...ingReturnOrderByOutOrderNumberRequest.json | 1 + ...ngReturnOrderByOutOrderNumberResponse.json | 12 + .../AddBrandProfitSharingReceiverRequest.json | 9 + ...AddBrandProfitSharingReceiverResponse.json | 5 + ...leteBrandProfitSharingReceiverRequest.json | 7 + ...eteBrandProfitSharingReceiverResponse.json | 5 + ...tBrandProfitSharingOrderFinishRequest.json | 6 + ...BrandProfitSharingOrderFinishResponse.json | 6 + ...ircleUserAuthorizationByOpenIdRequest.json | 1 + ...rcleUserAuthorizationByOpenIdResponse.json | 5 + .../NotifyBusinessCirclePointsRequest.json | 10 + .../NotifyBusinessCirclePointsResponse.json | 1 + .../QueryCertificatesRequest.json | 1 + .../QueryCertificatesResponse.json | 26 + .../CloseCombineTransactionRequest.json | 10 + .../CloseCombineTransactionResponse.json | 1 + .../CreateCombineTransactionAppRequest.json | 28 + .../CreateCombineTransactionAppResponse.json | 3 + .../CreateCombineTransactionH5Request.json | 36 + .../CreateCombineTransactionH5Response.json | 3 + .../CreateCombineTransactionJsapiRequest.json | 28 + ...CreateCombineTransactionJsapiResponse.json | 3 + ...CreateCombineTransactionNativeRequest.json | 44 + ...reateCombineTransactionNativeResponse.json | 3 + ...sactionByCombineOutTradeNumberRequest.json | 1 + ...actionByCombineOutTradeNumberResponse.json | 30 + .../GetDiscountCardByOutCardCodeRequest.json | 1 + .../GetDiscountCardByOutCardCodeResponse.json | 143 +++ .../PrepareDiscountCardRequest.json | 6 + .../PrepareDiscountCardResponse.json | 3 + .../AddDiscountCardUserRecordRequest.json | 35 + .../AddDiscountCardUserRecordResponse.json | 1 + .../CreateEcommerceApplymentRequest.json | 48 + .../CreateEcommerceApplymentResponse.json | 4 + ...commerceApplymentByApplymentIdRequest.json | 1 + ...ommerceApplymentByApplymentIdResponse.json | 26 + ...rceApplymentByOutRequestNumberRequest.json | 1 + ...ceApplymentByOutRequestNumberResponse.json | 26 + .../GetEcommerceBillFundflowBillRequest.json | 1 + .../GetEcommerceBillFundflowBillResponse.json | 13 + .../GetEcommerceFundBalanceRequest.json | 1 + .../GetEcommerceFundBalanceResponse.json | 6 + .../GetEcommerceFundDayendBalanceRequest.json | 1 + ...GetEcommerceFundDayendBalanceResponse.json | 5 + .../CreateEcommerceFundWithdrawRequest.json | 7 + .../CreateEcommerceFundWithdrawResponse.json | 5 + ...FundWithdrawByOutRequestNumberRequest.json | 1 + ...undWithdrawByOutRequestNumberResponse.json | 13 + ...mmerceFundWithdrawByWithdrawIdRequest.json | 1 + ...merceFundWithdrawByWithdrawIdResponse.json | 13 + ...merceProfitSharingOrderAmountsRequest.json | 1 + ...erceProfitSharingOrderAmountsResponse.json | 4 + ...ateEcommerceProfitSharingOrderRequest.json | 15 + ...teEcommerceProfitSharingOrderResponse.json | 6 + ...mmerceProfitSharingReturnOrderRequest.json | 9 + ...merceProfitSharingReturnOrderResponse.json | 12 + ...itSharingOrderByOutOrderNumberRequest.json | 1 + ...tSharingOrderByOutOrderNumberResponse.json | 19 + ...fitSharingReturnOrderByOrderIdRequest.json | 1 + ...itSharingReturnOrderByOrderIdResponse.json | 12 + ...ingReturnOrderByOutOrderNumberRequest.json | 1 + ...ngReturnOrderByOutOrderNumberResponse.json | 12 + ...EcommerceProfitSharingReceiverRequest.json | 7 + ...commerceProfitSharingReceiverResponse.json | 4 + ...EcommerceProfitSharingReceiverRequest.json | 5 + ...commerceProfitSharingReceiverResponse.json | 4 + ...mmerceProfitSharingOrderFinishRequest.json | 6 + ...merceProfitSharingOrderFinishResponse.json | 6 + .../CreateEcommerceRefundRequest.json | 16 + .../CreateEcommerceRefundResponse.json | 28 + ...ommerceRefundByOutRefundNumberRequest.json | 1 + ...mmerceRefundByOutRefundNumberResponse.json | 28 + .../GetEcommerceRefundByRefundIdRequest.json | 1 + .../GetEcommerceRefundByRefundIdResponse.json | 28 + ...teEcommerceRefundReturnAdvanceRequest.json | 3 + ...eEcommerceRefundReturnAdvanceResponse.json | 11 + ...etEcommerceRefundReturnAdvanceRequest.json | 1 + ...tEcommerceRefundReturnAdvanceResponse.json | 11 + .../CancelEcommerceSubsidyRequest.json | 5 + .../CancelEcommerceSubsidyResponse.json | 6 + .../CreateEcommerceSubsidyRequest.json | 8 + .../CreateEcommerceSubsidyResponse.json | 9 + .../CreateEcommerceSubsidyReturnRequest.json | 8 + .../CreateEcommerceSubsidyReturnResponse.json | 11 + ...ChangeGoldPlanCustomPageStatusRequest.json | 4 + ...hangeGoldPlanCustomPageStatusResponse.json | 3 + .../GoldPlan/ChangeGoldPlanStatusRequest.json | 4 + .../ChangeGoldPlanStatusResponse.json | 3 + .../CloseGoldPlanAdvertisingShowRequest.json | 3 + .../CloseGoldPlanAdvertisingShowResponse.json | 1 + .../OpenGoldPlanAdvertisingShowRequest.json | 8 + .../OpenGoldPlanAdvertisingShowResponse.json | 1 + ...dPlanAdvertisingIndustryFilterRequest.json | 8 + ...PlanAdvertisingIndustryFilterResponse.json | 1 + .../GetMarketingBusifavorCallbackRequest.json | 1 + ...GetMarketingBusifavorCallbackResponse.json | 4 + ...dateMarketingBusifavorCallbackRequest.json | 4 + ...ateMarketingBusifavorCallbackResponse.json | 5 + ...ociateMarketingBusifavorCouponRequest.json | 6 + ...ciateMarketingBusifavorCouponResponse.json | 3 + ...MarketingBusifavorCouponReturnRequest.json | 5 + ...arketingBusifavorCouponReturnResponse.json | 3 + ...tivateMarketingBusifavorCouponRequest.json | 6 + ...ivateMarketingBusifavorCouponResponse.json | 3 + ...ociateMarketingBusifavorCouponRequest.json | 6 + ...ciateMarketingBusifavorCouponResponse.json | 3 + .../SendMarketingBusifavorCouponRequest.json | 6 + .../SendMarketingBusifavorCouponResponse.json | 3 + ...etMarketingBusifavorCouponUsedRequest.json | 8 + ...tMarketingBusifavorCouponUsedResponse.json | 5 + .../CreateMarketingBusifavorStockRequest.json | 69 ++ ...CreateMarketingBusifavorStockResponse.json | 4 + ...rketingBusifavorStockByStockIdRequest.json | 1 + ...ketingBusifavorStockByStockIdResponse.json | 75 ++ ...tingBusifavorSubsidyPayReceiptRequest.json | 10 + ...ingBusifavorSubsidyPayReceiptResponse.json | 14 + ...gBusifavorSubsidyReturnReceiptRequest.json | 11 + ...BusifavorSubsidyReturnReceiptResponse.json | 16 + ...dyPayReceiptBySubsidyReceiptIdRequest.json | 1 + ...yPayReceiptBySubsidyReceiptIdResponse.json | 14 + ...eMarketingBusifavorStockBudgetRequest.json | 5 + ...MarketingBusifavorStockBudgetResponse.json | 4 + .../UpdateMarketingBusifavorStockRequest.json | 36 + ...UpdateMarketingBusifavorStockResponse.json | 1 + ...etingBusifavorStockCouponCodesRequest.json | 7 + ...tingBusifavorStockCouponCodesResponse.json | 23 + ...usifavorUserCouponByCouponCodeRequest.json | 1 + ...sifavorUserCouponByCouponCodeResponse.json | 68 ++ ...yMarketingBusifavorUserCouponsRequest.json | 1 + ...MarketingBusifavorUserCouponsResponse.json | 74 ++ .../UpdateMarketingFavorCallbackRequest.json | 4 + .../UpdateMarketingFavorCallbackResponse.json | 4 + .../CreateMarketingFavorStockRequest.json | 45 + .../CreateMarketingFavorStockResponse.json | 4 + ...etMarketingFavorStockByStockIdRequest.json | 1 + ...tMarketingFavorStockByStockIdResponse.json | 25 + ...tMarketingFavorStockRefundFlowRequest.json | 1 + ...MarketingFavorStockRefundFlowResponse.json | 5 + .../GetMarketingFavorStockUseFlowRequest.json | 1 + ...GetMarketingFavorStockUseFlowResponse.json | 5 + .../PauseMarketingFavorStockRequest.json | 3 + .../PauseMarketingFavorStockResponse.json | 4 + .../QueryMarketingFavorStockItemsRequest.json | 1 + ...QueryMarketingFavorStockItemsResponse.json | 6 + ...ryMarketingFavorStockMerchantsRequest.json | 1 + ...yMarketingFavorStockMerchantsResponse.json | 9 + .../QueryMarketingFavorStocksRequest.json | 1 + .../QueryMarketingFavorStocksResponse.json | 32 + .../RestartMarketingFavorStockRequest.json | 3 + .../RestartMarketingFavorStockResponse.json | 4 + .../StartMarketingFavorStockRequest.json | 3 + .../StartMarketingFavorStockResponse.json | 4 + ...etingFavorUserCouponByCouponIdRequest.json | 1 + ...tingFavorUserCouponByCouponIdResponse.json | 23 + ...QueryMarketingFavorUserCouponsRequest.json | 1 + ...ueryMarketingFavorUserCouponsResponse.json | 42 + .../SendMarketingFavorUserCouponRequest.json | 6 + .../SendMarketingFavorUserCouponResponse.json | 3 + .../UploadMarketingMediaImageRequest.json | 1 + .../UploadMarketingMediaImageResponse.json | 3 + .../BuildMarketingPartnershipRequest.json | 10 + .../BuildMarketingPartnershipResponse.json | 15 + .../QueryMarketingPartnershipsRequest.json | 1 + .../QueryMarketingPartnershipsResponse.json | 35 + .../TerminateMarketingPartnershipRequest.json | 10 + ...TerminateMarketingPartnershipResponse.json | 3 + ...rketingPayGiftActivityMerchantRequest.json | 4 + ...ketingPayGiftActivityMerchantResponse.json | 14 + ...ctivityUniqueThresholdActivityRequest.json | 53 ++ ...tivityUniqueThresholdActivityResponse.json | 4 + ...rketingPayGiftActivityMerchantRequest.json | 4 + ...ketingPayGiftActivityMerchantResponse.json | 4 + ...ingPayGiftActivityByActivityIdRequest.json | 1 + ...ngPayGiftActivityByActivityIdResponse.json | 60 ++ ...ueryMarketingPayGiftActivitiesRequest.json | 1 + ...eryMarketingPayGiftActivitiesResponse.json | 93 ++ ...yMarketingPayGiftActivityGoodsRequest.json | 1 + ...MarketingPayGiftActivityGoodsResponse.json | 13 + ...ketingPayGiftActivityMerchantsRequest.json | 1 + ...etingPayGiftActivityMerchantsResponse.json | 14 + ...minateMarketingPayGiftActivityRequest.json | 1 + ...inateMarketingPayGiftActivityResponse.json | 4 + .../GetMerchantFundBalanceRequest.json | 1 + .../GetMerchantFundBalanceResponse.json | 4 + .../GetMerchantFundDayendBalanceRequest.json | 1 + .../GetMerchantFundDayendBalanceResponse.json | 4 + .../GetMerchantFundWithdrawBillRequest.json | 1 + .../GetMerchantFundWithdrawBillResponse.json | 5 + .../CreateMerchantFundWithdrawRequest.json | 7 + .../CreateMerchantFundWithdrawResponse.json | 4 + ...FundWithdrawByOutRequestNumberRequest.json | 1 + ...undWithdrawByOutRequestNumberResponse.json | 13 + ...rchantFundWithdrawByWithdrawIdRequest.json | 1 + ...chantFundWithdrawByWithdrawIdResponse.json | 13 + .../UploadMerchantMediaImageRequest.json | 1 + .../UploadMerchantMediaImageResponse.json | 3 + .../UploadMerchantMediaVideoRequest.json | 1 + .../UploadMerchantMediaVideoResponse.json | 3 + ...ntServiceComplaintNotificationRequest.json | 3 + ...tServiceComplaintNotificationResponse.json | 4 + ...ntServiceComplaintNotificationRequest.json | 1 + ...tServiceComplaintNotificationResponse.json | 1 + ...ntServiceComplaintNotificationRequest.json | 1 + ...tServiceComplaintNotificationResponse.json | 4 + ...ntServiceComplaintNotificationRequest.json | 3 + ...tServiceComplaintNotificationResponse.json | 4 + ...rchantServiceComplaintResponseRequest.json | 7 + ...chantServiceComplaintResponseResponse.json | 1 + ...tServiceComplaintByComplaintIdRequest.json | 1 + ...ServiceComplaintByComplaintIdResponse.json | 19 + ...eComplaintNegotiationHistoriesRequest.json | 1 + ...ComplaintNegotiationHistoriesResponse.json | 17 + ...QueryMerchantServiceComplaintsRequest.json | 1 + ...ueryMerchantServiceComplaintsResponse.json | 30 + ...rchantServiceComplaintCompleteRequest.json | 3 + ...chantServiceComplaintCompleteResponse.json | 1 + .../UploadMerchantServiceImageRequest.json | 1 + .../UploadMerchantServiceImageResponse.json | 3 + .../ClosePayPartnerTransactionRequest.json | 4 + .../ClosePayPartnerTransactionResponse.json | 1 + ...CreatePayPartnerTransactionAppRequest.json | 13 + ...reatePayPartnerTransactionAppResponse.json | 3 + .../CreatePayPartnerTransactionH5Request.json | 18 + ...CreatePayPartnerTransactionH5Response.json | 3 + ...eatePayPartnerTransactionJsapiRequest.json | 16 + ...atePayPartnerTransactionJsapiResponse.json | 3 + ...atePayPartnerTransactionNativeRequest.json | 13 + ...tePayPartnerTransactionNativeResponse.json | 3 + .../GetPayPartnerTransactionByIdRequest.json | 1 + .../GetPayPartnerTransactionByIdResponse.json | 25 + ...nerTransactionByOutTradeNumberRequest.json | 1 + ...erTransactionByOutTradeNumberResponse.json | 25 + .../ApplyPayScorePermissionsRequest.json | 6 + .../ApplyPayScorePermissionsResponse.json | 3 + ...PermissionsByAuthorizationCodeRequest.json | 1 + ...ermissionsByAuthorizationCodeResponse.json | 11 + ...GetPayScorePermissionsByOpenIdRequest.json | 1 + ...etPayScorePermissionsByOpenIdResponse.json | 11 + ...PermissionsByAuthorizationCodeRequest.json | 4 + ...ermissionsByAuthorizationCodeResponse.json | 1 + ...atePayScorePermissionsByOpenIdRequest.json | 4 + ...tePayScorePermissionsByOpenIdResponse.json | 1 + .../CancelPayScoreServiceOrderRequest.json | 5 + .../CancelPayScoreServiceOrderResponse.json | 7 + ...coreServiceOrderDirectCompleteRequest.json | 50 ++ ...oreServiceOrderDirectCompleteResponse.json | 51 ++ .../CreatePayScoreServiceOrderRequest.json | 37 + .../CreatePayScoreServiceOrderResponse.json | 40 + ...reServiceOrderByOutOrderNumberRequest.json | 1 + ...eServiceOrderByOutOrderNumberResponse.json | 57 ++ ...tPayScoreServiceOrderByQueryIdRequest.json | 1 + ...PayScoreServiceOrderByQueryIdResponse.json | 57 ++ .../ModifyPayScoreServiceOrderRequest.json | 21 + .../ModifyPayScoreServiceOrderResponse.json | 39 + ...etPayScoreServiceOrderCompleteRequest.json | 28 + ...tPayScoreServiceOrderCompleteResponse.json | 40 + .../SetPayScoreServiceOrderPayRequest.json | 4 + .../SetPayScoreServiceOrderPayResponse.json | 7 + .../SetPayScoreServiceOrderSyncRequest.json | 8 + .../SetPayScoreServiceOrderSyncResponse.json | 57 ++ .../ClosePayTransactionRequest.json | 3 + .../ClosePayTransactionResponse.json | 1 + .../CreatePayTransactionAppRequest.json | 11 + .../CreatePayTransactionAppResponse.json | 3 + .../CreatePayTransactionH5Request.json | 17 + .../CreatePayTransactionH5Response.json | 3 + .../CreatePayTransactionJsapiRequest.json | 14 + .../CreatePayTransactionJsapiResponse.json | 3 + .../CreatePayTransactionNativeRequest.json | 11 + .../CreatePayTransactionNativeResponse.json | 3 + .../GetPayTransactionByIdRequest.json | 1 + .../GetPayTransactionByIdResponse.json | 22 + ...PayTransactionByOutTradeNumberRequest.json | 1 + ...ayTransactionByOutTradeNumberResponse.json | 22 + .../CreateRefundDomesticRefundRequest.json | 12 + .../CreateRefundDomesticRefundResponse.json | 22 + ...omesticRefundByOutRefundNumberRequest.json | 1 + ...mesticRefundByOutRefundNumberResponse.json | 23 + .../SmartGuide/AssignSmartGuideRequest.json | 3 + .../SmartGuide/AssignSmartGuideResponse.json | 1 + .../SmartGuide/CreateSmartGuideRequest.json | 10 + .../SmartGuide/CreateSmartGuideResponse.json | 3 + .../SmartGuide/QuerySmartGuidesRequest.json | 1 + .../SmartGuide/QuerySmartGuidesResponse.json | 21 + .../SmartGuide/UpdateSmartGuideRequest.json | 7 + .../SmartGuide/UpdateSmartGuideResponse.json | 1 + .../BusinessCircle/MallRefundResource.json | 13 + .../MallTransactionResource.json | 11 + .../CombineTransactionResource.json | 29 + .../DiscountCard/DiscountCardResource.json | 135 +++ .../MarketingBusifavorCouponResource.json | 14 + .../MarketingFavorCouponResource.json | 38 + .../MerchantService/ComplaintResource.json | 4 + .../PartnerRefundResource.json | 17 + .../PartnerTransactionResource.json | 83 ++ .../PayScorePermissionsResource.json | 9 + .../PayScoreServiceOrderResource.json | 40 + .../PayTransactions/TransactionResource.json | 80 ++ .../Refund/RefundResource.json | 16 + ...ttpClient.Wechat.TenpayV3.UnitTests.csproj | 35 + .../TestClients.cs | 20 + .../TestConfigs.cs | 32 + .../WechatTenpayConverterTests.cs | 140 +++ .../WechatTenpayDefinitionTests.cs | 298 +++++++ .../WechatTenpayExecuteBillTests.cs | 55 ++ .../WechatTenpayExecuteCertificatesTests.cs | 29 + ...atTenpayExecuteCombineTransactionsTests.cs | 164 ++++ ...hatTenpayExecuteMarketingBusifavorTests.cs | 104 +++ .../WechatTenpayExecuteMarketingFavorTests.cs | 158 ++++ .../WechatTenpayExecuteMarketingMediaTests.cs | 26 + ...TenpayExecuteMarketingPartnershipsTests.cs | 63 ++ ...payExecuteMarketingPayGiftActivityTests.cs | 30 + .../WechatTenpayExecuteMerchantMediaTests.cs | 40 + ...WechatTenpayExecuteMerchantServiceTests.cs | 133 +++ ...WechatTenpayExecutePayTransactionsTests.cs | 140 +++ .../WechatTenpayExecuteRefundTests.cs | 63 ++ .../WechatTenpayResponseVerificationTests.cs | 34 + .../WechatTenpayUtilityTests.cs | 99 +++ .../appsettings.json | 10 + 916 files changed, 38562 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SKIT.FlurlHttpClient.Wechat.sln create mode 100644 docs/WechatApi/README.md create mode 100644 docs/WechatTenpayV3/Advanced_CallbackDataDecryption.md create mode 100644 docs/WechatTenpayV3/Advanced_IHttpClientFactory.md create mode 100644 docs/WechatTenpayV3/Advanced_JsonSerializer.md create mode 100644 docs/WechatTenpayV3/Advanced_MerchantCertSerialNumber.md create mode 100644 docs/WechatTenpayV3/Advanced_ModelDefinition.md create mode 100644 docs/WechatTenpayV3/Advanced_Payment.md create mode 100644 docs/WechatTenpayV3/Advanced_ResponseDataDecryption.md create mode 100644 docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md create mode 100644 docs/WechatTenpayV3/README.md create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinTagsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinUserExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteSnsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClientOptions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiEndpoints.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiException.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/EncryptionAlgorithms.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/SignTypes.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonNullableDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringArrayConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringIListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonNullableDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringArrayConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringIListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayCallbackDecryptionException.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayRequestSignatureException.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseDecryptionException.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseVerificationException.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientCallbackDeserializationExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubMerchantExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubjectExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBillExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBrandProfitSharingExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBusinessCircleExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCertificatesExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCombineTransactionExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteDiscountCardExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceApplymentsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceBillExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundBalanceExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundWithdrawExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceProfitSharingExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceRefundsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceSubsidiesExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteGoldPlanExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBusifavorExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingFavorExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMediaExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPartnershipsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPayGiftActivityExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundBalanceExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundWithdrawExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantServiceExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScorePermissionsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScoreServiceOrderExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteRefundExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteSmartGuideExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientParameterExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseVerifyExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayAuthenticator.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Request.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Response.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/QueryMarketingPartnershipsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/QueryMarketingPartnershipsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Request.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Response.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallRefundResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallTransactionResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/CombineTransactions/CombineTransactionResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/DiscountCard/DiscountCardResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingBusifavor/MarketingBusifavorCouponResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingFavor/MarketingFavorCouponResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MerchantService/ComplaintResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerRefundResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerTransactionResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScorePermissions/PayScorePermissionsResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScoreServiceOrder/PayScoreServiceOrderResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayTransactions/TransactionResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/Refund/RefundResource.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/AesUtil.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/RsaUtil.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Sha256Util.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayAuthSchemes.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayCallback.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClientOptions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayEndpoints.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339DateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339NullableDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339DateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339NullableDateTimeOffsetConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedNullableBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Extensions/FlurlHttpRequestVerbExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/IWechatRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/IWechatResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/SKIT.FlurlHttpClient.Wechat.csproj create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlNewtonsoftJsonSerializer.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlSystemTextJsonSerializer.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/WechatClientSettings.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat/WechatExceptionBase.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/.gitignore create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestClients.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDefinitionTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAccessTokenTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAppSecretTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/appsettings.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/.gitignore create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Request.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Response.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Request.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Response.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallRefundResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallTransactionResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/CombineTransactions/CombineTransactionResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/DiscountCard/DiscountCardResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingBusifavor/MarketingBusifavorCouponResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingFavor/MarketingFavorCouponResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MerchantService/ComplaintResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerRefundResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerTransactionResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScorePermissions/PayScorePermissionsResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScoreServiceOrder/PayScoreServiceOrderResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayTransactions/TransactionResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/Refund/RefundResource.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests.csproj create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestClients.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestConfigs.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayConverterTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayDefinitionTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteBillTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCertificatesTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCombineTransactionsTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingBusifavorTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingFavorTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingMediaTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPartnershipsTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPayGiftActivityTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantMediaTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantServiceTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecutePayTransactionsTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteRefundTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayResponseVerificationTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayUtilityTests.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/appsettings.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..dadc0fc8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,193 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +# NuGet Packages Directory +packages/* +## TODO: If the tool you use requires repositories.config +## uncomment the next line +#!packages/repositories.config + +# Enable "build/" folder in the NuGet Packages folder since +# NuGet packages use it for MSBuild targets. +# This line needs to be after the ignore of the build folder +# (and the packages folder if the line above has been uncommented) +!packages/build/ + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# Visual Studio temporary files +.vs +*.nupkg \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..79b03939 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 RHQYZ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..6a5c71ba --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# SKIT.FlurlHttpClient.Wechat + +基于 `Flurl.Http` 的微信 API HTTP 客户端,支持公众平台、开放平台、商户平台等模块。 + +> [`Flurl.Http`](https://flurl.dev/) 是一个轻量级 HTTP 库,是 .NET 中最受欢迎扩展库之一,在 NuGet 上的累计下载量超过 1200 万、日均下载量超过 5 千、GitHub 2.6k Stars(数据统计截至 2021-05-01)。 +> +> 与另一个目前更加流行的 HTTP 库 [`RestSharp`](https://restsharp.dev/) 相比,`Flurl.Http` 底层基于 `System.Net.Http.HttpClient`,而 `RestSharp` 底层则基于 `System.Net.HttpWebRequest`,前者在多核多线程环境下的性能基准测试中表现要远由优于后者,同时也是微软官方目前推荐的 HTTP 客户端方案。 +> +> +> 【附】微软官方关于 `System.Net.HttpWebRequest` 与 `System.Net.Http.HttpClient` 的说明: +> +> - https://docs.microsoft.com/zh-cn/dotnet/api/system.net.httpwebrequest#remarks +> - https://docs.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclient#httpclient-and-net-core)。 + +--- + +## 特性 + +- 基于 `Flurl.Http`,可与 `IHttpClientFactory` 集成。 + +- 支持 .NET Framework 4.6.1+、.NET Standard 2.0+、.NET Core 2.0+、.NET 5。 + +- 支持 Windows / Linux / macOS 多平台部署。 + +- 支持 `System.Text.Json`(默认)和 `Newtonsoft.Json` 两种序列化方式。 + +- 异步式编程。 + +- 强类型接口模型。 + +- 完善的微信 API 封装。 + +--- + +## 模块 + +- [《微信公众平台(公众号、小程序) & 开放平台 API 模块》文档](./docs/WechatApi/README.md) + +- [《微信商户平台(微信支付) API 模块》文档](./docs/WechatTenpayV3/README.md) diff --git a/SKIT.FlurlHttpClient.Wechat.sln b/SKIT.FlurlHttpClient.Wechat.sln new file mode 100644 index 00000000..5172f638 --- /dev/null +++ b/SKIT.FlurlHttpClient.Wechat.sln @@ -0,0 +1,60 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31112.23 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3E34ADB9-1F52-4C96-9A42-DE782DE1AAA3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SKIT.FlurlHttpClient.Wechat", "src\SKIT.FlurlHttpClient.Wechat\SKIT.FlurlHttpClient.Wechat.csproj", "{63F7116F-320A-4CD8-9B84-2C675412F70F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SKIT.FlurlHttpClient.Wechat.Api", "src\SKIT.FlurlHttpClient.Wechat.Api\SKIT.FlurlHttpClient.Wechat.Api.csproj", "{082C1F69-7932-473F-A700-49584371BE8C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SKIT.FlurlHttpClient.Wechat.TenpayV3", "src\SKIT.FlurlHttpClient.Wechat.TenpayV3\SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj", "{6FE502D4-C43D-49C9-9E57-D1EE566FD1C3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C95AF531-CF44-44AA-AC90-F4DF9F941674}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SKIT.FlurlHttpClient.Wechat.Api.UnitTests", "test\SKIT.FlurlHttpClient.Wechat.Api.UnitTests\SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj", "{0C87A7D9-26EA-4821-AF3F-6D28B3006B24}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests", "test\SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests\SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests.csproj", "{5ECE2E7A-9AE8-49BF-902D-41A7756C3E78}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {63F7116F-320A-4CD8-9B84-2C675412F70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63F7116F-320A-4CD8-9B84-2C675412F70F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63F7116F-320A-4CD8-9B84-2C675412F70F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63F7116F-320A-4CD8-9B84-2C675412F70F}.Release|Any CPU.Build.0 = Release|Any CPU + {082C1F69-7932-473F-A700-49584371BE8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {082C1F69-7932-473F-A700-49584371BE8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {082C1F69-7932-473F-A700-49584371BE8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {082C1F69-7932-473F-A700-49584371BE8C}.Release|Any CPU.Build.0 = Release|Any CPU + {6FE502D4-C43D-49C9-9E57-D1EE566FD1C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FE502D4-C43D-49C9-9E57-D1EE566FD1C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FE502D4-C43D-49C9-9E57-D1EE566FD1C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FE502D4-C43D-49C9-9E57-D1EE566FD1C3}.Release|Any CPU.Build.0 = Release|Any CPU + {0C87A7D9-26EA-4821-AF3F-6D28B3006B24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C87A7D9-26EA-4821-AF3F-6D28B3006B24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C87A7D9-26EA-4821-AF3F-6D28B3006B24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C87A7D9-26EA-4821-AF3F-6D28B3006B24}.Release|Any CPU.Build.0 = Release|Any CPU + {5ECE2E7A-9AE8-49BF-902D-41A7756C3E78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5ECE2E7A-9AE8-49BF-902D-41A7756C3E78}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5ECE2E7A-9AE8-49BF-902D-41A7756C3E78}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5ECE2E7A-9AE8-49BF-902D-41A7756C3E78}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {63F7116F-320A-4CD8-9B84-2C675412F70F} = {3E34ADB9-1F52-4C96-9A42-DE782DE1AAA3} + {082C1F69-7932-473F-A700-49584371BE8C} = {3E34ADB9-1F52-4C96-9A42-DE782DE1AAA3} + {6FE502D4-C43D-49C9-9E57-D1EE566FD1C3} = {3E34ADB9-1F52-4C96-9A42-DE782DE1AAA3} + {0C87A7D9-26EA-4821-AF3F-6D28B3006B24} = {C95AF531-CF44-44AA-AC90-F4DF9F941674} + {5ECE2E7A-9AE8-49BF-902D-41A7756C3E78} = {C95AF531-CF44-44AA-AC90-F4DF9F941674} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F08ED64E-2517-4B51-A4BE-D33D56CC7B39} + EndGlobalSection +EndGlobal diff --git a/docs/WechatApi/README.md b/docs/WechatApi/README.md new file mode 100644 index 00000000..e90dfdd1 --- /dev/null +++ b/docs/WechatApi/README.md @@ -0,0 +1,3 @@ +# SKIT.FlurlHttpClient.Wechat.Api + +*开发中,未完待续 ...* \ No newline at end of file diff --git a/docs/WechatTenpayV3/Advanced_CallbackDataDecryption.md b/docs/WechatTenpayV3/Advanced_CallbackDataDecryption.md new file mode 100644 index 00000000..d8fe269f --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_CallbackDataDecryption.md @@ -0,0 +1,27 @@ +### 如何解密回调通知事件中的敏感数据? + +--- + +> 请先自行阅读: +> +> [《微信支付开发者文档 - 开发指南:证书和回调报文解密》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_2.shtml) + +对于回调通知事件的敏感信息,微信支付平台使用了商户公钥基于 RSA 算法加密。 + +开发者利用本库提供的 `RsaUtil` 工具类自行解密相关字段。 + +此外,本库还封装了直接解密事件的扩展方法,下面给出一个示例: + +```csharp +string callbackJson = "..."; // 微信支付平台发来的通知内容 + +var callbackModel = client.DeserializeCallback(callbackJson); // 得到通知对象 +if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) +{ + var callbackResource = client.DecryptCallbackResource(callbackModel); // 得到支付通知敏感数据 + string outTradeNumber = callbackResource.OutTradeNumber; + string transactionId = callbackResource.TransactionId; +} +``` + +完整的回调通知模型定义可以参考项目目录下的 _src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources_ 目录。 diff --git a/docs/WechatTenpayV3/Advanced_IHttpClientFactory.md b/docs/WechatTenpayV3/Advanced_IHttpClientFactory.md new file mode 100644 index 00000000..1eaba8de --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_IHttpClientFactory.md @@ -0,0 +1,50 @@ +### 如何在 ASP.NET Core 中与 `IHttpClientFactory` 集成? + +--- + +> 请先自行阅读: +> +> [《Microsoft Docs - 使用 IHttpClientFactory 实现复原 HTTP 请求》](https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests) +> +> [《Microsoft Docs - 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求》](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests#httpclient-and-lifetime-management) + +你可以在构造得到 `WechatTenpayClient` 对象后: + +```csharp +client.Configure(settings => +{ + settings.HttpClientFactory = HttpClientFactory; // 赋值为依赖注入的 `IHttpClientFactory` 对象 +}); +``` + +下面给出一个使用了依赖注入的完整例子: + +```csharp +using System.Net.Http; +using Microsoft.Extensions.Http; +using Microsoft.Extensions.Options; +using SKIT.FlurlHttpClient.Wechat.TenpayV3; +using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; + +public class MyWechatClientFactory +{ + private readonly IHttpClientFactory _httpClientFactory; + private readonly IOptions _wechatTenpayClientOptions; + + public MyWechatClient( + IHttpClientFactory httpClientFactory, + IOptions wechatTenpayClientOptions) + { + _httpClientFactory = httpClientFactory; + _wechatTenpayClientOptions = wechatTenpayClientOptions; + } + + public WechatTenpayClient CreateClient() + { + var client = new WechatTenpayClient(_wechatTenpayClientOptions.Value); + client.Configure(settings => settings.HttpClientFactory = _httpClientFactory); + + return client; + } +} +``` diff --git a/docs/WechatTenpayV3/Advanced_JsonSerializer.md b/docs/WechatTenpayV3/Advanced_JsonSerializer.md new file mode 100644 index 00000000..705ca8f3 --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_JsonSerializer.md @@ -0,0 +1,46 @@ +### 如何指定 JSON 序列化器? + +--- + +> 请先自行阅读: +> +> [《Microsoft Docs - .NET 中的 JSON 序列化和反序列化(封送和拆收)》](https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-overview) + +默认情况下,本库使用 `System.Text.Json` 作为 JSON 序列化器。 + +如果你更习惯于 `Newtonsoft.Json`,那么你可以在构造得到 `WechatTenpayClient` 对象后: + +```csharp +client.Configure(settings => +{ + settings.JsonSerializer = new FlurlNewtonsoftJsonSerializer(); +}); +``` + +此外,如果你希望调整一些序列化器的配置项,那么可以: + +```csharp +using System.Text.Json; +using SKIT.FlurlHttpClient.Wechat; + +client.Configure(settings => +{ + var jsonOptions = FlurlSystemTextJsonSerializer.GetDefaultSerializerOptions(); + jsonOptions.WriteIndented = true; + settings.JsonSerializer = new FlurlSystemTextJsonSerializer(jsonOptions); +}); +``` + +使用 `Newtonsoft.Json` 时也是同样的: + +```csharp +using Newtonsoft.Json; +using SKIT.FlurlHttpClient.Wechat; + +client.Configure(settings => +{ + var jsonSettings = FlurlNewtonsoftJsonSerializer.GetDefaultSerializerSettings(); + jsonSettings.Formatting = Formatting.Indented; + settings.JsonSerializer = new FlurlNewtonsoftJsonSerializer(jsonSettings); +}); +``` diff --git a/docs/WechatTenpayV3/Advanced_MerchantCertSerialNumber.md b/docs/WechatTenpayV3/Advanced_MerchantCertSerialNumber.md new file mode 100644 index 00000000..7294cba6 --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_MerchantCertSerialNumber.md @@ -0,0 +1,9 @@ +### 如何查看商户证书序列号? + +--- + +> 请先自行阅读: +> +> [《微信支付开发者文档 - 证书/密钥/签名介绍:私钥和证书 - 声明所使用的证书》](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_1.shtml#part-3) +> +> [《微信支付开发者文档 - 常见问题:证书相关 - 如何查看证书序列号?》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay7_0.shtml#part-5) \ No newline at end of file diff --git a/docs/WechatTenpayV3/Advanced_ModelDefinition.md b/docs/WechatTenpayV3/Advanced_ModelDefinition.md new file mode 100644 index 00000000..96a90676 --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_ModelDefinition.md @@ -0,0 +1,789 @@ +### 如何快速找到需要调用的 API 模型类名 / 方法名? + +--- + +本库提供的请求模型、响应模型和接口方法,三者均保持同名。 + +例如,发起退款的请求是 `CreateRefundDomesticRefundRequest`,响应是 `CreateRefundDomesticRefundResponse`,接口是 `CreateRefundDomesticRefundAsync()`。知道其中一个,其余两个就可以快速地推断出了。 + +再有,每个对象的命名与官方文档的接口地址大体保持一致。例如刚刚提到的发起退款,它的接口地址是 `[POST] /refund/domestic/refunds`,将其中的反斜杠去掉、并以大驼峰命名法的方式调整它,就可以得到前文提到的几个对象了。 + +另外,以 `Query` 开头的一般表示列表查询;以 `Get` 开头的一般表示获取详情;以 `Create` 开头的一般表示发起或新建操作;以 `Update`、`Modify` 开头的一般表示修改操作;以 `Set` 开头的一般表示设置操作。 + +完整的模型定义可以参考项目目录下的 _src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models_ 目录。 + +--- + +【附 1】直连商户模式 API 模型命名速查表: + +注:树形结构与[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml)目录结构保持一致。 + +
+ +展开 + +- 平台证书 + + - 获取平台证书:`QueryCertificates` + +- 基础支付 + + - JSAPI 支付 + + - 统一下单:`CreatePayTransactionJsapi` + + - 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - APP 支付 + + - 统一下单:`CreatePayTransactionApp` + + - 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - H5 支付 + + - 统一下单:`CreatePayTransactionH5` + + - 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - Native 支付 + + - 统一下单:`CreatePayTransactionNative` + + - 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - 小程序支付 + + - 统一下单:`CreatePayTransactionJsapi` + + - 查询订单:`GetPayTransactionById` / `GetPayTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - 合单支付 + + - 合单 APP 下单:`CreateCombineTransactionApp` + + - 合单 H5 下单:`CreateCombineTransactionH5` + + - 合单 JSAPI 下单:`CreateCombineTransactionJsapi` + + - 合单小程序下单:`CreateCombineTransactionJsapi` + + - 合单 Native 下单:`CreateCombineTransactionNative` + + - 合单查询订单:`GetCombineTransactionByCombineOutTradeNumber` + + - 合单关闭订单:`CloseCombineTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单个退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + +- 经营能力 + + - 微信支付分(免确认模式) + + - 创单结单合并:`CreatePayScoreServiceOrderDirectComplete` + + - 微信支付分(免确认预授权模式) + + - 商户预授权:`ApplyPayScorePermissions` + + - 查询用户授权记录(授权协议号):`GetPayScorePermissionsByAuthorizationCode` + + - 解除用户授权关系(授权协议号):`TerminatePayScorePermissionsByAuthorizationCode` + + - 查询用户授权记录(OpenId):`GetPayScorePermissionsByOpenId` + + - 解除用户授权关系(OpenId):`TerminatePayScorePermissionsByOpenId` + + - 微信支付分(公共 API) + + - 创建支付分订单:`CreatePayScoreServiceOrder` + + - 查询支付分订单:`GetPayScoreServiceOrderByQueryId` / `GetPayScoreServiceOrderByOutOrderNumber` + + - 取消支付分订单:`CancelPayScoreServiceOrder` + + - 修改订单金额:`ModifyPayScoreServiceOrder` + + - 完结支付分订单:`SetPayScoreServiceOrderComplete` + + - 商户发起催收扣款:`SetPayScoreServiceOrderPay` + + - 同步服务订单信息:`SetPayScoreServiceOrderSync` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 微信先享卡 + + - 预受理领卡请求:`PrepareDiscountCard` + + - 增加用户记录:`AddDiscountCardUserRecord` + + - 查询先享卡订单:`GetDiscountCardByOutCardCode` + + - 支付即服务 + + - 服务人员注册:`CreateSmartGuide` + + - 服务人员分配:`AssignSmartGuide` + + - 服务人员查询:`QuerySmartGuides` + + - 服务人员信息更新:`UpdateSmartGuide` + +- 行业方案 + + - 智慧商圈 + + - 商圈积分同步:`NotifyBusinessCirclePoints` + + - 商圈积分授权查询:`GetBusinessCircleUserAuthorizationByOpenId` + +- 营销工具 + + - 代金券 + + - 创建代金券批次:`CreateMarketingFavorStock` + + - 激活代金券批次:`StartMarketingFavorStock` + + - 发放代金券批次:`SendMarketingFavorUserCoupon` + + - 暂停代金券批次:`PauseMarketingFavorStock` + + - 重启代金券批次:`RestartMarketingFavorStock` + + - 条件查询批次列表:`QueryMarketingFavorStocks` + + - 查询批次详情:`GetMarketingFavorStockByStockId` + + - 查询代金券详情:`GetMarketingFavorUserCouponByCouponId` + + - 查询代金券可用商户:`QueryMarketingFavorStockMerchants` + + - 查询代金券可用单品:`QueryMarketingFavorStockItems` + + - 根据商户号查用户的券:`QueryMarketingFavorUserCoupons` + + - 下载批次核销明细:`GetMarketingFavorStockUseFlow` + + - 下载批次退款明细:`GetMarketingFavorStockRefundFlow` + + - 设置消息通知地址:`UpdateMarketingFavorCallback` + + - 商家券 + + - 创建商家券:`CreateMarketingBusifavorStock` + + - 查询商家券详情:`GetMarketingBusifavorStockByStockId` + + - 核销用户券:`SetMarketingBusifavorCouponUsed` + + - 根据过滤条件查询用户券:`QueryMarketingBusifavorUserCoupons` + + - 查询用户单张券详情:`GetMarketingBusifavorUserCouponByCouponCode` + + - 上传预存 Code:`UploadMarketingBusifavorStockCouponCodes` + + - 设置商家券事件通知地址:`UpdateMarketingBusifavorCallback` + + - 查询商家券事件通知地址:`GetMarketingBusifavorCallback` + + - 关联订单信息:`AssociateMarketingBusifavorCoupon` + + - 取消关联订单信息:`DisassociateMarketingBusifavorCoupon` + + - 修改批次预算:`UpdateMarketingBusifavorStockBudget` + + - 修改商家券基本信息:`UpdateMarketingBusifavorStock` + + - 申请退券:`CreateMarketingBusifavorCouponReturn` + + - 使券失效:`DeactivateMarketingBusifavorCoupon` + + - 营销补差付款:`CreateMarketingBusifavorSubsidyPayReceipt` + + - 营销补差回退:`CreateMarketingBusifavorSubsidyReturnReceipt` + + - 查询营销补差付款单详情:`GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptId` + + - 委托营销 + + - 建立合作关系:`BuildMarketingPartnership` + + - 终止合作关系:`TerminateMarketingPartnership` + + - 查询合作关系列表:`QueryMarketingPartnerships` + + - 消费卡 + + - 发放消费卡:`SendMarketingBusifavorCoupon` + + - 支付有礼 + + - 创建全场满额送活动:`CreateMarketingPayGiftActivityUniqueThresholdActivity` + + - 查询活动详情接口:`GetMarketingPayGiftActivityByActivityId` + + - 查询活动发券商户号:`QueryMarketingPayGiftActivityMerchants` + + - 查询活动指定商品列表:`QueryMarketingPayGiftActivityGoods` + + - 终止活动:`TerminateMarketingPayGiftActivity` + + - 新增活动发券商户号:`AddMarketingPayGiftActivityMerchant` + + - 获取支付有礼活动列表:`QueryMarketingPayGiftActivities` + + - 删除活动发券商户号:`DeleteMarketingPayGiftActivityMerchant` + + - 图片上传(营销专用):`UploadMarketingMediaImage` + +- 风险合规 + + - 消费者投诉 2.0 + + - 查询投诉单列表:`QueryMerchantServiceComplaints` + + - 查询投诉单详情:`GetMerchantServiceComplaintByComplaintId` + + - 查询投诉协商历史:`QueryMerchantServiceComplaintNegotiationHistories` + + - 创建投诉通知回调地址:`CreateMerchantServiceComplaintNotification` + + - 查询投诉通知回调地址:`GetMerchantServiceComplaintNotification` + + - 更新投诉通知回调地址:`UpdateMerchantServiceComplaintNotification` + + - 删除投诉通知回调地址:`DeleteMerchantServiceComplaintNotification` + + - 提交回复:`CreateMerchantServiceComplaintResponse` + + - 反馈处理完成:`SetMerchantServiceComplaintComplete` + + - 商户上传反馈图片:`UploadMerchantServiceImage` + +- 其他能力 + + - 图片上传:`UploadMerchantMediaImage` + + - 视频上传:`UploadMerchantMediaVideo` + +
+ +--- + +【附 2】服务商模式 API 模型命名速查表: + +注:树形结构与[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/index.shtml)目录结构保持一致。 + +
+ +展开 + +- 平台证书 + + - 获取平台证书:`QueryCertificates` + +- 商户进件 + + - 特约商户进件 + + - 提交申请单:`CreateApplyForSubMerchantApplyment` + + - 查询申请单状态:`GetApplyForSubMerchantApplymentByApplymentId` / `GetApplyForSubMerchantApplymentByBusinessCode` + + - 修改结算帐号:`ModifyApplyForSubMerchantSettlement` + + - 查询结算账户:`GetApplyForSubMerchantSettlement` + +- 基础支付 + + - JSAPI 支付 + + - 统一下单:`CreatePayPartnerTransactionJsapi` + + - 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayPartnerTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - APP 支付 + + - 统一下单:`CreatePayPartnerTransactionApp` + + - 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayPartnerTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - H5 支付 + + - 统一下单:`CreatePayPartnerTransactionH5` + + - 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayPartnerTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - Native 支付 + + - 统一下单:`CreatePayPartnerTransactionNative` + + - 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayPartnerTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - 小程序支付 + + - 统一下单:`CreatePayPartnerTransactionJsapi` + + - 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayPartnerTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单笔退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - 合单支付 + + - 合单 APP 下单:`CreateCombineTransactionApp` + + - 合单 H5 下单:`CreateCombineTransactionH5` + + - 合单 JSAPI 下单:`CreateCombineTransactionJsapi` + + - 合单小程序下单:`CreateCombineTransactionJsapi` + + - 合单 Native 下单:`CreateCombineTransactionNative` + + - 合单查询订单:`GetCombineTransactionByCombineOutTradeNumber` + + - 合单关闭订单:`CloseCombineTransaction` + + - 申请退款:`CreateRefundDomesticRefund` + + - 查询单个退款:`GetRefundDomesticRefundByOutRefundNumber` + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 下载账单:`DownloadBillFile` + +- 经营能力 + + - 支付即服务 + + - 服务人员注册:`CreateSmartGuide` + + - 服务人员分配:`AssignSmartGuide` + + - 服务人员查询:`QuerySmartGuides` + + - 服务人员信息更新:`UpdateSmartGuide` + + - 点金计划 + + - 点金计划管理:`ChangeGoldPlanStatus` + + - 商家小票管理:`ChangeGoldPlanCustomPageStatus` + + - 同业过滤标签管理:`SetGoldPlanAdvertisingIndustryFilter` + + - 开通广告展示:`OpenGoldPlanAdvertisingShow` + + - 关闭广告展示:`CloseGoldPlanAdvertisingShow` + +- 行业方案 + + - 电商收付通(商户进件) + + - 二级商户进件:`CreateEcommerceApplyment` + + - 查询申请状态:`GetEcommerceApplymentByApplymentId` / `GetEcommerceApplymentByOutRequestNumber` + + - 下载平台证书:`QueryCertificates` + + - 修改结算帐号:`ModifyApplyForSubMerchantSettlement` + + - 查询结算账户:`GetApplyForSubMerchantSettlement` + + - 电商收付通(普通支付) + + - APP 下单:`CreatePayPartnerTransactionApp` + + - JSAPI 下单:`CreatePayPartnerTransactionJsapi` + + - 小程序下单:`CreatePayPartnerTransactionJsapi` + + - H5 下单:`CreatePayPartnerTransactionH5` + + - H5 下单:`CreatePayPartnerTransactionH5` + + - 查询订单:`GetPayPartnerTransactionById` / `GetPayPartnerTransactionByOutTradeNumber` + + - 关闭订单:`ClosePayPartnerTransaction` + + - 电商收付通(合单支付) + + - 合单 APP 下单:`CreateCombineTransactionApp` + + - 合单 H5 下单:`CreateCombineTransactionH5` + + - 合单 JSAPI 下单:`CreateCombineTransactionJsapi` + + - 合单小程序下单:`CreateCombineTransactionJsapi` + + - 合单 Native 下单:`CreateCombineTransactionNative` + + - 合单查询订单:`GetCombineTransactionByCombineOutTradeNumber` + + - 合单关闭订单:`CloseCombineTransaction` + + - 电商收付通(分账) + + - 请求分账:`CreateEcommerceProfitSharingOrder` + + - 查询分账结果:`GetEcommerceProfitSharingOrderByOutOrderNumber` + + - 请求分账回退:`CreateEcommerceProfitSharingReturnOrder` + + - 查询分账回退结果:`GetEcommerceProfitSharingReturnOrderByOrderId` / `GetEcommerceProfitSharingReturnOrderByOutOrderNumber` + + - 完结分账:`SetEcommerceProfitSharingOrderFinish` + + - 查询订单剩余待分金额:`GetEcommerceProfitSharingOrderAmounts` + + - 添加分账接收方:`AddEcommerceProfitSharingReceiver` + + - 删除分账接收方:`DeleteEcommerceProfitSharingReceiver` + + - 电商收付通(补差) + + - 请求补差:`CreateEcommerceSubsidy` + + - 请求补差回退:`CreateEcommerceSubsidyReturn` + + - 取消补差:`CancelEcommerceSubsidy` + + - 电商收付通(退款) + + - 申请退款:`CreateEcommerceRefund` + + - 查询退款:`GetEcommerceRefundByRefundId` / `GetEcommerceRefundByOutRefundNumber` + + - 垫付退款回补:`CreateEcommerceRefundReturnAdvance` + + - 查询垫付回补结果:`GetEcommerceRefundReturnAdvance` + + - 电商收付通(余额查询) + + - 查询二级商户账户实时余额:`GetEcommerceFundBalance` + + - 查询二级商户账户日终余额:`GetEcommerceFundDayendBalance` + + - 查询电商平台账户实时余额:`GetMerchantFundBalance` + + - 查询电商平台账户日终余额:`GetMerchantFundDayendBalance` + + - 电商收付通(商户提现) + + - 二级商户余额提现:`CreateEcommerceFundWithdraw` + + - 二级商户查询提现状态:`GetEcommerceFundWithdrawByWithdrawId` / `GetEcommerceFundWithdrawByOutRequestNumber` + + - 电商平台提现:`CreateMerchantFundWithdraw` + + - 电商平台查询提现状态:`GetMerchantFundWithdrawByWithdrawId` / `GetMerchantFundWithdrawByOutRequestNumber` + + - 按日下载提现异常文件:`GetMerchantFundWithdrawBill` + + - 电商收付通(下载账单) + + - 申请交易账单:`GetBillTradeBill` + + - 申请资金账单:`GetBillFundflowBill` + + - 申请二级商户资金账单:`GetEcommerceBillFundflowBill` + + - 下载账单:`DownloadBillFile` + + - 智慧商圈 + + - 商圈积分同步:`NotifyBusinessCirclePoints` + + - 商圈积分授权查询:`GetBusinessCircleUserAuthorizationByOpenId` + +- 营销工具 + + - 代金券 + + - 创建代金券批次:`CreateMarketingFavorStock` + + - 激活代金券批次:`StartMarketingFavorStock` + + - 发放代金券批次:`SendMarketingFavorUserCoupon` + + - 暂停代金券批次:`PauseMarketingFavorStock` + + - 重启代金券批次:`RestartMarketingFavorStock` + + - 条件查询批次列表:`QueryMarketingFavorStocks` + + - 查询批次详情:`GetMarketingFavorStockByStockId` + + - 查询代金券详情:`GetMarketingFavorUserCouponByCouponId` + + - 查询代金券可用商户:`QueryMarketingFavorStockMerchants` + + - 查询代金券可用单品:`QueryMarketingFavorStockItems` + + - 根据商户号查用户的券:`QueryMarketingFavorUserCoupons` + + - 下载批次核销明细:`GetMarketingFavorStockUseFlow` + + - 下载批次退款明细:`GetMarketingFavorStockRefundFlow` + + - 设置消息通知地址:`UpdateMarketingFavorCallback` + + - 商家券 + + - 创建商家券:`CreateMarketingBusifavorStock` + + - 查询商家券详情:`GetMarketingBusifavorStockByStockId` + + - 核销用户券:`SetMarketingBusifavorCouponUsed` + + - 根据过滤条件查询用户券:`QueryMarketingBusifavorUserCoupons` + + - 查询用户单张券详情:`GetMarketingBusifavorUserCouponByCouponCode` + + - 上传预存 Code:`UploadMarketingBusifavorStockCouponCodes` + + - 设置商家券事件通知地址:`UpdateMarketingBusifavorCallback` + + - 查询商家券事件通知地址:`GetMarketingBusifavorCallback` + + - 关联订单信息:`AssociateMarketingBusifavorCoupon` + + - 取消关联订单信息:`DisassociateMarketingBusifavorCoupon` + + - 修改批次预算:`UpdateMarketingBusifavorStockBudget` + + - 修改商家券基本信息:`UpdateMarketingBusifavorStock` + + - 申请退券:`CreateMarketingBusifavorCouponReturn` + + - 使券失效:`DeactivateMarketingBusifavorCoupon` + + - 营销补差付款:`CreateMarketingBusifavorSubsidyPayReceipt` + + - 营销补差回退:`CreateMarketingBusifavorSubsidyReturnReceipt` + + - 查询营销补差付款单详情:`GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptId` + + - 委托营销 + + - 建立合作关系:`BuildMarketingPartnership` + + - 终止合作关系:`TerminateMarketingPartnership` + + - 查询合作关系列表:`QueryMarketingPartnerships` + + - 支付有礼 + + - 创建全场满额送活动:`CreateMarketingPayGiftActivityUniqueThresholdActivity` + + - 查询活动详情接口:`GetMarketingPayGiftActivityByActivityId` + + - 查询活动发券商户号:`QueryMarketingPayGiftActivityMerchants` + + - 查询活动指定商品列表:`QueryMarketingPayGiftActivityGoods` + + - 终止活动:`TerminateMarketingPayGiftActivity` + + - 新增活动发券商户号:`AddMarketingPayGiftActivityMerchant` + + - 获取支付有礼活动列表:`QueryMarketingPayGiftActivities` + + - 删除活动发券商户号:`DeleteMarketingPayGiftActivityMerchant` + + - 图片上传(营销专用):`UploadMarketingMediaImage` + +- 资金应用 + + - 连锁品牌分账 + + - 请求分账:`CreateBrandProfitSharingOrder` + + - 查询分账结果:`GetBrandProfitSharingOrderByOutOrderNumber` + + - 请求分账回退:`CreateBrandProfitSharingReturnOrder` + + - 查询分账回退结果:`GetBrandProfitSharingReturnOrderByOrderId` / `GetBrandProfitSharingReturnOrderByOutOrderNumber` + + - 完结分账:`SetBrandProfitSharingOrderFinish` + + - 查询订单剩余待分金额:`GetBrandProfitSharingOrderAmounts` + + - 查询最大分账比例:`GetBrandProfitBrandConfigs` + + - 添加分账接收方:`AddBrandProfitSharingReceiver` + + - 删除分账接收方:`DeleteBrandProfitSharingReceiver` + +- 风险合规 + + - 消费者开户意愿确认 + + - 提交申请单:`CreateApplyForSubjectApplyment` + + - 撤销申请单:`CancelApplyForSubjectApplymentByApplymentId` / `CancelApplyForSubjectApplymentByBusinessCode` + + - 查询申请单审核结果:`GetApplyForSubjectApplymentByApplymentId` / `GetApplyForSubjectApplymentByBusinessCode` + + - 获取商户开户意愿确认状态:`GetApplyForSubjectApplymentMerchantState` + + - 消费者投诉 2.0 + + - 查询投诉单列表:`QueryMerchantServiceComplaints` + + - 查询投诉单详情:`GetMerchantServiceComplaintByComplaintId` + + - 查询投诉协商历史:`QueryMerchantServiceComplaintNegotiationHistories` + + - 创建投诉通知回调地址:`CreateMerchantServiceComplaintNotification` + + - 查询投诉通知回调地址:`GetMerchantServiceComplaintNotification` + + - 更新投诉通知回调地址:`UpdateMerchantServiceComplaintNotification` + + - 删除投诉通知回调地址:`DeleteMerchantServiceComplaintNotification` + + - 提交回复:`CreateMerchantServiceComplaintResponse` + + - 反馈处理完成:`SetMerchantServiceComplaintComplete` + + - 商户上传反馈图片:`UploadMerchantServiceImage` + +- 其他能力 + + - 图片上传:`UploadMerchantMediaImage` + + - 视频上传:`UploadMerchantMediaVideo` + +
diff --git a/docs/WechatTenpayV3/Advanced_Payment.md b/docs/WechatTenpayV3/Advanced_Payment.md new file mode 100644 index 00000000..e25a8198 --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_Payment.md @@ -0,0 +1,35 @@ +### 如何生成客户端调起支付时所需的参数及签名? + +--- + +> 请先自行阅读: +> +> [《微信支付开发者文档 - 基础支付:JSAPI 调起支付 API》](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml) +> +> [《微信支付开发者文档 - 基础支付:APP 调起支付 API》](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml) +> +> [《微信支付开发者文档 - 基础支付:小程序调起支付 API》](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml) + +你可根据官方文档的规则利用本库提供的 `RsaUtil` 工具类自行进行签名生成。 + +此外,本库还封装了直接生成参数及签名的扩展方法,下面给出一个示例: + +```csharp +var request = new Models.CreatePayTransactionJsapiRequest() +{ + OutTradeNumber = "商户订单号", + AppId = "公众号 AppId", + Description = "描述", + NotifyUrl = "回调地址", + Amount = new Models.CreatePayTransactionJsapiRequest.Types.Amount() + { + Total = 0 + }, + Payer = new Models.CreatePayTransactionJsapiRequest.Types.Payer() + { + OpenId = "用户 OpenId" + } +}; +var response = await client.ExecuteQueryCertificatesAsync(request); +var paramMap = client.GenerateParametersForJsapiPayRequest(request.AppId, response.PrepayId); +``` diff --git a/docs/WechatTenpayV3/Advanced_ResponseDataDecryption.md b/docs/WechatTenpayV3/Advanced_ResponseDataDecryption.md new file mode 100644 index 00000000..454dcd64 --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_ResponseDataDecryption.md @@ -0,0 +1,28 @@ +### 如何解密响应中的敏感数据? + +--- + +> 请先自行阅读: +> +> [《微信支付开发者文档 - 证书/密钥/签名介绍:API v3 密钥》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay3_2.shtml) +> +> [《微信支付开发者文档 - 开发指南:敏感信息加解密》](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_3.shtml) + +对于部分接口返回的敏感信息,微信支付平台可能会使用两种方式进行加密: + +- 使用商户公钥基于 RSA 算法加密。 + +- 使用商户 API v3 密钥基于 AES-GCM 算法加密。 + +开发者利用本库提供的 `RsaUtil`、`AesUtil` 工具类自行解密相关字段。 + +此外,本库还封装了直接解密响应的扩展方法,下面给出一个示例: + +```csharp +var request = new Models.QueryCertificatesRequest(); +var response = await client.ExecuteQueryCertificatesAsync(request); + +string cert = response.CertificateList.First().EncryptCertificate.CipherText; // 此时仍是密文 +client.DecryptResponseEncryptedData(response); +string cert = response.CertificateList.First().EncryptCertificate.CipherText; // 此时已是明文 +``` diff --git a/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md b/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md new file mode 100644 index 00000000..6eef293e --- /dev/null +++ b/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md @@ -0,0 +1,25 @@ +### 如何验证微信响应签名? + +--- + +> 请先自行阅读: +> +> [《微信支付开发者文档 - 开发指南:签名验证》](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml) +> +> [《微信支付开发者文档 - 平台证书:更新指引》](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay5_0.shtml) + +本库已经封装了 `QueryCertificatesAsync()` 方法,供开发者获取微信支付平台证书。 + +每个响应对象均包含 `WechatpayTimestamp`、`WechatpayNonce`、`WechatpaySignature`、`WechatpaySerial` 等几个公共字段,你可根据官方文档的规则利用本库提供的 `RsaUtil` 工具类自行进行签名验证。 + +同时,本库也内置了验证签名的的方法,具体用法可以参考项目目录下的 _test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayResponseVerificationTests.cs_ 文件给出的测试用例。 + +需要注意的是,微信支付平台提供的是 PEM 格式的密钥文件,分为以下几种: + +- 以 `-----BEGIN PRIVATE KEY-----` 开头、 `-----END PRIVATE KEY-----` 结尾的是 **PKCS#8 私钥**文件。 + +- 以 `-----BEGIN PUBLIC KEY-----` 开头、 `-----END PUBLIC KEY-----` 结尾的是 **PKCS#8 公钥**文件。 + +- 以 `-----BEGIN CERTIFICATE-----` 开头、 `-----END CERTIFICATE-----` 结尾的是 **CER 证书**文件。 + +`QueryCertificatesAsync()` 方法返回的结果是 CER 证书,验证签名时需要先通过 `RsaUtil` 工具类导出 PKCS#8 公钥,再进行签名验证;当然,`RsaUtil` 也封装了直接通过 CER 证书验证签名的方法。 diff --git a/docs/WechatTenpayV3/README.md b/docs/WechatTenpayV3/README.md new file mode 100644 index 00000000..e9a0a6e6 --- /dev/null +++ b/docs/WechatTenpayV3/README.md @@ -0,0 +1,168 @@ +# SKIT.FlurlHttpClient.Wechat.TenpayV3 + +[![NuGet Version](https://img.shields.io/nuget/v/SKIT.FlurlHttpClient.Wechat.TenpayV3.svg?sanitize=true)](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3) +[![NuGet Download](https://img.shields.io/nuget/dt/SKIT.FlurlHttpClient.Wechat.TenpayV3.svg?sanitize=true)](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3) +[![GitHub License](https://img.shields.io/github/license/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/blob/main/LICENSE) + +基于 `Flurl.Http` 的微信支付 API v3 版客户端。 + +--- + +## 功能: + +- 基于微信支付 v3 版 API 封装。 + +- 支持直连商户、服务商两种模式。 + +- 请求时自动生成签名,无需开发者手动干预。 + +- 提供了微信支付所需的 RSA、AES-GCM、SHA-256 等算法工具类。 + +- 提供了调起支付签名、解析响应敏感数据、解析回调通知事件敏感数据等扩展方法。 + +- 完整微信支付 API 一览: + + | | 微信 API | 商户类型 | 备注 | + | :-: | :-----------------------------: | :--------------------------: | :---------------: | + | √ | 商户进件:特约商户进件 | 服务商 | | + | √ | 基础支付:JSAPI 支付 | 直连商户 & 服务商 | | + | √ | 基础支付:APP 支付 | 直连商户 & 服务商 | | + | √ | 基础支付:H5 支付 | 直连商户 & 服务商 | | + | √ | 基础支付:Native 支付 | 直连商户 & 服务商 | | + | √ | 基础支付:小程序支付 | 直连商户 & 服务商 | | + | √ | 基础支付:合单支付 | 直连商户 & 服务商 | | + | × | 基础支付:付款码支付 | 直连商户 & 服务商 | 微信未提供 v3 API | + | √ | 经营能力:微信支付分 | 直连商户 | | + | √ | 经营能力:微信先享卡 | 直连商户 | | + | √ | 经营能力:支付即服务 | 直连商户 & 服务商 | | + | √ | 经营能力:点金计划 | 服务商 | | + | √ | 行业方案:电商收付通 | 服务商 | | + | √ | 行业方案:智慧商圈 | 直连商户 & 服务商 | | + | √ | 营销工具:代金券 | 直连商户 & 服务商 | | + | √ | 营销工具:商家券 | 直连商户 & 服务商 | | + | √ | 营销工具:委托营销 | 直连商户 & 服务商 | | + | √ | 营销工具:消费卡 | 直连商户 & 服务商 | | + | √ | 营销工具:支付有礼 | 直连商户 & 服务商 | | + | √ | 营销工具:图片上传(营销专用) | 直连商户 & 服务商 | | + | × | 营销工具:现金红包 | 直连商户 & 服务商 | 微信未提供 v3 API | + | × | 资金应用:企业付款 | 直连商户 | 微信未提供 v3 API | + | × | 资金应用:分账 | 直连商户 | 微信未提供 v3 API | + | √ | 资金应用:连锁品牌分账 | 服务商 | | + | × | 资金应用:服务商分账 | 服务商 | 微信未提供 v3 API | + | √ | 风险合规:商户开户意愿确认 | 服务商 | | + | √ | 风险合规:消费者投诉 2.0 | 直连商户 & 服务商 | | + | × | 其他能力:清关上报 | 直连商户 | 微信未提供 v3 API | + | √ | 其他能力:图片上传 | 直连商户 & 服务商 | | + | √ | 其他能力:视频上传 | 直连商户 & 服务商 | | + +--- + +## 基础用法: + +### 安装: + +```shell +# 通过 NuGet 安装 +> Install-Package SKIT.FlurlHttpClient.Wechat.TenpayV3 + +# 通过 dotnet-tools 安装 +> dotnet add package SKIT.FlurlHttpClient.Wechat.TenpayV3 +``` + +### 初始化: + +```csharp +using SKIT.FlurlHttpClient.Wechat; +using SKIT.FlurlHttpClient.Wechat.TenpayV3; + +var options = new WechatTenpayClientOptions() +{ + MerchantId = "微信商户号", + MerchantV3Secret = "微信商户 v3 API 密钥", + MerchantCertSerialNumber = "微信商户证书序列号", + MerchantCertPrivateKey = "-----BEGIN PRIVATE KEY-----微信商户证书私钥-----END PRIVATE KEY-----" +}; +var client = new WechatTenpayClient(options); +``` + +### 请求 & 响应: + +```csharp +using SKIT.FlurlHttpClient.Wechat.TenpayV3; +using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; + +/* 示例:JSAPI 统一下单 */ +var request = new CreatePayTransactionJsapiRequest() +{ + OutTradeNumber = "商户订单号", + AppId = "微信 AppId", + Description = "订单描述", + ExpireTime = DateTimeOffset.Now.AddMinutes(15), + NotifyUrl = "https://example.com", + Amount = new Models.CreatePayTransactionJsapiRequest.Types.Amount() + { + Total = 1 + }, + Payer = new Models.CreatePayTransactionJsapiRequest.Types.Payer() + { + OpenId = TestConfigs.WechatOpenId + } +}; +var response = await TestClients.Instance.ExecuteCreatePayTransactionJsapiAsync(request); +``` + +--- + +## 高级技巧 + +- [如何查看商户证书序列号?](./Advanced_MerchantCertSerialNumber.md) + +- [如何验证微信响应签名?](./Advanced_ResponseSignatureVerification.md) + +- [如何快速找到需要调用的 API 模型类名 / 方法名?](./Advanced_ModelDefinition.md) + +- [如何在 ASP.NET Core 中与 `IHttpClientFactory` 集成?](./Advanced_IHttpClientFactory.md) + +- [如何指定 JSON 序列化器?](./Advanced_JsonSerializer.md) + +- [如何解密响应中的敏感数据?](./Advanced_ResponseDataDecryption.md) + +- [如何解密回调通知事件中的敏感数据?](./Advanced_CallbackDataDecryption.md) + +- [如何生成客户端调起支付时所需的参数及签名?](./Advanced_Payment.md) + +--- + +## 常见问题 + +### 1. 为什么要“造轮子”? + +目前网络上还没有基于微信支付 v3 版 API 封装的 .NET 客户端,遑论开源了;这都 2021 年了,官方本身提供的示例代码还只能运行在 .NET Framework on Windows 上;就连 RSA 签名这么基础的东西都没有人封装(确切的说是因为 RSA 有很多种分块模式和填充模式,网上能找到的往往只封装了其中一种,但却未必符合微信支付的要求)。 + +于是萌生了自己封装一个库的想法,打算解决这几个痛点,同时也是推广一下微软官方的 `System.Text.Json`。 + +### 2. 本库与[盛派微信 SDK(Senparc.Weixin)](https://github.com/JeffreySu/WeiXinMPSDK)有什么区别? + +- 本库只支持微信支付 v3 版 API;盛派微信 SDK 只支持微信支付 v2 版 API(年前作者开了新坑似乎是想提供 v3 版支持,不过目前只封装了部分接口,进展比较缓慢)。原则上官方已经停止更新 v2 版 API,现在接口只做日常维护,所以有条件的话还是应该尽快升级。 + +- 本库封装了目前微信支付官方提供的所有 API,包括直连商户和服务商两种模式;盛派微信 SDK 只提供了常用的 API,只完整支持直连商户模式、部分支持服务商模式。 + +- 本库的接口模型遵循的是微软官方推荐的 C# 属性命名方式(大驼峰命名法);盛派微信 SDK 提供的是微信支付接口本身的命名方式(蛇形命名法和小驼峰命名法混杂)。 + +- 本库专注于 API 本身的封装;盛派微信 SDK 提供了大而全的功能,与 ASP.NET / ASP.NET Core 深度集成。 + +### 3. 为什么不支持企业付款、现金红包等功能? + +请注意前文所描述的微信支付 API 一览表,有部分功能并非封装遗漏,而是官方尚未提供支持。 + +如果你确实需要这部分功能,可以考虑使用上面提到过的[盛派微信 SDK(Senparc.Weixin)](https://github.com/JeffreySu/WeiXinMPSDK),也很不错。 + +当官方更新相关的 API 后,本库也会在第一时间保持跟进。 + +### 4. 看了源码,发现模型定义里很多同样的代码是复制粘贴的,为什么不继承? + +关于这点得吐槽微信支付提供的 API 了,很显然微信内部也是很多个 Team 在共同开发,每个 Team、甚至每个人的字段命名风格、约束条件、接口规则都大相径庭,虽然号称 v3 版 API 是 “RESTful” 的,却没一个统一标准。 + +举个例子,以分页查询为例,看似字段相同,都由 `offset`、`limit` + `total_count`、`data` 这几个字段构成,但某些接口的 `offset`、`limit` 字段是可选参数,某些却是必填项;某些值从 `0` 起始,某些却是从 `1` 起始;某些接口的 `total_count`、`data` 字段一定会返回,某些却是一定不返回,某些只在特定条件下返回。一共七八个分页查询的接口,却有四五种分页的数据结构,这种情况下很难抽象出一个公共的基类出来。 + +同样一个东西在不同接口里竟然拼法不一样;同样是表示数组有的是 JSON、有的却是字符串;诸如此类“奇葩”的情况很多很多。本库已经尽可能在条件允许的范围内抽象出了一些公共基类,聊胜于无。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs new file mode 100644 index 00000000..4128b30a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs @@ -0,0 +1,21 @@ +using System; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + internal static class FlurlHttpRequestOptionsExtensions + { + public static IFlurlRequest SetOptions(this IFlurlRequest request, WechatApiRequest options) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + if (options == null) throw new ArgumentNullException(nameof(options)); + + if (options.Timeout.HasValue) + { + request.WithTimeout(TimeSpan.FromMilliseconds(options.Timeout.Value)); + } + + return request; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs new file mode 100644 index 00000000..69677779 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinExtensions.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + public static class WechatApiClientExecuteCgibinExtensions + { + /// + /// 异步调用 [GET] /cgi-bin/token 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html + /// REF: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html + /// REF: https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/access-token/auth.getAccessToken.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTokenAsync(this WechatApiClient client, Models.CgibinTokenRequest 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(HttpMethod.Get, "cgi-bin", "token") + .SetOptions(request) + .SetQueryParam("grant_type", request.GrantType) + .SetQueryParam("appid", client.AppId) + .SetQueryParam("secret", client.AppSecret); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/ticket/getticket 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#54 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTicketGetTicketAsync(this WechatApiClient client, Models.CgibinTicketGetTicketRequest 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(HttpMethod.Get, "cgi-bin", "ticket", "getticket") + .SetOptions(request) + .SetQueryParam("type", request.Type) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/getcallbackip 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinGetCallbackIpAsync(this WechatApiClient client, Models.CgibinGetCallbackIpRequest 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(HttpMethod.Get, "cgi-bin", "getcallbackip") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/get_api_domain_ip 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinGetApiDomainIpAsync(this WechatApiClient client, Models.CgibinGetApiDomainIpRequest 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(HttpMethod.Get, "cgi-bin", "get_api_domain_ip") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinTagsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinTagsExtensions.cs new file mode 100644 index 00000000..14d8c60e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinTagsExtensions.cs @@ -0,0 +1,245 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + public static class WechatApiClientExecuteCgibinTagsExtensions + { + /// + /// 异步调用 [POST] /cgi-bin/tags/create 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsCreateAsync(this WechatApiClient client, Models.CgibinTagsCreateRequest 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(HttpMethod.Post, "cgi-bin", "tags", "create") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/tags/get 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsGetAsync(this WechatApiClient client, Models.CgibinTagsGetRequest 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(HttpMethod.Get, "cgi-bin", "tags", "get") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/update 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsUpdateAsync(this WechatApiClient client, Models.CgibinTagsUpdateRequest 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(HttpMethod.Post, "cgi-bin", "tags", "update") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/delete 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsDeleteAsync(this WechatApiClient client, Models.CgibinTagsDeleteRequest 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(HttpMethod.Post, "cgi-bin", "tags", "delete") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/user/tag/get 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinUserTagGetAsync(this WechatApiClient client, Models.CgibinUserTagGetRequest 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(HttpMethod.Post, "cgi-bin", "user", "tag", "get") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/members/batchtagging 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsMembersBatchTaggingAsync(this WechatApiClient client, Models.CgibinTagsMembersBatchTaggingRequest 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(HttpMethod.Post, "cgi-bin", "tags", "members", "batchtagging") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/members/batchuntagging 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsMembersBatchUntaggingAsync(this WechatApiClient client, Models.CgibinTagsMembersBatchUntaggingRequest 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(HttpMethod.Post, "cgi-bin", "tags", "members", "batchuntagging") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/getidlist 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsGetIdListAsync(this WechatApiClient client, Models.CgibinTagsGetIdListRequest 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(HttpMethod.Post, "cgi-bin", "tags", "getidlist") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/members/getblacklist 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Manage_blacklist.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsMembersGetBlackListAsync(this WechatApiClient client, Models.CgibinTagsMembersGetBlackListRequest 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(HttpMethod.Post, "cgi-bin", "tags", "members", "getblacklist") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/members/batchblacklist 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Manage_blacklist.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsMembersBatchBlackListAsync(this WechatApiClient client, Models.CgibinTagsMembersBatchBlackListRequest 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(HttpMethod.Post, "cgi-bin", "tags", "members", "batchblacklist") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/tags/members/batchunblacklist 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Manage_blacklist.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinTagsMembersBatchUnblackListAsync(this WechatApiClient client, Models.CgibinTagsMembersBatchUnblackListRequest 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(HttpMethod.Post, "cgi-bin", "tags", "members", "batchunblacklist") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinUserExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinUserExtensions.cs new file mode 100644 index 00000000..aca99e19 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinUserExtensions.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + public static class WechatApiClientExecuteCgibinUserExtensions + { + /// + /// 异步调用 [GET] /cgi-bin/user/info 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinUserInfoAsync(this WechatApiClient client, Models.CgibinUserInfoRequest 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(HttpMethod.Get, "cgi-bin", "user", "info") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken) + .SetQueryParam("openid", request.OpenId) + .SetQueryParam("lang", request.Language); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/user/info/batchget 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinUserInfoBatchGetAsync(this WechatApiClient client, Models.CgibinUserInfoBatchGetRequest 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(HttpMethod.Post, "cgi-bin", "user", "info", "batchget") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /cgi-bin/user/info/updateremark 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Configuring_user_notes.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinUserInfoUpdateRemarkAsync(this WechatApiClient client, Models.CgibinUserInfoUpdateRemarkRequest 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(HttpMethod.Post, "cgi-bin", "user", "info", "updateremark") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /cgi-bin/user/get 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinUserAsync(this WechatApiClient client, Models.CgibinUserRequest 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(HttpMethod.Get, "cgi-bin", "user", "get") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken); + + if (!string.IsNullOrEmpty(request.NextOpenId)) + flurlReq.SetQueryParam("next_openid", request.NextOpenId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteSnsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteSnsExtensions.cs new file mode 100644 index 00000000..3cc572e7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteSnsExtensions.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + public static class WechatApiClientExecuteSnsExtensions + { + /// + /// 异步调用 [GET] /sns/oauth2/access_token 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#1 + /// + /// + /// + /// + /// + public static async Task ExecuteSnsOAuth2AccessTokenAsync(this WechatApiClient client, Models.SnsOAuth2AccessTokenRequest 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(HttpMethod.Get, "sns", "oauth2", "access_token") + .SetOptions(request) + .SetQueryParam("grant_type", request.GrantType) + .SetQueryParam("appid", client.AppId) + .SetQueryParam("secret", client.AppSecret) + .SetQueryParam("code", request.Code); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /sns/oauth2/refresh_token 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#1 + /// + /// + /// + /// + /// + public static async Task ExecuteSnsOAuth2RefreshTokenAsync(this WechatApiClient client, Models.SnsOAuth2RefreshTokenRequest 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(HttpMethod.Get, "sns", "oauth2", "refresh_token") + .SetOptions(request) + .SetQueryParam("grant_type", request.GrantType) + .SetQueryParam("appid", client.AppId) + .SetQueryParam("refresh_token", request.RefreshToken); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /sns/userinfo 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#3 + /// + /// + /// + /// + /// + public static async Task ExecuteSnsUserInfoAsync(this WechatApiClient client, Models.SnsUserInfoRequest 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(HttpMethod.Get, "sns", "userinfo") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken) + .SetQueryParam("openid", request.OpenId) + .SetQueryParam("lang", request.Language); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /sns/auth 接口。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#4 + /// + /// + /// + /// + /// + public static async Task ExecuteSnsAuthAsync(this WechatApiClient client, Models.SnsAuthRequest 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(HttpMethod.Get, "sns", "auth") + .SetOptions(request) + .SetQueryParam("access_token", request.AccessToken) + .SetQueryParam("openid", request.OpenId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /sns/jscode2session 接口。 + /// REF: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html + /// REF: https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/login/auth.code2Session.html + /// + /// + /// + /// + /// + public static async Task ExecuteSnsJsCode2SessionAsync(this WechatApiClient client, Models.SnsJsCode2SessionRequest 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(HttpMethod.Get, "sns", "jscode2session") + .SetOptions(request) + .SetQueryParam("grant_type", request.GrantType) + .SetQueryParam("appid", client.AppId) + .SetQueryParam("secret", client.AppSecret) + .SetQueryParam("js_code", request.JsCode); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpRequest.cs new file mode 100644 index 00000000..adf7458a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/get_api_domain_ip 接口的请求。 + /// + public class CgibinGetApiDomainIpRequest : WechatApiRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpResponse.cs new file mode 100644 index 00000000..0339064f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetApiDomainIpResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/get_api_domain_ip 接口的响应。 + /// + public class CgibinGetApiDomainIpResponse : WechatApiResponse + { + /// + /// 获取或设置微信服务器 IP 地址列表。 + /// + [Newtonsoft.Json.JsonProperty("ip_list")] + [System.Text.Json.Serialization.JsonPropertyName("ip_list")] + public string[] IPList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpRequest.cs new file mode 100644 index 00000000..a6a2c233 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/getcallbackip 接口的请求。 + /// + public class CgibinGetCallbackIpRequest : WechatApiRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpResponse.cs new file mode 100644 index 00000000..a5ee311a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinGetCallbackIpResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/getcallbackip 接口的响应。 + /// + public class CgibinGetCallbackIpResponse : WechatApiResponse + { + /// + /// 获取或设置微信服务器 IP 地址列表。 + /// + [Newtonsoft.Json.JsonProperty("ip_list")] + [System.Text.Json.Serialization.JsonPropertyName("ip_list")] + public string[] IPList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketRequest.cs new file mode 100644 index 00000000..2a6838e6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/ticket/getticket 接口的请求。 + /// + public class CgibinTicketGetTicketRequest : WechatApiRequest + { + /// + /// (使用默认值即可,无需修改) + /// + public string Type { get; set; } = "jsapi"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketResponse.cs new file mode 100644 index 00000000..d4e9471d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTicketGetTicketResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/ticket/getticket 接口的响应。 + /// + public class CgibinTicketGetTicketResponse : WechatApiResponse + { + /// + /// 获取或设置 ApiTicket,即卡券接口中签名所需凭证。 + /// + [Newtonsoft.Json.JsonProperty("ticket")] + [System.Text.Json.Serialization.JsonPropertyName("ticket")] + public string Ticket { get; set; } = default!; + + /// + /// 获取或设置凭证有效时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("expires_in")] + [System.Text.Json.Serialization.JsonPropertyName("expires_in")] + public int ExpiresIn { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenRequest.cs new file mode 100644 index 00000000..a26ded69 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/token 接口的请求。 + /// + public class CgibinTokenRequest : WechatApiRequest + { + /// + /// (使用默认值即可,无需修改) + /// + public string GrantType { get; set; } = "client_credential"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenResponse.cs new file mode 100644 index 00000000..b42fe7bc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Cgibin/CgibinTokenResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/token 接口的响应。 + /// + public class CgibinTokenResponse : WechatApiResponse + { + /// + /// 获取或设置凭证。 + /// + [Newtonsoft.Json.JsonProperty("access_token")] + [System.Text.Json.Serialization.JsonPropertyName("access_token")] + public string AccessToken { get; set; } = default!; + + /// + /// 获取或设置凭证有效时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("expires_in")] + [System.Text.Json.Serialization.JsonPropertyName("expires_in")] + public int ExpiresIn { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateRequest.cs new file mode 100644 index 00000000..d0772391 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/create 接口的请求。 + /// + public class CgibinTagsCreateRequest : WechatApiRequest + { + public static class Types + { + public class Tag + { + /// + /// 获取或设置标签名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置标签数据。 + /// + [Newtonsoft.Json.JsonProperty("tag")] + [System.Text.Json.Serialization.JsonPropertyName("tag")] + public Types.Tag Tag { get; set; } = new Types.Tag(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateResponse.cs new file mode 100644 index 00000000..008eefb7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsCreateResponse.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/create 接口的响应。 + /// + public class CgibinTagsCreateResponse : WechatApiResponse + { + public static class Types + { + public class Tag + { + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public int Id { get; set; } + + /// + /// 获取或设置标签名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + } + } + + /// + /// 获取或设置批量获取的用户列表。 + /// + [Newtonsoft.Json.JsonProperty("tag")] + [System.Text.Json.Serialization.JsonPropertyName("tag")] + public Types.Tag Tag { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteRequest.cs new file mode 100644 index 00000000..70b18f28 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/delete 接口的请求。 + /// + public class CgibinTagsDeleteRequest : WechatApiRequest + { + public static class Types + { + public class Tag + { + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public int Id { get; set; } + } + } + + /// + /// 获取或设置标签数据。 + /// + [Newtonsoft.Json.JsonProperty("tag")] + [System.Text.Json.Serialization.JsonPropertyName("tag")] + public Types.Tag Tag { get; set; } = new Types.Tag(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteResponse.cs new file mode 100644 index 00000000..38e91170 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsDeleteResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/delete 接口的响应。 + /// + public class CgibinTagsDeleteResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetRequest.cs new file mode 100644 index 00000000..d91627f5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/tags/get 接口的请求。 + /// + public class CgibinTagsGetRequest : WechatApiRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetResponse.cs new file mode 100644 index 00000000..23912d25 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsGetResponse.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/tags/get 接口的响应。 + /// + public class CgibinTagsGetResponse : WechatApiResponse + { + public static class Types + { + public class Tag + { + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public int Id { get; set; } + + /// + /// 获取或设置标签名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置此标签下粉丝数。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + } + } + + /// + /// 获取或设置标签列表。 + /// + [Newtonsoft.Json.JsonProperty("tags")] + [System.Text.Json.Serialization.JsonPropertyName("tags")] + public Types.Tag[] Tags { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateRequest.cs new file mode 100644 index 00000000..c5acfaf1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateRequest.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/update 接口的请求。 + /// + public class CgibinTagsUpdateRequest : WechatApiRequest + { + public static class Types + { + public class Tag + { + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public int Id { get; set; } + + /// + /// 获取或设置标签名。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置标签数据。 + /// + [Newtonsoft.Json.JsonProperty("tag")] + [System.Text.Json.Serialization.JsonPropertyName("tag")] + public Types.Tag Tag { get; set; } = new Types.Tag(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateResponse.cs new file mode 100644 index 00000000..27b7ce51 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinTagsUpdateResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/update 接口的响应。 + /// + public class CgibinTagsUpdateResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetRequest.cs new file mode 100644 index 00000000..16cf8997 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/user/tag/get 接口的请求。 + /// + public class CgibinUserTagGetRequest : WechatApiRequest + { + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("tagid")] + [System.Text.Json.Serialization.JsonPropertyName("tagid")] + public int TagId { get; set; } + + /// + /// 获取或设置第一个拉取的 OpenId。不填默认从头开始拉取。 + /// + [Newtonsoft.Json.JsonProperty("next_openid")] + [System.Text.Json.Serialization.JsonPropertyName("next_openid")] + public string? NextOpenId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetResponse.cs new file mode 100644 index 00000000..425135ff --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/CgibinUserTagGetResponse.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/user/tag/get 接口的响应。 + /// + public class CgibinUserTagGetResponse : WechatApiResponse + { + public static class Types + { + public class Data + { + /// + /// 获取或设置 OpenId 的列表。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string[] OpenIdList { get; set; } = default!; + } + } + + /// + /// 获取或设置拉取列表的用户数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } = default!; + + /// + /// 获取或设置列表数据。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Data Data { get; set; } = default!; + + /// + /// 获取或设置拉取列表的最后一个用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("next_openid")] + [System.Text.Json.Serialization.JsonPropertyName("next_openid")] + public string NextOpenId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListRequest.cs new file mode 100644 index 00000000..31b12a2a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/getidlist 接口的请求。 + /// + public class CgibinTagsGetIdListRequest : WechatApiRequest + { + /// + /// 获取或设置用户 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListResponse.cs new file mode 100644 index 00000000..5ccdf594 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsGetIdListResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/getidlist 接口的响应。 + /// + public class CgibinTagsGetIdListResponse : WechatApiResponse + { + /// + /// 获取或设置用户身上的标签列表。 + /// + [Newtonsoft.Json.JsonProperty("tagid_list")] + [System.Text.Json.Serialization.JsonPropertyName("tagid_list")] + public int[] TagIdList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.cs new file mode 100644 index 00000000..d06641cf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchtagging 接口的请求。 + /// + public class CgibinTagsMembersBatchTaggingRequest : WechatApiRequest + { + /// + /// 获取或设置要打标签的用户 OpenId 列表。 + /// + [Newtonsoft.Json.JsonProperty("openid_list")] + [System.Text.Json.Serialization.JsonPropertyName("openid_list")] + public IList OpenIdList { get; set; } = new List(); + + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("tagid")] + [System.Text.Json.Serialization.JsonPropertyName("tagid")] + public int TagId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.cs new file mode 100644 index 00000000..2e2a7c62 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchtagging 接口的响应。 + /// + public class CgibinTagsMembersBatchTaggingResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.cs new file mode 100644 index 00000000..5b6c4cb3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchuntagging 接口的请求。 + /// + public class CgibinTagsMembersBatchUntaggingRequest : WechatApiRequest + { + /// + /// 获取或设置要取消标签的用户 OpenId 列表。 + /// + [Newtonsoft.Json.JsonProperty("openid_list")] + [System.Text.Json.Serialization.JsonPropertyName("openid_list")] + public IList OpenIdList { get; set; } = new List(); + + /// + /// 获取或设置标签 ID。 + /// + [Newtonsoft.Json.JsonProperty("tagid")] + [System.Text.Json.Serialization.JsonPropertyName("tagid")] + public int TagId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.cs new file mode 100644 index 00000000..8da52fcc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchuntagging 接口的响应。 + /// + public class CgibinTagsMembersBatchUntaggingResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.cs new file mode 100644 index 00000000..f33059c0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchblacklist 接口的请求。 + /// + public class CgibinTagsMembersBatchBlackListRequest : WechatApiRequest + { + /// + /// 获取或设置要拉黑的用户 OpenId 列表。 + /// + [Newtonsoft.Json.JsonProperty("openid_list")] + [System.Text.Json.Serialization.JsonPropertyName("openid_list")] + public IList OpenIdList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.cs new file mode 100644 index 00000000..78e8db65 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchblacklist 接口的响应。 + /// + public class CgibinTagsMembersBatchBlackListResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.cs new file mode 100644 index 00000000..e46d1df9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchunblacklist 接口的请求。 + /// + public class CgibinTagsMembersBatchUnblackListRequest : WechatApiRequest + { + /// + /// 获取或设置要取消拉黑的用户 OpenId 列表。 + /// + [Newtonsoft.Json.JsonProperty("openid_list")] + [System.Text.Json.Serialization.JsonPropertyName("openid_list")] + public IList OpenIdList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.cs new file mode 100644 index 00000000..57620d27 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/batchunblacklist 接口的响应。 + /// + public class CgibinTagsMembersBatchUnblackListResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.cs new file mode 100644 index 00000000..e53b39f7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/getblacklist 接口的请求。 + /// + public class CgibinTagsMembersGetBlackListRequest : WechatApiRequest + { + /// + /// 获取或设置第一个拉取的 OpenId。不填默认从头开始拉取。 + /// + [Newtonsoft.Json.JsonProperty("begin_openid")] + [System.Text.Json.Serialization.JsonPropertyName("begin_openid")] + public string? NextOpenId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.cs new file mode 100644 index 00000000..c259113a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/tags/members/getblacklist 接口的响应。 + /// + public class CgibinTagsMembersGetBlackListResponse : WechatApiResponse + { + public static class Types + { + public class Data + { + /// + /// 获取或设置 OpenId 的列表。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string[] OpenIdList { get; set; } = default!; + } + } + + /// + /// 获取或设置拉取黑名单中的总用户数。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置拉取列表的用户数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + + /// + /// 获取或设置列表数据。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Data Data { get; set; } = default!; + + /// + /// 获取或设置拉取列表的最后一个用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("next_openid")] + [System.Text.Json.Serialization.JsonPropertyName("next_openid")] + public string NextOpenId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetRequest.cs new file mode 100644 index 00000000..56e2b643 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/user/info/batchget 接口的请求。 + /// + public class CgibinUserInfoBatchGetRequest : WechatApiRequest + { + public static class Types + { + public class User + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置返回国家地区语言版本。 + /// 默认值:zh_CN + /// + [Newtonsoft.Json.JsonProperty("lang")] + [System.Text.Json.Serialization.JsonPropertyName("lang")] + public string Language { get; set; } = "zh_CN"; + } + } + + /// + /// 获取或设置批量获取的用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_list")] + public IList UserList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetResponse.cs new file mode 100644 index 00000000..63035b34 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoBatchGetResponse.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/user/info/batchget 接口的响应。 + /// + public class CgibinUserInfoBatchGetResponse : WechatApiResponse + { + public static class Types + { + public class User + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户全局标识。只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 + /// + [Newtonsoft.Json.JsonProperty("unionid")] + [System.Text.Json.Serialization.JsonPropertyName("unionid")] + public string? UnionId { get; set; } + + /// + /// 获取或设置用户的昵称。 + /// + [Newtonsoft.Json.JsonProperty("nickname")] + [System.Text.Json.Serialization.JsonPropertyName("nickname")] + public string Nickname { get; set; } = default!; + + /// + /// 获取或设置用户的性别。 + /// + [Newtonsoft.Json.JsonProperty("sex")] + [System.Text.Json.Serialization.JsonPropertyName("sex")] + public int Sex { get; set; } + + /// + /// 获取或设置用户所在城市。 + /// + [Newtonsoft.Json.JsonProperty("city")] + [System.Text.Json.Serialization.JsonPropertyName("city")] + public string City { get; set; } = default!; + + /// + /// 获取或设置用户所在省份。 + /// + [Newtonsoft.Json.JsonProperty("province")] + [System.Text.Json.Serialization.JsonPropertyName("province")] + public string Province { get; set; } = default!; + + /// + /// 获取或设置用户所在国家。 + /// + [Newtonsoft.Json.JsonProperty("country")] + [System.Text.Json.Serialization.JsonPropertyName("country")] + public string Country { get; set; } = default!; + + /// + /// 获取或设置用户的语言。 + /// + [Newtonsoft.Json.JsonProperty("language")] + [System.Text.Json.Serialization.JsonPropertyName("language")] + public string Language { get; set; } = default!; + + /// + /// 获取或设置用户的头像 URL。 + /// + [Newtonsoft.Json.JsonProperty("headimgurl")] + [System.Text.Json.Serialization.JsonPropertyName("headimgurl")] + public string HeadImageUrl { get; set; } = default!; + + /// + /// 获取或设置用户是否订阅该公众号标识(值为 0 时,代表此用户没有关注该公众号,拉取不到其余信息)。 + /// + [Newtonsoft.Json.JsonProperty("subscribe")] + [System.Text.Json.Serialization.JsonPropertyName("subscribe")] + public int Subscribe { get; set; } + + /// + /// 获取或设置用户关注的时间戳。如果用户曾多次关注,则取最后关注时间。 + /// + [Newtonsoft.Json.JsonProperty("subscribe_time")] + [System.Text.Json.Serialization.JsonPropertyName("subscribe_time")] + public long? SubscribeTimestamp { get; set; } + + /// + /// 获取或设置用户关注的渠道来源。 + /// + [Newtonsoft.Json.JsonProperty("subscribe_scene")] + [System.Text.Json.Serialization.JsonPropertyName("subscribe_scene")] + public string? SubscribeScene { get; set; } + + /// + /// 获取或设置公众号运营者对粉丝的备注。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + + /// + /// 获取或设置用户所在的分组 ID(兼容旧的用户分组接口)。 + /// + [Newtonsoft.Json.JsonProperty("groupid")] + [System.Text.Json.Serialization.JsonPropertyName("groupid")] + public int GroupId { get; set; } + + /// + /// 获取或设置用户被打上的标签 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("tagid_list")] + [System.Text.Json.Serialization.JsonPropertyName("tagid_list")] + public int[]? TagIdList { get; set; } + + /// + /// 获取或设置二维码扫码场景。 + /// + [Newtonsoft.Json.JsonProperty("qr_scene")] + [System.Text.Json.Serialization.JsonPropertyName("qr_scene")] + public int? QrcodeScene { get; set; } + + /// + /// 获取或设置二维码扫码场景描述。 + /// + [Newtonsoft.Json.JsonProperty("qr_scene_str")] + [System.Text.Json.Serialization.JsonPropertyName("qr_scene_str")] + public string? QrcodeSceneString { get; set; } + } + } + + /// + /// 获取或设置批量获取的用户列表。 + /// + [Newtonsoft.Json.JsonProperty("user_info_list")] + [System.Text.Json.Serialization.JsonPropertyName("user_info_list")] + public Types.User[] UserList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoRequest.cs new file mode 100644 index 00000000..1114fa79 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoRequest.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/user/info 接口的请求。 + /// + public class CgibinUserInfoRequest : WechatApiRequest + { + /// + /// 获取或设置用户唯一标识。 + /// + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置返回国家地区语言版本。 + /// 默认值:zh_CN + /// + public string Language { get; set; } = "zh_CN"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoResponse.cs new file mode 100644 index 00000000..9e1f79d0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoResponse.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/user/info 接口的响应。 + /// + public class CgibinUserInfoResponse : WechatApiResponse + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户全局标识。只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 + /// + [Newtonsoft.Json.JsonProperty("unionid")] + [System.Text.Json.Serialization.JsonPropertyName("unionid")] + public string? UnionId { get; set; } + + /// + /// 获取或设置用户的昵称。 + /// + [Newtonsoft.Json.JsonProperty("nickname")] + [System.Text.Json.Serialization.JsonPropertyName("nickname")] + public string Nickname { get; set; } = default!; + + /// + /// 获取或设置用户的性别。 + /// + [Newtonsoft.Json.JsonProperty("sex")] + [System.Text.Json.Serialization.JsonPropertyName("sex")] + public int Sex { get; set; } + + /// + /// 获取或设置用户所在城市。 + /// + [Newtonsoft.Json.JsonProperty("city")] + [System.Text.Json.Serialization.JsonPropertyName("city")] + public string City { get; set; } = default!; + + /// + /// 获取或设置用户所在省份。 + /// + [Newtonsoft.Json.JsonProperty("province")] + [System.Text.Json.Serialization.JsonPropertyName("province")] + public string Province { get; set; } = default!; + + /// + /// 获取或设置用户所在国家。 + /// + [Newtonsoft.Json.JsonProperty("country")] + [System.Text.Json.Serialization.JsonPropertyName("country")] + public string Country { get; set; } = default!; + + /// + /// 获取或设置用户的语言。 + /// + [Newtonsoft.Json.JsonProperty("language")] + [System.Text.Json.Serialization.JsonPropertyName("language")] + public string Language { get; set; } = default!; + + /// + /// 获取或设置用户的头像 URL。 + /// + [Newtonsoft.Json.JsonProperty("headimgurl")] + [System.Text.Json.Serialization.JsonPropertyName("headimgurl")] + public string HeadImageUrl { get; set; } = default!; + + /// + /// 获取或设置用户是否订阅该公众号标识(值为 0 时,代表此用户没有关注该公众号,拉取不到其余信息)。 + /// + [Newtonsoft.Json.JsonProperty("subscribe")] + [System.Text.Json.Serialization.JsonPropertyName("subscribe")] + public int Subscribe { get; set; } + + /// + /// 获取或设置用户关注的时间戳。如果用户曾多次关注,则取最后关注时间。 + /// + [Newtonsoft.Json.JsonProperty("subscribe_time")] + [System.Text.Json.Serialization.JsonPropertyName("subscribe_time")] + public long? SubscribeTimestamp { get; set; } + + /// + /// 获取或设置用户关注的渠道来源。 + /// + [Newtonsoft.Json.JsonProperty("subscribe_scene")] + [System.Text.Json.Serialization.JsonPropertyName("subscribe_scene")] + public string? SubscribeScene { get; set; } + + /// + /// 获取或设置公众号运营者对粉丝的备注。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + + /// + /// 获取或设置用户所在的分组 ID(兼容旧的用户分组接口)。 + /// + [Newtonsoft.Json.JsonProperty("groupid")] + [System.Text.Json.Serialization.JsonPropertyName("groupid")] + public int GroupId { get; set; } + + /// + /// 获取或设置用户被打上的标签 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("tagid_list")] + [System.Text.Json.Serialization.JsonPropertyName("tagid_list")] + public int[]? TagIdList { get; set; } + + /// + /// 获取或设置二维码扫码场景。 + /// + [Newtonsoft.Json.JsonProperty("qr_scene")] + [System.Text.Json.Serialization.JsonPropertyName("qr_scene")] + public int? QrcodeScene { get; set; } + + /// + /// 获取或设置二维码扫码场景描述。 + /// + [Newtonsoft.Json.JsonProperty("qr_scene_str")] + [System.Text.Json.Serialization.JsonPropertyName("qr_scene_str")] + public string? QrcodeSceneString { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkRequest.cs new file mode 100644 index 00000000..e8678b67 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/user/info/updateremark 接口的请求。 + /// + public class CgibinUserInfoUpdateRemarkRequest : WechatApiRequest + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置新的备注名。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string Remark { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkResponse.cs new file mode 100644 index 00000000..fcc0c9ee --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserInfoUpdateRemarkResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [POST] /cgi-bin/user/info/updateremark 接口的响应。 + /// + public class CgibinUserInfoUpdateRemarkResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserRequest.cs new file mode 100644 index 00000000..91b259ad --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/user 接口的请求。 + /// + public class CgibinUserRequest : WechatApiRequest + { + /// + /// 获取或设置第一个拉取的 OpenId。不填默认从头开始拉取。 + /// + public string? NextOpenId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserResponse.cs new file mode 100644 index 00000000..ccd885f5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinUser/CgibinUserResponse.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /cgi-bin/user/get 接口的响应。 + /// + public class CgibinUserResponse : WechatApiResponse + { + public static class Types + { + public class Data + { + /// + /// 获取或设置 OpenId 的列表。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string[] OpenIdList { get; set; } = default!; + } + } + + /// + /// 获取或设置关注该公众账号的总用户数。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置拉取列表的用户数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + + /// + /// 获取或设置列表数据。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Data Data { get; set; } = default!; + + /// + /// 获取或设置拉取列表的最后一个用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("next_openid")] + [System.Text.Json.Serialization.JsonPropertyName("next_openid")] + public string NextOpenId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthRequest.cs new file mode 100644 index 00000000..f6ee4a2f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/auth 接口的请求。 + /// + public class SnsAuthRequest : WechatApiRequest + { + /// + /// 获取或设置网页授权接口调用凭证(注意与全局 AccessToken 相区分)。 + /// + public override string? AccessToken { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthResponse.cs new file mode 100644 index 00000000..6021fe63 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsAuthResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/auth 接口的响应。 + /// + public class SnsAuthResponse : WechatApiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionRequest.cs new file mode 100644 index 00000000..74b5a665 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/jscode2session 接口的请求。 + /// + public class SnsJsCode2SessionRequest : WechatApiRequest + { + /// + /// (使用默认值即可,无需修改) + /// + public string GrantType { get; set; } = "authorization_code"; + + /// + /// 获取或设置登录时获取的 Code。 + /// + public string JsCode { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionResponse.cs new file mode 100644 index 00000000..000cd17b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsJsCode2SessionResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/jscode2session 接口的响应。 + /// + public class SnsJsCode2SessionResponse : WechatApiResponse + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户全局标识。只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 + /// + [Newtonsoft.Json.JsonProperty("unionid")] + [System.Text.Json.Serialization.JsonPropertyName("unionid")] + public string? UnionId { get; set; } + + /// + /// 获取或设置会话密钥。 + /// + [Newtonsoft.Json.JsonProperty("session_key")] + [System.Text.Json.Serialization.JsonPropertyName("session_key")] + public string SessionKey { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenRequest.cs new file mode 100644 index 00000000..34a8e555 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/oauth2/access_token 接口的请求。 + /// + public class SnsOAuth2AccessTokenRequest : WechatApiRequest + { + /// + /// (使用默认值即可,无需修改) + /// + public string GrantType { get; set; } = "authorization_code"; + + /// + /// 获取或设置换取 AccessToken 的票据。 + /// + public string Code { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenResponse.cs new file mode 100644 index 00000000..4baabf32 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2AccessTokenResponse.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/oauth2/access_token 接口的响应。 + /// + public class SnsOAuth2AccessTokenResponse : WechatApiResponse + { + /// + /// 获取或设置网页授权接口调用凭证。 + /// + [Newtonsoft.Json.JsonProperty("access_token")] + [System.Text.Json.Serialization.JsonPropertyName("access_token")] + public string AccessToken { get; set; } = default!; + + /// + /// 获取或设置凭证有效时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("expires_in")] + [System.Text.Json.Serialization.JsonPropertyName("expires_in")] + public int ExpiresIn { get; set; } + + /// + /// 获取或设置用户刷新 AccessToken。 + /// + [Newtonsoft.Json.JsonProperty("refresh_token")] + [System.Text.Json.Serialization.JsonPropertyName("refresh_token")] + public string RefreshToken { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户授权的作用域,使用逗号分隔。 + /// + [Newtonsoft.Json.JsonProperty("scope")] + [System.Text.Json.Serialization.JsonPropertyName("scope")] + public string Scope { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenRequest.cs new file mode 100644 index 00000000..84dadaec --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/oauth2/refresh_token 接口的请求。 + /// + public class SnsOAuth2RefreshTokenRequest : WechatApiRequest + { + /// + /// (使用默认值即可,无需修改) + /// + public string GrantType { get; set; } = "refresh_token"; + + /// + /// 获取或设置通过 AccessToken 获取到的 RefreshToken 参数。 + /// + public string RefreshToken { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenResponse.cs new file mode 100644 index 00000000..a44b3228 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsOAuth2RefreshTokenResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/oauth2/refresh_token 接口的响应。 + /// + public class SnsOAuth2RefreshTokenResponse : SnsOAuth2AccessTokenResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoRequest.cs new file mode 100644 index 00000000..25bb58c8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoRequest.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/userinfo 接口的请求。 + /// + public class SnsUserInfoRequest : WechatApiRequest + { + /// + /// 获取或设置网页授权接口调用凭证(注意与全局 AccessToken 相区分)。 + /// + public override string? AccessToken { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置返回国家地区语言版本。 + /// 默认值:zh_CN + /// + public string Language { get; set; } = "zh_CN"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoResponse.cs new file mode 100644 index 00000000..c490aacb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Sns/SnsUserInfoResponse.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Models +{ + /// + /// 表示 [GET] /sns/userinfo 接口的响应。 + /// + public class SnsUserInfoResponse : WechatApiResponse + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户全局标识。只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 + /// + [Newtonsoft.Json.JsonProperty("unionid")] + [System.Text.Json.Serialization.JsonPropertyName("unionid")] + public string? UnionId { get; set; } + + /// + /// 获取或设置用户的昵称。 + /// + [Newtonsoft.Json.JsonProperty("nickname")] + [System.Text.Json.Serialization.JsonPropertyName("nickname")] + public string Nickname { get; set; } = default!; + + /// + /// 获取或设置用户的性别。 + /// + [Newtonsoft.Json.JsonProperty("sex")] + [System.Text.Json.Serialization.JsonPropertyName("sex")] + public int Sex { get; set; } + + /// + /// 获取或设置用户所在城市。 + /// + [Newtonsoft.Json.JsonProperty("city")] + [System.Text.Json.Serialization.JsonPropertyName("city")] + public string City { get; set; } = default!; + + /// + /// 获取或设置用户所在省份。 + /// + [Newtonsoft.Json.JsonProperty("province")] + [System.Text.Json.Serialization.JsonPropertyName("province")] + public string Province { get; set; } = default!; + + /// + /// 获取或设置用户所在国家。 + /// + [Newtonsoft.Json.JsonProperty("country")] + [System.Text.Json.Serialization.JsonPropertyName("country")] + public string Country { get; set; } = default!; + + /// + /// 获取或设置用户的头像 URL。 + /// + [Newtonsoft.Json.JsonProperty("headimgurl")] + [System.Text.Json.Serialization.JsonPropertyName("headimgurl")] + public string HeadImageUrl { get; set; } = default!; + + /// + /// 获取或设置用户特权信息。 + /// + [Newtonsoft.Json.JsonProperty("privilege")] + [System.Text.Json.Serialization.JsonPropertyName("privilege")] + public string[]? PrivilegeList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj b/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj new file mode 100644 index 00000000..10772908 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj @@ -0,0 +1,26 @@ + + + + net461; netstandard2.0 + 8.0 + enable + true + + + + SKIT.FlurlHttpClient.Wechat.Api + MIT + https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat + Flurl.Http Wechat Weixin MicroMessage 微信 公众号 服务号 小程序 公众平台 开放平台 微信公众号 微信服务号 微信小程序 微信公众平台 微信开放平台 + 0.0.1-alpha.1 + Flurl.Http client for Wechat API. 基于 Flurl.Http 的微信 API 客户端,支持公众平台(公众号、小程序)、开放平台等功能。 + Fu Diwei + git + https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git + + + + + + + diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs new file mode 100644 index 00000000..b851b64d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClient.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + /// + /// 一个微信 API HTTP 客户端。 + /// + public class WechatApiClient : WechatClientBase + { + /// + /// 获取当前客户端使用的微信 AppId。 + /// + public string AppId { get; } + + /// + /// 获取或设置当前客户端使用的微信 AppSecret。 + /// + public string AppSecret { get; set; } + + /// + /// 用指定的配置项初始化 类的新实例。 + /// + /// 配置项。 + public WechatApiClient(WechatApiClientOptions options) + : base() + { + if (options == null) throw new ArgumentNullException(nameof(options)); + + AppId = options.AppId; + AppSecret = options.AppSecret; + + ProxyFlurlClient.BaseUrl = options.Endpoints ?? WechatApiEndpoints.DEFAULT; + ProxyFlurlClient.Configure(settings => + { + settings.Timeout = TimeSpan.FromMilliseconds(options.Timeout); + }); + } + + /// + /// 用指定的微信 AppId 和微信 AppSecret 初始化 类的新实例。 + /// + /// 微信 AppId。 + /// 微信 AppSecret。 + public WechatApiClient(string appId, string appSecret) + : this(new WechatApiClientOptions() { AppId = appId, AppSecret = appSecret }) + { + } + + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + /// + public async Task SendRequestAsync(IFlurlRequest request, HttpContent? content = null, CancellationToken cancellationToken = default) + where T : WechatApiResponse, new() + { + try + { + using IFlurlResponse response = await base.SendRequestAsync(request, content, cancellationToken).ConfigureAwait(false); + return await GetResposneAsync(response).ConfigureAwait(false); + } + catch (FlurlHttpException ex) + { + throw new WechatApiException(ex.Message, ex); + } + } + + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + /// + public async Task SendRequestWithJsonAsync(IFlurlRequest request, object? data = null, CancellationToken cancellationToken = default) + where T : WechatApiResponse, new() + { + try + { + using IFlurlResponse response = await base.SendRequestWithJsonAsync(request, data, cancellationToken).ConfigureAwait(false); + return await GetResposneAsync(response).ConfigureAwait(false); + } + catch (FlurlHttpException ex) + { + throw new WechatApiException(ex.Message, ex); + } + } + + private async Task GetResposneAsync(IFlurlResponse response) + where T : WechatApiResponse, new() + { + string contentType = response.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; + bool contentTypeIsNotJson = + response.StatusCode == (int)HttpStatusCode.OK && !contentType.StartsWith("application/json") && !contentType.StartsWith("text/json"); + + T result = contentTypeIsNotJson ? new T() : await response.GetJsonAsync().ConfigureAwait(false); + result.RawStatus = response.StatusCode; + result.RawHeaders = new ReadOnlyDictionary( + response.Headers + .GroupBy(e => e.Name) + .ToDictionary( + k => k.Key, + v => string.Join(", ", v.Select(e => e.Value)) + ) + ); + result.RawBytes = await response.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + return result; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClientOptions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClientOptions.cs new file mode 100644 index 00000000..07e58036 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiClientOptions.cs @@ -0,0 +1,32 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + /// + /// 一个用于构造 时使用的配置项。 + /// + public class WechatApiClientOptions + { + /// + /// 获取或设置请求超时时间(单位:毫秒)。 + /// 默认值:30000 + /// + public int Timeout { get; set; } = 30 * 1000; + + /// + /// 获取或设置微信 API 域名。 + /// 默认值: + /// + public string? Endpoints { get; set; } = WechatApiEndpoints.DEFAULT; + + /// + /// 获取或设置微信 AppId。 + /// + public string AppId { get; set; } = default!; + + /// + /// 获取或设置微信 AppSecret。 + /// + public string AppSecret { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiEndpoints.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiEndpoints.cs new file mode 100644 index 00000000..a03845b8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiEndpoints.cs @@ -0,0 +1,36 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + /// + /// 微信 API 接口域名。 + /// REF: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Interface_field_description.html + /// + public static class WechatApiEndpoints + { + /// + /// 主域名(默认)。 + /// + public const string DEFAULT = "https://api.weixin.qq.com"; + + /// + /// 容灾备用域名。 + /// + public const string BACKUP = "https://api2.weixin.qq.com"; + + /// + /// 上海域名。 + /// + public const string REGION_SHANGHAI = "https://sh.api.weixin.qq.com"; + + /// + /// 深圳域名。 + /// + public const string REGION_SHENZHEN = "https://sz.api.weixin.qq.com"; + + /// + /// 香港域名。 + /// + public const string REGION_HONGKONG = "https://hk.api.weixin.qq.com"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiException.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiException.cs new file mode 100644 index 00000000..29067b25 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiException.cs @@ -0,0 +1,27 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + /// + /// 当调用微信 API 出错时引发的异常。 + /// + public class WechatApiException : WechatExceptionBase + { + /// + public WechatApiException() + { + } + + /// + public WechatApiException(string message) + : base(message) + { + } + + /// + public WechatApiException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiRequest.cs new file mode 100644 index 00000000..908fb815 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiRequest.cs @@ -0,0 +1,25 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + /// + /// 表示微信 API 请求的基类。 + /// + public abstract class WechatApiRequest : IWechatRequest + { + /// + /// 获取或设置请求超时时间(单位:毫秒)。 + /// 如果不指定将使用构造 时的 参数,这在需要指定特定耗时请求(比如上传或下载文件)的超时时间时很有用。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual int? Timeout { get; set; } + + /// + /// 获取或设置微信 AccessToken。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual string? AccessToken { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiResponse.cs new file mode 100644 index 00000000..8771f886 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/WechatApiResponse.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Api +{ + /// + /// 表示微信 API 响应的基类。 + /// + public abstract class WechatApiResponse : IWechatResponse + { + /// + /// 获取原始的 HTTP 响应状态码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int RawStatus { get; internal set; } + + /// + /// 获取原始的 HTTP 响应表头集合。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public IDictionary RawHeaders { get; internal set; } = default!; + + /// + /// 获取原始的 HTTP 响应正文。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] RawBytes { get; internal set; } = default!; + + /// + /// 获取微信 API 返回的错误码。 + /// + [Newtonsoft.Json.JsonProperty("errcode")] + [System.Text.Json.Serialization.JsonPropertyName("errcode")] + public virtual int ErrorCode { get; set; } + + /// + /// 获取微信 API 返回的错误描述。 + /// + [Newtonsoft.Json.JsonProperty("errmsg")] + [System.Text.Json.Serialization.JsonPropertyName("errmsg")] + public virtual string? ErrorMessage { get; set; } + + /// + /// 获取一个值,该值指示调用微信 API 是否成功(即 HTTP 状态码为 200、且 errcode 值为 0)。 + /// + /// + public virtual bool IsSuccessful() + { + return RawStatus == 200 && ErrorCode == 0; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/EncryptionAlgorithms.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/EncryptionAlgorithms.cs new file mode 100644 index 00000000..0c93afd2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/EncryptionAlgorithms.cs @@ -0,0 +1,9 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Constants +{ + public static class EncryptionAlgorithms + { + public const string AEAD_AES_256_GCM = "AEAD_AES_256_GCM"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/SignTypes.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/SignTypes.cs new file mode 100644 index 00000000..ebc1cb84 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Constants/SignTypes.cs @@ -0,0 +1,9 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Constants +{ + public static class SignTypes + { + public const string RSA = "RSA"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonDateTimeOffsetConverter.cs new file mode 100644 index 00000000..4cd08c4a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonDateTimeOffsetConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class CommonDateTimeOffsetConverter : JsonConverter + { + private readonly JsonConverter _converter = new CommonNullableDateTimeOffsetConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) ?? default; + } + + public override void WriteJson(JsonWriter writer, DateTimeOffset value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value, serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonNullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonNullableDateTimeOffsetConverter.cs new file mode 100644 index 00000000..96b2ac27 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonNullableDateTimeOffsetConverter.cs @@ -0,0 +1,57 @@ +using System; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class CommonNullableDateTimeOffsetConverter : JsonConverter + { + internal const string DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override DateTimeOffset? ReadJson(JsonReader reader, Type objectType, DateTimeOffset? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return existingValue; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + if (DateTimeOffset.TryParseExact(value, DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTimeOffset result)) + return result; + + if (DateTimeOffset.TryParse(value, out result)) + return result; + } + else if (reader.TokenType == JsonToken.Date) + { + reader.DateFormatString = DATETIME_FORMAT; + return serializer.Deserialize(reader); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, DateTimeOffset? value, JsonSerializer serializer) + { + if (value.HasValue) + writer.WriteValue(value.Value.ToString(DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs new file mode 100644 index 00000000..3d46f74d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class CommonWithoutSeparatorsDateTimeOffsetConverter : JsonConverter + { + private readonly JsonConverter _converter = new CommonWithoutSeparatorsNullableDateTimeOffsetConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) ?? default; + } + + public override void WriteJson(JsonWriter writer, DateTimeOffset value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value, serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs new file mode 100644 index 00000000..4b039e4b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs @@ -0,0 +1,57 @@ +using System; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class CommonWithoutSeparatorsNullableDateTimeOffsetConverter : JsonConverter + { + internal const string DATETIME_FORMAT = "yyyyMMddHHmmss"; + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override DateTimeOffset? ReadJson(JsonReader reader, Type objectType, DateTimeOffset? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return existingValue; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + if (DateTimeOffset.TryParseExact(value, DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTimeOffset result)) + return result; + + if (DateTimeOffset.TryParse(value, out result)) + return result; + } + else if (reader.TokenType == JsonToken.Date) + { + reader.DateFormatString = DATETIME_FORMAT; + return serializer.Deserialize(reader); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, DateTimeOffset? value, JsonSerializer serializer) + { + if (value.HasValue) + writer.WriteValue(value.Value.ToString(DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringArrayConverter.cs new file mode 100644 index 00000000..44bcbfdb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringArrayConverter.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class StringTypedStringArrayConverter : JsonConverter + { + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override string[]? ReadJson(JsonReader reader, Type objectType, string[]? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + if (value.StartsWith("[") && value.EndsWith("[")) + return JsonConvert.DeserializeObject(value); + + if (string.IsNullOrEmpty(value)) + return new string[0]; + else + return new string[1] { value }; + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(JsonConvert.SerializeObject(value, Formatting.None)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringIListConverter.cs new file mode 100644 index 00000000..6ce8cf4f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringIListConverter.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class StringTypedStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new StringTypedStringListConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override IList? ReadJson(JsonReader reader, Type objectType, IList? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer); + } + + public override void WriteJson(JsonWriter writer, IList? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, ConvertIListToList(value), serializer); + } + + private List? ConvertIListToList(IList? src) + { + if (src == null) + return null; + + List? dest = src as List; + if (dest != null) + return dest; + + return new List(src); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringListConverter.cs new file mode 100644 index 00000000..78550102 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/StringTypedStringListConverter.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class StringTypedStringListConverter : JsonConverter?> + { + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override List? ReadJson(JsonReader reader, Type objectType, List? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + return JsonConvert.DeserializeObject>(value); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, List? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(JsonConvert.SerializeObject(value, Formatting.None)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonDateTimeOffsetConverter.cs new file mode 100644 index 00000000..926fb65f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonDateTimeOffsetConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class CommonDateTimeOffsetConverter : JsonConverter + { + private readonly JsonConverter _converter = new CommonNullableDateTimeOffsetConverter(); + + public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonNullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonNullableDateTimeOffsetConverter.cs new file mode 100644 index 00000000..a358abf3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonNullableDateTimeOffsetConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class CommonNullableDateTimeOffsetConverter : JsonConverter + { + private const string DATETIME_FORMAT = Newtonsoft.Json.Converters.CommonNullableDateTimeOffsetConverter.DATETIME_FORMAT; + + public override DateTimeOffset? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if (DateTimeOffset.TryParseExact(value, DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTimeOffset result)) + return result; + + if (DateTimeOffset.TryParse(value, out result)) + return result; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteStringValue(value.Value.ToString(DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs new file mode 100644 index 00000000..e5c5803a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class CommonWithoutSeparatorsDateTimeOffsetConverter : JsonConverter + { + private readonly JsonConverter _converter = new CommonWithoutSeparatorsNullableDateTimeOffsetConverter(); + + public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs new file mode 100644 index 00000000..4871ed5b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class CommonWithoutSeparatorsNullableDateTimeOffsetConverter : JsonConverter + { + private const string DATETIME_FORMAT = Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter.DATETIME_FORMAT; + + public override DateTimeOffset? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if (DateTimeOffset.TryParseExact(value, DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTimeOffset result)) + return result; + + if (DateTimeOffset.TryParse(value, out result)) + return result; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteStringValue(value.Value.ToString(DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringArrayConverter.cs new file mode 100644 index 00000000..9a30eaa4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringArrayConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class StringTypedStringArrayConverter : JsonConverter + { + public override string[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if (value.StartsWith("[") && value.EndsWith("[")) + return JsonSerializer.Deserialize(value, options); + + if (string.IsNullOrEmpty(value)) + return new string[0]; + else + return new string[1] { value }; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(JsonSerializer.Serialize(value, options)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringIListConverter.cs new file mode 100644 index 00000000..d8fd7ca8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringIListConverter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class StringTypedStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new StringTypedStringListConverter(); + + public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options); + } + + public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) + { + _converter.Write(writer, ConvertIListToList(value), options); + } + + private List? ConvertIListToList(IList? src) + { + if (src == null) + return null; + + List? dest = src as List; + if (dest != null) + return dest; + + return new List(src); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringListConverter.cs new file mode 100644 index 00000000..cff41b92 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/StringTypedStringListConverter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class StringTypedStringListConverter : JsonConverter?> + { + public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + return JsonSerializer.Deserialize>(value, options); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(JsonSerializer.Serialize(value, options)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayCallbackDecryptionException.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayCallbackDecryptionException.cs new file mode 100644 index 00000000..62571972 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayCallbackDecryptionException.cs @@ -0,0 +1,24 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Exceptions +{ + public class WechatTenpayCallbackDecryptionException : WechatTenpayException + { + /// + internal WechatTenpayCallbackDecryptionException() + { + } + + /// + internal WechatTenpayCallbackDecryptionException(string message) + : base(message) + { + } + + /// + internal WechatTenpayCallbackDecryptionException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayRequestSignatureException.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayRequestSignatureException.cs new file mode 100644 index 00000000..5ffaa083 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayRequestSignatureException.cs @@ -0,0 +1,24 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Exceptions +{ + public class WechatTenpayRequestSignatureException : WechatTenpayException + { + /// + internal WechatTenpayRequestSignatureException() + { + } + + /// + internal WechatTenpayRequestSignatureException(string message) + : base(message) + { + } + + /// + internal WechatTenpayRequestSignatureException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseDecryptionException.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseDecryptionException.cs new file mode 100644 index 00000000..4b5dbcfc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseDecryptionException.cs @@ -0,0 +1,24 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Exceptions +{ + public class WechatTenpayResponseDecryptionException : WechatTenpayException + { + /// + internal WechatTenpayResponseDecryptionException() + { + } + + /// + internal WechatTenpayResponseDecryptionException(string message) + : base(message) + { + } + + /// + internal WechatTenpayResponseDecryptionException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseVerificationException.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseVerificationException.cs new file mode 100644 index 00000000..0be0e102 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Exceptions/WechatTenpayResponseVerificationException.cs @@ -0,0 +1,24 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Exceptions +{ + public class WechatTenpayResponseVerificationException : WechatTenpayException + { + /// + internal WechatTenpayResponseVerificationException() + { + } + + /// + internal WechatTenpayResponseVerificationException(string message) + : base(message) + { + } + + /// + internal WechatTenpayResponseVerificationException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs new file mode 100644 index 00000000..936f4e79 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/FlurlHttpRequestOptionsExtensions.cs @@ -0,0 +1,27 @@ +using System; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + internal static class FlurlHttpRequestOptionsExtensions + { + public static IFlurlRequest SetOptions(this IFlurlRequest request, WechatTenpayRequest options) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + if (options == null) throw new ArgumentNullException(nameof(options)); + + if (options.Timeout.HasValue) + { + request.WithTimeout(TimeSpan.FromMilliseconds(options.Timeout.Value)); + } + + if (options.WechatpayCertSerialNumber != null) + { + request.Headers.Remove("Wechatpay-Serial"); + request.WithHeader("Wechatpay-Serial", options.WechatpayCertSerialNumber); + } + + return request; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientCallbackDeserializationExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientCallbackDeserializationExtensions.cs new file mode 100644 index 00000000..2b983938 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientCallbackDeserializationExtensions.cs @@ -0,0 +1,80 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供回调通知事件的扩展方法。 + /// + public static class WechatTenpayClientCallbackDeserializationExtensions + { + /// + /// 反序列化得到 对象。 + /// + /// + /// + /// + /// + public static WechatTenpayCallback DeserializeCallback(this WechatTenpayClient client, string callbackJson) + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (string.IsNullOrEmpty(callbackJson)) throw new ArgumentNullException(callbackJson); + + return client.JsonSerializer.Deserialize(callbackJson); + } + + /// + /// 返回序列化并解密事件数据中被加密的通知数据。 + /// + /// + /// + /// + /// + public static T DecryptCallbackResource(this WechatTenpayClient client, WechatTenpayCallback callback) + where T : WechatTenpayCallback.Types.IDecryptedResource, new() + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (callback == null) throw new ArgumentNullException(nameof(callback)); + + return DecryptCallbackResource(client, callback.Resource); + } + + /// + /// 返回序列化并解密事件数据中被加密的通知数据。 + /// + /// + /// + /// + /// + public static T DecryptCallbackResource(this WechatTenpayClient client, WechatTenpayCallback.Types.Resource resource) + where T : WechatTenpayCallback.Types.IDecryptedResource, new() + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (resource == null) throw new ArgumentNullException(nameof(resource)); + + string plainJson; + + if (Constants.EncryptionAlgorithms.AEAD_AES_256_GCM.Equals(resource.Algorithm)) + { + try + { + plainJson = Utilities.AesUtil.DecryptWithGCM( + aesKey: client.MerchantV3Secret, + nonce: resource.Nonce, + associatedData: resource.AssociatedData, + cipherText: resource.CipherText + ); + } + catch (Exception ex) + { + throw new Exceptions.WechatTenpayCallbackDecryptionException("Decrypt callback failed.", ex); + } + } + else + { + throw new Exceptions.WechatTenpayCallbackDecryptionException("Unknown encrypt algorithm of the resource."); + } + + return client.JsonSerializer.Deserialize(plainJson); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubMerchantExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubMerchantExtensions.cs new file mode 100644 index 00000000..81d6ae87 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubMerchantExtensions.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供商户特约商户进件相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteApplyForSubMerchantExtensions + { + /// + /// 异步调用 [POST] /applyment4sub/applyment 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateApplyForSubMerchantApplymentAsync(this WechatTenpayClient client, Models.CreateApplyForSubMerchantApplymentRequest 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(HttpMethod.Post, "applyment4sub", "applyment"); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /applyment4sub/applyment/business_code/{business_code} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetApplyForSubMerchantApplymentByBusinessCodeAsync(this WechatTenpayClient client, Models.GetApplyForSubMerchantApplymentByBusinessCodeRequest 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(HttpMethod.Get, "applyment4sub", "applyment", "business_code", request.BusinessCode) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /applyment4sub/applyment/applyment_id/{applyment_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetApplyForSubMerchantApplymentByApplymentIdAsync(this WechatTenpayClient client, Models.GetApplyForSubMerchantApplymentByApplymentIdRequest 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(HttpMethod.Get, "applyment4sub", "applyment", "applyment_id", request.ApplymentId.ToString()) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteModifyApplyForSubMerchantSettlementAsync(this WechatTenpayClient client, Models.ModifyApplyForSubMerchantSettlementRequest 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(HttpMethod.Post, "apply4sub", "sub_merchants", request.SubMerchantId, "modify-settlement") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetApplyForSubMerchantSettlementAsync(this WechatTenpayClient client, Models.GetApplyForSubMerchantSettlementRequest 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(HttpMethod.Get, "apply4sub", "sub_merchants", request.SubMerchantId, "settlement") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubjectExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubjectExtensions.cs new file mode 100644 index 00000000..a9de4265 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteApplyForSubjectExtensions.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供商户开户意愿确认相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteApplyForSubjectExtensions + { + /// + /// 异步调用 [POST] /apply4subject/applyment 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateApplyForSubjectApplymentAsync(this WechatTenpayClient client, Models.CreateApplyForSubjectApplymentRequest 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(HttpMethod.Post, "apply4subject", "applyment") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /apply4subject/applyment 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetApplyForSubjectApplymentByBusinessCodeAsync(this WechatTenpayClient client, Models.GetApplyForSubjectApplymentByBusinessCodeRequest 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(HttpMethod.Get, "apply4subject", "applyment") + .SetOptions(request) + .SetQueryParam("business_code", request.BusinessCode); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /apply4subject/applyment 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetApplyForSubjectApplymentByApplymentIdAsync(this WechatTenpayClient client, Models.GetApplyForSubjectApplymentByApplymentIdRequest 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(HttpMethod.Get, "apply4subject", "applyment") + .SetOptions(request) + .SetQueryParam("applyment_id", request.ApplymentId.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /apply4subject/applyment/{business_code}/cancel 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCancelApplyForSubjectApplymentByBusinessCodeAsync(this WechatTenpayClient client, Models.CancelApplyForSubjectApplymentByBusinessCodeRequest 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(HttpMethod.Post, "apply4subject", "applyment", request.BusinessCode, "cancel") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /apply4subject/applyment/{applyment_id}/cancel 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCancelApplyForSubjectApplymentByApplymentIdAsync(this WechatTenpayClient client, Models.CancelApplyForSubjectApplymentByApplymentIdRequest 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(HttpMethod.Post, "apply4subject", "applyment", request.ApplymentId.ToString(), "cancel") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /apply4subject/applyment/merchants/{sub_mchid}/state 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetApplyForSubjectApplymentMerchantStateAsync(this WechatTenpayClient client, Models.GetApplyForSubjectApplymentMerchantStateRequest 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(HttpMethod.Get, "apply4subject", "applyment", "merchants", request.SubMerchantId, "state") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBillExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBillExtensions.cs new file mode 100644 index 00000000..6c763e06 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBillExtensions.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供账单相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteBillExtensions + { + /// + /// 异步调用 [GET] /bill/tradebill 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_17.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_17.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_9_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBillTradeBillAsync(this WechatTenpayClient client, Models.GetBillTradeBillRequest 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(HttpMethod.Get, "bill/tradebill") + .SetOptions(request) + .SetQueryParam("bill_date", request.BillDateString); + + if (!string.IsNullOrEmpty(request.SubMerchantId)) + flurlReq.SetQueryParam("sub_mchid", request.SubMerchantId); + + if (!string.IsNullOrEmpty(request.BillType)) + flurlReq.SetQueryParam("bill_type", request.BillType); + + if (!string.IsNullOrEmpty(request.TarType)) + flurlReq.SetQueryParam("tar_type", request.TarType); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /bill/fundflowbill 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_18.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_18.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_9_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBillFundflowBillAsync(this WechatTenpayClient client, Models.GetBillFundflowBillRequest 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(HttpMethod.Get, "bill/fundflowbill") + .SetOptions(request) + .SetQueryParam("bill_date", request.BillDateString); + + if (!string.IsNullOrEmpty(request.AccountType)) + flurlReq.SetQueryParam("account_type", request.AccountType); + + if (!string.IsNullOrEmpty(request.TarType)) + flurlReq.SetQueryParam("tar_type", request.TarType); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /billdownload/file 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_19.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_19.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_9_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDownloadBillFileAsync(this WechatTenpayClient client, Models.DownloadBillFileRequest 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(HttpMethod.Get, request.DownloadUrl); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBrandProfitSharingExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBrandProfitSharingExtensions.cs new file mode 100644 index 00000000..ccdf1f89 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBrandProfitSharingExtensions.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供连锁品牌分账相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteBrandProfitSharingExtensions + { + /// + /// 异步调用 [POST] /brand/profitsharing/orders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateBrandProfitSharingOrderAsync(this WechatTenpayClient client, Models.CreateBrandProfitSharingOrderRequest 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(HttpMethod.Post, "brand", "profitsharing", "orders") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /brand/profitsharing/orders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBrandProfitSharingOrderByOutOrderNumberAsync(this WechatTenpayClient client, Models.GetBrandProfitSharingOrderByOutOrderNumberRequest 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(HttpMethod.Get, "brand", "profitsharing", "orders") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("transaction_id", request.TransactionId) + .SetQueryParam("out_order_no", request.OutOrderNumber); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /brand/profitsharing/returnorders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateBrandProfitSharingReturnOrderAsync(this WechatTenpayClient client, Models.CreateBrandProfitSharingReturnOrderRequest 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(HttpMethod.Post, "brand", "profitsharing", "returnorders") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /brand/profitsharing/returnorders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBrandProfitSharingReturnOrderByOutOrderNumberAsync(this WechatTenpayClient client, Models.GetBrandProfitSharingReturnOrderByOutOrderNumberRequest 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(HttpMethod.Get, "brand", "profitsharing", "returnorders") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("out_order_no", request.OutOrderNumber) + .SetQueryParam("out_return_no", request.OutReturnNumber); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /brand/profitsharing/returnorders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBrandProfitSharingReturnOrderByOrderIdAsync(this WechatTenpayClient client, Models.GetBrandProfitSharingReturnOrderByOrderIdRequest 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(HttpMethod.Get, "brand", "profitsharing", "returnorders") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("order_id", request.OrderId) + .SetQueryParam("out_return_no", request.OutReturnNumber); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /brand/profitsharing/finish-order 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetBrandProfitSharingOrderFinishAsync(this WechatTenpayClient client, Models.SetBrandProfitSharingOrderFinishRequest 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(HttpMethod.Post, "brand", "profitsharing", "finish-order") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /brand/profitsharing/orders/{transaction_id}/amounts 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_9.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBrandProfitSharingOrderAmountsAsync(this WechatTenpayClient client, Models.GetBrandProfitSharingOrderAmountsRequest 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(HttpMethod.Get, "brand", "profitsharing", "orders", request.TransactionId, "amounts") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /brand/profitsharing/brand-configs/{brand_mchid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_10.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBrandProfitBrandConfigsAsync(this WechatTenpayClient client, Models.GetBrandProfitBrandConfigsRequest 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(HttpMethod.Get, "brand", "profitsharing", "brand-configs", request.BrandMerchantId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /brand/profitsharing/receivers/add 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAddBrandProfitSharingReceiverAsync(this WechatTenpayClient client, Models.AddBrandProfitSharingReceiverRequest 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(HttpMethod.Post, "brand", "profitsharing", "receivers", "add") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /brand/profitsharing/receivers/delete 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_7_8.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDeleteBrandProfitSharingReceiverAsync(this WechatTenpayClient client, Models.DeleteBrandProfitSharingReceiverRequest 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(HttpMethod.Post, "brand", "profitsharing", "receivers", "delete") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBusinessCircleExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBusinessCircleExtensions.cs new file mode 100644 index 00000000..8b177717 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteBusinessCircleExtensions.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供智慧商圈相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteBusinessCircleExtensions + { + /// + /// 异步调用 [POST] /businesscircle/points/notify 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_6_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_6_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteNotifyBusinessCirclePointsAsync(this WechatTenpayClient client, Models.NotifyBusinessCirclePointsRequest 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(HttpMethod.Post, "businesscircle", "points", "notify") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /businesscircle/user-authorizations/{openid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_6_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_6_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetBusinessCircleUserAuthorizationByOpenIdAsync(this WechatTenpayClient client, Models.GetBusinessCircleUserAuthorizationByOpenIdRequest 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(HttpMethod.Get, "businesscircle", "user-authorizations", request.OpenId) + .SetOptions(request) + .SetQueryParam("appid", request.AppId); + + if (!string.IsNullOrEmpty(request.SubMerchantId)) + flurlReq.SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCertificatesExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCertificatesExtensions.cs new file mode 100644 index 00000000..68ee3f5a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCertificatesExtensions.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供证书相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteCertificatesExtensions + { + /// + /// 异步调用 [GET] /certificates 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay5_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay5_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryCertificatesAsync(this WechatTenpayClient client, Models.QueryCertificatesRequest 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(HttpMethod.Get, "certificates"); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCombineTransactionExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCombineTransactionExtensions.cs new file mode 100644 index 00000000..f53630eb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteCombineTransactionExtensions.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供合单支付相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteCombineTransactionExtensions + { + /// + /// 异步调用 [POST] /combine-transactions/app 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateCombineTransactionAppAsync(this WechatTenpayClient client, Models.CreateCombineTransactionAppRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.CombineMerchantId)) + request.CombineMerchantId = client.MerchantId; + + if (request.SubOrderList != null) + { + foreach (var subOrder in request.SubOrderList) + { + if (string.IsNullOrEmpty(subOrder.MerchantId)) + subOrder.MerchantId = request.CombineMerchantId; + } + } + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "combine-transactions", "app") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /combine-transactions/jsapi 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateCombineTransactionJsapiAsync(this WechatTenpayClient client, Models.CreateCombineTransactionJsapiRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.CombineMerchantId)) + request.CombineMerchantId = client.MerchantId; + + if (request.SubOrderList != null) + { + foreach (var subOrder in request.SubOrderList) + { + if (string.IsNullOrEmpty(subOrder.MerchantId)) + subOrder.MerchantId = request.CombineMerchantId; + } + } + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "combine-transactions", "jsapi") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /combine-transactions/h5 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateCombineTransactionH5Async(this WechatTenpayClient client, Models.CreateCombineTransactionH5Request request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.CombineMerchantId)) + request.CombineMerchantId = client.MerchantId; + + if (request.SubOrderList != null) + { + foreach (var subOrder in request.SubOrderList) + { + if (string.IsNullOrEmpty(subOrder.MerchantId)) + subOrder.MerchantId = request.CombineMerchantId; + } + } + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "combine-transactions", "h5") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /combine-transactions/native 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_5.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateCombineTransactionNativeAsync(this WechatTenpayClient client, Models.CreateCombineTransactionNativeRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.CombineMerchantId)) + request.CombineMerchantId = client.MerchantId; + + if (request.SubOrderList != null) + { + foreach (var subOrder in request.SubOrderList) + { + if (string.IsNullOrEmpty(subOrder.MerchantId)) + subOrder.MerchantId = request.CombineMerchantId; + } + } + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "combine-transactions", "native") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /combine-transactions/out-trade-no/{combine_out_trade_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_11.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_11.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetCombineTransactionByCombineOutTradeNumberAsync(this WechatTenpayClient client, Models.GetCombineTransactionByCombineOutTradeNumberRequest 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(HttpMethod.Get, "combine-transactions", "out-trade-no", request.CombineOutTradeNumber) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /combine-transactions/out-trade-no/{combine_out_trade_no}/close 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_12.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_12.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCloseCombineTransactionAsync(this WechatTenpayClient client, Models.CloseCombineTransactionRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.SubOrderList != null) + { + foreach (var subOrder in request.SubOrderList) + { + if (string.IsNullOrEmpty(subOrder.MerchantId)) + subOrder.MerchantId = client.MerchantId; + } + } + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "combine-transactions", "out-trade-no", request.CombineOutTradeNumber, "close") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteDiscountCardExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteDiscountCardExtensions.cs new file mode 100644 index 00000000..c64f8fc9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteDiscountCardExtensions.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供微信先享卡相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteDiscountCardExtensions + { + /// + /// 异步调用 [POST] /discount-card/cards 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_3_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecutePrepareDiscountCardAsync(this WechatTenpayClient client, Models.PrepareDiscountCardRequest 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(HttpMethod.Post, "discount-card", "cards") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /discount-card/cards/{out_card_code}/add-user-records 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_3_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAddDiscountCardUserRecordAsync(this WechatTenpayClient client, Models.AddDiscountCardUserRecordRequest 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(HttpMethod.Post, "discount-card", "cards", request.OutCardCode, "add-user-records") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /discount-card/cards/{out_card_code} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_3_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetDiscountCardByOutCardCodeAsync(this WechatTenpayClient client, Models.GetDiscountCardByOutCardCodeRequest 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(HttpMethod.Get, "discount-card", "cards", request.OutCardCode) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceApplymentsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceApplymentsExtensions.cs new file mode 100644 index 00000000..0d077b15 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceApplymentsExtensions.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通进件相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceApplymentsExtensions + { + /// + /// 异步调用 [POST] /ecommerce/applyments 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceApplymentAsync(this WechatTenpayClient client, Models.CreateEcommerceApplymentRequest 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(HttpMethod.Post, "ecommerce", "applyments") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/applyments/{applyment_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceApplymentByApplymentIdAsync(this WechatTenpayClient client, Models.GetEcommerceApplymentByApplymentIdRequest 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(HttpMethod.Get, "ecommerce", "applyments", request.ApplymentId.ToString()) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/applyments/out-request-no/{out_request_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceApplymentByOutRequestNumberAsync(this WechatTenpayClient client, Models.GetEcommerceApplymentByOutRequestNumberRequest 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(HttpMethod.Get, "ecommerce", "applyments", "out-request-no", request.OutRequestNumber) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceBillExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceBillExtensions.cs new file mode 100644 index 00000000..8fc43ac4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceBillExtensions.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通账单相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceBillExtensions + { + /// + /// 异步调用 [GET] /ecommerce/bill/fundflowbill 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_9_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceBillFundflowBillAsync(this WechatTenpayClient client, Models.GetEcommerceBillFundflowBillRequest 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(HttpMethod.Get, "ecommerce", "bill", "fundflowbill") + .SetOptions(request) + .SetQueryParam("bill_date", request.BillDateString) + .SetQueryParam("account_type", request.AccountType) + .SetQueryParam("algorithm", request.Algorithm); + + if (!string.IsNullOrEmpty(request.TarType)) + flurlReq.SetQueryParam("tar_type", request.TarType); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundBalanceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundBalanceExtensions.cs new file mode 100644 index 00000000..996a0743 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundBalanceExtensions.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通二级商户余额相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceFundBalanceExtensions + { + /// + /// 异步调用 [GET] /ecommerce/fund/balance/{sub_mchid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_7_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceFundBalanceAsync(this WechatTenpayClient client, Models.GetEcommerceFundBalanceRequest 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(HttpMethod.Get, "ecommerce", "fund", "balance", request.SubMerchantId) + .SetOptions(request); + + if (!string.IsNullOrEmpty(request.AccountType)) + flurlReq.SetQueryParam("account_type", request.AccountType); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/fund/balance/enddaybalance/{sub_mchid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_7_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceFundDayendBalanceAsync(this WechatTenpayClient client, Models.GetEcommerceFundDayendBalanceRequest 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(HttpMethod.Get, "ecommerce", "fund", "enddaybalance", "balance", request.SubMerchantId) + .SetOptions(request) + .SetQueryParam("date", request.DateString); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundWithdrawExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundWithdrawExtensions.cs new file mode 100644 index 00000000..321da050 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceFundWithdrawExtensions.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通二级商户提现相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceFundWithdrawExtensions + { + /// + /// 异步调用 [POST] /ecommerce/fund/withdraw 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceFundWithdrawAsync(this WechatTenpayClient client, Models.CreateEcommerceFundWithdrawRequest 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(HttpMethod.Post, "ecommerce", "fund", "withdraw") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/fund/withdraw/out-request-no/{out_request_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceFundWithdrawByOutRequestNumberAsync(this WechatTenpayClient client, Models.GetEcommerceFundWithdrawByOutRequestNumberRequest 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(HttpMethod.Get, "ecommerce", "fund", "withdraw", "out-request-no", request.OutRequestNumber) + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/fund/withdraw/{withdraw_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceFundWithdrawByWithdrawIdAsync(this WechatTenpayClient client, Models.GetEcommerceFundWithdrawByWithdrawIdRequest 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(HttpMethod.Get, "ecommerce", "fund", "withdraw", request.WithdrawId) + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceProfitSharingExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceProfitSharingExtensions.cs new file mode 100644 index 00000000..3c47331a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceProfitSharingExtensions.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通分账相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceProfitSharingExtensions + { + /// + /// 异步调用 [POST] /ecommerce/profitsharing/orders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceProfitSharingOrderAsync(this WechatTenpayClient client, Models.CreateEcommerceProfitSharingOrderRequest 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(HttpMethod.Post, "ecommerce", "profitsharing", "orders") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/profitsharing/orders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceProfitSharingOrderByOutOrderNumberAsync(this WechatTenpayClient client, Models.GetEcommerceProfitSharingOrderByOutOrderNumberRequest 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(HttpMethod.Get, "ecommerce", "profitsharing", "orders") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("transaction_id", request.TransactionId) + .SetQueryParam("out_order_no", request.OutOrderNumber); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/profitsharing/returnorders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceProfitSharingReturnOrderAsync(this WechatTenpayClient client, Models.CreateEcommerceProfitSharingReturnOrderRequest 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(HttpMethod.Post, "ecommerce", "profitsharing", "returnorders") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/profitsharing/returnorders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceProfitSharingReturnOrderByOutOrderNumberAsync(this WechatTenpayClient client, Models.GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest 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(HttpMethod.Get, "ecommerce", "profitsharing", "returnorders") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("out_order_no", request.OutOrderNumber) + .SetQueryParam("out_return_no", request.OutReturnNumber); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/profitsharing/returnorders 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceProfitSharingReturnOrderByOrderIdAsync(this WechatTenpayClient client, Models.GetEcommerceProfitSharingReturnOrderByOrderIdRequest 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(HttpMethod.Get, "ecommerce", "profitsharing", "returnorders") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId) + .SetQueryParam("order_id", request.OrderId) + .SetQueryParam("out_return_no", request.OutReturnNumber); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/profitsharing/finish-order 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetEcommerceProfitSharingOrderFinishAsync(this WechatTenpayClient client, Models.SetEcommerceProfitSharingOrderFinishRequest 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(HttpMethod.Post, "ecommerce", "profitsharing", "finish-order") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/profitsharing/orders/{transaction_id}/amounts 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_9.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceProfitSharingOrderAmountsAsync(this WechatTenpayClient client, Models.GetEcommerceProfitSharingOrderAmountsRequest 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(HttpMethod.Get, "ecommerce", "profitsharing", "orders", request.TransactionId, "amounts", HttpMethod.Get) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/profitsharing/receivers/add 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAddEcommerceProfitSharingReceiverAsync(this WechatTenpayClient client, Models.AddEcommerceProfitSharingReceiverRequest 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(HttpMethod.Post, "ecommerce", "profitsharing", "receivers", "add") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/profitsharing/receivers/delete 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_8.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDeleteEcommerceProfitSharingReceiverAsync(this WechatTenpayClient client, Models.DeleteEcommerceProfitSharingReceiverRequest 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(HttpMethod.Post, "ecommerce", "profitsharing", "receivers", "delete") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceRefundsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceRefundsExtensions.cs new file mode 100644 index 00000000..4320fa45 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceRefundsExtensions.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通退款相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceRefundsExtensions + { + /// + /// 异步调用 [POST] /ecommerce/refunds/apply 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceRefundAsync(this WechatTenpayClient client, Models.CreateEcommerceRefundRequest 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(HttpMethod.Post, "ecommerce", "refunds", "apply") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/refunds/out-refund-no/{out_refund_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceRefundByOutRefundNumberAsync(this WechatTenpayClient client, Models.GetEcommerceRefundByOutRefundNumberRequest 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(HttpMethod.Get, "ecommerce", "refunds", "out-refund-no", request.OutRefundNumber) + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/refunds/id/{refund_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceRefundByRefundIdAsync(this WechatTenpayClient client, Models.GetEcommerceRefundByRefundIdRequest 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(HttpMethod.Get, "ecommerce", "refunds", "id", request.RefundId) + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/refunds/{refund_id}/return-advance 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceRefundReturnAdvanceAsync(this WechatTenpayClient client, Models.CreateEcommerceRefundReturnAdvanceRequest 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(HttpMethod.Post, "ecommerce", "refunds", request.RefundId, "return-advance") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /ecommerce/refunds/{refund_id}/return-advance 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetEcommerceRefundReturnAdvanceAsync(this WechatTenpayClient client, Models.GetEcommerceRefundReturnAdvanceRequest 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(HttpMethod.Get, "ecommerce", "refunds", request.RefundId, "return-advance") + .SetOptions(request) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceSubsidiesExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceSubsidiesExtensions.cs new file mode 100644 index 00000000..21d05313 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteEcommerceSubsidiesExtensions.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通补差相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteEcommerceSubsidiesExtensions + { + /// + /// 异步调用 [POST] /ecommerce/subsidies/create 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_5_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceSubsidyAsync(this WechatTenpayClient client, Models.CreateEcommerceSubsidyRequest 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(HttpMethod.Post, "ecommerce", "subsidies", "create") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/subsidies/return 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_5_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateEcommerceSubsidyReturnAsync(this WechatTenpayClient client, Models.CreateEcommerceSubsidyReturnRequest 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(HttpMethod.Post, "ecommerce", "subsidies", "return") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /ecommerce/subsidies/cancel 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_5_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCancelEcommerceSubsidyAsync(this WechatTenpayClient client, Models.CancelEcommerceSubsidyRequest 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(HttpMethod.Post, "ecommerce", "subsidies", "cancel") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteGoldPlanExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteGoldPlanExtensions.cs new file mode 100644 index 00000000..64ac0a09 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteGoldPlanExtensions.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供点金计划相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteGoldPlanExtensions + { + /// + /// 异步调用 [POST] /goldplan/merchants/changegoldplanstatus 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteChangeGoldPlanStatusAsync(this WechatTenpayClient client, Models.ChangeGoldPlanStatusRequest 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(HttpMethod.Post, "apply4subject", "applyment") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /goldplan/merchants/changecustompagestatus 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteChangeGoldPlanCustomPageStatusAsync(this WechatTenpayClient client, Models.ChangeGoldPlanCustomPageStatusRequest 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(HttpMethod.Post, "goldplan", "merchants", "hangecustompagestatus") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /goldplan/merchants/set-advertising-industry-filter 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetGoldPlanAdvertisingIndustryFilterAsync(this WechatTenpayClient client, Models.SetGoldPlanAdvertisingIndustryFilterRequest 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(HttpMethod.Post, "goldplan", "merchants", "set-advertising-industry-filter") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /goldplan/merchants/open-advertising-show 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteOpenGoldPlanAdvertisingShowAsync(this WechatTenpayClient client, Models.OpenGoldPlanAdvertisingShowRequest 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(HttpMethod.Post, "goldplan", "merchants", "open-advertising-show") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /goldplan/merchants/open-advertising-close 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_5_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCloseGoldPlanAdvertisingShowAsync(this WechatTenpayClient client, Models.CloseGoldPlanAdvertisingShowRequest 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(HttpMethod.Post, "goldplan", "merchants", "open-advertising-close") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBusifavorExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBusifavorExtensions.cs new file mode 100644 index 00000000..599ad895 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingBusifavorExtensions.cs @@ -0,0 +1,438 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供商家券相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMarketingBusifavorExtensions + { + /// + /// 异步调用 [POST] /marketing/busifavor/stocks 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingBusifavorStockAsync(this WechatTenpayClient client, Models.CreateMarketingBusifavorStockRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.BelongMerchantId)) + request.BelongMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "busifavor", "stocks") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/busifavor/stocks/{stock_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingBusifavorStockByStockIdAsync(this WechatTenpayClient client, Models.GetMarketingBusifavorStockByStockIdRequest 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(HttpMethod.Get, "marketing", "busifavor", "stocks", request.StockId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [PATCH] /marketing/busifavor/stocks/{stock_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_12.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_12.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUpdateMarketingBusifavorStockAsync(this WechatTenpayClient client, Models.UpdateMarketingBusifavorStockRequest 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(new HttpMethod("PATCH"), "marketing", "busifavor", "stocks", request.StockId) + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [PATCH] /marketing/busifavor/stocks/{stock_id}/budget 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_11.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_11.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUpdateMarketingBusifavorStockBudgetAsync(this WechatTenpayClient client, Models.UpdateMarketingBusifavorStockBudgetRequest 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(new HttpMethod("PATCH"), "marketing", "busifavor", "stocks", request.StockId, "budget") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/stocks/{stock_id}/couponcodes 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMarketingBusifavorStockCouponCodesAsync(this WechatTenpayClient client, Models.UploadMarketingBusifavorStockCouponCodesRequest 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(HttpMethod.Post, "marketing", "busifavor", "stocks", request.StockId, "couponcodes") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_5.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingBusifavorUserCouponByCouponCodeAsync(this WechatTenpayClient client, Models.GetMarketingBusifavorUserCouponByCouponCodeRequest 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(HttpMethod.Get, "marketing", "busifavor", "users", request.OpenId, "coupons", request.CouponCode, "appids", request.AppId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/busifavor/users/{openid}/coupons 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingBusifavorUserCouponsAsync(this WechatTenpayClient client, Models.QueryMarketingBusifavorUserCouponsRequest 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(HttpMethod.Get, "marketing", "busifavor", "users", request.OpenId, "coupons") + .SetOptions(request) + .SetQueryParam("appid", request.AppId); + + if (!string.IsNullOrEmpty(request.StockId)) + flurlReq.SetQueryParam("stock_id", request.StockId); + + if (!string.IsNullOrEmpty(request.CouponState)) + flurlReq.SetQueryParam("coupon_state", request.CouponState); + + if (!string.IsNullOrEmpty(request.CreatorMerchantId)) + flurlReq.SetQueryParam("creator_mchid", request.CreatorMerchantId); + + if (!string.IsNullOrEmpty(request.SenderMerchantId)) + flurlReq.SetQueryParam("sender_mchid", request.SenderMerchantId); + + if (!string.IsNullOrEmpty(request.BelongMerchantId)) + flurlReq.SetQueryParam("belong_merchant", request.BelongMerchantId); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/coupons/use 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetMarketingBusifavorCouponUsedAsync(this WechatTenpayClient client, Models.SetMarketingBusifavorCouponUsedRequest 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(HttpMethod.Post, "marketing", "busifavor", "coupons", "use") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/coupons/associate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_9.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAssociateMarketingBusifavorCouponAsync(this WechatTenpayClient client, Models.AssociateMarketingBusifavorCouponRequest 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(HttpMethod.Post, "marketing", "busifavor", "coupons", "associate") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/coupons/disassociate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_10.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDisassociateMarketingBusifavorCouponAsync(this WechatTenpayClient client, Models.DisassociateMarketingBusifavorCouponRequest 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(HttpMethod.Post, "marketing", "busifavor", "coupons", "disassociate") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/coupons/return 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_13.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_13.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingBusifavorCouponReturnAsync(this WechatTenpayClient client, Models.CreateMarketingBusifavorCouponReturnRequest 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(HttpMethod.Post, "marketing", "busifavor", "coupons", "return") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/coupons/deactivate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_14.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_14.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDeactivateMarketingBusifavorCouponAsync(this WechatTenpayClient client, Models.DeactivateMarketingBusifavorCouponRequest 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(HttpMethod.Post, "marketing", "busifavor", "coupons", "deactivate") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/coupons/{card_id}/send 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_6_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSendMarketingBusifavorCouponAsync(this WechatTenpayClient client, Models.SendMarketingBusifavorCouponRequest 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(HttpMethod.Post, "marketing", "busifavor", "coupons", request.CardId, "send") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/busifavor/callbacks 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_8.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingBusifavorCallbackAsync(this WechatTenpayClient client, Models.GetMarketingBusifavorCallbackRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "marketing", "busifavor", "callbacks") + .SetOptions(request) + .SetQueryParam("mchid", request.MerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/callbacks 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUpdateMarketingBusifavorCallbackAsync(this WechatTenpayClient client, Models.UpdateMarketingBusifavorCallbackRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "busifavor", "callbacks") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/subsidy/pay-receipts 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_16.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_16.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingBusifavorSubsidyPayReceiptAsync(this WechatTenpayClient client, Models.CreateMarketingBusifavorSubsidyPayReceiptRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.PayerMerchantId)) + request.PayerMerchantId = client.MerchantId; + + if (string.IsNullOrEmpty(request.PayeeMerchantId)) + request.PayeeMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "busifavor", "subsidy", "pay-receipts") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/busifavor/subsidy/pay-receipts/{subsidy_receipt_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_18.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_18.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdAsync(this WechatTenpayClient client, Models.GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest 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(HttpMethod.Get, "marketing", "busifavor", "subsidy", "pay-receipts", request.SubsidyReceiptId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/busifavor/subsidy/return-receipts 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_17.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_2_17.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingBusifavorSubsidyReturnReceiptAsync(this WechatTenpayClient client, Models.CreateMarketingBusifavorSubsidyReturnReceiptRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.PayerMerchantId)) + request.PayerMerchantId = client.MerchantId; + + if (string.IsNullOrEmpty(request.PayeeMerchantId)) + request.PayeeMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "busifavor", "subsidy", "return-receipts") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingFavorExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingFavorExtensions.cs new file mode 100644 index 00000000..446827bd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingFavorExtensions.cs @@ -0,0 +1,383 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供代金券相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMarketingFavorExtensions + { + /// + /// 异步调用 [POST] /marketing/favor/coupon-stocks 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingFavorStockAsync(this WechatTenpayClient client, Models.CreateMarketingFavorStockRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.BelongMerchantId)) + request.BelongMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "coupon-stocks") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/favor/stocks/{stock_id}/start 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteStartMarketingFavorStockAsync(this WechatTenpayClient client, Models.StartMarketingFavorStockRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "stocks", request.StockId, "start") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/favor/stocks/{stock_id}/pause 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_13.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_13.shtml + /// + /// + /// + /// + /// + public static async Task ExecutePauseMarketingFavorStockAsync(this WechatTenpayClient client, Models.PauseMarketingFavorStockRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "stocks", request.StockId, "pause") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/favor/stocks/{stock_id}/restart 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_14.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_14.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteRestartMarketingFavorStockAsync(this WechatTenpayClient client, Models.RestartMarketingFavorStockRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "stocks", request.StockId, "restart") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/stocks/{stock_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_5.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingFavorStockByStockIdAsync(this WechatTenpayClient client, Models.GetMarketingFavorStockByStockIdRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "marketing", "favor", "stocks", request.StockId) + .SetOptions(request) + .SetQueryParam("stock_creator_mchid", request.StockCreatorMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/stocks 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingFavorStocksAsync(this WechatTenpayClient client, Models.QueryMarketingFavorStocksRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "marketing", "favor", "stocks") + .SetOptions(request) + .SetQueryParam("stock_creator_mchid", request.StockCreatorMerchantId) + .SetQueryParam("limit", request.Limit.ToString()) + .SetQueryParam("offset", request.Offset.ToString()); + + if (request.CreateStartTime.HasValue) + flurlReq.SetQueryParam("create_start_time", request.CreateStartTime.Value.ToString("yyyy-MM-dd'T'HH:mm:sszzz")); + + if (request.CreateEndTime.HasValue) + flurlReq.SetQueryParam("create_end_time", request.CreateEndTime.Value.ToString("yyyy-MM-dd'T'HH:mm:sszzz")); + + if (!string.IsNullOrEmpty(request.Status)) + flurlReq.SetQueryParam("status", request.Status); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/stocks/{stock_id}/merchants 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingFavorStockMerchantsAsync(this WechatTenpayClient client, Models.QueryMarketingFavorStockMerchantsRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "marketing", "favor", "stocks", request.StockId, "merchants") + .SetOptions(request) + .SetQueryParam("stock_creator_mchid", request.StockCreatorMerchantId) + .SetQueryParam("limit", request.Limit.ToString()) + .SetQueryParam("offset", request.Offset.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/stocks/{stock_id}/items 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_8.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingFavorStockItemsAsync(this WechatTenpayClient client, Models.QueryMarketingFavorStockItemsRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "marketing", "favor", "stocks", request.StockId, "items") + .SetOptions(request) + .SetQueryParam("stock_creator_mchid", request.StockCreatorMerchantId) + .SetQueryParam("limit", request.Limit.ToString()) + .SetQueryParam("offset", request.Offset.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/stocks/{stock_id}/use-flow 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_10.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingFavorStockUseFlowAsync(this WechatTenpayClient client, Models.GetMarketingFavorStockUseFlowRequest 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(HttpMethod.Get, "marketing", "favor", "stocks", request.StockId, "use-flow") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/stocks/{stock_id}/refund-flow 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_11.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_11.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingFavorStockRefundFlowAsync(this WechatTenpayClient client, Models.GetMarketingFavorStockRefundFlowRequest 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(HttpMethod.Get, "marketing", "favor", "stocks", request.StockId, "refund-flow") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/favor/users/{openid}/coupons 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSendMarketingFavorUserCouponAsync(this WechatTenpayClient client, Models.SendMarketingFavorUserCouponRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.StockCreatorMerchantId)) + request.StockCreatorMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "users", request.OpenId, "coupons") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/users/{openid}/coupons/{coupon_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingFavorUserCouponByCouponIdAsync(this WechatTenpayClient client, Models.GetMarketingFavorUserCouponByCouponIdRequest 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(HttpMethod.Get, "marketing", "favor", "users", request.OpenId, "coupons", request.CouponId) + .SetOptions(request) + .SetQueryParam("appid", request.AppId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/favor/users/{openid}/coupons 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_9.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingFavorUserCouponsAsync(this WechatTenpayClient client, Models.QueryMarketingFavorUserCouponsRequest 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(HttpMethod.Get, "marketing", "favor", "users", request.OpenId, "coupons") + .SetOptions(request) + .SetQueryParam("appid", request.AppId); + + if (!string.IsNullOrEmpty(request.StockId)) + flurlReq.SetQueryParam("stock_id", request.StockId); + + if (!string.IsNullOrEmpty(request.Status)) + flurlReq.SetQueryParam("status", request.Status); + + if (!string.IsNullOrEmpty(request.CreatorMerchantId)) + flurlReq.SetQueryParam("creator_mchid", request.CreatorMerchantId); + + if (!string.IsNullOrEmpty(request.SenderMerchantId)) + flurlReq.SetQueryParam("sender_mchid", request.SenderMerchantId); + + if (!string.IsNullOrEmpty(request.AvailableMerchantId)) + flurlReq.SetQueryParam("available_mchid", request.AvailableMerchantId); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/favor/callbacks 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_12.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_1_12.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUpdateMarketingFavorCallbackAsync(this WechatTenpayClient client, Models.UpdateMarketingFavorCallbackRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "callbacks") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMediaExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMediaExtensions.cs new file mode 100644 index 00000000..01ac722e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMediaExtensions.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供图片上传(营销专用)相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMarketingMediaExtensions + { + /// + /// 异步调用 [POST] /marketing/favor/media/image-upload 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_0_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_0_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMarketingMediaImageAsync(this WechatTenpayClient client, Models.UploadMarketingMediaImageRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.FileName)) + request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png"; + + if (string.IsNullOrEmpty(request.FileHash)) + request.FileHash = Utilities.Sha256Util.Hash(request.FileBytes).ToLower(); + + if (string.IsNullOrEmpty(request.FileContentType)) + { + if (request.FileName!.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/bmp"; + else if (request.FileName!.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/jpeg"; + else if (request.FileName!.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/jpeg"; + else + request.FileContentType = "image/png"; + } + + string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x"); + using var fileContent = new ByteArrayContent(request.FileBytes); + using var metaContent = new ByteArrayContent(Encoding.UTF8.GetBytes(client.JsonSerializer.Serialize(request))); + using var httpContent = new MultipartFormDataContent(boundary); + httpContent.Add(metaContent, "\"meta\""); // NOTICE: meta 必须要加双引号 + httpContent.Add(fileContent, "\"file\"", "\"" + request.FileName + "\""); // NOTICE: file 必须要加双引号 + httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary); // NOTICE: boundary 不能加引号 + metaContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(request.FileContentType); + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "marketing", "favor", "media", "image-upload") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, content: httpContent, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPartnershipsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPartnershipsExtensions.cs new file mode 100644 index 00000000..3647fcd2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPartnershipsExtensions.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供委托营销相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMarketingPartnershipsExtensions + { + /// + /// 异步调用 [POST] /marketing/partnerships/build 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_5_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_5_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteBuildMarketingPartnershipAsync(this WechatTenpayClient client, Models.BuildMarketingPartnershipRequest 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(HttpMethod.Post, "marketing", "partnerships", "build") + .SetOptions(request) + .WithHeader("Idempotency-Key", request.IdempotencyKey); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/partnerships/terminate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_5_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_5_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteTerminateMarketingPartnershipAsync(this WechatTenpayClient client, Models.TerminateMarketingPartnershipRequest 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(HttpMethod.Post, "marketing", "partnerships", "terminate") + .SetOptions(request) + .WithHeader("Idempotency-Key", request.IdempotencyKey); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/partnerships 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_5_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_5_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingPartnershipsAsync(this WechatTenpayClient client, Models.QueryMarketingPartnershipsRequest 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(HttpMethod.Get, "marketing", "partnerships"); + + if (request.Partner != null) + flurlReq.SetQueryParam("partner", client.JsonSerializer.Serialize(request.Partner)); + + if (request.AuthorizedData != null) + flurlReq.SetQueryParam("authorized_data", client.JsonSerializer.Serialize(request.AuthorizedData)); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPayGiftActivityExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPayGiftActivityExtensions.cs new file mode 100644 index 00000000..62ecb12b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingPayGiftActivityExtensions.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供支付有礼相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMarketingPayGiftActivityExtensions + { + /// + /// 异步调用 [POST] /marketing/paygiftactivity/unique-threshold-activity 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMarketingPayGiftActivityUniqueThresholdActivityAsync(this WechatTenpayClient client, Models.CreateMarketingPayGiftActivityUniqueThresholdActivityRequest 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(HttpMethod.Post, "marketing", "paygiftactivity", "unique-threshold-activity") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/paygiftactivity/activities/{activity_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMarketingPayGiftActivityByActivityIdAsync(this WechatTenpayClient client, Models.GetMarketingPayGiftActivityByActivityIdRequest 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(HttpMethod.Get, "marketing", "paygiftactivity", "activities", request.ActivityId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/paygiftactivity/activities 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_9.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingPayGiftActivitiesAsync(this WechatTenpayClient client, Models.QueryMarketingPayGiftActivitiesRequest 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(HttpMethod.Get, "marketing", "paygiftactivity", "activities") + .SetOptions(request) + .SetQueryParam("limit", request.Limit.ToString()) + .SetQueryParam("offset", request.Offset.ToString()); + + if (!string.IsNullOrEmpty(request.ActivityName)) + flurlReq.SetQueryParam("activity_name", request.ActivityName); + + if (!string.IsNullOrEmpty(request.ActivityStatus)) + flurlReq.SetQueryParam("activity_status", request.ActivityStatus); + + if (!string.IsNullOrEmpty(request.AwardType)) + flurlReq.SetQueryParam("award_type", request.AwardType); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/paygiftactivity/activities/{activity_id}/terminate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_7.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_7.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteTerminateMarketingPayGiftActivityAsync(this WechatTenpayClient client, Models.TerminateMarketingPayGiftActivityRequest 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(HttpMethod.Post, "marketing", "paygiftactivity", "activities", request.ActivityId, "terminate") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/paygiftactivity/activities/{activity_id}/merchants/add 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_8.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAddMarketingPayGiftActivityMerchantAsync(this WechatTenpayClient client, Models.AddMarketingPayGiftActivityMerchantRequest 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(HttpMethod.Post, "marketing", "paygiftactivity", "activities", request.ActivityId, "merchants", "add") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/paygiftactivity/activities/{activity_id}/merchants 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_5.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingPayGiftActivityMerchantsAsync(this WechatTenpayClient client, Models.QueryMarketingPayGiftActivityMerchantsRequest 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(HttpMethod.Get, "marketing", "paygiftactivity", "activities", request.ActivityId, "merchants") + .SetOptions(request); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /marketing/paygiftactivity/activities/{activity_id}/merchants/delete 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_10.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDeleteMarketingPayGiftActivityMerchantAsync(this WechatTenpayClient client, Models.DeleteMarketingPayGiftActivityMerchantRequest 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(HttpMethod.Delete, "marketing", "paygiftactivity", "activities", request.ActivityId, "merchants", "delete") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /marketing/paygiftactivity/activities/{activity_id}/goods 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_7_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter9_7_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMarketingPayGiftActivityGoodsAsync(this WechatTenpayClient client, Models.QueryMarketingPayGiftActivityGoodsRequest 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(HttpMethod.Get, "marketing", "paygiftactivity", "activities", request.ActivityId, "goods") + .SetOptions(request); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundBalanceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundBalanceExtensions.cs new file mode 100644 index 00000000..4bd10875 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundBalanceExtensions.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通电商平台余额相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMerchantFundBalanceExtensions + { + /// + /// 异步调用 [GET] /merchant/fund/balance/{sub_mchid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_7_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantFundBalanceAsync(this WechatTenpayClient client, Models.GetMerchantFundBalanceRequest 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(HttpMethod.Get, "merchant", "fund", "balance", request.AccountType) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant/fund/dayendbalance/{account_type} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_7_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantFundDayendBalanceAsync(this WechatTenpayClient client, Models.GetMerchantFundDayendBalanceRequest 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(HttpMethod.Get, "merchant", "fund", "dayendbalance", request.AccountType) + .SetOptions(request) + .SetQueryParam("date", request.DateString); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundWithdrawExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundWithdrawExtensions.cs new file mode 100644 index 00000000..81409bde --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantFundWithdrawExtensions.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供电商收付通电商平台提现相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMerchantFundWithdrawExtensions + { + /// + /// 异步调用 [POST] /merchant/fund/withdraw 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMerchantFundWithdrawAsync(this WechatTenpayClient client, Models.CreateMerchantFundWithdrawRequest 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(HttpMethod.Post, "merchant", "fund", "withdraw") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant/fund/withdraw/out-request-no/{out_request_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantFundWithdrawByOutRequestNumberAsync(this WechatTenpayClient client, Models.GetMerchantFundWithdrawByOutRequestNumberRequest 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(HttpMethod.Get, "merchant", "fund", "withdraw", "out-request-no", request.OutRequestNumber) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant/fund/withdraw/{withdraw_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantFundWithdrawByWithdrawIdAsync(this WechatTenpayClient client, Models.GetMerchantFundWithdrawByWithdrawIdRequest 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(HttpMethod.Get, "merchant", "fund", "withdraw", request.WithdrawId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant/fund/withdraw/bill-type/{bill_type} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantFundWithdrawBillAsync(this WechatTenpayClient client, Models.GetMerchantFundWithdrawBillRequest 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(HttpMethod.Get, "merchant", "fund", "withdraw", "bill-type", request.BillType) + .SetOptions(request) + .SetQueryParam("bill_date", request.BillDateString); + + if (!string.IsNullOrEmpty(request.TarType)) + flurlReq.SetQueryParam("tar_type", request.TarType); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs new file mode 100644 index 00000000..c2443b52 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供媒体文件上传相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMerchantMediaExtensions + { + /// + /// 异步调用 [POST] /merchant/media/upload 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter2_1_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter2_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMerchantMediaImageAsync(this WechatTenpayClient client, Models.UploadMerchantMediaImageRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.FileName)) + request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png"; + + if (string.IsNullOrEmpty(request.FileHash)) + request.FileHash = Utilities.Sha256Util.Hash(request.FileBytes).ToLower(); + + if (string.IsNullOrEmpty(request.FileContentType)) + { + if (request.FileName!.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/bmp"; + else if (request.FileName!.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/jpeg"; + else if (request.FileName!.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/jpeg"; + else + request.FileContentType = "image/png"; + } + + string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x"); + using var fileContent = new ByteArrayContent(request.FileBytes); + using var metaContent = new StringContent(client.JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); + using var httpContent = new MultipartFormDataContent(boundary); + httpContent.Add(metaContent, "\"meta\""); // NOTICE: meta 必须要加双引号 + httpContent.Add(fileContent, "\"file\"", "\"" + request.FileName + "\""); // NOTICE: file 必须要加双引号 + httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary); // NOTICE: boundary 不能加引号 + metaContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(request.FileContentType); + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "merchant", "media", "upload") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, content: httpContent, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /merchant/media/video_upload 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter2_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter2_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMerchantMediaVideoAsync(this WechatTenpayClient client, Models.UploadMerchantMediaVideoRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.FileName)) + request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".mp4"; + + if (string.IsNullOrEmpty(request.FileHash)) + request.FileHash = Utilities.Sha256Util.Hash(request.FileBytes).ToLower(); + + if (string.IsNullOrEmpty(request.FileContentType)) + { + if (request.FileName!.EndsWith(".avi", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/x-msvideo"; + else if (request.FileName!.EndsWith(".wmv", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/x-ms-wmv"; + else if (request.FileName!.EndsWith(".mpeg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/mpeg"; + else if (request.FileName!.EndsWith(".mov", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/quicktime"; + else if (request.FileName!.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/mkv"; + else if (request.FileName!.EndsWith(".m4v", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/x-m4v"; + else if (request.FileName!.EndsWith(".flv", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/x-flv"; + else if (request.FileName!.EndsWith(".f4v", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/x-f4v"; + else if (request.FileName!.EndsWith(".rmvb", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "video/vnd.rn-realvideo"; + else + request.FileContentType = "video/mp4"; + } + + string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x"); + using var fileContent = new ByteArrayContent(request.FileBytes); + using var metaContent = new ByteArrayContent(Encoding.UTF8.GetBytes(client.JsonSerializer.Serialize(request))); + using var httpContent = new MultipartFormDataContent(boundary); + httpContent.Add(metaContent, "\"meta\""); // NOTICE: meta 必须要加双引号 + httpContent.Add(fileContent, "\"file\"", "\"" + request.FileName + "\""); // NOTICE: file 必须要加双引号 + httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary); // NOTICE: boundary 不能加引号 + metaContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(request.FileContentType); + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "merchant", "media", "video_upload") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, content: httpContent, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantServiceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantServiceExtensions.cs new file mode 100644 index 00000000..d71f5e8a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMerchantServiceExtensions.cs @@ -0,0 +1,277 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供支付即服务相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteMerchantServiceExtensions + { + /// + /// 异步调用 [GET] /merchant-service/complaints-v2 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_11.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_11.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMerchantServiceComplaintsAsync(this WechatTenpayClient client, Models.QueryMerchantServiceComplaintsRequest 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(HttpMethod.Get, "merchant-service", "complaints-v2") + .SetOptions(request) + .SetQueryParam("begin_date", request.BeginDateString) + .SetQueryParam("end_date", request.EndDateString); + + if (!string.IsNullOrEmpty(request.ComplaintedMerchantId)) + flurlReq.SetQueryParam("complainted_mchid", request.ComplaintedMerchantId); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant-service/complaints-v2/{complaint_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_13.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_13.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantServiceComplaintByComplaintIdAsync(this WechatTenpayClient client, Models.GetMerchantServiceComplaintByComplaintIdRequest 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(HttpMethod.Get, "merchant-service", "complaints-v2", request.ComplaintId) + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant-service/complaints-v2/{complaint_id}/negotiation-historys 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_12.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_12.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQueryMerchantServiceComplaintNegotiationHistoriesAsync(this WechatTenpayClient client, Models.QueryMerchantServiceComplaintNegotiationHistoriesRequest 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(HttpMethod.Get, "merchant-service", "complaints-v2", request.ComplaintId, "negotiation-historys") + .SetOptions(request); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /merchant-service/complaints-v2/{complaint_id}/response 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_14.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_14.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMerchantServiceComplaintResponseAsync(this WechatTenpayClient client, Models.CreateMerchantServiceComplaintResponseRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.ComplaintedMerchantId)) + request.ComplaintedMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "merchant-service", "complaints-v2", request.ComplaintId, "response") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /merchant-service/complaints-v2/{complaint_id}/complete 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_15.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_15.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetMerchantServiceComplaintCompleteAsync(this WechatTenpayClient client, Models.SetMerchantServiceComplaintCompleteRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.ComplaintedMerchantId)) + request.ComplaintedMerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "merchant-service", "complaints-v2", request.ComplaintId, "complete") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /merchant-service/complaint-notifications 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateMerchantServiceComplaintNotificationAsync(this WechatTenpayClient client, Models.CreateMerchantServiceComplaintNotificationRequest 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(HttpMethod.Post, "merchant-service", "complaint-notifications") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /merchant-service/complaint-notifications 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetMerchantServiceComplaintNotificationAsync(this WechatTenpayClient client, Models.GetMerchantServiceComplaintNotificationRequest 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(HttpMethod.Get, "merchant-service", "complaint-notifications"); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [PUT] /merchant-service/complaint-notifications 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUpdateMerchantServiceComplaintNotificationAsync(this WechatTenpayClient client, Models.UpdateMerchantServiceComplaintNotificationRequest 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(HttpMethod.Put, "merchant-service", "complaint-notifications") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [DELETE] /merchant-service/complaint-notifications 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_5.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteDeleteMerchantServiceComplaintNotificationAsync(this WechatTenpayClient client, Models.DeleteMerchantServiceComplaintNotificationRequest 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(HttpMethod.Delete, "merchant-service", "complaint-notifications") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /merchant-service/images/upload 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_2_10.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMerchantServiceImageAsync(this WechatTenpayClient client, Models.UploadMerchantServiceImageRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.FileName)) + request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".png"; + + if (string.IsNullOrEmpty(request.FileHash)) + request.FileHash = Utilities.Sha256Util.Hash(request.FileBytes).ToLower(); + + if (string.IsNullOrEmpty(request.FileContentType)) + { + if (request.FileName!.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/bmp"; + else if (request.FileName!.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/jpeg"; + else if (request.FileName!.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase)) + request.FileContentType = "image/jpeg"; + else + request.FileContentType = "image/png"; + } + + string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x"); + using var fileContent = new ByteArrayContent(request.FileBytes); + using var metaContent = new ByteArrayContent(Encoding.UTF8.GetBytes(client.JsonSerializer.Serialize(request))); + using var httpContent = new MultipartFormDataContent(boundary); + httpContent.Add(metaContent, "\"meta\""); // NOTICE: meta 必须要加双引号 + httpContent.Add(fileContent, "\"file\"", "\"" + request.FileName + "\""); // NOTICE: file 必须要加双引号 + httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary); // NOTICE: boundary 不能加引号 + metaContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(request.FileContentType); + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "merchant-service", "images", "upload") + .SetOptions(request); + + return await client.SendRequestAsync(flurlReq, content: httpContent, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs new file mode 100644 index 00000000..1166ba75 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供基础支付(服务商、电商收付通)相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecutePayPartnerTransactionsExtensions + { + /// + /// 异步调用 [POST] /pay/partner/transactions/app 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayPartnerTransactionAppAsync(this WechatTenpayClient client, Models.CreatePayPartnerTransactionAppRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "partner", "transactions", "app") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/partner/transactions/jsapi 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayPartnerTransactionJsapiAsync(this WechatTenpayClient client, Models.CreatePayPartnerTransactionJsapiRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "partner", "transactions", "jsapi") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/partner/transactions/h5 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayPartnerTransactionH5Async(this WechatTenpayClient client, Models.CreatePayPartnerTransactionH5Request request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "partner", "transactions", "h5") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/partner/transactions/native 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayPartnerTransactionNativeAsync(this WechatTenpayClient client, Models.CreatePayPartnerTransactionNativeRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "transactions", "native") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /pay/partner/transactions/out-trade-no/{out_trade_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayPartnerTransactionByOutTradeNumberAsync(this WechatTenpayClient client, Models.GetPayPartnerTransactionByOutTradeNumberRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "pay", "partner", "transactions", "out-trade-no", request.OutTradeNumber) + .SetOptions(request) + .SetQueryParam("sp_mchid", request.MerchantId) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /pay/partner/transactions/id/{transaction_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayPartnerTransactionByIdAsync(this WechatTenpayClient client, Models.GetPayPartnerTransactionByIdRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "pay", "partner", "transactions", "id", request.TransactionId) + .SetOptions(request) + .SetQueryParam("sp_mchid", request.MerchantId) + .SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/partner/transactions/out-trade-no/{out_trade_no}/close 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_3_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_4_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_2_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteClosePayPartnerTransactionAsync(this WechatTenpayClient client, Models.ClosePayPartnerTransactionRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "partner", "transactions", "out-trade-no", request.OutTradeNumber, "close") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScorePermissionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScorePermissionsExtensions.cs new file mode 100644 index 00000000..a7854d75 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScorePermissionsExtensions.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供微信支付分(免确认预授权模式)相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecutePayScorePermissionsExtensions + { + /// + /// 异步调用 [POST] /payscore/permissions 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteApplyPayScorePermissionsAsync(this WechatTenpayClient client, Models.ApplyPayScorePermissionsRequest 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(HttpMethod.Post, "payscore", "permissions") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /payscore/permissions/authorization-code/{authorization_code} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayScorePermissionsByAuthorizationCodeAsync(this WechatTenpayClient client, Models.GetPayScorePermissionsByAuthorizationCodeRequest 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(HttpMethod.Get, "payscore", "permissions", "authorization-code", request.AuthorizationCode) + .SetOptions(request) + .SetQueryParam("service_id", request.ServiceId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/permissions/authorization-code/{authorization_code}/terminate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteTerminatePayScorePermissionsByAuthorizationCodeAsync(this WechatTenpayClient client, Models.TerminatePayScorePermissionsByAuthorizationCodeRequest 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(HttpMethod.Post, "payscore", "permissions", "authorization-code", request.AuthorizationCode, "terminate") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /payscore/permissions/openid/{openid} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_5.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayScorePermissionsByOpenIdAsync(this WechatTenpayClient client, Models.GetPayScorePermissionsByOpenIdRequest 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(HttpMethod.Get, "payscore", "permissions", "openid", request.OpenId) + .SetOptions(request) + .SetQueryParam("appid", request.AppId) + .SetQueryParam("service_id", request.ServiceId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/permissions/openid/{openid}/terminate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_6.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteTerminatePayScorePermissionsByOpenIdAsync(this WechatTenpayClient client, Models.TerminatePayScorePermissionsByOpenIdRequest 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(HttpMethod.Post, "payscore", "permissions", "openid", request.OpenId, "terminate") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScoreServiceOrderExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScoreServiceOrderExtensions.cs new file mode 100644 index 00000000..a00c2eea --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayScoreServiceOrderExtensions.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供微信支付分相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecutePayScoreServiceOrderExtensions + { + /// + /// 异步调用 [POST] /payscore/serviceorder/direct-complete 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayScoreServiceOrderDirectCompleteAsync(this WechatTenpayClient client, Models.CreatePayScoreServiceOrderDirectCompleteRequest 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(HttpMethod.Post, "payscore", "serviceorder", "direct-complete") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/serviceorder 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_14.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayScoreServiceOrderAsync(this WechatTenpayClient client, Models.CreatePayScoreServiceOrderRequest 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(HttpMethod.Post, "payscore", "serviceorder") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /payscore/serviceorder 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayScoreServiceOrderByOutOrderNumberAsync(this WechatTenpayClient client, Models.GetPayScoreServiceOrderByOutOrderNumberRequest 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(HttpMethod.Get, "payscore", "serviceorder") + .SetOptions(request) + .SetQueryParam("out_order_no", request.OutOrderNumber) + .SetQueryParam("service_id", request.ServiceId) + .SetQueryParam("appid", request.AppId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /payscore/serviceorder 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_15.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayScoreServiceOrderByQueryIdAsync(this WechatTenpayClient client, Models.GetPayScoreServiceOrderByQueryIdRequest 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(HttpMethod.Get, "payscore", "serviceorder") + .SetOptions(request) + .SetQueryParam("query_id", request.QueryId) + .SetQueryParam("service_id", request.ServiceId) + .SetQueryParam("appid", request.AppId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/serviceorder/{out_order_no}/cancel 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_16.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCancelPayScoreServiceOrderAsync(this WechatTenpayClient client, Models.CancelPayScoreServiceOrderRequest 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(HttpMethod.Post, "payscore", "serviceorder", request.OutOrderNumber, "cancel") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/serviceorder/{out_order_no}/modify 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_17.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteModifyPayScoreServiceOrderAsync(this WechatTenpayClient client, Models.ModifyPayScoreServiceOrderRequest 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(HttpMethod.Post, "payscore", "serviceorder", request.OutOrderNumber, "modify") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/serviceorder/{out_order_no}/complete 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_18.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetPayScoreServiceOrderCompleteAsync(this WechatTenpayClient client, Models.SetPayScoreServiceOrderCompleteRequest 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(HttpMethod.Post, "payscore", "serviceorder", request.OutOrderNumber, "complete") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/serviceorder/{out_order_no}/pay 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_19.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetPayScoreServiceOrderPayAsync(this WechatTenpayClient client, Models.SetPayScoreServiceOrderPayRequest 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(HttpMethod.Post, "payscore", "serviceorder", request.OutOrderNumber, "pay") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /payscore/serviceorder/{out_order_no}/sync 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_20.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteSetPayScoreServiceOrderSyncAsync(this WechatTenpayClient client, Models.SetPayScoreServiceOrderSyncRequest 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(HttpMethod.Post, "payscore", "serviceorder", request.OutOrderNumber, "sync") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs new file mode 100644 index 00000000..7308094f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供基础支付(直连商户)相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecutePayTransactionsExtensions + { + /// + /// 异步调用 [POST] /pay/transactions/app 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayTransactionAppAsync(this WechatTenpayClient client, Models.CreatePayTransactionAppRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "transactions", "app") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/transactions/jsapi 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayTransactionJsapiAsync(this WechatTenpayClient client, Models.CreatePayTransactionJsapiRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "transactions", "jsapi") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/transactions/h5 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayTransactionH5Async(this WechatTenpayClient client, Models.CreatePayTransactionH5Request request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "transactions", "h5") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/transactions/native 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreatePayTransactionNativeAsync(this WechatTenpayClient client, Models.CreatePayTransactionNativeRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "transactions", "native") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /pay/transactions/out-trade-no/{out_trade_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayTransactionByOutTradeNumberAsync(this WechatTenpayClient client, Models.GetPayTransactionByOutTradeNumberRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "pay", "transactions", "out-trade-no", request.OutTradeNumber) + .SetOptions(request) + .SetQueryParam("mchid", request.MerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /pay/transactions/id/{transaction_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetPayTransactionByIdAsync(this WechatTenpayClient client, Models.GetPayTransactionByIdRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Get, "pay", "transactions", "id", request.TransactionId) + .SetOptions(request) + .SetQueryParam("mchid", request.MerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /pay/transactions/out-trade-no/{out_trade_no}/close 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteClosePayTransactionAsync(this WechatTenpayClient client, Models.ClosePayTransactionRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (string.IsNullOrEmpty(request.MerchantId)) + request.MerchantId = client.MerchantId; + + IFlurlRequest flurlReq = client + .CreateRequest(HttpMethod.Post, "pay", "transactions", "out-trade-no", request.OutTradeNumber, "close") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteRefundExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteRefundExtensions.cs new file mode 100644 index 00000000..8c80f9ed --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteRefundExtensions.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供退款相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteRefundExtensions + { + /// + /// 异步调用 [POST] /refund/domestic/refunds 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_14.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_26.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_1_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_2_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_3_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_4_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_5_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_14.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateRefundDomesticRefundAsync(this WechatTenpayClient client, Models.CreateRefundDomesticRefundRequest 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(HttpMethod.Post, "refund", "domestic", "refunds") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /refund/domestic/refunds/{out_refund_no} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_15.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_27.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_1_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_2_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_3_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_4_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter3_5_10.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_15.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetRefundDomesticRefundByOutRefundNumberAsync(this WechatTenpayClient client, Models.GetRefundDomesticRefundByOutRefundNumberRequest 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(HttpMethod.Get, "refund", "domestic", "refunds", request.OutRefundNumber) + .SetOptions(request); + + if (!string.IsNullOrEmpty(request.SubMerchantId)) + flurlReq.SetQueryParam("sub_mchid", request.SubMerchantId); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteSmartGuideExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteSmartGuideExtensions.cs new file mode 100644 index 00000000..0d1e50ea --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteSmartGuideExtensions.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供支付即服务相关的 API 扩展方法。 + /// + public static class WechatTenpayClientExecuteSmartGuideExtensions + { + /// + /// 异步调用 [POST] /smartguide/guides 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_4_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_4_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteCreateSmartGuideAsync(this WechatTenpayClient client, Models.CreateSmartGuideRequest 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(HttpMethod.Post, "smartguide", "guides") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /smartguide/guides/{guide_id}/assign 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_4_2.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_4_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAssignSmartGuideAsync(this WechatTenpayClient client, Models.AssignSmartGuideRequest 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(HttpMethod.Post, "smartguide", "guides", request.GuideId, "assign") + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [GET] /smartguide/guides 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_4_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_4_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteQuerySmartGuidesAsync(this WechatTenpayClient client, Models.QuerySmartGuidesRequest 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(HttpMethod.Get, "smartguide", "guides") + .SetOptions(request) + .SetQueryParam("store_id", request.StoreId.ToString()); + + if (!string.IsNullOrEmpty(request.SubMerchantId)) + flurlReq.SetQueryParam("sub_mchid", request.SubMerchantId); + + if (!string.IsNullOrEmpty(request.UserId)) + flurlReq.SetQueryParam("userid", request.UserId); + + if (!string.IsNullOrEmpty(request.UserMobile)) + flurlReq.SetQueryParam("mobile", request.UserMobile); + + if (!string.IsNullOrEmpty(request.UserWorkId)) + flurlReq.SetQueryParam("work_id", request.UserWorkId); + + if (request.Limit.HasValue) + flurlReq.SetQueryParam("limit", request.Limit.Value.ToString()); + + if (request.Offset.HasValue) + flurlReq.SetQueryParam("offset", request.Offset.Value.ToString()); + + return await client.SendRequestAsync(flurlReq, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [PATCH] /smartguide/guides/{guide_id} 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_4_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_4_4.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUpdateSmartGuideAsync(this WechatTenpayClient client, Models.UpdateSmartGuideRequest 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(new HttpMethod("PATCH"), "smartguide", "guides", request.GuideId) + .SetOptions(request); + + return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientParameterExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientParameterExtensions.cs new file mode 100644 index 00000000..270afdb9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientParameterExtensions.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供调起支付签名的扩展方法。 + /// + public static class WechatTenpayClientParameterExtensions + { + /// + /// 生成客户端 JSAPI / 小程序调起支付所需的参数。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_5_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_9.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_8.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_9.shtml + /// + /// + /// + /// + /// + public static IDictionary GenerateParametersForJsapiPayRequest(this WechatTenpayClient client, string appId, string prepayId) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (appId is null) throw new ArgumentNullException(nameof(appId)); + if (prepayId is null) throw new ArgumentNullException(nameof(prepayId)); + + string timestamp = DateTimeOffset.Now.ToLocalTime().ToUnixTimeSeconds().ToString(); + string nonce = Guid.NewGuid().ToString("N"); + string package = $"prepay_id={prepayId}"; + string sign = Utilities.RsaUtil.SignWithSHA256( + privateKey: client.MerchantCertPrivateKey, + plainText: $"{appId}\n{timestamp}\n{nonce}\n{package}" + ); + + return new ReadOnlyDictionary(new Dictionary() + { + { "appId", appId }, + { "timeStamp", timestamp }, + { "nonceStr", nonce }, + { "package", package }, + { "signType", Constants.SignTypes.RSA }, + { "paySign", sign } + }); + } + + /// + /// 生成 APP 调起支付所需的参数。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_6.shtml + /// + /// + /// + /// + /// + public static IDictionary GenerateParametersForAppPayRequest(this WechatTenpayClient client, string appId, string prepayId) + { + return GenerateParametersForAppPayRequest(client, merchantId: client.MerchantId, appId: appId, prepayId: prepayId); + } + + /// + /// 生成 APP 调起支付所需的参数。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_4.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter5_1_6.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_6.shtml + /// + /// + /// + /// + /// + /// + public static IDictionary GenerateParametersForAppPayRequest(this WechatTenpayClient client, string merchantId, string appId, string prepayId) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (merchantId is null) throw new ArgumentNullException(nameof(merchantId)); + if (appId is null) throw new ArgumentNullException(nameof(appId)); + if (prepayId is null) throw new ArgumentNullException(nameof(prepayId)); + + string timestamp = DateTimeOffset.Now.ToLocalTime().ToUnixTimeSeconds().ToString(); + string nonce = Guid.NewGuid().ToString("N"); + string sign = Utilities.RsaUtil.SignWithSHA256( + privateKey: client.MerchantCertPrivateKey, + plainText: $"{appId}\n{timestamp}\n{nonce}\n{prepayId}" + ); + + return new ReadOnlyDictionary(new Dictionary() + { + { "appid", appId }, + { "partnerid", merchantId }, + { "prepayid", prepayId }, + { "package", "Sign=WXPay" }, + { "noncestr", nonce }, + { "timestamp", timestamp }, + { "sign", sign } + }); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs new file mode 100644 index 00000000..481e685a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseDecryptionExtensions.cs @@ -0,0 +1,268 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供响应敏感数据解密的扩展方法。 + /// + public static class WechatTenpayClientResponseDecryptionExtensions + { + /// + /// 解密响应中返回的敏感数据。该方法会改变传入的响应信息。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_3.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_3.shtml + /// + /// + /// + /// + /// + public static TResponse DecryptResponseEncryptedData(this WechatTenpayClient client, TResponse response) + where TResponse : WechatTenpayResponse + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (response == null) throw new ArgumentNullException(nameof(response)); + + if (string.IsNullOrEmpty(client.MerchantCertPrivateKey)) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed, because of there is no merchant private key."); + + if (!response.IsSuccessful()) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed, because of the response is not successful."); + + if (response is Models.GetEcommerceApplymentByOutRequestNumberResponse resGetEcommerceApplymentByOutRequestNumber) + { + DecryptResponse(resGetEcommerceApplymentByOutRequestNumber, client.MerchantCertPrivateKey); + return (resGetEcommerceApplymentByOutRequestNumber as TResponse)!; + } + else if (response is Models.GetEcommerceBillFundflowBillResponse resGetEcommerceBillFundflowBill) + { + DecryptResponse(resGetEcommerceBillFundflowBill, client.MerchantCertPrivateKey); + return (resGetEcommerceBillFundflowBill as TResponse)!; + } + else if (response is Models.GetMerchantServiceComplaintByComplaintIdResponse resGetMerchantServiceComplaintByComplaintId) + { + DecryptResponse(resGetMerchantServiceComplaintByComplaintId, client.MerchantCertPrivateKey); + return (resGetMerchantServiceComplaintByComplaintId as TResponse)!; + } + else if (response is Models.QueryCertificatesResponse resQueryCertificates) + { + DecryptResponse(resQueryCertificates, client.MerchantV3Secret); + return (resQueryCertificates as TResponse)!; + } + else if (response is Models.QueryMerchantServiceComplaintsResponse resQueryMerchantServiceComplaints) + { + DecryptResponse(resQueryMerchantServiceComplaints, client.MerchantCertPrivateKey); + return (resQueryMerchantServiceComplaints as TResponse)!; + } + else if (response is Models.QuerySmartGuidesResponse resQuerySmartGuides) + { + DecryptResponse(resQuerySmartGuides, client.MerchantCertPrivateKey); + return (resQuerySmartGuides as TResponse)!; + } + + return response; + } + + private static void DecryptResponse(Models.GetEcommerceApplymentByOutRequestNumberResponse response, string privateKey) + { + if (response.AccountValidation != null) + { + IList exceptions = new List(); + + var accountValidationModel = response.AccountValidation; + + if (!string.IsNullOrEmpty(accountValidationModel.AccountNameEncryptedData)) + { + try + { + accountValidationModel.AccountNameEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + accountValidationModel.AccountNameEncryptedData + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + + if (!string.IsNullOrEmpty(accountValidationModel.AccountNumberEncryptedData)) + { + try + { + accountValidationModel.AccountNumberEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + accountValidationModel.AccountNumberEncryptedData! + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + + if (exceptions.Any()) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed.", new AggregateException(exceptions)); + } + } + + private static void DecryptResponse(Models.GetEcommerceBillFundflowBillResponse response, string privateKey) + { + if (response.DownloadBillList != null) + { + IList exceptions = new List(); + + foreach (var downloadBillModel in response.DownloadBillList) + { + if (!string.IsNullOrEmpty(downloadBillModel.EncryptKeyEncryptedData)) + { + try + { + downloadBillModel.EncryptKeyEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + downloadBillModel.EncryptKeyEncryptedData + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + } + + if (exceptions.Any()) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed.", new AggregateException(exceptions)); + } + } + + private static void DecryptResponse(Models.GetMerchantServiceComplaintByComplaintIdResponse response, string privateKey) + { + if (response.ComplaintDetail != null) + { + if (!string.IsNullOrEmpty(response.PayerPhoneEncryptedData)) + { + try + { + response.PayerPhoneEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + response.PayerPhoneEncryptedData! + ); + } + catch (Exception ex) + { + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed.", ex); + } + } + } + } + + private static void DecryptResponse(Models.QueryCertificatesResponse response, string aesKey) + { + if (response.CertificateList != null) + { + IList exceptions = new List(); + + foreach (var certificateModel in response.CertificateList) + { + if (Constants.EncryptionAlgorithms.AEAD_AES_256_GCM.Equals(certificateModel.EncryptCertificate?.Algorithm)) + { + try + { + certificateModel.EncryptCertificate.CipherText = Utilities.AesUtil.DecryptWithGCM( + aesKey: aesKey, + nonce: certificateModel.EncryptCertificate.Nonce, + associatedData: certificateModel.EncryptCertificate.AssociatedData, + cipherText: certificateModel.EncryptCertificate.CipherText + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + else + { + exceptions.Add(new Exception("Unknown encrypt algorithm of the certificate.")); + } + } + + if (exceptions.Any()) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed.", new AggregateException(exceptions)); + } + } + + private static void DecryptResponse(Models.QueryMerchantServiceComplaintsResponse response, string privateKey) + { + if (response.ComplaintList != null) + { + IList exceptions = new List(); + + foreach (var complaintModel in response.ComplaintList) + { + if (!string.IsNullOrEmpty(complaintModel.PayerPhoneEncryptedData)) + { + try + { + complaintModel.PayerPhoneEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + complaintModel.PayerPhoneEncryptedData! + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + } + + if (exceptions.Any()) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed.", new AggregateException(exceptions)); + } + } + + private static void DecryptResponse(Models.QuerySmartGuidesResponse response, string privateKey) + { + if (response.GuideList != null) + { + IList exceptions = new List(); + + foreach (var guideModel in response.GuideList) + { + if (!string.IsNullOrEmpty(guideModel.UserNameEncryptedData)) + { + try + { + guideModel.UserNameEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + guideModel.UserNameEncryptedData + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + + if (!string.IsNullOrEmpty(guideModel.UserMobileEncryptedData)) + { + try + { + guideModel.UserMobileEncryptedData = Utilities.RsaUtil.DecryptWithECB( + privateKey, + guideModel.UserMobileEncryptedData + ); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + } + + if (exceptions.Any()) + throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed.", new AggregateException(exceptions)); + } + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseVerifyExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseVerifyExtensions.cs new file mode 100644 index 00000000..34989fdb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientResponseVerifyExtensions.cs @@ -0,0 +1,81 @@ +using System; +using System.Text; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 为 提供响应签名验证的扩展方法。 + /// + public static class WechatTenpayClientResponseVerifyExtensions + { + /// + /// 验证响应签名(使用微信支付平台证书公钥)。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_1.shtml + /// + /// + /// + /// + /// + /// + public static bool VerifyResponseSignature(this WechatTenpayClient client, TResponse response, string publicKey) + where TResponse : WechatTenpayResponse + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (response == null) throw new ArgumentNullException(nameof(response)); + if (string.IsNullOrEmpty(publicKey)) throw new ArgumentNullException(publicKey); + + try + { + return Utilities.RsaUtil.VerifyWithSHA256( + publicKey: publicKey, + plainText: GetPlainTextForSignature(response), + signature: response.WechatpaySignature + ); + } + catch (Exception ex) + { + throw new Exceptions.WechatTenpayResponseVerificationException("Verify response signature failed.", ex); + } + } + + /// + /// 验证响应签名(使用微信支付平台证书)。 + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml + /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_1.shtml + /// + /// + /// + /// + /// + /// + public static bool VerifyResponseSignatureByCertificate(this WechatTenpayClient client, TResponse response, string certificate) + where TResponse : WechatTenpayResponse + { + if (client == null) throw new ArgumentNullException(nameof(client)); + if (response == null) throw new ArgumentNullException(nameof(response)); + if (string.IsNullOrEmpty(certificate)) throw new ArgumentNullException(certificate); + + try + { + return Utilities.RsaUtil.VerifyWithSHA256ByCertificate( + certificate: certificate, + plainText: GetPlainTextForSignature(response), + signature: response.WechatpaySignature + ); + } + catch (Exception ex) + { + throw new Exceptions.WechatTenpayResponseVerificationException("Verify response signature failed.", ex); + } + } + + private static string GetPlainTextForSignature(WechatTenpayResponse response) + { + string timestamp = response.WechatpayTimestamp; + string nonce = response.WechatpayNonce; + string body = Encoding.UTF8.GetString(response.RawBytes); + return $"{timestamp}\n{nonce}\n{body}\n"; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayAuthenticator.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayAuthenticator.cs new file mode 100644 index 00000000..ffd13c06 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpayAuthenticator.cs @@ -0,0 +1,75 @@ +using System; +using System.Linq; +using System.Net.Http; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Interceptors +{ + internal class WechatTenpayAuthenticator + { + private readonly string _scheme; + private readonly string _mchId; + private readonly string _mchCertSn; + private readonly string _mchCertPk; + + public WechatTenpayAuthenticator(string scheme, string mchId, string mchCertSn, string mchCertPk) + { + _scheme = scheme; + _mchId = mchId; + _mchCertSn = mchCertSn; + _mchCertPk = mchCertPk; + } + + public void Authenticate(FlurlCall flurlCall) + { + if (flurlCall == null) throw new ArgumentNullException(nameof(flurlCall)); + + string method = flurlCall.HttpRequestMessage.Method.ToString().ToUpper(); + string url = flurlCall.HttpRequestMessage.RequestUri.PathAndQuery; + string timestamp = DateTimeOffset.Now.ToLocalTime().ToUnixTimeSeconds().ToString(); + string nonce = Guid.NewGuid().ToString("N"); + string body = string.Empty; + + if (flurlCall.HttpRequestMessage.Content is MultipartFormDataContent) + { + // NOTICE: multipart/form-data 文件上传请求的待签名参数需特殊处理。 + var httpContent = (MultipartFormDataContent)flurlCall.HttpRequestMessage.Content; + body = httpContent + .Where(e => "meta".Equals(e.Headers.ContentDisposition?.Name?.Trim('\"'))) + .Select(e => e.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult()) + .Single(); + } + else + { + body = flurlCall.RequestBody; + } + + string plainText = $"{method}\n{url}\n{timestamp}\n{nonce}\n{body}\n"; + string signText; + + switch (_scheme) + { + case WechatTenpayAuthSchemes.WECHATPAY2_SHA256_RSA2048: + { + try + { + signText = Utilities.RsaUtil.SignWithSHA256(_mchCertPk, plainText); + } + catch (Exception ex) + { + throw new Exceptions.WechatTenpayRequestSignatureException("Generate signature of request failed.", ex); + } + } + break; + + default: + throw new Exceptions.WechatTenpayRequestSignatureException("Unsupported authorization scheme."); + } + + string auth = $"mchid=\"{_mchId}\",nonce_str=\"{nonce}\",signature=\"{signText}\",timestamp=\"{timestamp}\",serial_no=\"{_mchCertSn}\""; + flurlCall.Request.Headers.Remove("Authorization"); + flurlCall.Request.WithHeader("Authorization", $"{_scheme} {auth}"); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs new file mode 100644 index 00000000..e8a71941 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.cs @@ -0,0 +1,829 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /applyment4sub/applyment 接口的请求。 + /// + public class CreateApplyForSubMerchantApplymentRequest : WechatTenpayRequest + { + public static class Types + { + public class Contact + { + /// + /// 获取或设置超级管理员姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("contact_name")] + [System.Text.Json.Serialization.JsonPropertyName("contact_name")] + public string NameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置联系人手机号(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("mobile_phone")] + [System.Text.Json.Serialization.JsonPropertyName("mobile_phone")] + public string MobileEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置超级管理员身份证号码(需使用微信支付平台公钥加密)。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("contact_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("contact_id_number")] + public string? IdCardNumberEncryptedData { get; set; } + + /// + /// 获取或设置超级管理员微信 OpenId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置联系邮箱(需使用微信支付平台公钥加密)。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("contact_email")] + [System.Text.Json.Serialization.JsonPropertyName("contact_email")] + public string EmailEncryptedData { get; set; } = string.Empty; + } + + public class Subject + { + public static class Types + { + public class BusinessLicense + { + /// + /// 获取或设置营业执照注册号。 + /// + [Newtonsoft.Json.JsonProperty("license_number")] + [System.Text.Json.Serialization.JsonPropertyName("license_number")] + public string LicenceNumber { get; set; } = string.Empty; + + /// + /// 获取或设置营业执照照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("license_copy")] + [System.Text.Json.Serialization.JsonPropertyName("license_copy")] + public string LicenseCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置法人姓名。 + /// + [Newtonsoft.Json.JsonProperty("legal_person")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person")] + public string LegalPerson { get; set; } = string.Empty; + } + + public class InstitutionalCertificate + { + /// + /// 获取或设置证书类型。 + /// + [Newtonsoft.Json.JsonProperty("cert_type")] + [System.Text.Json.Serialization.JsonPropertyName("cert_type")] + public string CertificateType { get; set; } = string.Empty; + + /// + /// 获取或设置证书编号。 + /// + [Newtonsoft.Json.JsonProperty("cert_number")] + [System.Text.Json.Serialization.JsonPropertyName("cert_number")] + public string CertificateNumber { get; set; } = string.Empty; + + /// + /// 获取或设置证书照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("cert_copy")] + [System.Text.Json.Serialization.JsonPropertyName("cert_copy")] + public string CertificateCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置注册地址。 + /// + [Newtonsoft.Json.JsonProperty("company_address")] + [System.Text.Json.Serialization.JsonPropertyName("company_address")] + public string CompanyAddress { get; set; } = string.Empty; + + /// + /// 获取或设置法人姓名。 + /// + [Newtonsoft.Json.JsonProperty("legal_person")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person")] + public string LegalPerson { get; set; } = string.Empty; + + /// + /// 获取或设置有效期限开始日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("period_begin")] + [System.Text.Json.Serialization.JsonPropertyName("period_begin")] + public string PeriodBeginDate { get; set; } = string.Empty; + + /// + /// 获取或设置有效期限结束日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("period_end")] + [System.Text.Json.Serialization.JsonPropertyName("period_end")] + public string PeriodEndDate { get; set; } = string.Empty; + } + + public class OrganizationCertificate + { + /// + /// 获取或设置组织机构代码。 + /// + [Newtonsoft.Json.JsonProperty("organization_code")] + [System.Text.Json.Serialization.JsonPropertyName("organization_code")] + public string OrganizationCode { get; set; } = string.Empty; + + /// + /// 获取或设置组织机构代码证照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("organization_copy")] + [System.Text.Json.Serialization.JsonPropertyName("organization_copy")] + public string OrganizationCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置组织机构代码证有效期开始日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("org_period_begin")] + [System.Text.Json.Serialization.JsonPropertyName("org_period_begin")] + public string PeriodBeginDate { get; set; } = string.Empty; + + /// + /// 获取或设置组织机构代码证有效期结束日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("org_period_end")] + [System.Text.Json.Serialization.JsonPropertyName("org_period_end")] + public string PeriodEndDate { get; set; } = string.Empty; + } + + public class Identity + { + public static class Types + { + public class IdCard + { + /// + /// 获取或设置身份证人像面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_card_copy")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_copy")] + public string IdCardFrontCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置身份证国徽面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_card_national")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_national")] + public string IdCardBackCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置身份证姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_card_name")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_name")] + public string IdCardNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置身份证号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_card_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_number")] + public string IdCardNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置身份证有效期开始时间(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("card_period_begin")] + [System.Text.Json.Serialization.JsonPropertyName("card_period_begin")] + public string PeriodBeginDate { get; set; } = string.Empty; + + /// + /// 获取或设置身份证有效期结束时间(格式:yyyy-MM-dd / "长期")。 + /// + [Newtonsoft.Json.JsonProperty("card_period_end")] + [System.Text.Json.Serialization.JsonPropertyName("card_period_end")] + public string PeriodEndDate { get; set; } = string.Empty; + } + + public class IdDocument + { + /// + /// 获取或设置证件照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_copy")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_copy")] + public string IdDocumentCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置证件姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_name")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_name")] + public string IdDocumentNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_number")] + public string IdDocumentNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件有效期开始时间(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("doc_period_begin")] + [System.Text.Json.Serialization.JsonPropertyName("doc_period_begin")] + public string PeriodBeginDate { get; set; } = string.Empty; + + /// + /// 获取或设置证件有效期结束时间(格式:yyyy-MM-dd / "长期")。 + /// + [Newtonsoft.Json.JsonProperty("doc_period_end")] + [System.Text.Json.Serialization.JsonPropertyName("doc_period_end")] + public string PeriodEndDate { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置证件类型。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_type")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_type")] + public string IdentityType { get; set; } = string.Empty; + + /// + /// 获取或设置身份证信息。 + /// + [Newtonsoft.Json.JsonProperty("id_card_info")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_info")] + public Types.IdCard? IdCard { get; set; } + + /// + /// 获取或设置其他类型证件信息。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_info")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_info")] + public Types.IdDocument? IdDocument { get; set; } + + /// + /// 获取或设置法人是否为受益人。 + /// + [Newtonsoft.Json.JsonProperty("owner")] + [System.Text.Json.Serialization.JsonPropertyName("owner")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedBooleanConverter))] + public bool IsOwner { get; set; } + } + + public class UBO + { + /// + /// 获取或设置证件类型。 + /// + [Newtonsoft.Json.JsonProperty("id_type")] + [System.Text.Json.Serialization.JsonPropertyName("id_type")] + public string IdentityType { get; set; } = string.Empty; + + /// + /// 获取或设置身份证人像面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_card_copy")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_copy")] + public string? IdCardFrontCopyMediaId { get; set; } + + /// + /// 获取或设置身份证国徽面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_card_national")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_national")] + public string? IdCardBackCopyMediaId { get; set; } + + /// + /// 获取或设置证件照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_copy")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_copy")] + public string? IdDocumentCopyMediaId { get; set; } + + /// + /// 获取或设置受益人姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string NameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_number")] + public string IdNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件有效期开始时间(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonProperty("id_period_begin")] + [System.Text.Json.Serialization.JsonPropertyName("id_period_begin")] + public string IdPeriodBeginDate { get; set; } = string.Empty; + + /// + /// 获取或设置证件有效期结束时间(格式:yyyy-MM-dd / "长期")。 + /// + [Newtonsoft.Json.JsonProperty("id_period_end")] + [System.Text.Json.Serialization.JsonPropertyName("id_period_end")] + public string IdPeriodEndDate { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置主体类型。 + /// + [Newtonsoft.Json.JsonProperty("subject_type")] + [System.Text.Json.Serialization.JsonPropertyName("subject_type")] + public string SubjectType { get; set; } = string.Empty; + + /// + /// 获取或设置单位证明函照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("certificate_letter_copy")] + [System.Text.Json.Serialization.JsonPropertyName("certificate_letter_copy")] + public string? CertificateLetterCopyMediaId { get; set; } + + /// + /// 获取或设置营业执照信息。 + /// + [Newtonsoft.Json.JsonProperty("business_license_info")] + [System.Text.Json.Serialization.JsonPropertyName("business_license_info")] + public Types.BusinessLicense? BusinessLicense { get; set; } + + /// + /// 获取或设置登记证书信息。 + /// + [Newtonsoft.Json.JsonProperty("certificate_info")] + [System.Text.Json.Serialization.JsonPropertyName("certificate_info")] + public Types.InstitutionalCertificate? InstitutionalCertificate { get; set; } + + /// + /// 获取或设置组织机构代码证信息。 + /// + [Newtonsoft.Json.JsonProperty("organization_info")] + [System.Text.Json.Serialization.JsonPropertyName("organization_info")] + public Types.OrganizationCertificate? OrganizationCertificate { get; set; } + + /// + /// 获取或设置法人身份证件信息。 + /// + [Newtonsoft.Json.JsonProperty("identity_info")] + [System.Text.Json.Serialization.JsonPropertyName("identity_info")] + public Types.Identity Identity { get; set; } = new Types.Identity(); + + /// + /// 获取或设置最终受益人信息。 + /// + [Newtonsoft.Json.JsonProperty("ubo_info")] + [System.Text.Json.Serialization.JsonPropertyName("ubo_info")] + public Types.UBO? UBO { get; set; } + } + + public class Business + { + public static class Types + { + public class SaleScene + { + public static class Types + { + public class Store + { + /// + /// 获取或设置门店名称。 + /// + [Newtonsoft.Json.JsonProperty("biz_store_name")] + [System.Text.Json.Serialization.JsonPropertyName("biz_store_name")] + public string StoreName { get; set; } = string.Empty; + + /// + /// 获取或设置门店省市编码。 + /// + [Newtonsoft.Json.JsonProperty("biz_address_code")] + [System.Text.Json.Serialization.JsonPropertyName("biz_address_code")] + public string StoreAddressCode { get; set; } = string.Empty; + + /// + /// 获取或设置门店地址。 + /// + [Newtonsoft.Json.JsonProperty("biz_store_address")] + [System.Text.Json.Serialization.JsonPropertyName("biz_store_address")] + public string StoreAddress { get; set; } = string.Empty; + + /// + /// 获取或设置门店门头照片媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("store_entrance_pic")] + [System.Text.Json.Serialization.JsonPropertyName("store_entrance_pic")] + public IList StoreEntrancePictureMediaIdList { get; set; } = new List(); + + /// + /// 获取或设置店内环境照片媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("indoor_pic")] + [System.Text.Json.Serialization.JsonPropertyName("indoor_pic")] + public IList StoreIndoorPictureMediaIdList { get; set; } = new List(); + + /// + /// 获取或设置线下场所对应的商家 AppId。 + /// + [Newtonsoft.Json.JsonProperty("biz_sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("biz_sub_appid")] + public string? SubAppId { get; set; } + } + + public class MediaPlatform + { + /// + /// 获取或设置服务商公众号 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("mp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mp_appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置商家公众号 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("mp_sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mp_sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置公众号页面截图媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("mp_pics")] + [System.Text.Json.Serialization.JsonPropertyName("mp_pics")] + public IList? PictureMediaIdList { get; set; } + } + + public class MiniProgram + { + /// + /// 获取或设置服务商小程序 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("mini_program_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program_appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置商家小程序 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("mini_program_sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program_sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置小程序页面截图媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("mini_program_pics")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program_pics")] + public IList? PictureMediaIdList { get; set; } + } + + public class App + { + /// + /// 获取或设置服务商应用 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("app_appid")] + [System.Text.Json.Serialization.JsonPropertyName("app_appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置商家应用 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("app_sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("app_sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置应用页面截图媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("app_pics")] + [System.Text.Json.Serialization.JsonPropertyName("app_pics")] + public IList? PictureMediaIdList { get; set; } + } + + public class Web + { + /// + /// 获取或设置网站域名。 + /// + [Newtonsoft.Json.JsonProperty("domain")] + [System.Text.Json.Serialization.JsonPropertyName("domain")] + public string Domain { get; set; } = string.Empty; + + /// + /// 获取或设置网站授权函媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("web_authorisation")] + [System.Text.Json.Serialization.JsonPropertyName("web_authorisation")] + public string? AuthorizationCopyMediaId { get; set; } + + /// + /// 获取或设置互联网网站对应的商家 AppId。 + /// + [Newtonsoft.Json.JsonProperty("web_appid")] + [System.Text.Json.Serialization.JsonPropertyName("web_appid")] + public string? AppId { get; set; } + } + + public class Wework + { + /// + /// 获取或设置商家企业微信 CorpID。 + /// + [Newtonsoft.Json.JsonProperty("corp_id")] + [System.Text.Json.Serialization.JsonPropertyName("corp_id")] + public string? CorpId { get; set; } + + /// + /// 获取或设置商家企业微信 CorpID。 + /// + [Newtonsoft.Json.JsonProperty("sub_corp_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_corp_id")] + public string? SubCorpId { get; set; } + + /// + /// 获取或设置企业微信页面截图媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("wework_pics")] + [System.Text.Json.Serialization.JsonPropertyName("wework_pics")] + public IList? PictureMediaIdList { get; set; } + } + } + + /// + /// 获取或设置经营场景类型列表。 + /// + [Newtonsoft.Json.JsonProperty("sales_scenes_type")] + [System.Text.Json.Serialization.JsonPropertyName("sales_scenes_type")] + public IList SaleSceneTypeList { get; set; } = new List(); + + /// + /// 获取或设置线下门店场景信息。 + /// + [Newtonsoft.Json.JsonProperty("biz_store_info")] + [System.Text.Json.Serialization.JsonPropertyName("biz_store_info")] + public Types.Store? Store { get; set; } + + /// + /// 获取或设置公众号场景信息。 + /// + [Newtonsoft.Json.JsonProperty("mp_info")] + [System.Text.Json.Serialization.JsonPropertyName("mp_info")] + public Types.MediaPlatform? MediaPlatform { get; set; } + + /// + /// 获取或设置小程序场景信息。 + /// + [Newtonsoft.Json.JsonProperty("mini_program_info")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program_info")] + public Types.MiniProgram? MiniProgram { get; set; } + + /// + /// 获取或设置 App 场景信息。 + /// + [Newtonsoft.Json.JsonProperty("app_info")] + [System.Text.Json.Serialization.JsonPropertyName("app_info")] + public Types.App? App { get; set; } + + /// + /// 获取或设置互联网网站场景信息。 + /// + [Newtonsoft.Json.JsonProperty("web_info")] + [System.Text.Json.Serialization.JsonPropertyName("web_info")] + public Types.Web? Web { get; set; } + + /// + /// 获取或设置企业微信场景信息。 + /// + [Newtonsoft.Json.JsonProperty("wework_info")] + [System.Text.Json.Serialization.JsonPropertyName("wework_info")] + public Types.Wework? Wework { get; set; } + } + } + + /// + /// 获取或设置商户简称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_shortname")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_shortname")] + public string MerchantShortName { get; set; } = string.Empty; + + /// + /// 获取或设置客服电话。 + /// + [Newtonsoft.Json.JsonProperty("service_phone")] + [System.Text.Json.Serialization.JsonPropertyName("service_phone")] + public string ServicePhone { get; set; } = string.Empty; + + /// + /// 获取或设置经营场景信息。 + /// + [Newtonsoft.Json.JsonProperty("sales_info")] + [System.Text.Json.Serialization.JsonPropertyName("sales_info")] + public Types.SaleScene SaleScene { get; set; } = new Types.SaleScene(); + } + + public class Settlement + { + /// + /// 获取或设置入驻结算规则 ID。 + /// + [Newtonsoft.Json.JsonProperty("settlement_id")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_id")] + public string SettlementId { get; set; } = string.Empty; + + /// + /// 获取或设置所属行业。 + /// + [Newtonsoft.Json.JsonProperty("qualification_type")] + [System.Text.Json.Serialization.JsonPropertyName("qualification_type")] + public string QualificationType { get; set; } = string.Empty; + + /// + /// 获取或设置特殊资质图片媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("qualifications")] + [System.Text.Json.Serialization.JsonPropertyName("qualifications")] + public IList? QualificationPictureMediaIdList { get; set; } + + /// + /// 获取或设置优惠费率活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activities_id")] + [System.Text.Json.Serialization.JsonPropertyName("activities_id")] + public string? ActivityId { get; set; } + + /// + /// 获取或设置优惠费率活动值。 + /// + [Newtonsoft.Json.JsonProperty("activities_rate")] + [System.Text.Json.Serialization.JsonPropertyName("activities_rate")] + public double? ActivityRate { get; set; } + + /// + /// 获取或设置优惠费率活动补充材料媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("activities_additions")] + [System.Text.Json.Serialization.JsonPropertyName("activities_additions")] + public IList? ActivityAdditionMediaIdList { get; set; } + } + + public class BankAccount + { + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonProperty("bank_account_type")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account_type")] + public string AccountType { get; set; } = string.Empty; + + /// + /// 获取或设置开户名称(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("account_name")] + [System.Text.Json.Serialization.JsonPropertyName("account_name")] + public string AccountNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置银行账号(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("account_number")] + [System.Text.Json.Serialization.JsonPropertyName("account_number")] + public string AccountNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("account_bank")] + [System.Text.Json.Serialization.JsonPropertyName("account_bank")] + public string AccountBank { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行省市编码。 + /// + [Newtonsoft.Json.JsonProperty("bank_address_code")] + [System.Text.Json.Serialization.JsonPropertyName("bank_address_code")] + public string BankAddressCode { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行联行号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("bank_branch_id")] + [System.Text.Json.Serialization.JsonPropertyName("bank_branch_id")] + public string? BankBranchId { get; set; } + + /// + /// 获取或设置开户开户银行全称(含支行)。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankBranchName { get; set; } + } + + public class Addition + { + /// + /// 获取或设置法人开户承诺函媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("legal_person_commitment")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person_commitment")] + public string? LegalPermsonCommitmentMediaId { get; set; } + + /// + /// 获取或设置法人开户意愿视频媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("legal_person_video")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person_video")] + public string? LegalPermsonVideoMediaId { get; set; } + + /// + /// 获取或设置补充材料媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("business_addition_pics")] + [System.Text.Json.Serialization.JsonPropertyName("business_addition_pics")] + public IList? BusinessAdditionPictureMediaIdList { get; set; } + + /// + /// 获取或设置补充说明。 + /// + [Newtonsoft.Json.JsonProperty("business_addition_msg")] + [System.Text.Json.Serialization.JsonPropertyName("business_addition_msg")] + public string? BusinessAdditionMessage { get; set; } + } + } + + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonProperty("business_code")] + [System.Text.Json.Serialization.JsonPropertyName("business_code")] + public string BusinessCode { get; set; } = string.Empty; + + /// + /// 获取或设置超级管理员信息。 + /// + [Newtonsoft.Json.JsonProperty("contact_info")] + [System.Text.Json.Serialization.JsonPropertyName("contact_info")] + public Types.Contact Contact { get; set; } = new Types.Contact(); + + /// + /// 获取或设置主体信息。 + /// + [Newtonsoft.Json.JsonProperty("subject_info")] + [System.Text.Json.Serialization.JsonPropertyName("subject_info")] + public Types.Subject Subject { get; set; } = new Types.Subject(); + + /// + /// 获取或设置经营资料信息。 + /// + [Newtonsoft.Json.JsonProperty("business_info")] + [System.Text.Json.Serialization.JsonPropertyName("business_info")] + public Types.Business Business { get; set; } = new Types.Business(); + + /// + /// 获取或设置结算规则信息。 + /// + [Newtonsoft.Json.JsonProperty("settlement_info")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_info")] + public Types.Settlement Settlement { get; set; } = new Types.Settlement(); + + /// + /// 获取或设置银行账户信息。 + /// + [Newtonsoft.Json.JsonProperty("bank_account_info")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account_info")] + public Types.BankAccount BankAccount { get; set; } = new Types.BankAccount(); + + /// + /// 获取或设置补充材料信息。 + /// + [Newtonsoft.Json.JsonProperty("addition_info")] + [System.Text.Json.Serialization.JsonPropertyName("addition_info")] + public Types.Addition? Addition { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.cs new file mode 100644 index 00000000..6828314a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /applyment4sub/applyment 接口的响应。 + /// + public class CreateApplyForSubMerchantApplymentResponse : WechatTenpayResponse + { + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonProperty("applyment_id")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_id")] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.cs new file mode 100644 index 00000000..edc6e228 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /applyment4sub/applyment/applyment_id/{applyment_id} 接口的请求。 + /// + public class GetApplyForSubMerchantApplymentByApplymentIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.cs new file mode 100644 index 00000000..923b3f51 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /applyment4sub/applyment/applyment_id/{applyment_id} 接口的响应。 + /// + public class GetApplyForSubMerchantApplymentByApplymentIdResponse : GetApplyForSubMerchantApplymentByBusinessCodeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.cs new file mode 100644 index 00000000..1ad689a2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /applyment4sub/applyment/business_code/{business_code} 接口的请求。 + /// + public class GetApplyForSubMerchantApplymentByBusinessCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BusinessCode { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.cs new file mode 100644 index 00000000..fec9b8e4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /applyment4sub/applyment/business_code/{business_code} 接口的响应。 + /// + public class GetApplyForSubMerchantApplymentByBusinessCodeResponse : WechatTenpayResponse + { + public static class Types + { + public class AuditDetail + { + /// + /// 获取或设置字段名。 + /// + [Newtonsoft.Json.JsonProperty("field")] + [System.Text.Json.Serialization.JsonPropertyName("field")] + public string Field { get; set; } = default!; + + /// + /// 获取或设置字段名称。 + /// + [Newtonsoft.Json.JsonProperty("field_name")] + [System.Text.Json.Serialization.JsonPropertyName("field_name")] + public string FieldName { get; set; } = default!; + + /// + /// 获取或设置驳回原因。 + /// + [Newtonsoft.Json.JsonProperty("reject_reason")] + [System.Text.Json.Serialization.JsonPropertyName("reject_reason")] + public string RejectReason { get; set; } = default!; + } + } + + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonProperty("business_code")] + [System.Text.Json.Serialization.JsonPropertyName("business_code")] + public string BusinessCode { get; set; } = default!; + + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonProperty("applyment_id")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_id")] + public long ApplymentId { get; set; } + + /// + /// 获取或设置申请单状态。 + /// + [Newtonsoft.Json.JsonProperty("applyment_state")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_state")] + public string ApplymentState { get; set; } = default!; + + /// + /// 获取或设置申请单状态描述。 + /// + [Newtonsoft.Json.JsonProperty("applyment_state_msg")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_state_msg")] + public string ApplymentStateMessage { get; set; } = default!; + + /// + /// 获取或设置特约商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置超级管理员签约链接。 + /// + [Newtonsoft.Json.JsonProperty("sign_url")] + [System.Text.Json.Serialization.JsonPropertyName("sign_url")] + public string? SignUrl { get; set; } + + /// + /// 获取或设置驳回原因详情列表。 + /// + [Newtonsoft.Json.JsonProperty("audit_detail")] + [System.Text.Json.Serialization.JsonPropertyName("audit_detail")] + public Types.AuditDetail[]? AuditList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.cs new file mode 100644 index 00000000..5a989227 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口的请求。 + /// + public class GetApplyForSubMerchantSettlementRequest : WechatTenpayRequest + { + /// + /// 获取或设置特约商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.cs new file mode 100644 index 00000000..9a6ffbcd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口的响应。 + /// + public class GetApplyForSubMerchantSettlementResponse : WechatTenpayResponse + { + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonProperty("account_type")] + [System.Text.Json.Serialization.JsonPropertyName("account_type")] + public string AccountType { get; set; } = default!; + + /// + /// 获取或设置银行账号(掩码显示)。 + /// + [Newtonsoft.Json.JsonProperty("account_number")] + [System.Text.Json.Serialization.JsonPropertyName("account_number")] + public string AccountNumber { get; set; } = default!; + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("account_bank")] + [System.Text.Json.Serialization.JsonPropertyName("account_bank")] + public string AccountBank { get; set; } = default!; + + /// + /// 获取或设置开户银行省市编码。 + /// + [Newtonsoft.Json.JsonProperty("bank_address_code")] + [System.Text.Json.Serialization.JsonPropertyName("bank_address_code")] + public string BankAddressCode { get; set; } = default!; + + /// + /// 获取或设置开户银行联行号。 + /// + [Newtonsoft.Json.JsonProperty("bank_branch_id")] + [System.Text.Json.Serialization.JsonPropertyName("bank_branch_id")] + public string BankBranchId { get; set; } = default!; + + /// + /// 获取或设置开户开户银行全称(含支行)。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string BankBranchName { get; set; } = default!; + + /// + /// 获取或设置汇款验证结果。 + /// + [Newtonsoft.Json.JsonProperty("verify_result")] + [System.Text.Json.Serialization.JsonPropertyName("verify_result")] + public string VerifyResult { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs new file mode 100644 index 00000000..1876a7e4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口的请求。 + /// + public class ModifyApplyForSubMerchantSettlementRequest : WechatTenpayRequest + { + /// + /// 获取或设置特约商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonProperty("account_type")] + [System.Text.Json.Serialization.JsonPropertyName("account_type")] + public string AccountType { get; set; } = string.Empty; + + /// + /// 获取或设置银行账号(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("account_number")] + [System.Text.Json.Serialization.JsonPropertyName("account_number")] + public string AccountNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("account_bank")] + [System.Text.Json.Serialization.JsonPropertyName("account_bank")] + public string AccountBank { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行省市编码。 + /// + [Newtonsoft.Json.JsonProperty("bank_address_code")] + [System.Text.Json.Serialization.JsonPropertyName("bank_address_code")] + public string BankAddressCode { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行联行号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("bank_branch_id")] + [System.Text.Json.Serialization.JsonPropertyName("bank_branch_id")] + public string? BankBranchId { get; set; } + + /// + /// 获取或设置开户开户银行全称(含支行)。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankBranchName { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.cs new file mode 100644 index 00000000..e1899618 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口的响应。 + /// + public class ModifyApplyForSubMerchantSettlementResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.cs new file mode 100644 index 00000000..22947ccf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4subject/applyment/{applyment_id}/cancel 接口的请求。 + /// + public class CancelApplyForSubjectApplymentByApplymentIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.cs new file mode 100644 index 00000000..ac3a4c0b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4subject/applyment/{applyment_id}/cancel 接口的响应。 + /// + public class CancelApplyForSubjectApplymentByApplymentIdResponse : CancelApplyForSubjectApplymentByBusinessCodeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.cs new file mode 100644 index 00000000..ad0112c2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4subject/applyment/{business_code}/cancel 接口的请求。 + /// + public class CancelApplyForSubjectApplymentByBusinessCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BusinessCode { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.cs new file mode 100644 index 00000000..b4a5dc0d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4subject/applyment/{business_code}/cancel 接口的响应。 + /// + public class CancelApplyForSubjectApplymentByBusinessCodeResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs new file mode 100644 index 00000000..ddfe2bdb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentRequest.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4subject/applyment 接口的请求。 + /// + public class CreateApplyForSubjectApplymentRequest : WechatTenpayRequest + { + public static class Types + { + public class Contact + { + /// + /// 获取或设置联系人姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string NameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置联系人手机号(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("mobile")] + [System.Text.Json.Serialization.JsonPropertyName("mobile")] + public string MobileEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置联系人身份证号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_card_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_number")] + public string IdCardNumberEncryptedData { get; set; } = string.Empty; + } + + public class Subject + { + public static class Types + { + public class BusinessLicense + { + /// + /// 获取或设置营业执照注册号。 + /// + [Newtonsoft.Json.JsonProperty("licence_number")] + [System.Text.Json.Serialization.JsonPropertyName("licence_number")] + public string LicenseNumber { get; set; } = string.Empty; + + /// + /// 获取或设置营业执照照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("licence_copy")] + [System.Text.Json.Serialization.JsonPropertyName("licence_copy")] + public string LicenseCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置营业执照有效日期(格式:["yyyy-MM-dd", "yyyy-MM-dd"],长期用 "forever" 表示)。 + /// + [Newtonsoft.Json.JsonProperty("licence_valid_date")] + [System.Text.Json.Serialization.JsonPropertyName("licence_valid_date")] + public string LicenseValidDate { get; set; } = string.Empty; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置法人姓名。 + /// + [Newtonsoft.Json.JsonProperty("legal_person")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person")] + public string LegalPerson { get; set; } = string.Empty; + + /// + /// 获取或设置注册地址。 + /// + [Newtonsoft.Json.JsonProperty("company_address")] + [System.Text.Json.Serialization.JsonPropertyName("company_address")] + public string CompanyAddress { get; set; } = string.Empty; + } + + public class InstitutionalCertificate + { + /// + /// 获取或设置证书类型。 + /// + [Newtonsoft.Json.JsonProperty("cert_type")] + [System.Text.Json.Serialization.JsonPropertyName("cert_type")] + public string CertificateType { get; set; } = string.Empty; + + /// + /// 获取或设置证书编号。 + /// + [Newtonsoft.Json.JsonProperty("cert_number")] + [System.Text.Json.Serialization.JsonPropertyName("cert_number")] + public string CertificateNumber { get; set; } = string.Empty; + + /// + /// 获取或设置证书照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("cert_copy")] + [System.Text.Json.Serialization.JsonPropertyName("cert_copy")] + public string CertificateCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置证书有效日期(格式:["yyyy-MM-dd", "yyyy-MM-dd"],长期用 "forever" 表示)。 + /// + [Newtonsoft.Json.JsonProperty("cert_valid_date")] + [System.Text.Json.Serialization.JsonPropertyName("cert_valid_date")] + public string CertificateValidDate { get; set; } = string.Empty; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置法人姓名。 + /// + [Newtonsoft.Json.JsonProperty("legal_person")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person")] + public string LegalPerson { get; set; } = string.Empty; + + /// + /// 获取或设置注册地址。 + /// + [Newtonsoft.Json.JsonProperty("company_address")] + [System.Text.Json.Serialization.JsonPropertyName("company_address")] + public string CompanyAddress { get; set; } = string.Empty; + } + + public class AssistedProof + { + /// + /// 获取或设置小微经营类型。 + /// + [Newtonsoft.Json.JsonProperty("micro_biz_type")] + [System.Text.Json.Serialization.JsonPropertyName("micro_biz_type")] + public string MicroBusinessType { get; set; } = string.Empty; + + /// + /// 获取或设置门店名称。 + /// + [Newtonsoft.Json.JsonProperty("store_name")] + [System.Text.Json.Serialization.JsonPropertyName("store_name")] + public string StoreName { get; set; } = string.Empty; + + /// + /// 获取或设置门店省市编码。 + /// + [Newtonsoft.Json.JsonProperty("store_address_code")] + [System.Text.Json.Serialization.JsonPropertyName("store_address_code")] + public string StoreAddressCode { get; set; } = string.Empty; + + /// + /// 获取或设置门店地址。 + /// + [Newtonsoft.Json.JsonProperty("store_address")] + [System.Text.Json.Serialization.JsonPropertyName("store_address")] + public string StoreAddress { get; set; } = string.Empty; + + /// + /// 获取或设置门店门头照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("store_header_copy")] + [System.Text.Json.Serialization.JsonPropertyName("store_header_copy")] + public string StoreEntranceCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置店内环境照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("store_indoor_copy")] + [System.Text.Json.Serialization.JsonPropertyName("store_indoor_copy")] + public string StoreIndoorCopyMediaId { get; set; } = string.Empty; + } + + public class SpecialOperation + { + /// + /// 获取或设置行业 ID。 + /// + [Newtonsoft.Json.JsonProperty("category_id")] + [System.Text.Json.Serialization.JsonPropertyName("category_id")] + public string CategoryId { get; set; } = string.Empty; + + /// + /// 获取或设置行业经营许可证资质照片媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("operation_copy_list")] + [System.Text.Json.Serialization.JsonPropertyName("operation_copy_list")] + public IList OperationCopyMediaIdList { get; set; } = new List(); + } + } + + /// + /// 获取或设置主体类型。 + /// + [Newtonsoft.Json.JsonProperty("subject_type")] + [System.Text.Json.Serialization.JsonPropertyName("subject_type")] + public string SubjectType { get; set; } = string.Empty; + + /// + /// 获取或设置单位证明函照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("company_prove_copy")] + [System.Text.Json.Serialization.JsonPropertyName("company_prove_copy")] + public string? CompanyProveCopyMediaId { get; set; } + + /// + /// 获取或设置营业执照信息。 + /// + [Newtonsoft.Json.JsonProperty("business_licence_info")] + [System.Text.Json.Serialization.JsonPropertyName("business_licence_info")] + public Types.BusinessLicense? BusinessLicense { get; set; } + + /// + /// 获取或设置登记证书信息。 + /// + [Newtonsoft.Json.JsonProperty("certificate_info")] + [System.Text.Json.Serialization.JsonPropertyName("certificate_info")] + public Types.InstitutionalCertificate? InstitutionalCertificate { get; set; } + + /// + /// 获取或设置辅助证明材料信息。 + /// + [Newtonsoft.Json.JsonProperty("assist_prove_info")] + [System.Text.Json.Serialization.JsonPropertyName("assist_prove_info")] + public Types.AssistedProof? AssistedProof { get; set; } + + /// + /// 获取或设置经营许可证列表。 + /// + [Newtonsoft.Json.JsonProperty("special_operation_list")] + [System.Text.Json.Serialization.JsonPropertyName("special_operation_list")] + public IList? SpecialOperationList { get; set; } + } + + public class Identification + { + /// + /// 获取或设置证件类型。 + /// + [Newtonsoft.Json.JsonProperty("identification_type")] + [System.Text.Json.Serialization.JsonPropertyName("identification_type")] + public string IdentificationType { get; set; } = string.Empty; + + /// + /// 获取或设置证件姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("identification_name")] + [System.Text.Json.Serialization.JsonPropertyName("identification_name")] + public string IdentificationNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("identification_number")] + [System.Text.Json.Serialization.JsonPropertyName("identification_number")] + public string IdentificationNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件有效日期(格式:["yyyy-MM-dd", "yyyy-MM-dd"])。 + /// + [Newtonsoft.Json.JsonProperty("identification_valid_date")] + [System.Text.Json.Serialization.JsonPropertyName("identification_valid_date")] + public string IdentificationValidDate { get; set; } = string.Empty; + + /// + /// 获取或设置证件正面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("identification_front_copy")] + [System.Text.Json.Serialization.JsonPropertyName("identification_front_copy")] + public string IdentificationFrontCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置证件反面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("identification_back_copy")] + [System.Text.Json.Serialization.JsonPropertyName("identification_back_copy")] + public string? IdentificationBackCopyMediaId { get; set; } + } + + public class Addition + { + /// + /// 获取或设置待确认商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("confirm_mchid_list")] + [System.Text.Json.Serialization.JsonPropertyName("confirm_mchid_list")] + public IList? ConfirmMerchantIdList { get; set; } + } + } + + /// + /// 获取或设置渠道商户号。 + /// + [Newtonsoft.Json.JsonProperty("channel_id")] + [System.Text.Json.Serialization.JsonPropertyName("channel_id")] + public string? ChannelId { get; set; } + + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonProperty("business_code")] + [System.Text.Json.Serialization.JsonPropertyName("business_code")] + public string BusinessCode { get; set; } = string.Empty; + + /// + /// 获取或设置联系人信息。 + /// + [Newtonsoft.Json.JsonProperty("contact_info")] + [System.Text.Json.Serialization.JsonPropertyName("contact_info")] + public Types.Contact Contact { get; set; } = new Types.Contact(); + + /// + /// 获取或设置主体信息。 + /// + [Newtonsoft.Json.JsonProperty("subject_info")] + [System.Text.Json.Serialization.JsonPropertyName("subject_info")] + public Types.Subject Subject { get; set; } = new Types.Subject(); + + /// + /// 获取或设置法人身份信息。 + /// + [Newtonsoft.Json.JsonProperty("identification_info")] + [System.Text.Json.Serialization.JsonPropertyName("identification_info")] + public Types.Identification Identification { get; set; } = new Types.Identification(); + + /// + /// 获取或设置补充材料信息。 + /// + [Newtonsoft.Json.JsonProperty("addition_info")] + [System.Text.Json.Serialization.JsonPropertyName("addition_info")] + public Types.Addition? Addition { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentResponse.cs new file mode 100644 index 00000000..a16f077b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/CreateApplyForSubjectApplymentResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /apply4subject/applyment 接口的响应。 + /// + public class CreateApplyForSubjectApplymentResponse : WechatTenpayResponse + { + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonProperty("applyment_id")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_id")] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.cs new file mode 100644 index 00000000..c10ba55c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4subject/applyment 接口的请求。 + /// + public class GetApplyForSubjectApplymentByApplymentIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.cs new file mode 100644 index 00000000..92643098 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4subject/applyment 接口的响应。 + /// + public class GetApplyForSubjectApplymentByApplymentIdResponse : GetApplyForSubjectApplymentByBusinessCodeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.cs new file mode 100644 index 00000000..26a77787 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4subject/applyment 接口的请求。 + /// + public class GetApplyForSubjectApplymentByBusinessCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BusinessCode { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.cs new file mode 100644 index 00000000..89e265dd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4subject/applyment 接口的响应。 + /// + public class GetApplyForSubjectApplymentByBusinessCodeResponse : WechatTenpayResponse + { + /// + /// 获取或设置申请单状态。 + /// + [Newtonsoft.Json.JsonProperty("applyment_state")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_state")] + public string ApplymentState { get; set; } = default!; + + /// + /// 获取或设置小程序码图片数据(经 Base64 编码)。 + /// + [Newtonsoft.Json.JsonProperty("qrcode_data")] + [System.Text.Json.Serialization.JsonPropertyName("qrcode_data")] + public string? QrcodeData { get; set; } + + /// + /// 获取或设置驳回参数。 + /// + [Newtonsoft.Json.JsonProperty("reject_param")] + [System.Text.Json.Serialization.JsonPropertyName("reject_param")] + public string? RejectParameter { get; set; } + + /// + /// 获取或设置驳回原因。 + /// + [Newtonsoft.Json.JsonProperty("reject_reason")] + [System.Text.Json.Serialization.JsonPropertyName("reject_reason")] + public string? RejectReason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.cs new file mode 100644 index 00000000..8bf7f373 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4subject/applyment/merchants/{sub_mchid}/state 接口的请求。 + /// + public class GetApplyForSubjectApplymentMerchantStateRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.cs new file mode 100644 index 00000000..8bdf04ba --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /apply4subject/applyment/merchants/{sub_mchid}/state 接口的响应。 + /// + public class GetApplyForSubjectApplymentMerchantStateResponse : WechatTenpayResponse + { + /// + /// 获取或设置授权状态。 + /// + [Newtonsoft.Json.JsonProperty("authorize_state")] + [System.Text.Json.Serialization.JsonPropertyName("authorize_state")] + public string AuthorizeState { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileRequest.cs new file mode 100644 index 00000000..133f29f2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /billdownload/file 接口的请求。 + /// + public class DownloadBillFileRequest : WechatTenpayRequest + { + /// + /// 获取或设置账单下载地址。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string DownloadUrl { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileResponse.cs new file mode 100644 index 00000000..d592e1ea --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/DownloadBillFileResponse.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /billdownload/file 接口的响应。 + /// + public class DownloadBillFileResponse : WechatTenpayResponse + { + public override bool IsSuccessful() + { + return base.IsSuccessful() && RawBytes.Length > 0; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillRequest.cs new file mode 100644 index 00000000..9aa99aa4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /bill/fundflowbill 接口的请求。 + /// + public class GetBillFundflowBillRequest : WechatTenpayRequest + { + /// + /// 获取或设置账单日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BillDateString { get; set; } = string.Empty; + + /// + /// 获取或设置资金账户类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? AccountType { get; set; } + + /// + /// 获取或设置压缩类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? TarType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillResponse.cs new file mode 100644 index 00000000..e173aae9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillFundflowBillResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /bill/fundflowbill 接口的响应。 + /// + public class GetBillFundflowBillResponse : GetBillTradeBillResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillRequest.cs new file mode 100644 index 00000000..72515477 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /bill/tradebill 接口的请求。 + /// + public class GetBillTradeBillRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置账单日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BillDateString { get; set; } = string.Empty; + + /// + /// 获取或设置账单类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? BillType { get; set; } + + /// + /// 获取或设置压缩类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? TarType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillResponse.cs new file mode 100644 index 00000000..8e1e94df --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Bill/GetBillTradeBillResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /bill/tradebill 接口的响应。 + /// + public class GetBillTradeBillResponse : WechatTenpayResponse + { + /// + /// 获取或设置哈希类型。 + /// + [Newtonsoft.Json.JsonProperty("hash_type")] + [System.Text.Json.Serialization.JsonPropertyName("hash_type")] + public string HashType { get; set; } = default!; + + /// + /// 获取或设置哈希值。 + /// + [Newtonsoft.Json.JsonProperty("hash_value")] + [System.Text.Json.Serialization.JsonPropertyName("hash_value")] + public string HashValue { get; set; } = default!; + + /// + /// 获取或设置账单下载地址。 + /// + [Newtonsoft.Json.JsonProperty("download_url")] + [System.Text.Json.Serialization.JsonPropertyName("download_url")] + public string DownloadUrl { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.cs new file mode 100644 index 00000000..af043629 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/orders/{transaction_id}/amounts 接口的请求。 + /// + public class GetBrandProfitSharingOrderAmountsRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string TransactionId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.cs new file mode 100644 index 00000000..823fa5f2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/orders/{transaction_id}/amounts 接口的响应。 + /// + public class GetBrandProfitSharingOrderAmountsResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置订单剩余待分金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unsplit_amount")] + [System.Text.Json.Serialization.JsonPropertyName("unsplit_amount")] + public int UnsplitAmount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.cs new file mode 100644 index 00000000..f5edd2d1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/brand-configs/{brand_mchid} 接口的请求。 + /// + public class GetBrandProfitBrandConfigsRequest : WechatTenpayRequest + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BrandMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.cs new file mode 100644 index 00000000..b6570a20 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/brand-configs/{brand_mchid} 接口的响应。 + /// + public class GetBrandProfitBrandConfigsResponse : WechatTenpayResponse + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { get; set; } = default!; + + /// + /// 获取或设置最大分账比例(单位:万分比)。 + /// + [Newtonsoft.Json.JsonProperty("max_ratio")] + [System.Text.Json.Serialization.JsonPropertyName("max_ratio")] + public int MaxRatio { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs new file mode 100644 index 00000000..fc0d415c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /brand/profitsharing/orders 接口的请求。 + /// + public class CreateBrandProfitSharingOrderRequest : WechatTenpayRequest + { + public static class Types + { + public class Receiver + { + /// + /// 获取或设置分账接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置分账接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = string.Empty; + + /// + /// 获取或设置分账个人姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? NameEncryptedData { get; set; } + + /// + /// 获取或设置分账金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置分账描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置品牌主商户号 。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { 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("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置分账接收方列表。 + /// + [Newtonsoft.Json.JsonProperty("receivers")] + [System.Text.Json.Serialization.JsonPropertyName("receivers")] + public IList ReceiverList { get; set; } = new List(); + + /// + /// 获取或设置是否分账完成。 + /// + [Newtonsoft.Json.JsonProperty("finish")] + [System.Text.Json.Serialization.JsonPropertyName("finish")] + public bool IsFinish { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.cs new file mode 100644 index 00000000..e46e22b1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /brand/profitsharing/orders 接口的响应。 + /// + public class CreateBrandProfitSharingOrderResponse : WechatTenpayResponse + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { get; set; } = default!; + + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.cs new file mode 100644 index 00000000..d4c28850 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /brand/profitsharing/returnorders 接口的请求。 + /// + public class CreateBrandProfitSharingReturnOrderRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string? OutOrderNumber { get; set; } + + /// + /// 获取或设置微信分账单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string? OrderId { get; set; } + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonProperty("out_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_return_no")] + public string OutReturnNumber { get; set; } = string.Empty; + + /// + /// 获取或设置回退商户号。 + /// + [Newtonsoft.Json.JsonProperty("return_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("return_mchid")] + public string ReturnMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置回退描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.cs new file mode 100644 index 00000000..9d141352 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /brand/profitsharing/returnorders 接口的响应。 + /// + public class CreateBrandProfitSharingReturnOrderResponse : GetBrandProfitSharingReturnOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.cs new file mode 100644 index 00000000..50e6b4e4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/orders 接口的请求。 + /// + public class GetBrandProfitSharingOrderByOutOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [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 OutOrderNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.cs new file mode 100644 index 00000000..1cb6850e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/orders 接口的响应。 + /// + public class GetBrandProfitSharingOrderByOutOrderNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Receiver + { + /// + /// 获取或设置分账接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置分账接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = default!; + + /// + /// 获取或设置分账金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置分账描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置分账结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置分账失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置分账完成时间。 + /// + [Newtonsoft.Json.JsonProperty("finish_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("finish_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? FinishTime { get; set; } + } + } + + /// + /// 获取或设置微信子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置分账单状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置分账接收方列表。 + /// + [Newtonsoft.Json.JsonProperty("receivers")] + [System.Text.Json.Serialization.JsonPropertyName("receivers")] + public Types.Receiver[]? ReceiverList { get; set; } + + /// + /// 获取或设置分账完结金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("finish_amount")] + [System.Text.Json.Serialization.JsonPropertyName("finish_amount")] + public int? FinishAmount { get; set; } + + /// + /// 获取或设置分账完结描述。 + /// + [Newtonsoft.Json.JsonProperty("finish_description")] + [System.Text.Json.Serialization.JsonPropertyName("finish_description")] + public string? FinishDescription { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.cs new file mode 100644 index 00000000..8116a2fa --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/returnorders 接口的请求。 + /// + public class GetBrandProfitSharingReturnOrderByOrderIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OrderId { get; set; } = string.Empty; + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutReturnNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.cs new file mode 100644 index 00000000..7e0f424f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/returnorders 接口的响应。 + /// + public class GetBrandProfitSharingReturnOrderByOrderIdResponse : GetBrandProfitSharingReturnOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.cs new file mode 100644 index 00000000..e77e1d66 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/returnorders 接口的请求。 + /// + public class GetBrandProfitSharingReturnOrderByOutOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutReturnNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.cs new file mode 100644 index 00000000..3a7ee6c2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/returnorders 接口的响应。 + /// + public class GetBrandProfitSharingReturnOrderByOutOrderNumberResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonProperty("out_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_return_no")] + public string OutReturnNumber { get; set; } = default!; + + /// + /// 获取或设置微信回退单号。 + /// + [Newtonsoft.Json.JsonProperty("return_no")] + [System.Text.Json.Serialization.JsonPropertyName("return_no")] + public string ReturnId { get; set; } = default!; + + /// + /// 获取或设置回退商户号。 + /// + [Newtonsoft.Json.JsonProperty("return_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("return_mchid")] + public string ReturnMerchantId { get; set; } = default!; + + /// + /// 获取或设置回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置回退结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置回退失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置回退完成时间。 + /// + [Newtonsoft.Json.JsonProperty("finish_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("finish_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? FinishTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.cs new file mode 100644 index 00000000..11cfee98 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/receivers/add 接口的请求。 + /// + public class AddBrandProfitSharingReceiverRequest : WechatTenpayRequest + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置电商平台 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = string.Empty; + + /// + /// 获取或设置接收方商户全称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// 获取或设置与分账方的关系类型。 + /// + [Newtonsoft.Json.JsonProperty("relation_type")] + [System.Text.Json.Serialization.JsonPropertyName("relation_type")] + public string RelationType { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.cs new file mode 100644 index 00000000..02649de4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/receivers/add 接口的响应。 + /// + public class AddBrandProfitSharingReceiverResponse : WechatTenpayResponse + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { get; set; } = default!; + + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.cs new file mode 100644 index 00000000..15d7dfac --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/receivers/delete 接口的请求。 + /// + public class DeleteBrandProfitSharingReceiverRequest : WechatTenpayRequest + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置电商平台 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.cs new file mode 100644 index 00000000..987a7267 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /brand/profitsharing/receivers/delete 接口的响应。 + /// + public class DeleteBrandProfitSharingReceiverResponse : WechatTenpayResponse + { + /// + /// 获取或设置品牌主商户号。 + /// + [Newtonsoft.Json.JsonProperty("brand_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("brand_mchid")] + public string BrandMerchantId { get; set; } = default!; + + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.cs new file mode 100644 index 00000000..8df6d2e6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /brand/profitsharing/finish-order 接口的请求。 + /// + public class SetBrandProfitSharingOrderFinishRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置分账描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.cs new file mode 100644 index 00000000..96d1012a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /brand/profitsharing/finish-order 接口的响应。 + /// + public class SetBrandProfitSharingOrderFinishResponse : WechatTenpayResponse + { + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.cs new file mode 100644 index 00000000..84bad243 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /businesscircle/user-authorizations/{openid} 接口的请求。 + /// + public class GetBusinessCircleUserAuthorizationByOpenIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.cs new file mode 100644 index 00000000..bbd281f9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /businesscircle/user-authorizations/{openid} 接口的响应。 + /// + public class GetBusinessCircleUserAuthorizationByOpenIdResponse : WechatTenpayResponse + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置授权状态。 + /// + [Newtonsoft.Json.JsonProperty("authorize_state")] + [System.Text.Json.Serialization.JsonPropertyName("authorize_state")] + public string AuthorizeState { get; set; } = default!; + + /// + /// 获取或设置授权时间。 + /// + [Newtonsoft.Json.JsonProperty("authorize_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("authorize_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? AuthorizeTime { get; set; } + + /// + /// 获取或设置取消授权时间。 + /// + [Newtonsoft.Json.JsonProperty("deauthorize_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("deauthorize_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? DeauthorizeTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsRequest.cs new file mode 100644 index 00000000..3cbc11d9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsRequest.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /businesscircle/points/notify 接口的请求。 + /// + public class NotifyBusinessCirclePointsRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置是否获得积分。 + /// + [Newtonsoft.Json.JsonProperty("earn_points")] + [System.Text.Json.Serialization.JsonPropertyName("earn_points")] + public bool IsEarnPoints { get; set; } + + /// + /// 获取或设置订单新增积分值。 + /// + [Newtonsoft.Json.JsonProperty("increased_points")] + [System.Text.Json.Serialization.JsonPropertyName("increased_points")] + public int IncreasedPoints { get; set; } + + /// + /// 获取或设置积分更新时间。 + /// + [Newtonsoft.Json.JsonProperty("points_update_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("points_update_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset UpdateTime { get; set; } + + /// + /// 获取或设置未获得积分的备注信息。 + /// + [Newtonsoft.Json.JsonProperty("no_points_remarks")] + [System.Text.Json.Serialization.JsonPropertyName("no_points_remarks")] + public string? NoPointsRemarks { get; set; } + + /// + /// 获取或设置顾客积分总额。 + /// + [Newtonsoft.Json.JsonProperty("total_points")] + [System.Text.Json.Serialization.JsonPropertyName("total_points")] + public int? TotalPoints { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsResponse.cs new file mode 100644 index 00000000..a9366bf4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/BusinessCircle/NotifyBusinessCirclePointsResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /businesscircle/points/notify 接口的响应。 + /// + public class NotifyBusinessCirclePointsResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesRequest.cs new file mode 100644 index 00000000..5c4f1306 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /certificates 接口的请求。 + /// + public class QueryCertificatesRequest : WechatTenpayRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs new file mode 100644 index 00000000..5537bb36 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Certificates/QueryCertificatesResponse.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /certificates 接口的响应。 + /// + public class QueryCertificatesResponse : WechatTenpayResponse + { + public static class Types + { + public class Certificate + { + public static class Types + { + public class EncryptCertificate + { + /// + /// 获取或设置加密算法。 + /// + [Newtonsoft.Json.JsonProperty("algorithm")] + [System.Text.Json.Serialization.JsonPropertyName("algorithm")] + public string Algorithm { get; set; } = default!; + + /// + /// 获取或设置加密使用的附加数据。 + /// + [Newtonsoft.Json.JsonProperty("associated_data")] + [System.Text.Json.Serialization.JsonPropertyName("associated_data")] + public string? AssociatedData { get; set; } + + /// + /// 获取或设置加密使用的随机串初始化向量。 + /// + [Newtonsoft.Json.JsonProperty("nonce")] + [System.Text.Json.Serialization.JsonPropertyName("nonce")] + public string Nonce { get; set; } = default!; + + /// + /// 获取或设置 Base64 编码后的密文(需使用商户 API v3 密钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("ciphertext")] + [System.Text.Json.Serialization.JsonPropertyName("ciphertext")] + public string CipherText { get; set; } = default!; + } + } + + /// + /// 获取或设置证书生效时间。 + /// + [Newtonsoft.Json.JsonProperty("effective_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("effective_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EffectiveTime { get; set; } + + /// + /// 获取或设置证书过期时间。 + /// + [Newtonsoft.Json.JsonProperty("expire_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("expire_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ExpireTime { get; set; } + + /// + /// 获取或设置证书序列号。 + /// + [Newtonsoft.Json.JsonProperty("serial_no")] + [System.Text.Json.Serialization.JsonPropertyName("serial_no")] + public string SerialNumber { get; set; } = default!; + + /// + /// 获取或设置证书信息。 + /// + [Newtonsoft.Json.JsonProperty("encrypt_certificate")] + [System.Text.Json.Serialization.JsonPropertyName("encrypt_certificate")] + public Types.EncryptCertificate EncryptCertificate { get; set; } = default!; + } + } + + /// + /// 获取或设置微信服务器证书列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Certificate[] CertificateList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionRequest.cs new file mode 100644 index 00000000..bf0e6a2f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionRequest.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/out-trade-no/{combine_out_trade_no}/close 接口的请求。 + /// + public class CloseCombineTransactionRequest : WechatTenpayRequest + { + public static class Types + { + public class SubOrder + { + /// + /// 获取或设置子单微信商户号。如果不指定将使用合单微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string? MerchantId { get; set; } + + /// + /// 获取或设置子单子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置子单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置合单发起方的微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = string.Empty; + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string CombineOutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public IList SubOrderList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionResponse.cs new file mode 100644 index 00000000..3a47837b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CloseCombineTransactionResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/out-trade-no/{combine_out_trade_no}/close 接口的响应。 + /// + public class CloseCombineTransactionResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppRequest.cs new file mode 100644 index 00000000..1ca69bb3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppRequest.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/app 接口的请求。 + /// + public class CreateCombineTransactionAppRequest : WechatTenpayRequest + { + public static class Types + { + public class SubOrder + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置标价金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int Total { get; set; } + + /// + /// 获取或设置标价币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = "CNY"; + } + + public class Settlement + { + /// + /// 获取或设置是否指定分账。 + /// + [Newtonsoft.Json.JsonProperty("profit_sharing")] + [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] + public bool? IsProfitSharing { get; set; } + + /// + /// 获取或设置补差金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_amount")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_amount")] + public long? SubsidyAmount { get; set; } + } + } + + /// + /// 获取或设置子单微信商户号。如果不指定将使用合单微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string? MerchantId { get; set; } + + /// + /// 获取或设置子单子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string Attachment { get; set; } = string.Empty; + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { 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("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = new Types.Amount(); + + /// + /// 获取或设置结算信息。 + /// + [Newtonsoft.Json.JsonProperty("settle_info")] + [System.Text.Json.Serialization.JsonPropertyName("settle_info")] + public Types.Settlement? Settlement { get; set; } + } + + public class Payer + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + } + + public class Scene + { + /// + /// 获取或设置用户终端 IP。 + /// + [Newtonsoft.Json.JsonProperty("payer_client_ip")] + [System.Text.Json.Serialization.JsonPropertyName("payer_client_ip")] + public string ClientIp { get; set; } = string.Empty; + + /// + /// 获取或设置商户端设备号。 + /// + [Newtonsoft.Json.JsonProperty("device_id")] + [System.Text.Json.Serialization.JsonPropertyName("device_id")] + public string? DeviceId { get; set; } + } + } + + /// + /// 获取或设置合单发起方的微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = string.Empty; + + /// + /// 获取或设置合单发起方的微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("combine_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_mchid")] + public string? CombineMerchantId { get; set; } + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("combine_out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("combine_out_trade_no")] + public string CombineOutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置交易起始时间。 + /// + [Newtonsoft.Json.JsonProperty("time_start")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_start")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置交易结束时间。 + /// + [Newtonsoft.Json.JsonProperty("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public IList SubOrderList { get; set; } = new List(); + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("combine_payer_info")] + [System.Text.Json.Serialization.JsonPropertyName("combine_payer_info")] + public Types.Payer? CombinePayer { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppResponse.cs new file mode 100644 index 00000000..623912da --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionAppResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/app 接口的响应。 + /// + public class CreateCombineTransactionAppResponse : CreatePayTransactionAppResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Request.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Request.cs new file mode 100644 index 00000000..8e4a602c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Request.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/h5 接口的请求。 + /// + public class CreateCombineTransactionH5Request : WechatTenpayRequest + { + public static class Types + { + public class SubOrder : CreateCombineTransactionAppRequest.Types.SubOrder + { + } + + public class Scene : CreateCombineTransactionAppRequest.Types.Scene + { + public static class Types + { + public class H5 + { + /// + /// 获取或设置场景类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = "Wap"; + + /// + /// 获取或设置应用名称。 + /// + [Newtonsoft.Json.JsonProperty("app_name")] + [System.Text.Json.Serialization.JsonPropertyName("app_name")] + public string? AppName { get; set; } + + /// + /// 获取或设置网站 URL。 + /// + [Newtonsoft.Json.JsonProperty("app_url")] + [System.Text.Json.Serialization.JsonPropertyName("app_url")] + public string? AppUrl { get; set; } + + /// + /// 获取或设置 iOS 平台 BundleID。 + /// + [Newtonsoft.Json.JsonProperty("bundle_id")] + [System.Text.Json.Serialization.JsonPropertyName("bundle_id")] + public string? BundleId { get; set; } + + /// + /// 获取或设置 Android 平台 PackageName。 + /// + [Newtonsoft.Json.JsonProperty("package_name")] + [System.Text.Json.Serialization.JsonPropertyName("package_name")] + public string? PackageName { get; set; } + } + } + + /// + /// 获取或设置 H5 场景信息。 + /// + [Newtonsoft.Json.JsonProperty("h5_info")] + [System.Text.Json.Serialization.JsonPropertyName("h5_info")] + public Types.H5 H5 { get; set; } = new Types.H5(); + } + } + + /// + /// 获取或设置合单发起方的微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = string.Empty; + + /// + /// 获取或设置合单发起方的微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("combine_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_mchid")] + public string? CombineMerchantId { get; set; } + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("combine_out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("combine_out_trade_no")] + public string CombineOutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置交易起始时间。 + /// + [Newtonsoft.Json.JsonProperty("time_start")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_start")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置交易结束时间。 + /// + [Newtonsoft.Json.JsonProperty("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public IList SubOrderList { get; set; } = new List(); + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Response.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Response.cs new file mode 100644 index 00000000..33e8f13a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionH5Response.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/h5 接口的响应。 + /// + public class CreateCombineTransactionH5Response : CreatePayTransactionH5Response + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiRequest.cs new file mode 100644 index 00000000..2b8e9571 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiRequest.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/jsapi 接口的请求。 + /// + public class CreateCombineTransactionJsapiRequest : WechatTenpayRequest + { + public static class Types + { + public class SubOrder : CreateCombineTransactionAppRequest.Types.SubOrder + { + } + + public class Payer : CreateCombineTransactionAppRequest.Types.Payer + { + } + + public class Scene : CreateCombineTransactionAppRequest.Types.Scene + { + } + } + + /// + /// 获取或设置合单发起方的微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = string.Empty; + + /// + /// 获取或设置合单发起方的微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("combine_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_mchid")] + public string? CombineMerchantId { get; set; } + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("combine_out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("combine_out_trade_no")] + public string CombineOutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置交易起始时间。 + /// + [Newtonsoft.Json.JsonProperty("time_start")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_start")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置交易结束时间。 + /// + [Newtonsoft.Json.JsonProperty("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public IList SubOrderList { get; set; } = new List(); + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("combine_payer_info")] + [System.Text.Json.Serialization.JsonPropertyName("combine_payer_info")] + public Types.Payer? CombinePayer { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiResponse.cs new file mode 100644 index 00000000..c5a2a312 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionJsapiResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/jsapi 接口的响应。 + /// + public class CreateCombineTransactionJsapiResponse : CreatePayTransactionJsapiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeRequest.cs new file mode 100644 index 00000000..1d28d8f3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeRequest.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/native 接口的请求。 + /// + public class CreateCombineTransactionNativeRequest : WechatTenpayRequest + { + public static class Types + { + public class SubOrder : CreateCombineTransactionAppRequest.Types.SubOrder + { + } + + public class Scene : CreateCombineTransactionAppRequest.Types.Scene + { + } + } + + /// + /// 获取或设置合单发起方的微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = string.Empty; + + /// + /// 获取或设置合单发起方的微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("combine_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_mchid")] + public string? CombineMerchantId { get; set; } + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("combine_out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("combine_out_trade_no")] + public string CombineOutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置交易起始时间。 + /// + [Newtonsoft.Json.JsonProperty("time_start")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_start")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置交易结束时间。 + /// + [Newtonsoft.Json.JsonProperty("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public IList SubOrderList { get; set; } = new List(); + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeResponse.cs new file mode 100644 index 00000000..f8171f30 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/CreateCombineTransactionNativeResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /combine-transactions/native 接口的响应。 + /// + public class CreateCombineTransactionNativeResponse : CreatePayTransactionNativeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.cs new file mode 100644 index 00000000..9b3e7d7a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /combine-transactions/out-trade-no/{combine_out_trade_no} 接口的请求。 + /// + public class GetCombineTransactionByCombineOutTradeNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string CombineOutTradeNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.cs new file mode 100644 index 00000000..0ad339db --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /combine-transactions/out-trade-no/{combine_out_trade_no} 接口的响应。 + /// + public class GetCombineTransactionByCombineOutTradeNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class SubOrder + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置标价金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int Total { get; set; } + + /// + /// 获取或设置标价币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = default!; + + /// + /// 获取或设置用户支付金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("payer_amount")] + [System.Text.Json.Serialization.JsonPropertyName("payer_amount")] + public int PayerAmount { get; set; } + + /// + /// 获取或设置用户支付币种。 + /// + [Newtonsoft.Json.JsonProperty("payer_currency")] + [System.Text.Json.Serialization.JsonPropertyName("payer_currency")] + public string PayerCurrency { get; set; } = default!; + } + } + + /// + /// 获取或设置子单微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置子单子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置子单商户订单号。 + /// + [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("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; } = default!; + + /// + /// 获取或设置支付完成时间。 + /// + [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("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + } + + public class Payer + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + } + public class Scene + { + /// + /// 获取或设置商户端设备号。 + /// + [Newtonsoft.Json.JsonProperty("device_id")] + [System.Text.Json.Serialization.JsonPropertyName("device_id")] + public string? DeviceId { get; set; } + } + } + + /// + /// 获取或设置合单发起方的微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = default!; + + /// + /// 获取或设置合单发起方的微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("combine_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_mchid")] + public string CombineMerchantId { get; set; } = default!; + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("combine_out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("combine_out_trade_no")] + public string CombineOutTradeNumber { get; set; } = default!; + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public Types.SubOrder[]? SubOrderList { get; set; } = default!; + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("combine_payer_info")] + [System.Text.Json.Serialization.JsonPropertyName("combine_payer_info")] + public Types.Payer? CombinePayer { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeRequest.cs new file mode 100644 index 00000000..052e407d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /discount-card/cards/{out_card_code} 接口的请求。 + /// + public class GetDiscountCardByOutCardCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户领卡号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutCardCode { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeResponse.cs new file mode 100644 index 00000000..45ae57a7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/GetDiscountCardByOutCardCodeResponse.cs @@ -0,0 +1,400 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /discount-card/cards/{out_card_code} 接口的响应。 + /// + public class GetDiscountCardByOutCardCodeResponse : WechatTenpayResponse + { + public static class Types + { + public class TimeRange + { + /// + /// 获取或设置约定开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BeginTime { get; set; } + + /// + /// 获取或设置约定结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + } + + public class Payment + { + /// + /// 获取或设置付款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pay_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pay_amount")] + public int PayAmount { get; set; } + + /// + /// 获取或设置付款状态。 + /// + [Newtonsoft.Json.JsonProperty("pay_state")] + [System.Text.Json.Serialization.JsonPropertyName("pay_state")] + public string PayState { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + + /// + /// 获取或设置支付时间。 + /// + [Newtonsoft.Json.JsonProperty("pay_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("pay_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? PayTime { get; set; } + } + + public class Objective + { + public static class Types + { + public class CompletionRecord + { + /// + /// 获取或设置目标完成流水号。 + /// + [Newtonsoft.Json.JsonProperty("objective_completion_serial_no")] + [System.Text.Json.Serialization.JsonPropertyName("objective_completion_serial_no")] + public string SerialNumber { get; set; } = default!; + + /// + /// 获取或设置目标 ID。 + /// + [Newtonsoft.Json.JsonProperty("objective_id")] + [System.Text.Json.Serialization.JsonPropertyName("objective_id")] + public string ObjectiveId { get; set; } = default!; + + /// + /// 获取或设置目标完成时间。 + /// + [Newtonsoft.Json.JsonProperty("completion_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("completion_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CompletionTime { get; set; } + + /// + /// 获取或设置目标完成类型。 + /// + [Newtonsoft.Json.JsonProperty("completion_type")] + [System.Text.Json.Serialization.JsonPropertyName("completion_type")] + public string CompletionType { get; set; } = default!; + + /// + /// 获取或设置目标完成数量。 + /// + [Newtonsoft.Json.JsonProperty("completion_count")] + [System.Text.Json.Serialization.JsonPropertyName("completion_count")] + public int CompletionCount { get; set; } + + /// + /// 获取或设置目标完成描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置备注说明。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置目标 ID。 + /// + [Newtonsoft.Json.JsonProperty("objective_id")] + [System.Text.Json.Serialization.JsonPropertyName("objective_id")] + public string ObjectiveId { get; set; } = default!; + + /// + /// 获取或设置目标名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置目标数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + + /// + /// 获取或设置目标单位。 + /// + [Newtonsoft.Json.JsonProperty("unit")] + [System.Text.Json.Serialization.JsonPropertyName("unit")] + public string Unit { get; set; } = default!; + + /// + /// 获取或设置目标描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置目标完成记录列表。 + /// + [Newtonsoft.Json.JsonProperty("objective_completion_records")] + [System.Text.Json.Serialization.JsonPropertyName("objective_completion_records")] + public Types.CompletionRecord[]? CompletionRecordList { get; set; } + } + + public class Reward + { + public static class Types + { + public class UsageRecord + { + /// + /// 获取或设置优惠使用记录流水号。 + /// + [Newtonsoft.Json.JsonProperty("reward_usage_serial_no")] + [System.Text.Json.Serialization.JsonPropertyName("reward_usage_serial_no")] + public string SerialNumber { get; set; } = default!; + + /// + /// 获取或设置优惠 ID。 + /// + [Newtonsoft.Json.JsonProperty("reward_id")] + [System.Text.Json.Serialization.JsonPropertyName("reward_id")] + public string RewardId { get; set; } = default!; + + /// + /// 获取或设置优惠使用时间。 + /// + [Newtonsoft.Json.JsonProperty("usage_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("usage_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset UsageTime { get; set; } + + /// + /// 获取或设置优惠使用类型。 + /// + [Newtonsoft.Json.JsonProperty("usage_type")] + [System.Text.Json.Serialization.JsonPropertyName("usage_type")] + public string UsageType { get; set; } = default!; + + /// + /// 获取或设置优惠使用数量。 + /// + [Newtonsoft.Json.JsonProperty("usage_count")] + [System.Text.Json.Serialization.JsonPropertyName("usage_count")] + public int UsageCount { get; set; } + + /// + /// 获取或设置优惠金额(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠使用描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置备注说明。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置优惠 ID。 + /// + [Newtonsoft.Json.JsonProperty("reward_id")] + [System.Text.Json.Serialization.JsonPropertyName("reward_id")] + public string RewardId { get; set; } = default!; + + /// + /// 获取或设置优惠名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置优惠数量类型。 + /// + [Newtonsoft.Json.JsonProperty("count_type")] + [System.Text.Json.Serialization.JsonPropertyName("count_type")] + public string CountType { get; set; } = default!; + + /// + /// 获取或设置优惠数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + + /// + /// 获取或设置优惠单位。 + /// + [Newtonsoft.Json.JsonProperty("unit")] + [System.Text.Json.Serialization.JsonPropertyName("unit")] + public string Unit { get; set; } = default!; + + /// + /// 获取或设置优惠金额(单位:元)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置优惠使用记录列表。 + /// + [Newtonsoft.Json.JsonProperty("reward_usage_records")] + [System.Text.Json.Serialization.JsonPropertyName("reward_usage_records")] + public Types.UsageRecord[]? UsageRecordList { get; set; } + } + } + + /// + /// 获取或设置微信商户号。 + /// + [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("out_card_code")] + [System.Text.Json.Serialization.JsonPropertyName("out_card_code")] + public string OutCardCode { get; set; } = default!; + + /// + /// 获取或设置先享卡模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_template_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_template_id")] + public string CardTemplateId { get; set; } = default!; + + /// + /// 获取或设置先享卡 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_id")] + public string CardId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置约定时间期限信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange TimeRange { get; set; } = default!; + + /// + /// 获取或设置状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置未完成约定原因。 + /// + [Newtonsoft.Json.JsonProperty("unfinished_reason")] + [System.Text.Json.Serialization.JsonPropertyName("unfinished_reason")] + public string? UnfinishedReason { get; set; } + + /// + /// 获取或设置享受优惠总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int? TotalAmount { get; set; } + + /// + /// 获取或设置用户退回优惠的付款信息。 + /// + [Newtonsoft.Json.JsonProperty("pay_information")] + [System.Text.Json.Serialization.JsonPropertyName("pay_information")] + public Types.Payment? Payment { get; set; } + + /// + /// 获取或设置目标列表。 + /// + [Newtonsoft.Json.JsonProperty("objectives")] + [System.Text.Json.Serialization.JsonPropertyName("objectives")] + public Types.Objective[] Objectives { get; set; } = default!; + + /// + /// 获取或设置优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("rewards")] + [System.Text.Json.Serialization.JsonPropertyName("rewards")] + public Types.Reward[] Rewards { get; set; } = default!; + + /// + /// 获取或设置邀请者用户标识。 + /// + [Newtonsoft.Json.JsonProperty("sharer_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sharer_openid")] + public string? SharerOpenId { get; set; } + + /// + /// 获取或设置创卡时间。 + /// + [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/DiscountCard/PrepareDiscountCardRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardRequest.cs new file mode 100644 index 00000000..1bae63e5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /discount-card/cards 接口的请求。 + /// + public class PrepareDiscountCardRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商户领卡号。 + /// + [Newtonsoft.Json.JsonProperty("out_card_code")] + [System.Text.Json.Serialization.JsonPropertyName("out_card_code")] + public string OutCardCode { get; set; } = string.Empty; + + /// + /// 获取或设置先享卡模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_template_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_template_id")] + public string CardTemplateId { get; set; } = string.Empty; + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardResponse.cs new file mode 100644 index 00000000..6ac35dd9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/PrepareDiscountCardResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /discount-card/cards 接口的响应。 + /// + public class PrepareDiscountCardResponse : WechatTenpayResponse + { + /// + /// 获取或设置预领卡请求 Token。 + /// + [Newtonsoft.Json.JsonProperty("prepare_card_token")] + [System.Text.Json.Serialization.JsonPropertyName("prepare_card_token")] + public string PrepareCardToken { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.cs new file mode 100644 index 00000000..e8d97398 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /discount-card/cards/{out_card_code}/add-user-records 接口的请求。 + /// + public class AddDiscountCardUserRecordRequest : WechatTenpayRequest + { + public static class Types + { + public class CompletionRecord + { + /// + /// 获取或设置目标完成流水号。 + /// + [Newtonsoft.Json.JsonProperty("objective_completion_serial_no")] + [System.Text.Json.Serialization.JsonPropertyName("objective_completion_serial_no")] + public string SerialNumber { get; set; } = string.Empty; + + /// + /// 获取或设置目标 ID。 + /// + [Newtonsoft.Json.JsonProperty("objective_id")] + [System.Text.Json.Serialization.JsonPropertyName("objective_id")] + public string ObjectiveId { get; set; } = string.Empty; + + /// + /// 获取或设置目标完成时间。 + /// + [Newtonsoft.Json.JsonProperty("completion_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("completion_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset CompletionTime { get; set; } + + /// + /// 获取或设置目标完成类型。 + /// + [Newtonsoft.Json.JsonProperty("completion_type")] + [System.Text.Json.Serialization.JsonPropertyName("completion_type")] + public string CompletionType { get; set; } = string.Empty; + + /// + /// 获取或设置目标完成数量。 + /// + [Newtonsoft.Json.JsonProperty("completion_count")] + [System.Text.Json.Serialization.JsonPropertyName("completion_count")] + public int CompletionCount { get; set; } + + /// + /// 获取或设置目标完成描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置备注说明。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + + + public class UsageRecord + { + /// + /// 获取或设置优惠使用记录流水号。 + /// + [Newtonsoft.Json.JsonProperty("reward_usage_serial_no")] + [System.Text.Json.Serialization.JsonPropertyName("reward_usage_serial_no")] + public string SerialNumber { get; set; } = string.Empty; + + /// + /// 获取或设置优惠 ID。 + /// + [Newtonsoft.Json.JsonProperty("reward_id")] + [System.Text.Json.Serialization.JsonPropertyName("reward_id")] + public string RewardId { get; set; } = string.Empty; + + /// + /// 获取或设置优惠使用时间。 + /// + [Newtonsoft.Json.JsonProperty("usage_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("usage_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset UsageTime { get; set; } + + /// + /// 获取或设置优惠使用类型。 + /// + [Newtonsoft.Json.JsonProperty("usage_type")] + [System.Text.Json.Serialization.JsonPropertyName("usage_type")] + public string UsageType { get; set; } = string.Empty; + + /// + /// 获取或设置优惠使用数量。 + /// + [Newtonsoft.Json.JsonProperty("usage_count")] + [System.Text.Json.Serialization.JsonPropertyName("usage_count")] + public int UsageCount { get; set; } + + /// + /// 获取或设置优惠金额(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠使用描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置备注说明。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + } + } + + /// + /// 获取或设置商户领卡号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutCardCode { get; set; } = string.Empty; + + /// + /// 获取或设置先享卡模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_template_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_template_id")] + public string CardTemplateId { get; set; } = string.Empty; + + /// + /// 获取或设置目标完成记录列表。 + /// + [Newtonsoft.Json.JsonProperty("objective_completion_records")] + [System.Text.Json.Serialization.JsonPropertyName("objective_completion_records")] + public IList CompletionRecordList { get; set; } = new List(); + + /// + /// 获取或设置优惠使用记录列表。 + /// + [Newtonsoft.Json.JsonProperty("reward_usage_records")] + [System.Text.Json.Serialization.JsonPropertyName("reward_usage_records")] + public IList UsageRecordList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.cs new file mode 100644 index 00000000..f3986cbe --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /discount-card/cards/{out_card_code}/add-user-records 接口的响应。 + /// + public class AddDiscountCardUserRecordResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs new file mode 100644 index 00000000..f1c9f531 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentRequest.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/applyments 接口的请求。 + /// + public class CreateEcommerceApplymentRequest : WechatTenpayRequest + { + public static class Types + { + public class BusinessLicense + { + /// + /// 获取或设置营业执照注册号。 + /// + [Newtonsoft.Json.JsonProperty("business_license_number")] + [System.Text.Json.Serialization.JsonPropertyName("business_license_number")] + public string LicenceNumber { get; set; } = string.Empty; + + /// + /// 获取或设置营业执照照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("business_license_copy")] + [System.Text.Json.Serialization.JsonPropertyName("business_license_copy")] + public string LicenseCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置法人姓名。 + /// + [Newtonsoft.Json.JsonProperty("legal_person")] + [System.Text.Json.Serialization.JsonPropertyName("legal_person")] + public string LegalPerson { get; set; } = string.Empty; + + /// + /// 获取或设置注册地址。 + /// + [Newtonsoft.Json.JsonProperty("company_address")] + [System.Text.Json.Serialization.JsonPropertyName("company_address")] + public string? CompanyAddress { get; set; } + + /// + /// 获取或设置营业执照有效日期(格式:["yyyy-MM-dd", "yyyy-MM-dd"],长期用 "长期" 表示)。 + /// + [Newtonsoft.Json.JsonProperty("business_time")] + [System.Text.Json.Serialization.JsonPropertyName("business_time")] + public string? LicenseValidDate { get; set; } = string.Empty; + } + + public class OrganizationCertificate + { + /// + /// 获取或设置组织机构代码。 + /// + [Newtonsoft.Json.JsonProperty("organization_number")] + [System.Text.Json.Serialization.JsonPropertyName("organization_number")] + public string OrganizationNumber { get; set; } = string.Empty; + + /// + /// 获取或设置组织机构代码证照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("organization_copy")] + [System.Text.Json.Serialization.JsonPropertyName("organization_copy")] + public string OrganizationCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置组织机构代码证有效日期(格式:["yyyy-MM-dd", "yyyy-MM-dd"],长期用 "长期" 表示)。 + /// + [Newtonsoft.Json.JsonProperty("organization_time")] + [System.Text.Json.Serialization.JsonPropertyName("organization_time")] + public string OrganizationValidDate { get; set; } = string.Empty; + } + + public class IdCard + { + /// + /// 获取或设置身份证人像面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_card_copy")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_copy")] + public string IdCardFrontCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置身份证国徽面照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_card_national")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_national")] + public string IdCardBackCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置身份证姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_card_name")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_name")] + public string IdCardNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置身份证号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_card_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_number")] + public string IdCardNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置身份证有效期结束时间(格式:yyyy-MM-dd / "长期")。 + /// + [Newtonsoft.Json.JsonProperty("id_card_valid_time")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_valid_time")] + public string PeriodEndDate { get; set; } = string.Empty; + } + + public class IdDocument + { + /// + /// 获取或设置证件照片媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_copy")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_copy")] + public string IdDocumentCopyMediaId { get; set; } = string.Empty; + + /// + /// 获取或设置证件姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_name")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_name")] + public string IdDocumentNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_number")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_number")] + public string IdDocumentNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置证件有效期结束时间(格式:yyyy-MM-dd / "长期")。 + /// + [Newtonsoft.Json.JsonProperty("doc_period_end")] + [System.Text.Json.Serialization.JsonPropertyName("doc_period_end")] + public string PeriodEndDate { get; set; } = string.Empty; + } + + public class Contact + { + /// + /// 获取或设置超级管理员类型。 + /// + [Newtonsoft.Json.JsonProperty("contact_type")] + [System.Text.Json.Serialization.JsonPropertyName("contact_type")] + public string ContactType { get; set; } = string.Empty; + + /// + /// 获取或设置超级管理员姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("contact_name")] + [System.Text.Json.Serialization.JsonPropertyName("contact_name")] + public string ContactNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置联系人手机号(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("mobile_phone")] + [System.Text.Json.Serialization.JsonPropertyName("mobile_phone")] + public string ContactMobileEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置超级管理员身份证号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("contact_id_card_number")] + [System.Text.Json.Serialization.JsonPropertyName("contact_id_card_number")] + public string ContactIdCardNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置联系邮箱(需使用微信支付平台公钥加密)。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("contact_email")] + [System.Text.Json.Serialization.JsonPropertyName("contact_email")] + public string ContactEmailEncryptedData { get; set; } = string.Empty; + } + + public class BankAccount + { + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonProperty("bank_account_type")] + [System.Text.Json.Serialization.JsonPropertyName("bank_account_type")] + public string AccountType { get; set; } = string.Empty; + + /// + /// 获取或设置开户名称(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("account_name")] + [System.Text.Json.Serialization.JsonPropertyName("account_name")] + public string AccountNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置银行账号(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("account_number")] + [System.Text.Json.Serialization.JsonPropertyName("account_number")] + public string AccountNumberEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行。 + /// + [Newtonsoft.Json.JsonProperty("account_bank")] + [System.Text.Json.Serialization.JsonPropertyName("account_bank")] + public string AccountBank { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行省市编码。 + /// + [Newtonsoft.Json.JsonProperty("bank_address_code")] + [System.Text.Json.Serialization.JsonPropertyName("bank_address_code")] + public string BankAddressCode { get; set; } = string.Empty; + + /// + /// 获取或设置开户银行联行号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("bank_branch_id")] + [System.Text.Json.Serialization.JsonPropertyName("bank_branch_id")] + public string? BankBranchId { get; set; } + + /// + /// 获取或设置开户开户银行全称(含支行)。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("bank_name")] + [System.Text.Json.Serialization.JsonPropertyName("bank_name")] + public string? BankBranchName { get; set; } + } + + public class SaleScene + { + /// + /// 获取或设置店铺名称。 + /// + [Newtonsoft.Json.JsonProperty("store_name")] + [System.Text.Json.Serialization.JsonPropertyName("store_name")] + public string StoreName { get; set; } = string.Empty; + + /// + /// 获取或设置店铺链接。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("store_url")] + [System.Text.Json.Serialization.JsonPropertyName("store_url")] + public string? StoreUrl { get; set; } + + /// + /// 获取或设置店铺二维码媒体文件标识 ID。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("store_qr_code")] + [System.Text.Json.Serialization.JsonPropertyName("store_qr_code")] + public string? StoreQrcodeMediaId { get; set; } + + /// + /// 获取或设置子商户小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_program_sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program_sub_appid")] + public string? MiniProgramSubAppId { get; set; } + } + } + + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置主体类型。 + /// + [Newtonsoft.Json.JsonProperty("organization_type")] + [System.Text.Json.Serialization.JsonPropertyName("organization_type")] + public string SubjectType { get; set; } = string.Empty; + + /// + /// 获取或设置营业执照信息。 + /// + [Newtonsoft.Json.JsonProperty("business_license_info")] + [System.Text.Json.Serialization.JsonPropertyName("business_license_info")] + public Types.BusinessLicense? BusinessLicense { get; set; } + + /// + /// 获取或设置组织机构代码证信息。 + /// + [Newtonsoft.Json.JsonProperty("organization_cert_info")] + [System.Text.Json.Serialization.JsonPropertyName("organization_cert_info")] + public Types.OrganizationCertificate? OrganizationCertificate { get; set; } + + /// + /// 获取或设置法人证件类型。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_type")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_type")] + public string IdentityType { get; set; } = string.Empty; + + /// + /// 获取或设置身份证信息。 + /// + [Newtonsoft.Json.JsonProperty("id_card_info")] + [System.Text.Json.Serialization.JsonPropertyName("id_card_info")] + public Types.IdCard? IdCard { get; set; } + + /// + /// 获取或设置其他类型证件信息。 + /// + [Newtonsoft.Json.JsonProperty("id_doc_info")] + [System.Text.Json.Serialization.JsonPropertyName("id_doc_info")] + public Types.IdDocument? IdDocument { get; set; } + + /// + /// 获取或设置是否填写结算银行账户。 + /// + [Newtonsoft.Json.JsonProperty("need_account_info")] + [System.Text.Json.Serialization.JsonPropertyName("need_account_info")] + public bool RequireBankAccount { get; set; } + + /// + /// 获取或设置结算银行账户信息。 + /// + [Newtonsoft.Json.JsonProperty("account_info")] + [System.Text.Json.Serialization.JsonPropertyName("account_info")] + public Types.BankAccount BankAccount { get; set; } = new Types.BankAccount(); + + /// + /// 获取或设置超级管理员信息。 + /// + [Newtonsoft.Json.JsonProperty("contact_info")] + [System.Text.Json.Serialization.JsonPropertyName("contact_info")] + public Types.Contact Contact { get; set; } = new Types.Contact(); + + /// + /// 获取或设置销售场景信息。 + /// + [Newtonsoft.Json.JsonProperty("sales_scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("sales_scene_info")] + public Types.SaleScene SaleScene { get; set; } = new Types.SaleScene(); + + /// + /// 获取或设置商户简称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_shortname")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_shortname")] + public string MerchantShortName { get; set; } = string.Empty; + + /// + /// 获取或设置特殊资质图片媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("qualifications")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringTypedStringIListConverter))] + [System.Text.Json.Serialization.JsonPropertyName("qualifications")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedStringIListConverter))] + public IList? QualificationPictureMediaIdList { get; set; } + + /// + /// 获取或设置补充材料媒体文件标识 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("business_addition_pics")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringTypedStringIListConverter))] + [System.Text.Json.Serialization.JsonPropertyName("business_addition_pics")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedStringIListConverter))] + public IList? BusinessAdditionPictureMediaIdList { get; set; } + + /// + /// 获取或设置补充说明。 + /// + [Newtonsoft.Json.JsonProperty("business_addition_desc")] + [System.Text.Json.Serialization.JsonPropertyName("business_addition_desc")] + public string? BusinessAdditionDescription { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentResponse.cs new file mode 100644 index 00000000..f41f60be --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/CreateEcommerceApplymentResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/applyments 接口的响应。 + /// + public class CreateEcommerceApplymentResponse : WechatTenpayResponse + { + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonProperty("applyment_id")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_id")] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.cs new file mode 100644 index 00000000..3fa72bf7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/applyments/{applyment_id} 接口的请求。 + /// + public class GetEcommerceApplymentByApplymentIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public long ApplymentId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.cs new file mode 100644 index 00000000..5bd1be29 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/applyments/{applyment_id} 接口的响应。 + /// + public class GetEcommerceApplymentByApplymentIdResponse : GetEcommerceApplymentByOutRequestNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.cs new file mode 100644 index 00000000..4e3a2918 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/applyments/out-request-no/{out_request_no} 接口的请求。 + /// + public class GetEcommerceApplymentByOutRequestNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs new file mode 100644 index 00000000..f6d3ed91 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/applyments/out-request-no/{out_request_no} 接口的响应。 + /// + public class GetEcommerceApplymentByOutRequestNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class AccountValidation + { + /// + /// 获取或设置付款户名(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("account_name")] + [System.Text.Json.Serialization.JsonPropertyName("account_name")] + public string AccountNameEncryptedData { get; set; } = default!; + + /// + /// 获取或设置付款卡号(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("account_no")] + [System.Text.Json.Serialization.JsonPropertyName("account_no")] + public string? AccountNumberEncryptedData { get; set; } + + /// + /// 获取或设置汇款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pay_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pay_amount")] + public int PayAmount { get; set; } + + /// + /// 获取或设置收款户名。 + /// + [Newtonsoft.Json.JsonProperty("destination_account_name")] + [System.Text.Json.Serialization.JsonPropertyName("destination_account_name")] + public string DestinationAccountName { get; set; } = default!; + + /// + /// 获取或设置收款卡号。 + /// + [Newtonsoft.Json.JsonProperty("destination_account_number")] + [System.Text.Json.Serialization.JsonPropertyName("destination_account_number")] + public string DestinationAccountNumber { get; set; } = default!; + + /// + /// 获取或设置收款开户银行。 + /// + [Newtonsoft.Json.JsonProperty("destination_account_bank")] + [System.Text.Json.Serialization.JsonPropertyName("destination_account_bank")] + public string DestinationAccountBank { get; set; } = default!; + + /// + /// 获取或设置收款省市信息。 + /// + [Newtonsoft.Json.JsonProperty("city")] + [System.Text.Json.Serialization.JsonPropertyName("city")] + public string DestinationAccountCity { get; set; } = default!; + + /// + /// 获取或设置备注信息。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string Remark { get; set; } = default!; + + /// + /// 获取或设置汇款截止时间。 + /// + [Newtonsoft.Json.JsonProperty("deadline")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("deadline")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonDateTimeOffsetConverter))] + public DateTimeOffset Deadline { get; set; } + } + + public class AuditDetail + { + /// + /// 获取或设置参数名称。 + /// + [Newtonsoft.Json.JsonProperty("param_name")] + [System.Text.Json.Serialization.JsonPropertyName("param_name")] + public string ParameterName { get; set; } = default!; + + /// + /// 获取或设置驳回原因。 + /// + [Newtonsoft.Json.JsonProperty("reject_reason")] + [System.Text.Json.Serialization.JsonPropertyName("reject_reason")] + public string RejectReason { get; set; } = default!; + } + } + + /// + /// 获取或设置业务申请编号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置申请单编号。 + /// + [Newtonsoft.Json.JsonProperty("applyment_id")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_id")] + public long ApplymentId { get; set; } + + /// + /// 获取或设置申请单状态。 + /// + [Newtonsoft.Json.JsonProperty("applyment_state")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_state")] + public string ApplymentState { get; set; } = default!; + + /// + /// 获取或设置申请单状态描述。 + /// + [Newtonsoft.Json.JsonProperty("applyment_state_desc")] + [System.Text.Json.Serialization.JsonPropertyName("applyment_state_desc")] + public string ApplymentStateDescription { get; set; } = default!; + + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置签约状态。 + /// + [Newtonsoft.Json.JsonProperty("sign_state")] + [System.Text.Json.Serialization.JsonPropertyName("sign_state")] + public string? SignState { get; set; } + + /// + /// 获取或设置超级管理员签约链接。 + /// + [Newtonsoft.Json.JsonProperty("sign_url")] + [System.Text.Json.Serialization.JsonPropertyName("sign_url")] + public string? SignUrl { get; set; } + + /// + /// 获取或设置汇款账户验证信息。 + /// + [Newtonsoft.Json.JsonProperty("account_validation")] + [System.Text.Json.Serialization.JsonPropertyName("account_validation")] + public Types.AccountValidation? AccountValidation { get; set; } + + /// + /// 获取或设置法人验证链接。 + /// + [Newtonsoft.Json.JsonProperty("legal_validation_url")] + [System.Text.Json.Serialization.JsonPropertyName("legal_validation_url")] + public string? LegalPersonValidationUrl { get; set; } + + /// + /// 获取或设置驳回原因详情列表。 + /// + [Newtonsoft.Json.JsonProperty("audit_detail")] + [System.Text.Json.Serialization.JsonPropertyName("audit_detail")] + public Types.AuditDetail[]? AuditList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillRequest.cs new file mode 100644 index 00000000..87ea5af1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/bill/fundflowbill 接口的请求。 + /// + public class GetEcommerceBillFundflowBillRequest : WechatTenpayRequest + { + /// + /// 获取或设置账单日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BillDateString { get; set; } = string.Empty; + + /// + /// 获取或设置资金账户类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AccountType { get; set; } = "ALL"; + + /// + /// 获取或设置压缩类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? TarType { get; set; } + + /// + /// 获取或设置加密算法。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string Algorithm { get; set; } = Constants.EncryptionAlgorithms.AEAD_AES_256_GCM; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs new file mode 100644 index 00000000..0de4dcfc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceBill/GetEcommerceBillFundflowBillResponse.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/bill/fundflowbill 接口的响应。 + /// + public class GetEcommerceBillFundflowBillResponse : WechatTenpayResponse + { + public static class Types + { + public class DownloadBill + { + /// + /// 获取或设置账单文件序号。 + /// + [Newtonsoft.Json.JsonProperty("bill_sequence")] + [System.Text.Json.Serialization.JsonPropertyName("bill_sequence")] + public int BillSequence { get; set; } + + /// + /// 获取或设置哈希类型。 + /// + [Newtonsoft.Json.JsonProperty("hash_type")] + [System.Text.Json.Serialization.JsonPropertyName("hash_type")] + public string HashType { get; set; } = default!; + + /// + /// 获取或设置哈希值。 + /// + [Newtonsoft.Json.JsonProperty("hash_value")] + [System.Text.Json.Serialization.JsonPropertyName("hash_value")] + public string HashValue { get; set; } = default!; + + /// + /// 获取或设置账单下载地址。 + /// + [Newtonsoft.Json.JsonProperty("download_url")] + [System.Text.Json.Serialization.JsonPropertyName("download_url")] + public string DownloadUrl { get; set; } = default!; + + /// + /// 获取或设置账单加密密钥(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("encrypt_key")] + [System.Text.Json.Serialization.JsonPropertyName("encrypt_key")] + public string EncryptKeyEncryptedData { get; set; } = default!; + + /// + /// 获取或设置账单加密使用的随机字符串。 + /// + [Newtonsoft.Json.JsonProperty("nonce")] + [System.Text.Json.Serialization.JsonPropertyName("nonce")] + public string Nonce { get; set; } = default!; + } + } + + /// + /// 获取或设置下载信息总数。 + /// + [Newtonsoft.Json.JsonProperty("download_bill_count")] + [System.Text.Json.Serialization.JsonPropertyName("download_bill_count")] + public int DownloadBillCount { get; set; } + + /// + /// 获取或设置下载信息明细列表。 + /// + [Newtonsoft.Json.JsonProperty("download_bill_list")] + [System.Text.Json.Serialization.JsonPropertyName("download_bill_list")] + public Types.DownloadBill[] DownloadBillList { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceRequest.cs new file mode 100644 index 00000000..f358f37b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/balance/{sub_mchid} 接口的请求。 + /// + public class GetEcommerceFundBalanceRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? AccountType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceResponse.cs new file mode 100644 index 00000000..2f5a7ebf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundBalanceResponse.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/balance/{sub_mchid} 接口的响应。 + /// + public class GetEcommerceFundBalanceResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonProperty("account_type")] + [System.Text.Json.Serialization.JsonPropertyName("account_type")] + public string? AccountType { get; set; } + + /// + /// 获取或设置可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("available_amount")] + [System.Text.Json.Serialization.JsonPropertyName("available_amount")] + public long AvailableAmount { get; set; } + + /// + /// 获取或设置不可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pending_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pending_amount")] + public long PendingAmount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.cs new file mode 100644 index 00000000..cd3a8eef --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/enddaybalance/{sub_mchid} 接口的请求。 + /// + public class GetEcommerceFundDayendBalanceRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string DateString { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.cs new file mode 100644 index 00000000..941b5bf9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/enddaybalance/{sub_mchid} 接口的响应。 + /// + public class GetEcommerceFundDayendBalanceResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("available_amount")] + [System.Text.Json.Serialization.JsonPropertyName("available_amount")] + public long AvailableAmount { get; set; } + + /// + /// 获取或设置不可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pending_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pending_amount")] + public long PendingAmount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.cs new file mode 100644 index 00000000..e504d414 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/fund/withdraw 接口的请求。 + /// + public class CreateEcommerceFundWithdrawRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置提现金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置提现备注。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + + /// + /// 获取或设置银行附言。 + /// + [Newtonsoft.Json.JsonProperty("bank_memo")] + [System.Text.Json.Serialization.JsonPropertyName("bank_memo")] + public string? BankMemo { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.cs new file mode 100644 index 00000000..d501074f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/fund/withdraw 接口的响应。 + /// + public class CreateEcommerceFundWithdrawResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付提现单号。 + /// + [Newtonsoft.Json.JsonProperty("withdraw_id")] + [System.Text.Json.Serialization.JsonPropertyName("withdraw_id")] + public string WithdrawId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.cs new file mode 100644 index 00000000..38b57189 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/withdraw/out-request-no/{out_request_no} 接口的请求。 + /// + public class GetEcommerceFundWithdrawByOutRequestNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.cs new file mode 100644 index 00000000..cd094737 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/withdraw/out-request-no/{out_request_no} 接口的响应。 + /// + public class GetEcommerceFundWithdrawByOutRequestNumberResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付提现单号。 + /// + [Newtonsoft.Json.JsonProperty("withdraw_id")] + [System.Text.Json.Serialization.JsonPropertyName("withdraw_id")] + public string WithdrawId { get; set; } = default!; + + /// + /// 获取或设置提现单状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置提现金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置提现备注。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + + /// + /// 获取或设置提现备注。 + /// + [Newtonsoft.Json.JsonProperty("bank_memo")] + [System.Text.Json.Serialization.JsonPropertyName("bank_memo")] + public string? BankMemo { get; set; } + + /// + /// 获取或设置失败原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置发起提现时间。 + /// + [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("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/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.cs new file mode 100644 index 00000000..c40ea442 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/withdraw/{withdraw_id} 接口的请求。 + /// + public class GetEcommerceFundWithdrawByWithdrawIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付提现单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WithdrawId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.cs new file mode 100644 index 00000000..5ad48732 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/fund/withdraw/{withdraw_id} 接口的响应。 + /// + public class GetEcommerceFundWithdrawByWithdrawIdResponse : GetEcommerceFundWithdrawByOutRequestNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.cs new file mode 100644 index 00000000..257fa14b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/orders/{transaction_id}/amounts 接口的请求。 + /// + public class GetEcommerceProfitSharingOrderAmountsRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string TransactionId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.cs new file mode 100644 index 00000000..f743b970 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/orders/{transaction_id}/amounts 接口的响应。 + /// + public class GetEcommerceProfitSharingOrderAmountsResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置订单剩余待分金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unsplit_amount")] + [System.Text.Json.Serialization.JsonPropertyName("unsplit_amount")] + public int UnsplitAmount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs new file mode 100644 index 00000000..7924bf26 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/profitsharing/orders 接口的请求。 + /// + public class CreateEcommerceProfitSharingOrderRequest : WechatTenpayRequest + { + public static class Types + { + public class Receiver + { + /// + /// 获取或设置分账接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置分账接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("receiver_account")] + [System.Text.Json.Serialization.JsonPropertyName("receiver_account")] + public string Account { get; set; } = string.Empty; + + /// + /// 获取或设置分账个人姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("receiver_name")] + [System.Text.Json.Serialization.JsonPropertyName("receiver_name")] + public string? NameEncryptedData { get; set; } + + /// + /// 获取或设置分账金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置分账描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { 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("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置分账接收方列表。 + /// + [Newtonsoft.Json.JsonProperty("receivers")] + [System.Text.Json.Serialization.JsonPropertyName("receivers")] + public IList ReceiverList { get; set; } = new List(); + + /// + /// 获取或设置是否分账完成。 + /// + [Newtonsoft.Json.JsonProperty("finish")] + [System.Text.Json.Serialization.JsonPropertyName("finish")] + public bool IsFinish { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.cs new file mode 100644 index 00000000..5f9ba4bd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/profitsharing/orders 接口的响应。 + /// + public class CreateEcommerceProfitSharingOrderResponse : WechatTenpayResponse + { + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.cs new file mode 100644 index 00000000..33d894a4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/profitsharing/returnorders 接口的请求。 + /// + public class CreateEcommerceProfitSharingReturnOrderRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string? OutOrderNumber { get; set; } + + /// + /// 获取或设置微信分账单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string? OrderId { get; set; } + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonProperty("out_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_return_no")] + public string OutReturnNumber { get; set; } = string.Empty; + + /// + /// 获取或设置回退商户号。 + /// + [Newtonsoft.Json.JsonProperty("return_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("return_mchid")] + public string ReturnMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置回退描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.cs new file mode 100644 index 00000000..36f7b13a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/profitsharing/returnorders 接口的响应。 + /// + public class CreateEcommerceProfitSharingReturnOrderResponse : GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.cs new file mode 100644 index 00000000..c4e62c22 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/orders 接口的请求。 + /// + public class GetEcommerceProfitSharingOrderByOutOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [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 OutOrderNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.cs new file mode 100644 index 00000000..0be3b7bc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/orders 接口的响应。 + /// + public class GetEcommerceProfitSharingOrderByOutOrderNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Receiver + { + /// + /// 获取或设置分账接收商户号。 + /// + [Newtonsoft.Json.JsonProperty("receiver_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("receiver_mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置分账接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置分账接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("receiver_account")] + [System.Text.Json.Serialization.JsonPropertyName("receiver_account")] + public string Account { get; set; } = default!; + + /// + /// 获取或设置分账金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置分账描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置分账结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置分账失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置分账完成时间。 + /// + [Newtonsoft.Json.JsonProperty("finish_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("finish_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? FinishTime { get; set; } + } + } + + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置分账单状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置分账接收方列表。 + /// + [Newtonsoft.Json.JsonProperty("receivers")] + [System.Text.Json.Serialization.JsonPropertyName("receivers")] + public Types.Receiver[]? ReceiverList { get; set; } + + /// + /// 获取或设置分账完结金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("finish_amount")] + [System.Text.Json.Serialization.JsonPropertyName("finish_amount")] + public int? FinishAmount { get; set; } + + /// + /// 获取或设置分账完结描述。 + /// + [Newtonsoft.Json.JsonProperty("finish_description")] + [System.Text.Json.Serialization.JsonPropertyName("finish_description")] + public string? FinishDescription { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.cs new file mode 100644 index 00000000..244dcdf6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/returnorders 接口的请求。 + /// + public class GetEcommerceProfitSharingReturnOrderByOrderIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OrderId { get; set; } = string.Empty; + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutReturnNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.cs new file mode 100644 index 00000000..0d1361e6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/returnorders 接口的响应。 + /// + public class GetEcommerceProfitSharingReturnOrderByOrderIdResponse : GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.cs new file mode 100644 index 00000000..eb95f864 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/returnorders 接口的请求。 + /// + public class GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutReturnNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.cs new file mode 100644 index 00000000..d9273c9e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/returnorders 接口的响应。 + /// + public class GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置商户回退单号。 + /// + [Newtonsoft.Json.JsonProperty("out_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_return_no")] + public string OutReturnNumber { get; set; } = default!; + + /// + /// 获取或设置微信回退单号。 + /// + [Newtonsoft.Json.JsonProperty("return_no")] + [System.Text.Json.Serialization.JsonPropertyName("return_no")] + public string ReturnId { get; set; } = default!; + + /// + /// 获取或设置回退商户号。 + /// + [Newtonsoft.Json.JsonProperty("return_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("return_mchid")] + public string ReturnMerchantId { get; set; } = default!; + + /// + /// 获取或设置回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置回退结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置回退失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置回退完成时间。 + /// + [Newtonsoft.Json.JsonProperty("finish_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("finish_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? FinishTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs new file mode 100644 index 00000000..41b4157c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/receivers/add 接口的请求。 + /// + public class AddEcommerceProfitSharingReceiverRequest : WechatTenpayRequest + { + /// + /// 获取或设置电商平台 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = string.Empty; + + /// + /// 获取或设置接收方商户全称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// 获取或设置接收方个人姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("encrypted_name")] + [System.Text.Json.Serialization.JsonPropertyName("encrypted_name")] + public string? NameEncryptedData { get; set; } + + /// + /// 获取或设置与分账方的关系类型。 + /// + [Newtonsoft.Json.JsonProperty("relation_type")] + [System.Text.Json.Serialization.JsonPropertyName("relation_type")] + public string RelationType { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.cs new file mode 100644 index 00000000..96e6fef0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/receivers/add 接口的响应。 + /// + public class AddEcommerceProfitSharingReceiverResponse : WechatTenpayResponse + { + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.cs new file mode 100644 index 00000000..1515f2aa --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/receivers/delete 接口的请求。 + /// + public class DeleteEcommerceProfitSharingReceiverRequest : WechatTenpayRequest + { + /// + /// 获取或设置电商平台 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.cs new file mode 100644 index 00000000..be555726 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/profitsharing/receivers/delete 接口的响应。 + /// + public class DeleteEcommerceProfitSharingReceiverResponse : WechatTenpayResponse + { + /// + /// 获取或设置接收方类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置接收方账户。 + /// + [Newtonsoft.Json.JsonProperty("account")] + [System.Text.Json.Serialization.JsonPropertyName("account")] + public string Account { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.cs new file mode 100644 index 00000000..f6737aa2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/profitsharing/finish-order 接口的请求。 + /// + public class SetEcommerceProfitSharingOrderFinishRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置分账描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.cs new file mode 100644 index 00000000..79bbc1bb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/profitsharing/finish-order 接口的响应。 + /// + public class SetEcommerceProfitSharingOrderFinishResponse : WechatTenpayResponse + { + /// + /// 获取或设置二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户分账单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信分账单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundRequest.cs new file mode 100644 index 00000000..6a806bc8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundRequest.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/refunds/apply 接口的请求。 + /// + public class CreateEcommerceRefundRequest : WechatTenpayRequest + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置原订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund")] + [System.Text.Json.Serialization.JsonPropertyName("refund")] + public int Refund { get; set; } + + /// + /// 获取或设置退款币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = default!; + } + } + + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置电商平台 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置二级商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置商户订单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置微信订单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + + /// + /// 获取或设置商户退款单号。 + /// + [Newtonsoft.Json.JsonProperty("out_refund_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_refund_no")] + public string OutRefundNumber { get; set; } = string.Empty; + + /// + /// 获取或设置退款原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string Reason { get; set; } = string.Empty; + + /// + /// 获取或设置订单金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = new Types.Amount(); + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置退款出资账户。 + /// + [Newtonsoft.Json.JsonProperty("refund_account")] + [System.Text.Json.Serialization.JsonPropertyName("refund_account")] + public string? RefundAccount { get; set; } + + /// + /// 获取或设置资金账户。 + /// + [Newtonsoft.Json.JsonProperty("funds_account")] + [System.Text.Json.Serialization.JsonPropertyName("funds_account")] + public string? FundsAccount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundResponse.cs new file mode 100644 index 00000000..20d4ec64 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/CreateEcommerceRefundResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/refunds/apply 接口的响应。 + /// + public class CreateEcommerceRefundResponse : GetEcommerceRefundByOutRefundNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.cs new file mode 100644 index 00000000..a44334b5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/refunds/out-refund-no/{out_refund_no} 接口的请求。 + /// + public class GetEcommerceRefundByOutRefundNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置商户退款单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutRefundNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.cs new file mode 100644 index 00000000..43d5e2e6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/refunds/out-refund-no/{out_refund_no} 接口的响应。 + /// + public class GetEcommerceRefundByOutRefundNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund")] + [System.Text.Json.Serialization.JsonPropertyName("refund")] + public int Refund { get; set; } + + /// + /// 获取或设置用户退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("payer_refund")] + [System.Text.Json.Serialization.JsonPropertyName("payer_refund")] + public int PayerRefund { get; set; } + + /// + /// 获取或设置优惠退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("discount_refund")] + [System.Text.Json.Serialization.JsonPropertyName("discount_refund")] + public int DiscountRefund { get; set; } + + /// + /// 获取或设置退款币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = default!; + } + + public class Promotion + { + /// + /// 获取或设置券 ID。 + /// + [Newtonsoft.Json.JsonProperty("promotion_id")] + [System.Text.Json.Serialization.JsonPropertyName("promotion_id")] + public string PromotionId { get; set; } = default!; + + /// + /// 获取或设置优惠范围。 + /// + [Newtonsoft.Json.JsonProperty("scope")] + [System.Text.Json.Serialization.JsonPropertyName("scope")] + public string Scope { get; set; } = default!; + + /// + /// 获取或设置优惠类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置优惠券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_amount")] + [System.Text.Json.Serialization.JsonPropertyName("refund_amount")] + public int RefundAmount { get; set; } + } + } + + /// + /// 获取或设置商户退款单号。 + /// + [Newtonsoft.Json.JsonProperty("out_refund_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_refund_no")] + public string OutRefundNumber { get; set; } = default!; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { 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("channel")] + [System.Text.Json.Serialization.JsonPropertyName("channel")] + public string Channel { get; set; } = default!; + + /// + /// 获取或设置退款状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置退款金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + + /// + /// 获取或设置优惠退款信息。 + /// + [Newtonsoft.Json.JsonProperty("promotion_detail")] + [System.Text.Json.Serialization.JsonPropertyName("promotion_detail")] + public Types.Promotion[]? PromotionList { get; set; } + + /// + /// 获取或设置退款入账账户。 + /// + [Newtonsoft.Json.JsonProperty("user_received_account")] + [System.Text.Json.Serialization.JsonPropertyName("user_received_account")] + public string UserReceivedAccount { get; set; } = default!; + + /// + /// 获取或设置退款出资账户。 + /// + [Newtonsoft.Json.JsonProperty("refund_account")] + [System.Text.Json.Serialization.JsonPropertyName("refund_account")] + public string? RefundAccount { get; set; } + + /// + /// 获取或设置资金账户。 + /// + [Newtonsoft.Json.JsonProperty("funds_account")] + [System.Text.Json.Serialization.JsonPropertyName("funds_account")] + public string? FundsAccount { 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("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/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.cs new file mode 100644 index 00000000..cebe7adf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/refunds/id/{refund_id} 接口的请求。 + /// + public class GetEcommerceRefundByRefundIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string RefundId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.cs new file mode 100644 index 00000000..25ab9605 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/refunds/id/{refund_id} 接口的响应。 + /// + public class GetEcommerceRefundByRefundIdResponse : GetEcommerceRefundByOutRefundNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.cs new file mode 100644 index 00000000..616602f1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/refunds/{refund_id}/return-advance 接口的请求。 + /// + public class CreateEcommerceRefundReturnAdvanceRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string RefundId { get; set; } = string.Empty; + + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.cs new file mode 100644 index 00000000..f9a897de --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/refunds/{refund_id}/return-advance 接口的响应。 + /// + public class CreateEcommerceRefundReturnAdvanceResponse : GetEcommerceRefundReturnAdvanceResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.cs new file mode 100644 index 00000000..d38b5fa6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/refunds/{refund_id}/return-advance 接口的请求。 + /// + public class GetEcommerceRefundReturnAdvanceRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string RefundId { get; set; } = string.Empty; + + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.cs new file mode 100644 index 00000000..246b17bc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /ecommerce/refunds/{refund_id}/return-advance 接口的响应。 + /// + public class GetEcommerceRefundReturnAdvanceResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置微信回补单号。 + /// + [Newtonsoft.Json.JsonProperty("advance_return_id")] + [System.Text.Json.Serialization.JsonPropertyName("advance_return_id")] + public string AdvanceReturnId { get; set; } = default!; + + /// + /// 获取或设置垫付回补金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("return_amount")] + [System.Text.Json.Serialization.JsonPropertyName("return_amount")] + public int ReturnAmount { get; set; } + + /// + /// 获取或设置出款方商户号。 + /// + [Newtonsoft.Json.JsonProperty("payer_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("payer_mchid")] + public string PayerMerchantId { get; set; } = default!; + + /// + /// 获取或设置出款方账户。 + /// + [Newtonsoft.Json.JsonProperty("payer_account")] + [System.Text.Json.Serialization.JsonPropertyName("payer_account")] + public string PayerAccount { get; set; } = default!; + + /// + /// 获取或设置入账方商户号。 + /// + [Newtonsoft.Json.JsonProperty("payee_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("payee_mchid")] + public string PayeeMerchantId { get; set; } = default!; + + /// + /// 获取或设置入账方账户。 + /// + [Newtonsoft.Json.JsonProperty("payee_account")] + [System.Text.Json.Serialization.JsonPropertyName("payee_account")] + public string PayeeAccount { get; set; } = default!; + + /// + /// 获取或设置垫付回补结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置垫付回补完成时间。 + /// + [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; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyRequest.cs new file mode 100644 index 00000000..59e8c3f0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/subsidies/cancel 接口的请求。 + /// + public class CancelEcommerceSubsidyRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置取消补差描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyResponse.cs new file mode 100644 index 00000000..f25211c4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CancelEcommerceSubsidyResponse.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/subsidies/cancel 接口的响应。 + /// + public class CancelEcommerceSubsidyResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置取消补差描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置取消补差结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyRequest.cs new file mode 100644 index 00000000..972ff0b8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/subsidies/create 接口的请求。 + /// + public class CreateEcommerceSubsidyRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string? RefundId { get; set; } + + /// + /// 获取或设置商户补差单号。 + /// + [Newtonsoft.Json.JsonProperty("out_subsidy_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_subsidy_no")] + public string OutSubsidyNumber { get; set; } = string.Empty; + + /// + /// 获取或设置补差描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置补差金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyResponse.cs new file mode 100644 index 00000000..15d65b7f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyResponse.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/subsidies/create 接口的响应。 + /// + public class CreateEcommerceSubsidyResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置微信补差单号。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_id")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_id")] + public string SubsidyId { get; set; } = default!; + + /// + /// 获取或设置补差描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置补差金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置补差结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置补差完成时间。 + /// + [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; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.cs new file mode 100644 index 00000000..c0a9dd82 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/subsidies/return 接口的请求。 + /// + public class CreateEcommerceSubsidyReturnRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string? RefundId { get; set; } + + /// + /// 获取或设置商户补差回退单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutReturnNumber { get; set; } = string.Empty; + + /// + /// 获取或设置补差回退描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置补差回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.cs new file mode 100644 index 00000000..c7e089a4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /ecommerce/subsidies/return 接口的响应。 + /// + public class CreateEcommerceSubsidyReturnResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信二级商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置商户补差回退单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutReturnNumber { get; set; } = default!; + + /// + /// 获取或设置微信补差回退单号。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_refund_id")] + public string SubsidyReturnId { get; set; } = default!; + + /// + /// 获取或设置微信退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string? RefundId { get; set; } + + /// + /// 获取或设置补差回退描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置补差回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置补差回退结果。 + /// + [Newtonsoft.Json.JsonProperty("result")] + [System.Text.Json.Serialization.JsonPropertyName("result")] + public string Result { get; set; } = default!; + + /// + /// 获取或设置补差回退完成时间。 + /// + [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; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.cs new file mode 100644 index 00000000..2392ef51 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/changecustompagestatus 接口的请求。 + /// + public class ChangeGoldPlanCustomPageStatusRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置操作类型。 + /// + [Newtonsoft.Json.JsonProperty("operation_type")] + [System.Text.Json.Serialization.JsonPropertyName("operation_type")] + public string OperationType { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.cs new file mode 100644 index 00000000..94db35af --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/changecustompagestatus 接口的响应。 + /// + public class ChangeGoldPlanCustomPageStatusResponse : WechatTenpayResponse + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusRequest.cs new file mode 100644 index 00000000..69be33ab --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/changegoldplanstatus 接口的请求。 + /// + public class ChangeGoldPlanStatusRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置操作类型。 + /// + [Newtonsoft.Json.JsonProperty("operation_type")] + [System.Text.Json.Serialization.JsonPropertyName("operation_type")] + public string OperationType { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusResponse.cs new file mode 100644 index 00000000..3b96fa66 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/ChangeGoldPlanStatusResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/changegoldplanstatus 接口的响应。 + /// + public class ChangeGoldPlanStatusResponse : WechatTenpayResponse + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowRequest.cs new file mode 100644 index 00000000..c2814425 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/close-advertising-show 接口的请求。 + /// + public class CloseGoldPlanAdvertisingShowRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowResponse.cs new file mode 100644 index 00000000..49cf42c2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/CloseGoldPlanAdvertisingShowResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/close-advertising-show 接口的响应。 + /// + public class CloseGoldPlanAdvertisingShowResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowRequest.cs new file mode 100644 index 00000000..7d46f1c1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/open-advertising-show 接口的请求。 + /// + public class OpenGoldPlanAdvertisingShowRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置同业过滤标签值列表。 + /// + [Newtonsoft.Json.JsonProperty("advertising_industry_filters")] + [System.Text.Json.Serialization.JsonPropertyName("advertising_industry_filters")] + public IList? AdvertisingIndustryFilterList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowResponse.cs new file mode 100644 index 00000000..e1373189 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/OpenGoldPlanAdvertisingShowResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/open-advertising-show 接口的响应。 + /// + public class OpenGoldPlanAdvertisingShowResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.cs new file mode 100644 index 00000000..dcb89ee0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/set-advertising-industry-filter 接口的请求。 + /// + public class SetGoldPlanAdvertisingIndustryFilterRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置同业过滤标签值列表。 + /// + [Newtonsoft.Json.JsonProperty("advertising_industry_filters")] + [System.Text.Json.Serialization.JsonPropertyName("advertising_industry_filters")] + public IList AdvertisingIndustryFilterList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.cs new file mode 100644 index 00000000..0c410d0e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /goldplan/merchants/set-advertising-industry-filter 接口的响应。 + /// + public class SetGoldPlanAdvertisingIndustryFilterResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.cs new file mode 100644 index 00000000..10147e63 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/callbacks 接口的请求。 + /// + public class GetMarketingBusifavorCallbackRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? MerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.cs new file mode 100644 index 00000000..a8072d1a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/callbacks 接口的响应。 + /// + public class GetMarketingBusifavorCallbackResponse : WechatTenpayResponse + { + /// + /// 获取或设置商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.cs new file mode 100644 index 00000000..13d00d27 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/callbacks 接口的请求。 + /// + public class UpdateMarketingBusifavorCallbackRequest : WechatTenpayRequest + { + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = string.Empty; + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string? MerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.cs new file mode 100644 index 00000000..a938a855 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/callbacks 接口的响应。 + /// + public class UpdateMarketingBusifavorCallbackResponse : WechatTenpayResponse + { + /// + /// 获取或设置商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = default!; + + /// + /// 获取或设置修改时间。 + /// + [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/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.cs new file mode 100644 index 00000000..5f402531 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/associate 接口的请求。 + /// + public class AssociateMarketingBusifavorCouponRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { 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("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.cs new file mode 100644 index 00000000..1727dbdc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/associate 接口的响应。 + /// + public class AssociateMarketingBusifavorCouponResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信侧关联成功时间。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_associate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_associate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset WechatpayAssociateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.cs new file mode 100644 index 00000000..88d73b9b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/return 接口的请求。 + /// + public class CreateMarketingBusifavorCouponReturnRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = string.Empty; + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("return_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("return_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.cs new file mode 100644 index 00000000..549978f4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/return 接口的响应。 + /// + public class CreateMarketingBusifavorCouponReturnResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信侧退券时间。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_return_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_return_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset WechatpayReturnTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.cs new file mode 100644 index 00000000..6fc7bc21 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/deactivate 接口的请求。 + /// + public class DeactivateMarketingBusifavorCouponRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = string.Empty; + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("deactivate_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("deactivate_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置失效原因。 + /// + [Newtonsoft.Json.JsonProperty("deactivate_reason")] + [System.Text.Json.Serialization.JsonPropertyName("deactivate_reason")] + public string? Reason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.cs new file mode 100644 index 00000000..cbf83545 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/deactivate 接口的响应。 + /// + public class DeactivateMarketingBusifavorCouponResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信侧券失效时间。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_deactivate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_deactivate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset WechatpayDeactivateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.cs new file mode 100644 index 00000000..de2ae1ed --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/disassociate 接口的请求。 + /// + public class DisassociateMarketingBusifavorCouponRequest : AssociateMarketingBusifavorCouponRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.cs new file mode 100644 index 00000000..57d60e59 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/disassociate 接口的响应。 + /// + public class DisassociateMarketingBusifavorCouponResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信侧取消关联成功时间。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_disassociate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_disassociate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset WechatpayDisassociateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.cs new file mode 100644 index 00000000..b45bb44a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/{card_id}/send 接口的请求。 + /// + public class SendMarketingBusifavorCouponRequest : WechatTenpayRequest + { + /// + /// 获取或设置消费卡 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string CardId { get; set; } = string.Empty; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置商户单据号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置请求发卡时间。 + /// + [Newtonsoft.Json.JsonProperty("send_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("send_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset SendTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.cs new file mode 100644 index 00000000..10566c0d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/{card_id}/send 接口的响应。 + /// + public class SendMarketingBusifavorCouponResponse : WechatTenpayResponse + { + /// + /// 获取或设置消费卡 Code。 + /// + [Newtonsoft.Json.JsonProperty("card_code")] + [System.Text.Json.Serialization.JsonPropertyName("card_code")] + public string CardCode { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.cs new file mode 100644 index 00000000..82de54bf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/use 接口的请求。 + /// + public class SetMarketingBusifavorCouponUsedRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = string.Empty; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置核销请求单据号。 + /// + [Newtonsoft.Json.JsonProperty("use_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("use_request_no")] + public string UseOutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置核销请求时间。 + /// + [Newtonsoft.Json.JsonProperty("use_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("use_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset UseTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.cs new file mode 100644 index 00000000..e7291696 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/coupons/use 接口的响应。 + /// + public class SetMarketingBusifavorCouponUsedResponse : WechatTenpayResponse + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置微信侧核销券成功的时间。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_use_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_use_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset WechatpayUseTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockRequest.cs new file mode 100644 index 00000000..e2c00a53 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockRequest.cs @@ -0,0 +1,493 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/stocks 接口的请求。 + /// + public class CreateMarketingBusifavorStockRequest : WechatTenpayRequest + { + public static class Types + { + public class StockSendRule + { + /// + /// 获取或设置发放总上限。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons")] + public int MaxCoupons { get; set; } + + /// + /// 获取或设置单个用户可领个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_per_user")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_per_user")] + public int MaxCouponsPerUser { get; set; } + + /// + /// 获取或设置单天发放上限个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_by_day")] + public int? MaxCouponsPerDay { get; set; } + + /// + /// 获取或设置是否开启自然人限制。 + /// + [Newtonsoft.Json.JsonProperty("natural_person_limit")] + [System.Text.Json.Serialization.JsonPropertyName("natural_person_limit")] + public bool? IsNaturalPersonLimit { get; set; } + + /// + /// 获取或设置是否开启防刷拦截。 + /// + [Newtonsoft.Json.JsonProperty("prevent_api_abuse")] + [System.Text.Json.Serialization.JsonPropertyName("prevent_api_abuse")] + public bool? IsPreventApiAbuse { get; set; } + + /// + /// 获取或设置是否允许转赠。 + /// + [Newtonsoft.Json.JsonProperty("transferable")] + [System.Text.Json.Serialization.JsonPropertyName("transferable")] + public bool? IsTransferable { get; set; } + + /// + /// 获取或设置是否允许分享链接。 + /// + [Newtonsoft.Json.JsonProperty("shareable")] + [System.Text.Json.Serialization.JsonPropertyName("shareable")] + public bool? IsShareable { get; set; } + } + + public class CouponUseRule + { + public static class Types + { + public class CouponAvailableTime + { + public static class Types + { + public class AvailableWeek + { + public static class Types + { + public class AvailableTimeRange + { + /// + /// 获取或设置当天开始时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + public int? BeginTimeSeconds { get; set; } + + /// + /// 获取或设置当天结束时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + public int? EndTimeSeconds { get; set; } + } + } + + /// + /// 获取或设置可用星期数。 + /// + [Newtonsoft.Json.JsonProperty("week_day")] + [System.Text.Json.Serialization.JsonPropertyName("week_day")] + public IList WeekDayList { get; set; } = new List(); + + /// + /// 获取或设置当天可用时间段。 + /// + [Newtonsoft.Json.JsonProperty("available_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("available_day_time")] + public IList? AvailableTimeRangeList { get; set; } + } + + public class AvailableTime + { + /// + /// 获取或设置开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? BeginTime { get; set; } + + /// + /// 获取或设置结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + } + } + + /// + /// 获取或设置批次开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置批次结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置固定周期有效时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("available_week")] + [System.Text.Json.Serialization.JsonPropertyName("available_week")] + public Types.AvailableWeek? AvailableWeek { get; set; } + + /// + /// 获取或设置无规律的有效时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("irregulary_avaliable_time")] + [System.Text.Json.Serialization.JsonPropertyName("irregulary_avaliable_time")] + public IList? IrregularyAvailableTimeList { get; set; } + + /// + /// 获取或设置生效后 N 天内有效。 + /// + [Newtonsoft.Json.JsonProperty("available_day_after_receive")] + [System.Text.Json.Serialization.JsonPropertyName("available_day_after_receive")] + public int? AvailableDaysAfterReceive { get; set; } + + /// + /// 获取或设置领取后 N 天开始生效。 + /// + [Newtonsoft.Json.JsonProperty("wait_days_after_receive")] + [System.Text.Json.Serialization.JsonPropertyName("wait_days_after_receive")] + public int? WaitDaysAfterReceive { get; set; } + } + + public class NormalCoupon + { + /// + /// 获取或设置优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("discount_amount")] + [System.Text.Json.Serialization.JsonPropertyName("discount_amount")] + public int DiscountAmount { get; set; } + + /// + /// 获取或设置消费门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + + public class DiscountCoupon + { + /// + /// 获取或设置折扣比例(范围:1~99)。 + /// + [Newtonsoft.Json.JsonProperty("discount_percent")] + [System.Text.Json.Serialization.JsonPropertyName("discount_percent")] + public int DiscountPercent { get; set; } + + /// + /// 获取或设置消费门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + + public class ExchangeCoupon + { + /// + /// 获取或单品换购价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("exchange_price")] + [System.Text.Json.Serialization.JsonPropertyName("exchange_price")] + public int ExchangePrice { get; set; } + + /// + /// 获取或设置消费门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + } + + /// + /// 获取或设置券生效时间信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_available_time")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_available_time")] + public Types.CouponAvailableTime? CouponAvailableTime { get; set; } + + /// + /// 获取或设置固定面额满减券使用规则信息。与字段 三选一。 + /// + [Newtonsoft.Json.JsonProperty("fixed_normal_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("fixed_normal_coupon")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置折扣券使用规则信息。与字段 三选一。 + /// + [Newtonsoft.Json.JsonProperty("discount_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("discount_coupon")] + public Types.DiscountCoupon? DiscountCoupon { get; set; } + + /// + /// 获取或设置换购券使用规则信息。与字段 三选一。 + /// + [Newtonsoft.Json.JsonProperty("exchange_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("exchange_coupon")] + public Types.ExchangeCoupon? ExchangeCoupon { get; set; } + + /// + /// 获取或设置核销方式。 + /// + [Newtonsoft.Json.JsonProperty("use_method")] + [System.Text.Json.Serialization.JsonPropertyName("use_method")] + public string UseMethod { get; set; } = string.Empty; + + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string? MiniProgramPath { get; set; } + } + + public class Entrance + { + public static class Types + { + public class MiniProgram + { + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string Path { get; set; } = string.Empty; + + /// + /// 获取或设置入口文案。 + /// + [Newtonsoft.Json.JsonProperty("entrance_words")] + [System.Text.Json.Serialization.JsonPropertyName("entrance_words")] + public string EntranceWords { get; set; } = string.Empty; + + /// + /// 获取或设置引导文案。 + /// + [Newtonsoft.Json.JsonProperty("guiding_words")] + [System.Text.Json.Serialization.JsonPropertyName("guiding_words")] + public string? GuidingWords { get; set; } + } + } + + /// + /// 获取或设置商家小程序入口信息。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_info")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_info")] + public Types.MiniProgram? MiniProgram { get; set; } + + /// + /// 获取或设置商家公众号 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置营销馆 ID。 + /// + [Newtonsoft.Json.JsonProperty("hall_id")] + [System.Text.Json.Serialization.JsonPropertyName("hall_id")] + public string? HallId { get; set; } + + /// + /// 获取或设置可用门店 ID。 + /// + [Newtonsoft.Json.JsonProperty("store_id")] + [System.Text.Json.Serialization.JsonPropertyName("store_id")] + public string? StoreId { get; set; } + + /// + /// 获取或设置展示模式。 + /// + [Newtonsoft.Json.JsonProperty("code_display_mode")] + [System.Text.Json.Serialization.JsonPropertyName("code_display_mode")] + public string? CodeDisplayMode { get; set; } + } + + public class Pattern + { + /// + /// 获取或设置使用须知。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置品牌 Logo 媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("merchant_logo_url")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_logo_url")] + public string? MerchantLogoMediaUrl { get; set; } + + /// + /// 获取或设置品牌名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string? MerchantName { get; set; } + + /// + /// 获取或设置背景颜色。 + /// + [Newtonsoft.Json.JsonProperty("background_color")] + [System.Text.Json.Serialization.JsonPropertyName("background_color")] + public string? BackgroundColor { get; set; } + + /// + /// 获取或设置券详情图片媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("coupon_image_url")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_image_url")] + public string? CouponImageMediaUrl { get; set; } + } + + public class NotifyConfig + { + /// + /// 获取或设置事件通知 AppId。 + /// + [Newtonsoft.Json.JsonProperty("notify_appid")] + [System.Text.Json.Serialization.JsonPropertyName("notify_appid")] + public string? NotifyAppId { get; set; } + } + } + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = string.Empty; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = string.Empty; + + /// + /// 获取或设置商户单据号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置批次归属商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant")] + public string? BelongMerchantId { get; set; } + + /// + /// 获取或设置发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("stock_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("stock_send_rule")] + public Types.StockSendRule StockSendRule { get; set; } = new Types.StockSendRule(); + + /// + /// 获取或设置核销规则信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_use_rule")] + public Types.CouponUseRule CouponUseRule { get; set; } = new Types.CouponUseRule(); + + /// + /// 获取或设置自定义入口信息。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance")] + public Types.Entrance? CustomEntrance { get; set; } + + /// + /// 获取或设置样式设置信息。 + /// + [Newtonsoft.Json.JsonProperty("display_pattern_info")] + [System.Text.Json.Serialization.JsonPropertyName("display_pattern_info")] + public Types.Pattern? DisplayPattern { get; set; } + + /// + /// 获取或设置事件通知配置信息。 + /// + [Newtonsoft.Json.JsonProperty("notify_config")] + [System.Text.Json.Serialization.JsonPropertyName("notify_config")] + public Types.NotifyConfig? NotifyConfig { get; set; } + + /// + /// 获取或设置适用商品范围。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code 模式。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code_mode")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code_mode")] + public string CouponCodeMode { get; set; } = string.Empty; + + /// + /// 获取或设置是否允许营销补贴。 + /// + [Newtonsoft.Json.JsonProperty("subsidy")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy")] + public bool? AllowSubsidy { get; set; } + + /// + /// 获取或设置批次备注。 + /// + [Newtonsoft.Json.JsonProperty("comment")] + [System.Text.Json.Serialization.JsonPropertyName("comment")] + public string? Comment { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockResponse.cs new file mode 100644 index 00000000..015da6ca --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/CreateMarketingBusifavorStockResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/stocks 接口的响应。 + /// + public class CreateMarketingBusifavorStockResponse : WechatTenpayResponse + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { 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/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.cs new file mode 100644 index 00000000..b7e8a335 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/stocks/{stock_id} 接口的请求。 + /// + public class GetMarketingBusifavorStockByStockIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.cs new file mode 100644 index 00000000..baed218d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.cs @@ -0,0 +1,569 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/stocks/{stock_id} 接口的请求。 + /// + public class GetMarketingBusifavorStockByStockIdResponse : WechatTenpayResponse + { + public static class Types + { + public class StockSendRule + { + /// + /// 获取或设置发放总上限。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons")] + public int MaxCoupons { get; set; } + + /// + /// 获取或设置批次总预算(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_amount")] + [System.Text.Json.Serialization.JsonPropertyName("max_amount")] + public long? MaxAmount { get; set; } + + /// + /// 获取或设置单个用户可领个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_per_user")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_per_user")] + public int MaxCouponsPerUser { get; set; } + + /// + /// 获取或设置单天发放上限金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_amount_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("max_amount_by_day")] + public long? MaxAmountPerDay { get; set; } + + /// + /// 获取或设置单天发放上限个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_by_day")] + public int? MaxCouponsPerDay { get; set; } + + /// + /// 获取或设置是否开启自然人限制。 + /// + [Newtonsoft.Json.JsonProperty("natural_person_limit")] + [System.Text.Json.Serialization.JsonPropertyName("natural_person_limit")] + public bool? IsNaturalPersonLimit { get; set; } + + /// + /// 获取或设置是否开启防刷拦截。 + /// + [Newtonsoft.Json.JsonProperty("prevent_api_abuse")] + [System.Text.Json.Serialization.JsonPropertyName("prevent_api_abuse")] + public bool? IsPreventApiAbuse { get; set; } + + /// + /// 获取或设置是否允许转赠。 + /// + [Newtonsoft.Json.JsonProperty("transferable")] + [System.Text.Json.Serialization.JsonPropertyName("transferable")] + public bool? IsTransferable { get; set; } + + /// + /// 获取或设置是否允许分享链接。 + /// + [Newtonsoft.Json.JsonProperty("shareable")] + [System.Text.Json.Serialization.JsonPropertyName("shareable")] + public bool? IsShareable { get; set; } + } + + public class CouponUseRule + { + public static class Types + { + public class CouponAvailableTime + { + public static class Types + { + public class AvailableWeek + { + public static class Types + { + public class AvailableTimeRange + { + /// + /// 获取或设置当天开始时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + public int? BeginTimeSeconds { get; set; } + + /// + /// 获取或设置当天结束时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + public int? EndTimeSeconds { get; set; } + } + } + + /// + /// 获取或设置可用星期数。 + /// + [Newtonsoft.Json.JsonProperty("week_day")] + [System.Text.Json.Serialization.JsonPropertyName("week_day")] + public int[] WeekDayList { get; set; } = default!; + + /// + /// 获取或设置当天可用时间段。 + /// + [Newtonsoft.Json.JsonProperty("available_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("available_day_time")] + public Types.AvailableTimeRange[]? AvailableTimeRangeList { get; set; } + } + + public class AvailableTime + { + /// + /// 获取或设置开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? BeginTime { get; set; } + + /// + /// 获取或设置结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + } + } + + /// + /// 获取或设置批次开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置批次结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置固定周期有效时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("available_week")] + [System.Text.Json.Serialization.JsonPropertyName("available_week")] + public Types.AvailableWeek? AvailableWeek { get; set; } + + /// + /// 获取或设置无规律的有效时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("irregulary_avaliable_time")] + [System.Text.Json.Serialization.JsonPropertyName("irregulary_avaliable_time")] + public Types.AvailableTime[]? IrregularyAvailableTimeList { get; set; } + + /// + /// 获取或设置生效后 N 天内有效。 + /// + [Newtonsoft.Json.JsonProperty("available_day_after_receive")] + [System.Text.Json.Serialization.JsonPropertyName("available_day_after_receive")] + public int? AvailableDaysAfterReceive { get; set; } + + /// + /// 获取或设置领取后 N 天开始生效。 + /// + [Newtonsoft.Json.JsonProperty("wait_days_after_receive")] + [System.Text.Json.Serialization.JsonPropertyName("wait_days_after_receive")] + public int? WaitDaysAfterReceive { get; set; } + } + + public class NormalCoupon + { + /// + /// 获取或设置优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("discount_amount")] + [System.Text.Json.Serialization.JsonPropertyName("discount_amount")] + public int DiscountAmount { get; set; } + + /// + /// 获取或设置消费门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + + public class DiscountCoupon + { + /// + /// 获取或设置折扣比例(范围:1~99)。 + /// + [Newtonsoft.Json.JsonProperty("discount_percent")] + [System.Text.Json.Serialization.JsonPropertyName("discount_percent")] + public int DiscountPercent { get; set; } + + /// + /// 获取或设置消费门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + + public class ExchangeCoupon + { + /// + /// 获取或单品换购价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("exchange_price")] + [System.Text.Json.Serialization.JsonPropertyName("exchange_price")] + public int ExchangePrice { get; set; } + + /// + /// 获取或设置消费门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + } + + /// + /// 获取或设置券生效时间信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_available_time")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_available_time")] + public Types.CouponAvailableTime? CouponAvailableTime { get; set; } + + /// + /// 获取或设置固定面额满减券使用规则信息。与字段 三选一。 + /// + [Newtonsoft.Json.JsonProperty("fixed_normal_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("fixed_normal_coupon")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置折扣券使用规则信息。与字段 三选一。 + /// + [Newtonsoft.Json.JsonProperty("discount_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("discount_coupon")] + public Types.DiscountCoupon? DiscountCoupon { get; set; } + + /// + /// 获取或设置换购券使用规则信息。与字段 三选一。 + /// + [Newtonsoft.Json.JsonProperty("exchange_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("exchange_coupon")] + public Types.ExchangeCoupon? ExchangeCoupon { get; set; } + + /// + /// 获取或设置核销方式。 + /// + [Newtonsoft.Json.JsonProperty("use_method")] + [System.Text.Json.Serialization.JsonPropertyName("use_method")] + public string UseMethod { get; set; } = default!; + + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string? MiniProgramPath { get; set; } + } + + public class Entrance + { + public static class Types + { + public class MiniProgram + { + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string Path { get; set; } = default!; + + /// + /// 获取或设置入口文案。 + /// + [Newtonsoft.Json.JsonProperty("entrance_words")] + [System.Text.Json.Serialization.JsonPropertyName("entrance_words")] + public string EntranceWords { get; set; } = default!; + + /// + /// 获取或设置引导文案。 + /// + [Newtonsoft.Json.JsonProperty("guiding_words")] + [System.Text.Json.Serialization.JsonPropertyName("guiding_words")] + public string? GuidingWords { get; set; } + } + } + + /// + /// 获取或设置商家小程序入口信息。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_info")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_info")] + public Types.MiniProgram? MiniProgram { get; set; } + + /// + /// 获取或设置商家公众号 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置营销馆 ID。 + /// + [Newtonsoft.Json.JsonProperty("hall_id")] + [System.Text.Json.Serialization.JsonPropertyName("hall_id")] + public string? HallId { get; set; } + + /// + /// 获取或设置可用门店 ID。 + /// + [Newtonsoft.Json.JsonProperty("store_id")] + [System.Text.Json.Serialization.JsonPropertyName("store_id")] + public string? StoreId { get; set; } + + /// + /// 获取或设置展示模式。 + /// + [Newtonsoft.Json.JsonProperty("code_display_mode")] + [System.Text.Json.Serialization.JsonPropertyName("code_display_mode")] + public string? CodeDisplayMode { get; set; } + } + + public class Pattern + { + /// + /// 获取或设置使用须知。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置品牌 Logo 媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("merchant_logo_url")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_logo_url")] + public string? MerchantLogoMediaUrl { get; set; } + + /// + /// 获取或设置品牌名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string? MerchantName { get; set; } + + /// + /// 获取或设置背景颜色。 + /// + [Newtonsoft.Json.JsonProperty("background_color")] + [System.Text.Json.Serialization.JsonPropertyName("background_color")] + public string? BackgroundColor { get; set; } + + /// + /// 获取或设置券详情图片媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("coupon_image_url")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_image_url")] + public string? CouponImageMediaUrl { get; set; } + } + + public class NotifyConfig + { + /// + /// 获取或设置事件通知 AppId。 + /// + [Newtonsoft.Json.JsonProperty("notify_appid")] + [System.Text.Json.Serialization.JsonPropertyName("notify_appid")] + public string? NotifyAppId { get; set; } + } + + public class CouponCodeInformation + { + /// + /// 获取或设置该批次总共已上传的 Code 总数。 + /// + [Newtonsoft.Json.JsonProperty("total_count")] + [System.Text.Json.Serialization.JsonPropertyName("total_count")] + public int TotalCount { get; set; } + + /// + /// 获取或设置该批次当前可用的 Code 数。 + /// + [Newtonsoft.Json.JsonProperty("available_count")] + [System.Text.Json.Serialization.JsonPropertyName("available_count")] + public int AvailableCount { get; set; } + } + + public class CouponSendInformation + { + /// + /// 获取或设置已发放券张数。 + /// + [Newtonsoft.Json.JsonProperty("total_send_num")] + [System.Text.Json.Serialization.JsonPropertyName("total_send_num")] + public int? TotalSendCount { get; set; } + + /// + /// 获取或设置已发放券金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_send_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_send_amount")] + public long? TotalSendAmount { get; set; } + + /// + /// 获取或设置单天已发放券张数。 + /// + [Newtonsoft.Json.JsonProperty("today_send_num")] + [System.Text.Json.Serialization.JsonPropertyName("today_send_num")] + public int? TodaySendCount { get; set; } + + /// + /// 获取或设置单天已发放券金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("today_send_amount")] + [System.Text.Json.Serialization.JsonPropertyName("today_send_amount")] + public long? TodaySendAmount { get; set; } + } + } + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = default!; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = default!; + + /// + /// 获取或设置批次状态。 + /// + [Newtonsoft.Json.JsonProperty("stock_state")] + [System.Text.Json.Serialization.JsonPropertyName("stock_state")] + public string StockState { get; set; } = default!; + + /// + /// 获取或设置批次归属商户号。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant")] + public string BelongMerchantId { get; set; } = default!; + + /// + /// 获取或设置发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("stock_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("stock_send_rule")] + public Types.StockSendRule StockSendRule { get; set; } = default!; + + /// + /// 获取或设置核销规则信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_use_rule")] + public Types.CouponUseRule CouponUseRule { get; set; } = default!; + + /// + /// 获取或设置自定义入口信息。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance")] + public Types.Entrance CustomEntrance { get; set; } = default!; + + /// + /// 获取或设置样式设置信息。 + /// + [Newtonsoft.Json.JsonProperty("display_pattern_info")] + [System.Text.Json.Serialization.JsonPropertyName("display_pattern_info")] + public Types.Pattern DisplayPattern { get; set; } = default!; + + /// + /// 获取或设置事件通知配置信息。 + /// + [Newtonsoft.Json.JsonProperty("notify_config")] + [System.Text.Json.Serialization.JsonPropertyName("notify_config")] + public Types.NotifyConfig? NotifyConfig { get; set; } + + /// + /// 获取或设置商家券 Code 数量信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code_count")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code_count")] + public Types.CouponCodeInformation? CouponCodeInformation { get; set; } + + /// + /// 获取或设置批次发放情况信息。 + /// + [Newtonsoft.Json.JsonProperty("send_count_information")] + [System.Text.Json.Serialization.JsonPropertyName("send_count_information")] + public Types.CouponSendInformation? CouponSendInformation { get; set; } + + /// + /// 获取或设置适用商品范围。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = default!; + + /// + /// 获取或设置商家券 Code 模式。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code_mode")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code_mode")] + public string CouponCodeMode { get; set; } = default!; + + /// + /// 获取或设置批次备注。 + /// + [Newtonsoft.Json.JsonProperty("comment")] + [System.Text.Json.Serialization.JsonPropertyName("comment")] + public string? Comment { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.cs new file mode 100644 index 00000000..55ea1253 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/subsidy/pay-receipts 接口的请求。 + /// + public class CreateMarketingBusifavorSubsidyPayReceiptRequest : WechatTenpayRequest + { + /// + /// 获取或设置商家券批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置营销补差扣款商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("payer_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payer_merchant")] + public string? PayerMerchantId { get; set; } + + /// + /// 获取或设置营销补差入账商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("payee_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payee_merchant")] + public string? PayeeMerchantId { get; set; } + + /// + /// 获取或设置补差付款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置补差付款描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置业务请求唯一单号。 + /// + [Newtonsoft.Json.JsonProperty("out_subsidy_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_subsidy_no")] + public string OutSubsidyNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.cs new file mode 100644 index 00000000..755170f8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/subsidy/pay-receipts 接口的响应。 + /// + public class CreateMarketingBusifavorSubsidyPayReceiptResponse : GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.cs new file mode 100644 index 00000000..109f77e5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/subsidy/return-receipts 接口的请求。 + /// + public class CreateMarketingBusifavorSubsidyReturnReceiptRequest : WechatTenpayRequest + { + /// + /// 获取或设置商家券批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = string.Empty; + + /// + /// 获取或设置微信支付退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = string.Empty; + + /// + /// 获取或设置营销补差扣款商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("payer_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payer_merchant")] + public string? PayerMerchantId { get; set; } + + /// + /// 获取或设置营销补差入账商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("payee_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payee_merchant")] + public string? PayeeMerchantId { get; set; } + + /// + /// 获取或设置补差回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置补差回退描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置业务请求唯一单号。 + /// + [Newtonsoft.Json.JsonProperty("out_subsidy_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_subsidy_return_no")] + public string OutSubsidyReturnNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.cs new file mode 100644 index 00000000..fe243849 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/subsidy/return-receipts 接口的响应。 + /// + public class CreateMarketingBusifavorSubsidyReturnReceiptResponse : WechatTenpayResponse + { + /// + /// 获取或设置补差回退单号。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_return_receipt_id")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_return_receipt_id")] + public string SubsidyReturnReceiptId { get; set; } = default!; + + /// + /// 获取或设置商家券批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置微信支付退款单号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置营销补差扣款商户号。 + /// + [Newtonsoft.Json.JsonProperty("payer_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payer_merchant")] + public string PayerMerchantId { get; set; } = default!; + + /// + /// 获取或设置营销补差入账商户号。 + /// + [Newtonsoft.Json.JsonProperty("payee_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payee_merchant")] + public string PayeeMerchantId { get; set; } = default!; + + /// + /// 获取或设置补差回退金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置补差回退描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置补差付款单号。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_receipt_id")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_receipt_id")] + public string SubsidyReceiptId { get; set; } = default!; + + /// + /// 获取或设置业务请求唯一单号。 + /// + [Newtonsoft.Json.JsonProperty("out_subsidy_return_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_subsidy_return_no")] + public string OutSubsidyReturnNumber { get; set; } = default!; + + /// + /// 获取或设置补差回退单据状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置补差回退失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置补差回退完成时间。 + /// + [Newtonsoft.Json.JsonProperty("return_done_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("return_done_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? SuccessTime { get; set; } + + /// + /// 获取或设置补差回退发起时间。 + /// + [Newtonsoft.Json.JsonProperty("return_create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("return_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/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.cs new file mode 100644 index 00000000..0c8a7ea3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/subsidy/pay-receipts/{subsidy_receipt_id} 接口的请求。 + /// + public class GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置补差付款单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubsidyReceiptId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.cs new file mode 100644 index 00000000..c6efa961 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/subsidy/pay-receipts/{subsidy_receipt_id} 接口的响应。 + /// + public class GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse : WechatTenpayResponse + { + /// + /// 获取或设置补差付款单号。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_receipt_id")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_receipt_id")] + public string SubsidyReceiptId { get; set; } = default!; + + /// + /// 获取或设置商家券批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置营销补差扣款商户号。 + /// + [Newtonsoft.Json.JsonProperty("payer_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payer_merchant")] + public string PayerMerchantId { get; set; } = default!; + + /// + /// 获取或设置营销补差入账商户号。 + /// + [Newtonsoft.Json.JsonProperty("payee_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("payee_merchant")] + public string PayeeMerchantId { get; set; } = default!; + + /// + /// 获取或设置补差付款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置补差付款描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置业务请求唯一单号。 + /// + [Newtonsoft.Json.JsonProperty("out_subsidy_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_subsidy_no")] + public string OutSubsidyNumber { get; set; } = default!; + + /// + /// 获取或设置补差付款单据状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置补差付款失败原因。 + /// + [Newtonsoft.Json.JsonProperty("fail_reason")] + [System.Text.Json.Serialization.JsonPropertyName("fail_reason")] + public string? FailReason { 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("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/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.cs new file mode 100644 index 00000000..ab0f9c5d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /marketing/busifavor/stocks/{stock_id}/budget 接口的请求。 + /// + public class UpdateMarketingBusifavorStockBudgetRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置目标批次最大发放个数。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("target_max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("target_max_coupons")] + public int? TargetMaxCoupons { get; set; } + + /// + /// 获取或设置目标单天发放上限个数。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("target_max_coupons_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("target_max_coupons_by_day")] + public int? TargetMaxCouponsPerDay { get; set; } + + /// + /// 获取或设置当前单天发放上限个数。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("current_max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("current_max_coupons")] + public int? CurrentMaxCoupons { get; set; } + + /// + /// 获取或设置目标单天发放上限个数。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("current_max_coupons_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("current_max_coupons_by_day")] + public int? CurrentMaxCouponsPerDay { get; set; } + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("modify_budget_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("modify_budget_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.cs new file mode 100644 index 00000000..cd3bd5eb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /marketing/busifavor/stocks/{stock_id}/budget 接口的响应。 + /// + public class UpdateMarketingBusifavorStockBudgetResponse : WechatTenpayResponse + { + /// + /// 获取或设置当前最大发放个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons")] + public int MaxCoupons { get; set; } + + /// + /// 获取或设置当前单天发放上限个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_by_day")] + public int? MaxCouponsPerDay { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.cs new file mode 100644 index 00000000..4bb36f40 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /marketing/busifavor/stocks/{stock_id} 接口的请求。 + /// + public class UpdateMarketingBusifavorStockRequest : WechatTenpayRequest + { + public static class Types + { + public class StockSendRule + { + /// + /// 获取或设置是否开启自然人限制。 + /// + [Newtonsoft.Json.JsonProperty("natural_person_limit")] + [System.Text.Json.Serialization.JsonPropertyName("natural_person_limit")] + public bool? IsNaturalPersonLimit { get; set; } + + /// + /// 获取或设置是否开启防刷拦截。 + /// + [Newtonsoft.Json.JsonProperty("prevent_api_abuse")] + [System.Text.Json.Serialization.JsonPropertyName("prevent_api_abuse")] + public bool? IsPreventApiAbuse { get; set; } + } + + public class CouponUseRule + { + /// + /// 获取或设置核销方式。 + /// + [Newtonsoft.Json.JsonProperty("use_method")] + [System.Text.Json.Serialization.JsonPropertyName("use_method")] + public string? UseMethod { get; set; } + + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string? MiniProgramPath { get; set; } + } + + public class Entrance : CreateMarketingBusifavorStockRequest.Types.Entrance + { + } + + public class Pattern : CreateMarketingBusifavorStockRequest.Types.Pattern + { + } + + public class NotifyConfig : CreateMarketingBusifavorStockRequest.Types.NotifyConfig + { + } + } + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string? StockName { get; set; } + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("stock_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("stock_send_rule")] + public Types.StockSendRule? StockSendRule { get; set; } + + /// + /// 获取或设置核销规则信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_use_rule")] + public Types.CouponUseRule? CouponUseRule { get; set; } + + /// + /// 获取或设置自定义入口信息。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance")] + public Types.Entrance? CustomEntrance { get; set; } + + /// + /// 获取或设置样式设置信息。 + /// + [Newtonsoft.Json.JsonProperty("display_pattern_info")] + [System.Text.Json.Serialization.JsonPropertyName("display_pattern_info")] + public Types.Pattern? DisplayPattern { get; set; } + + /// + /// 获取或设置事件通知配置信息。 + /// + [Newtonsoft.Json.JsonProperty("notify_config")] + [System.Text.Json.Serialization.JsonPropertyName("notify_config")] + public Types.NotifyConfig? NotifyConfig { get; set; } + + /// + /// 获取或设置适用商品范围。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string? GoodsName { get; set; } + + /// + /// 获取或设置批次备注。 + /// + [Newtonsoft.Json.JsonProperty("comment")] + [System.Text.Json.Serialization.JsonPropertyName("comment")] + public string? Comment { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.cs new file mode 100644 index 00000000..da890fb1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /marketing/busifavor/stocks/{stock_id} 接口的响应。 + /// + public class UpdateMarketingBusifavorStockResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.cs new file mode 100644 index 00000000..bbcd7b4e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/stocks/{stock_id}/couponcodes 接口的请求。 + /// + public class UploadMarketingBusifavorStockCouponCodesRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置商家券 Code 列表。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code_list")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code_list")] + public IList CouponCodeList { get; set; } = new List(); + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("upload_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("upload_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.cs new file mode 100644 index 00000000..1dab0ef8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/busifavor/stocks/{stock_id}/couponcodes 接口的响应。 + /// + public class UploadMarketingBusifavorStockCouponCodesResponse : WechatTenpayResponse + { + public static class Types + { + public class FailCode + { + /// + /// 获取或设置上传失败的券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = default!; + + /// + /// 获取或设置上传失败错误码。 + /// + [Newtonsoft.Json.JsonProperty("code")] + [System.Text.Json.Serialization.JsonPropertyName("code")] + public string ErrorCode { get; set; } = default!; + + /// + /// 获取或设置上传失败错误信息。 + /// + [Newtonsoft.Json.JsonProperty("message")] + [System.Text.Json.Serialization.JsonPropertyName("message")] + public string ErrorMessage { get; set; } = default!; + } + } + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置去重后上传 Code 总数。 + /// + [Newtonsoft.Json.JsonProperty("total_count")] + [System.Text.Json.Serialization.JsonPropertyName("total_count")] + public int TotalCount { get; set; } + + /// + /// 获取或设置上传成功的 Code 总数。 + /// + [Newtonsoft.Json.JsonProperty("success_count")] + [System.Text.Json.Serialization.JsonPropertyName("success_count")] + public int SuccessCount { get; set; } + + /// + /// 获取或设置上传成功的 Code 列表。 + /// + [Newtonsoft.Json.JsonProperty("success_codes")] + [System.Text.Json.Serialization.JsonPropertyName("success_codes")] + public string[]? SuccessCodeList { 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; } + + /// + /// 获取或设置上传失败的 Code 总数。 + /// + [Newtonsoft.Json.JsonProperty("fail_count")] + [System.Text.Json.Serialization.JsonPropertyName("fail_count")] + public int? FailCount { get; set; } + + /// + /// 获取或设置上传失败的 Code 列表。 + /// + [Newtonsoft.Json.JsonProperty("fail_codes")] + [System.Text.Json.Serialization.JsonPropertyName("fail_codes")] + public Types.FailCode[]? FailCodeList { get; set; } + + /// + /// 获取或设置已存在的 Code 列表。 + /// + [Newtonsoft.Json.JsonProperty("exist_codes")] + [System.Text.Json.Serialization.JsonPropertyName("exist_codes")] + public string[]? ExistedCodeList { get; set; } + + /// + /// 获取或设置本次请求中重复的 Code 列表。 + /// + [Newtonsoft.Json.JsonProperty("duplicate_codes")] + [System.Text.Json.Serialization.JsonPropertyName("duplicate_codes")] + public string[]? DuplicateCodeList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.cs new file mode 100644 index 00000000..ac741beb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid} 接口的请求。 + /// + public class GetMarketingBusifavorUserCouponByCouponCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string CouponCode { get; set; } = string.Empty; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.cs new file mode 100644 index 00000000..9013e978 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid} 接口的响应。 + /// + public class GetMarketingBusifavorUserCouponByCouponCodeResponse : WechatTenpayResponse + { + public static class Types + { + public class CouponUseRule : GetMarketingBusifavorStockByStockIdResponse.Types.CouponUseRule + { + } + + public class Entrance : GetMarketingBusifavorStockByStockIdResponse.Types.Entrance + { + } + + public class Pattern : GetMarketingBusifavorStockByStockIdResponse.Types.Pattern + { + } + } + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = default!; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = default!; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = default!; + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonProperty("coupon_state")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_state")] + public string CouponState { get; set; } = default!; + + /// + /// 获取或设置批次归属商户号。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant")] + public string BelongMerchantId { get; set; } = default!; + + /// + /// 获取或设置是否允许转赠。 + /// + [Newtonsoft.Json.JsonProperty("transferable")] + [System.Text.Json.Serialization.JsonPropertyName("transferable")] + public bool? IsTransferable { get; set; } + + /// + /// 获取或设置是否允许分享链接。 + /// + [Newtonsoft.Json.JsonProperty("shareable")] + [System.Text.Json.Serialization.JsonPropertyName("shareable")] + public bool? IsShareable { get; set; } + + /// + /// 获取或设置券核销规则信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_use_rule")] + public Types.CouponUseRule CouponUseRule { get; set; } = default!; + + /// + /// 获取或设置自定义入口信息。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance")] + public Types.Entrance? CustomEntrance { get; set; } + + /// + /// 获取或设置样式设置信息。 + /// + [Newtonsoft.Json.JsonProperty("display_pattern_info")] + [System.Text.Json.Serialization.JsonPropertyName("display_pattern_info")] + public Types.Pattern DisplayPattern { get; set; } = default!; + + /// + /// 获取或设置适用商品范围。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = default!; + + /// + /// 获取或设置批次备注。 + /// + [Newtonsoft.Json.JsonProperty("comment")] + [System.Text.Json.Serialization.JsonPropertyName("comment")] + public string? Comment { get; set; } + + /// + /// 获取或设置券可使用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableStartTime { get; set; } + + /// + /// 获取或设置券过期时间。 + /// + [Newtonsoft.Json.JsonProperty("expire_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("expire_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ExpireTime { get; set; } + + /// + /// 获取或设置领券时间。 + /// + [Newtonsoft.Json.JsonProperty("receive_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("receive_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ReceiveTime { get; set; } + + /// + /// 获取或设置发券时商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("send_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("send_request_no")] + public string SendOutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置核销时商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("use_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("use_request_no")] + public string? UseOutRequestNumber { get; set; } + + /// + /// 获取或设置核销请求时间。 + /// + [Newtonsoft.Json.JsonProperty("use_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("use_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? UseTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsRequest.cs new file mode 100644 index 00000000..4c897c9c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsRequest.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/users/{openid}/coupons 接口的请求。 + /// + public class QueryMarketingBusifavorUserCouponsRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? StockId { get; set; } + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? CreatorMerchantId { get; set; } + + /// + /// 获取或设置批次发放的商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SenderMerchantId { get; set; } + + /// + /// 获取或设置批次归属商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? BelongMerchantId { get; set; } + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? CouponState { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [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/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsResponse.cs new file mode 100644 index 00000000..7a39d334 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingBusifavor/UsersCoupons/QueryMarketingBusifavorUserCouponsResponse.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/busifavor/users/{openid}/coupons 接口的响应。 + /// + public class QueryMarketingBusifavorUserCouponsResponse : WechatTenpayResponse + { + public static class Types + { + public class Coupon + { + public static class Types + { + public class CouponUseRule : GetMarketingBusifavorUserCouponByCouponCodeResponse.Types.CouponUseRule + { + } + + public class Entrance : GetMarketingBusifavorUserCouponByCouponCodeResponse.Types.Entrance + { + } + + public class Pattern : GetMarketingBusifavorUserCouponByCouponCodeResponse.Types.Pattern + { + } + } + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = default!; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = default!; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = default!; + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonProperty("coupon_state")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_state")] + public string CouponState { get; set; } = default!; + + /// + /// 获取或设置批次归属商户号。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant")] + public string BelongMerchantId { get; set; } = default!; + + /// + /// 获取或设置是否允许转赠。 + /// + [Newtonsoft.Json.JsonProperty("transferable")] + [System.Text.Json.Serialization.JsonPropertyName("transferable")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedNullableBooleanConverter))] + public bool? IsTransferable { get; set; } + + /// + /// 获取或设置是否允许分享链接。 + /// + [Newtonsoft.Json.JsonProperty("shareable")] + [System.Text.Json.Serialization.JsonPropertyName("shareable")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedNullableBooleanConverter))] + public bool? IsShareable { get; set; } + + /// + /// 获取或设置券核销规则信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_use_rule")] + public Types.CouponUseRule CouponUseRule { get; set; } = default!; + + /// + /// 获取或设置自定义入口信息。 + /// + [Newtonsoft.Json.JsonProperty("custom_entrance")] + [System.Text.Json.Serialization.JsonPropertyName("custom_entrance")] + public Types.Entrance? CustomEntrance { get; set; } + + /// + /// 获取或设置样式设置信息。 + /// + [Newtonsoft.Json.JsonProperty("display_pattern_info")] + [System.Text.Json.Serialization.JsonPropertyName("display_pattern_info")] + public Types.Pattern DisplayPattern { get; set; } = default!; + + /// + /// 获取或设置适用商品范围。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string GoodsName { get; set; } = default!; + + /// + /// 获取或设置批次备注。 + /// + [Newtonsoft.Json.JsonProperty("comment")] + [System.Text.Json.Serialization.JsonPropertyName("comment")] + public string? Comment { get; set; } + + /// + /// 获取或设置券可使用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableStartTime { get; set; } + + /// + /// 获取或设置券过期时间。 + /// + [Newtonsoft.Json.JsonProperty("expire_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("expire_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ExpireTime { get; set; } + + /// + /// 获取或设置领券时间。 + /// + [Newtonsoft.Json.JsonProperty("receive_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("receive_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ReceiveTime { get; set; } + + /// + /// 获取或设置发券时商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("send_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("send_request_no")] + public string SendOutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置核销时商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("use_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("use_request_no")] + public string? UseOutRequestNumber { get; set; } + + /// + /// 获取或设置核销请求时间。 + /// + [Newtonsoft.Json.JsonProperty("use_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("use_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? UseTime { get; set; } + } + } + + /// + /// 获取或设置券列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Coupon[] CouponList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.cs new file mode 100644 index 00000000..44ab0f79 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/callbacks 接口的请求。 + /// + public class UpdateMarketingFavorCallbackRequest : WechatTenpayRequest + { + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = string.Empty; + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string? MerchantId { get; set; } + + /// + /// 获取或设置是否接收回调。 + /// + [Newtonsoft.Json.JsonProperty("switch")] + [System.Text.Json.Serialization.JsonPropertyName("switch")] + public bool Switch { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.cs new file mode 100644 index 00000000..323c5afd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/callbacks 接口的响应。 + /// + public class UpdateMarketingFavorCallbackResponse : WechatTenpayResponse + { + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = default!; + + /// + /// 获取或设置修改时间。 + /// + [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/MarketingFavor/CreateMarketingFavorStockRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockRequest.cs new file mode 100644 index 00000000..906b5ff2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockRequest.cs @@ -0,0 +1,346 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/coupon-stocks 接口的请求。 + /// + public class CreateMarketingFavorStockRequest : WechatTenpayRequest + { + public static class Types + { + public class StockUseRule + { + /// + /// 获取或设置发放总上限。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons")] + public int MaxCoupons { get; set; } + + /// + /// 获取或设置发放总预算(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_amount")] + [System.Text.Json.Serialization.JsonPropertyName("max_amount")] + public long MaxAmount { get; set; } + + /// + /// 获取或设置单天预算发放上限(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_amount_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("max_amount_by_day")] + public long MaxAmountPerDay { get; set; } + + /// + /// 获取或设置单个用户可领个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_per_user")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_per_user")] + public int MaxCouponsPerUser { get; set; } + + /// + /// 获取或设置是否开启自然人限制。 + /// + [Newtonsoft.Json.JsonProperty("natural_person_limit")] + [System.Text.Json.Serialization.JsonPropertyName("natural_person_limit")] + public bool IsNaturalPersonLimit { get; set; } + + /// + /// 获取或设置是否开启防刷拦截。 + /// + [Newtonsoft.Json.JsonProperty("prevent_api_abuse")] + [System.Text.Json.Serialization.JsonPropertyName("prevent_api_abuse")] + public bool IsPreventApiAbuse { get; set; } + } + + public class CouponUseRule + { + public static class Types + { + public class CouponAvailableTime + { + public static class Types + { + public class AvailableTime + { + /// + /// 获取或设置可用星期数。 + /// + [Newtonsoft.Json.JsonProperty("available_week_day")] + [System.Text.Json.Serialization.JsonPropertyName("available_week_day")] + public int? AvailableWeekDay { get; set; } + + /// + /// 获取或设置当天开始时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + public int? BeginTimeSeconds { get; set; } + + /// + /// 获取或设置当天结束时间(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + public int? EndTimeSeconds { get; set; } + } + } + + /// + /// 获取或设置固定时间段可用信息。 + /// + [Newtonsoft.Json.JsonProperty("fix_available_time")] + [System.Text.Json.Serialization.JsonPropertyName("fix_available_time")] + public Types.AvailableTime? FixedAvailableTime { get; set; } + + /// + /// 获取或设置是否领取后 N 天有效。 + /// + [Newtonsoft.Json.JsonProperty("second_day_available")] + [System.Text.Json.Serialization.JsonPropertyName("second_day_available")] + public bool? IsSecondDayAvailable { get; set; } + + /// + /// 获取或设置领取后有效时间(单位:分钟)。 + /// + [Newtonsoft.Json.JsonProperty("available_time_after_receive")] + [System.Text.Json.Serialization.JsonPropertyName("available_time_after_receive")] + public int? AvailableMinutesAfterReceive { get; set; } + } + + public class NormalCoupon + { + /// + /// 获取或设置券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("coupon_amount")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_amount")] + public int CouponAmount { get; set; } + + /// + /// 获取或设置使用门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + + public class LimitCard + { + /// + /// 获取或设置银行卡名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// 获取或设置指定卡 BIN 列表。 + /// + [Newtonsoft.Json.JsonProperty("bin")] + [System.Text.Json.Serialization.JsonPropertyName("bin")] + public IList? BinList { get; set; } + } + } + + /// + /// 获取或设置券生效时间信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_available_time")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_available_time")] + public Types.CouponAvailableTime? CouponAvailableTime { get; set; } + + /// + /// 获取或设置固定面额满减券使用规则信息。 + /// + [Newtonsoft.Json.JsonProperty("fixed_normal_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("fixed_normal_coupon")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置订单优惠标记列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public IList? GoodsTagList { get; set; } + + /// + /// 获取或设置指定付款方式编码列表。 + /// + [Newtonsoft.Json.JsonProperty("limit_pay")] + [System.Text.Json.Serialization.JsonPropertyName("limit_pay")] + public IList? LimitPayCodeList { get; set; } + + /// + /// 获取或设置指定银行卡信息。 + /// + [Newtonsoft.Json.JsonProperty("limit_card")] + [System.Text.Json.Serialization.JsonPropertyName("limit_card")] + public Types.LimitCard? LimitCard { get; set; } + + /// + /// 获取或设置指定支付方式列表。 + /// + [Newtonsoft.Json.JsonProperty("trade_type")] + [System.Text.Json.Serialization.JsonPropertyName("trade_type")] + public IList? TradeTypeList { get; set; } + + /// + /// 获取或设置是否可叠加其他优惠。 + /// + [Newtonsoft.Json.JsonProperty("combine_use")] + [System.Text.Json.Serialization.JsonPropertyName("combine_use")] + public bool? AllowCombineUse { get; set; } + + /// + /// 获取或设置可核销商品编码列表。 + /// + [Newtonsoft.Json.JsonProperty("available_items")] + [System.Text.Json.Serialization.JsonPropertyName("available_items")] + public IList? AvailableItems { get; set; } + + /// + /// 获取或设置不可核销商品编码列表。 + /// + [Newtonsoft.Json.JsonProperty("unavailable_items")] + [System.Text.Json.Serialization.JsonPropertyName("unavailable_items")] + public IList? UnavailableItems { get; set; } + + /// + /// 获取或设置可用商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("available_merchants")] + [System.Text.Json.Serialization.JsonPropertyName("available_merchants")] + public IList? AvailableMerchantIdList { get; set; } + } + + public class Pattern + { + /// + /// 获取或设置使用说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置品牌 Logo 媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("merchant_logo")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_logo")] + public string? MerchantLogoMediaUrl { get; set; } + + /// + /// 获取或设置品牌名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string? MerchantName { get; set; } + + /// + /// 获取或设置背景颜色。 + /// + [Newtonsoft.Json.JsonProperty("background_color")] + [System.Text.Json.Serialization.JsonPropertyName("background_color")] + public string? BackgroundColor { get; set; } + + /// + /// 获取或设置券详情图片媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("coupon_image")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_image")] + public string? CouponImageMediaUrl { get; set; } + } + } + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = string.Empty; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = string.Empty; + + /// + /// 获取或设置商户单据号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置批次归属商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant")] + public string? BelongMerchantId { get; set; } + + /// + /// 获取或设置可用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置可用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("stock_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("stock_use_rule")] + public Types.StockUseRule StockUseRule { get; set; } = new Types.StockUseRule(); + + /// + /// 获取或设置核销规则信息。 + /// + [Newtonsoft.Json.JsonProperty("coupon_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_use_rule")] + public Types.CouponUseRule CouponUseRule { get; set; } = new Types.CouponUseRule(); + + /// + /// 获取或设置样式设置信息。 + /// + [Newtonsoft.Json.JsonProperty("pattern_info")] + [System.Text.Json.Serialization.JsonPropertyName("pattern_info")] + public Types.Pattern? Pattern { get; set; } + + /// + /// 获取或设置是否无资金流。 + /// + [Newtonsoft.Json.JsonProperty("no_cash")] + [System.Text.Json.Serialization.JsonPropertyName("no_cash")] + public bool IsNoCash { get; set; } + + /// + /// 获取或设置批次备注。 + /// + [Newtonsoft.Json.JsonProperty("comment")] + [System.Text.Json.Serialization.JsonPropertyName("comment")] + public string? Comment { get; set; } + + /// + /// 获取或设置扩展属性。 + /// + [Newtonsoft.Json.JsonProperty("ext_info")] + [System.Text.Json.Serialization.JsonPropertyName("ext_info")] + public string? Extdata { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockResponse.cs new file mode 100644 index 00000000..4fbb2f5c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/CreateMarketingFavorStockResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/coupon-stocks 接口的响应。 + /// + public class CreateMarketingFavorStockResponse : WechatTenpayResponse + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { 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/MarketingFavor/GetMarketingFavorStockByStockIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdRequest.cs new file mode 100644 index 00000000..5d65a8c8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id} 接口的请求。 + /// + public class GetMarketingFavorStockByStockIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? StockCreatorMerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdResponse.cs new file mode 100644 index 00000000..5ca72085 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockByStockIdResponse.cs @@ -0,0 +1,241 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id} 接口的请求。 + /// + public class GetMarketingFavorStockByStockIdResponse : WechatTenpayResponse + { + public static class Types + { + public class StockUseRule + { + public static class Types + { + public class NormalCoupon + { + /// + /// 获取或设置券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("coupon_amount")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_amount")] + public int CouponAmount { get; set; } + + /// + /// 获取或设置使用门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + } + + /// + /// 获取或设置发放总上限。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons")] + public int MaxCoupons { get; set; } + + /// + /// 获取或设置发放总预算(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_amount")] + [System.Text.Json.Serialization.JsonPropertyName("max_amount")] + public long MaxAmount { get; set; } + + /// + /// 获取或设置单天预算发放上限(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_amount_by_day")] + [System.Text.Json.Serialization.JsonPropertyName("max_amount_by_day")] + public long MaxAmountPerDay { get; set; } + + /// + /// 获取或设置单个用户可领个数。 + /// + [Newtonsoft.Json.JsonProperty("max_coupons_per_user")] + [System.Text.Json.Serialization.JsonPropertyName("max_coupons_per_user")] + public int MaxCouponsPerUser { get; set; } + + /// + /// 获取或设置固定面额批次特定信息。 + /// + [Newtonsoft.Json.JsonProperty("fixed_normal_coupon")] + [System.Text.Json.Serialization.JsonPropertyName("fixed_normal_coupon")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置券类型。 + /// + [Newtonsoft.Json.JsonProperty("coupon_type")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_type")] + public string? CouponType { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string[]? GoodsTagList { get; set; } + + /// + /// 获取或设置指定支付方式列表。 + /// + [Newtonsoft.Json.JsonProperty("trade_type")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringTypedStringArrayConverter))] + [System.Text.Json.Serialization.JsonPropertyName("trade_type")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedStringArrayConverter))] + public string[]? TradeTypeList { get; set; } + + /// + /// 获取或设置是否可叠加其他优惠。 + /// + [Newtonsoft.Json.JsonProperty("combine_use")] + [System.Text.Json.Serialization.JsonPropertyName("combine_use")] + public bool? AllowCombineUse { get; set; } + } + + public class CutToMessage + { + /// + /// 获取或设置可用优惠的商品最高单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("single_price_max")] + [System.Text.Json.Serialization.JsonPropertyName("single_price_max")] + public int SinglePriceMax { get; set; } + + /// + /// 获取或设置减至后的优惠单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_price")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_price")] + public int CutToPrice { get; set; } + } + } + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = default!; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = default!; + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string StockCreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置批次状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置使用说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置可用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置可用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("stock_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("stock_use_rule")] + public Types.StockUseRule StockUseRule { get; set; } = default!; + + /// + /// 获取或设置已发券数量。 + /// + [Newtonsoft.Json.JsonProperty("distributed_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("distributed_coupons")] + public int DistributedCoupons { get; set; } + + /// + /// 获取或设置是否无资金流。 + /// + [Newtonsoft.Json.JsonProperty("no_cash")] + [System.Text.Json.Serialization.JsonPropertyName("no_cash")] + public bool IsNoCash { get; set; } + + /// + /// 获取或设置是否单品优惠。 + /// + [Newtonsoft.Json.JsonProperty("singleitem")] + [System.Text.Json.Serialization.JsonPropertyName("singleitem")] + public bool IsSingleItem { get; set; } + + /// + /// 获取或设置单品优惠特定信息。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_message")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_message")] + public Types.CutToMessage? CutToMessage { get; set; } + + /// + /// 获取或设置激活时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置终止时间。 + /// + [Newtonsoft.Json.JsonProperty("stop_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("stop_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StopTime { get; set; } + + /// + /// 获取或设置创建时间。 + /// + [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/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.cs new file mode 100644 index 00000000..27c3d20b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/refund-flow 接口的请求。 + /// + public class GetMarketingFavorStockRefundFlowRequest : GetMarketingFavorStockUseFlowRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.cs new file mode 100644 index 00000000..55090351 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/refund-flow 接口的响应。 + /// + public class GetMarketingFavorStockRefundFlowResponse : GetMarketingFavorStockUseFlowResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowRequest.cs new file mode 100644 index 00000000..465fb597 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/use-flow 接口的请求。 + /// + public class GetMarketingFavorStockUseFlowRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowResponse.cs new file mode 100644 index 00000000..ab81cf13 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/GetMarketingFavorStockUseFlowResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/use-flow 接口的响应。 + /// + public class GetMarketingFavorStockUseFlowResponse : WechatTenpayResponse + { + /// + /// 获取或设置哈希类型。 + /// + [Newtonsoft.Json.JsonProperty("hash_type")] + [System.Text.Json.Serialization.JsonPropertyName("hash_type")] + public string HashType { get; set; } = default!; + + /// + /// 获取或设置哈希值。 + /// + [Newtonsoft.Json.JsonProperty("hash_value")] + [System.Text.Json.Serialization.JsonPropertyName("hash_value")] + public string HashValue { get; set; } = default!; + + /// + /// 获取或设置流水文件下载地址。 + /// + [Newtonsoft.Json.JsonProperty("url")] + [System.Text.Json.Serialization.JsonPropertyName("url")] + public string Url { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockRequest.cs new file mode 100644 index 00000000..c118a6e8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/stocks/{stock_id}/pause 接口的请求。 + /// + public class PauseMarketingFavorStockRequest : StartMarketingFavorStockRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockResponse.cs new file mode 100644 index 00000000..376d8c46 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/PauseMarketingFavorStockResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/stocks/{stock_id}/pause 接口的响应。 + /// + public class PauseMarketingFavorStockResponse : StartMarketingFavorStockResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsRequest.cs new file mode 100644 index 00000000..a54e53a3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/items 接口的请求。 + /// + public class QueryMarketingFavorStockItemsRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? StockCreatorMerchantId { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Limit { get; set; } = 10; + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Offset { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsResponse.cs new file mode 100644 index 00000000..2fdc68d4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockItemsResponse.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/items 接口的响应。 + /// + public class QueryMarketingFavorStockItemsResponse : WechatTenpayResponse + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置可用单品编码列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public string[] Items { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.cs new file mode 100644 index 00000000..0ccff308 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/merchants 接口的请求。 + /// + public class QueryMarketingFavorStockMerchantsRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? StockCreatorMerchantId { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Limit { get; set; } = 10; + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Offset { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.cs new file mode 100644 index 00000000..9b05c5f2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks/{stock_id}/merchants 接口的响应。 + /// + public class QueryMarketingFavorStockMerchantsResponse : WechatTenpayResponse + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置可用商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public string[] MerchantIdList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingFavor/QueryMarketingFavorStocksRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksRequest.cs new file mode 100644 index 00000000..4d586829 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks 接口的请求。 + /// + public class QueryMarketingFavorStocksRequest : WechatTenpayRequest + { + /// + /// 获取或设置起始时间。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public DateTimeOffset? CreateStartTime { get; set; } + + /// + /// 获取或设置终止时间。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public DateTimeOffset? CreateEndTime { get; set; } + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? StockCreatorMerchantId { get; set; } + + /// + /// 获取或设置批次状态。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? Status { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Limit { get; set; } = 10; + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Offset { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksResponse.cs new file mode 100644 index 00000000..0aac7f23 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/QueryMarketingFavorStocksResponse.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/stocks 接口的响应。 + /// + public class QueryMarketingFavorStocksResponse : WechatTenpayResponse + { + public static class Types + { + public class Stock + { + public static class Types + { + public class StockUseRule : GetMarketingFavorStockByStockIdResponse.Types.StockUseRule + { + } + + public class CutToMessage : GetMarketingFavorStockByStockIdResponse.Types.CutToMessage + { + } + } + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置批次名称。 + /// + [Newtonsoft.Json.JsonProperty("stock_name")] + [System.Text.Json.Serialization.JsonPropertyName("stock_name")] + public string StockName { get; set; } = default!; + + /// + /// 获取或设置批次类型。 + /// + [Newtonsoft.Json.JsonProperty("stock_type")] + [System.Text.Json.Serialization.JsonPropertyName("stock_type")] + public string StockType { get; set; } = default!; + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string StockCreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置批次状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置使用说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置可用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置可用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("stock_use_rule")] + [System.Text.Json.Serialization.JsonPropertyName("stock_use_rule")] + public Types.StockUseRule StockUseRule { get; set; } = default!; + + /// + /// 获取或设置已发券数量。 + /// + [Newtonsoft.Json.JsonProperty("distributed_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("distributed_coupons")] + public int DistributedCoupons { get; set; } + + /// + /// 获取或设置是否无资金流。 + /// + [Newtonsoft.Json.JsonProperty("no_cash")] + [System.Text.Json.Serialization.JsonPropertyName("no_cash")] + public bool IsNoCash { get; set; } + + /// + /// 获取或设置是否单品优惠。 + /// + [Newtonsoft.Json.JsonProperty("singleitem")] + [System.Text.Json.Serialization.JsonPropertyName("singleitem")] + public bool IsSingleItem { get; set; } + + /// + /// 获取或设置单品优惠特定信息。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_message")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_message")] + public Types.CutToMessage? CutToMessage { get; set; } + + /// + /// 获取或设置激活时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StartTime { get; set; } + + /// + /// 获取或设置终止时间。 + /// + [Newtonsoft.Json.JsonProperty("stop_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("stop_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? StopTime { get; set; } + + /// + /// 获取或设置创建时间。 + /// + [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.Stock[] StockList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingFavor/RestartMarketingFavorStockRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockRequest.cs new file mode 100644 index 00000000..cc814597 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/stocks/{stock_id}/restart 接口的请求。 + /// + public class RestartMarketingFavorStockRequest : StartMarketingFavorStockRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockResponse.cs new file mode 100644 index 00000000..311f9f10 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/RestartMarketingFavorStockResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/stocks/{stock_id}/restart 接口的响应。 + /// + public class RestartMarketingFavorStockResponse : StartMarketingFavorStockResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockRequest.cs new file mode 100644 index 00000000..ca1b265f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/stocks/{stock_id}/start 接口的请求。 + /// + public class StartMarketingFavorStockRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string? StockCreatorMerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockResponse.cs new file mode 100644 index 00000000..17f17438 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/StartMarketingFavorStockResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/stocks/{stock_id}/start 接口的响应。 + /// + public class StartMarketingFavorStockResponse : WechatTenpayResponse + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置生效时间。 + /// + [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; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.cs new file mode 100644 index 00000000..698ff13a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/users/{openid}/coupons/{coupon_id} 接口的请求。 + /// + public class GetMarketingFavorUserCouponByCouponIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string CouponId { get; set; } = string.Empty; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.cs new file mode 100644 index 00000000..7437d2f4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/users/{openid}/coupons/{coupon_id} 接口的响应。 + /// + public class GetMarketingFavorUserCouponByCouponIdResponse : WechatTenpayResponse + { + public static class Types + { + public class CutToMessage + { + /// + /// 获取或设置可用优惠的商品最高单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("single_price_max")] + [System.Text.Json.Serialization.JsonPropertyName("single_price_max")] + public int SinglePriceMax { get; set; } + + /// + /// 获取或设置减至后的优惠单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_price")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_price")] + public int CutToPrice { get; set; } + } + + public class NormalCoupon + { + /// + /// 获取或设置券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("coupon_amount")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_amount")] + public int CouponAmount { get; set; } + + /// + /// 获取或设置使用门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_minimum")] + public int TransactionMinimum { get; set; } + } + } + + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = default!; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string StockCreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置代金券名称。 + /// + [Newtonsoft.Json.JsonProperty("coupon_name")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_name")] + public string CouponName { get; set; } = default!; + + /// + /// 获取或设置券类型。 + /// + [Newtonsoft.Json.JsonProperty("coupon_type")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_type")] + public string CouponType { get; set; } = default!; + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置使用说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置可用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置可用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置已发券数量。 + /// + [Newtonsoft.Json.JsonProperty("distributed_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("distributed_coupons")] + public int DistributedCoupons { get; set; } + + /// + /// 获取或设置是否无资金流。 + /// + [Newtonsoft.Json.JsonProperty("no_cash")] + [System.Text.Json.Serialization.JsonPropertyName("no_cash")] + public bool IsNoCash { get; set; } + + /// + /// 获取或设置是否单品优惠。 + /// + [Newtonsoft.Json.JsonProperty("singleitem")] + [System.Text.Json.Serialization.JsonPropertyName("singleitem")] + public bool IsSingleItem { get; set; } + + /// + /// 获取或设置单品优惠特定信息。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_message")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_message")] + public Types.CutToMessage? CutToMessage { get; set; } + + /// + /// 获取或设置满减券信息。 + /// + [Newtonsoft.Json.JsonProperty("normal_coupon_information")] + [System.Text.Json.Serialization.JsonPropertyName("normal_coupon_information")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置领券时间。 + /// + [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/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.cs new file mode 100644 index 00000000..e5070aea --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/users/{openid}/coupons 接口的请求。 + /// + public class QueryMarketingFavorUserCouponsRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? StockId { get; set; } + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? CreatorMerchantId { get; set; } + + /// + /// 获取或设置批次发放的商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SenderMerchantId { get; set; } + + /// + /// 获取或设置可用商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? AvailableMerchantId { get; set; } + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? Status { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [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/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.cs new file mode 100644 index 00000000..e77d8eab --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.cs @@ -0,0 +1,241 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/favor/users/{openid}/coupons 接口的响应。 + /// + public class QueryMarketingFavorUserCouponsResponse : WechatTenpayResponse + { + public static class Types + { + public class Coupon + { + public static class Types + { + public class CutToMessage : GetMarketingFavorUserCouponByCouponIdResponse.Types.CutToMessage + { + } + + public class NormalCoupon : GetMarketingFavorUserCouponByCouponIdResponse.Types.NormalCoupon + { + } + + public class Consumption + { + public static class Types + { + public class GoodsDetail + { + /// + /// 获取或设置商品编码。 + /// + [Newtonsoft.Json.JsonProperty("goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("goods_id")] + public string GoodsId { get; set; } = default!; + + /// + /// 获取或设置商品数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置商品单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("price")] + [System.Text.Json.Serialization.JsonPropertyName("price")] + public int UnitPrice { get; set; } + + /// + /// 获取或设置商品优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("discount_amount")] + [System.Text.Json.Serialization.JsonPropertyName("discount_amount")] + public int DiscountAmount { get; set; } + } + } + + /// + /// 获取或设置核销时间。 + /// + [Newtonsoft.Json.JsonProperty("consume_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("consume_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ConsumeTime { get; set; } + + /// + /// 获取或设置核销商户号。 + /// + [Newtonsoft.Json.JsonProperty("consume_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("consume_mchid")] + public string ConsumeMerchantId { get; set; } = default!; + + /// + /// 获取或设置微信支付单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置单品列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_detail")] + [System.Text.Json.Serialization.JsonPropertyName("goods_detail")] + public Types.GoodsDetail[]? GoodsList { get; set; } + } + } + + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = default!; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string StockCreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置代金券名称。 + /// + [Newtonsoft.Json.JsonProperty("coupon_name")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_name")] + public string CouponName { get; set; } = default!; + + /// + /// 获取或设置券类型。 + /// + [Newtonsoft.Json.JsonProperty("coupon_type")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_type")] + public string CouponType { get; set; } = default!; + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置使用说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置可用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置可用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置已发券数量。 + /// + [Newtonsoft.Json.JsonProperty("distributed_coupons")] + [System.Text.Json.Serialization.JsonPropertyName("distributed_coupons")] + public int DistributedCoupons { get; set; } + + /// + /// 获取或设置是否无资金流。 + /// + [Newtonsoft.Json.JsonProperty("no_cash")] + [System.Text.Json.Serialization.JsonPropertyName("no_cash")] + public bool IsNoCash { get; set; } + + /// + /// 获取或设置是否单品优惠。 + /// + [Newtonsoft.Json.JsonProperty("singleitem")] + [System.Text.Json.Serialization.JsonPropertyName("singleitem")] + public bool IsSingleItem { get; set; } + + /// + /// 获取或设置单品优惠特定信息。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_message")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_message")] + public Types.CutToMessage? CutToMessage { get; set; } + + /// + /// 获取或设置满减券信息。 + /// + [Newtonsoft.Json.JsonProperty("normal_coupon_information")] + [System.Text.Json.Serialization.JsonPropertyName("normal_coupon_information")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置已实扣代金券核销信息。 + /// + [Newtonsoft.Json.JsonProperty("consume_information")] + [System.Text.Json.Serialization.JsonPropertyName("consume_information")] + public Types.Consumption? Consumption { get; set; } + + /// + /// 获取或设置领券时间。 + /// + [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.Coupon[] CouponList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.cs new file mode 100644 index 00000000..ba91e5cd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/users/{openid}/coupons 接口的请求。 + /// + public class SendMarketingFavorUserCouponRequest : WechatTenpayRequest + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置创建批次的商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string? StockCreatorMerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置商户单据号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置指定发券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("coupon_value")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_value")] + public int? CouponAmount { get; set; } + + /// + /// 获取或设置指定发券使用门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("coupon_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_minimum")] + public int? TransactionMinimum { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.cs new file mode 100644 index 00000000..90b2942d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/users/{openid}/coupons 接口的响应。 + /// + public class SendMarketingFavorUserCouponResponse : WechatTenpayResponse + { + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageRequest.cs new file mode 100644 index 00000000..8e78d3ac --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/media/image-upload 接口的请求。 + /// + public class UploadMarketingMediaImageRequest : WechatTenpayRequest + { + /// + /// 获取或设置图片文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = new byte[0]; + + /// + /// 获取或设置图片文件名(必须以 jpg、bmp、png 为后缀)。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("filename")] + [System.Text.Json.Serialization.JsonPropertyName("filename")] + public string? FileName { get; set; } + + /// + /// 获取或设置图片文件摘要。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("sha256")] + [System.Text.Json.Serialization.JsonPropertyName("sha256")] + public string? FileHash { get; set; } + + /// + /// 获取或设置图片文件 Conent-Type。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileContentType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageResponse.cs new file mode 100644 index 00000000..bbe18691 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMedia/UploadMarketingMediaImageResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/favor/media/image-upload 接口的响应。 + /// + public class UploadMarketingMediaImageResponse : WechatTenpayResponse + { + /// + /// 获取或设置媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("media_url")] + [System.Text.Json.Serialization.JsonPropertyName("media_url")] + public string MediaUrl { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipRequest.cs new file mode 100644 index 00000000..8e7be807 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipRequest.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/partnerships/build 接口的请求。 + /// + public class BuildMarketingPartnershipRequest : WechatTenpayRequest + { + public static class Types + { + public class Partner + { + /// + /// 获取或设置合作方类别。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置合作方 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置合作方商户号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id")] + public string? MerchantId { get; set; } + } + + public class AuthorizedData + { + /// + /// 获取或设置授权业务类别。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public string BusinessType { get; set; } = string.Empty; + + /// + /// 获取或设置授权场景列表。 + /// + [Newtonsoft.Json.JsonProperty("scenarios")] + [System.Text.Json.Serialization.JsonPropertyName("scenarios")] + public IList? Scenarios { get; set; } + + /// + /// 获取或设置授权批次 ID。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string? StockId { get; set; } + } + } + + /// + /// 获取或设置业务请求幂等值。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string IdempotencyKey { get; set; } = string.Empty; + + /// + /// 获取或设置合作方信息。 + /// + [Newtonsoft.Json.JsonProperty("partner")] + [System.Text.Json.Serialization.JsonPropertyName("partner")] + public Types.Partner Partner { get; set; } = new Types.Partner(); + + /// + /// 获取或设置被授权数据。 + /// + [Newtonsoft.Json.JsonProperty("authorized_data")] + [System.Text.Json.Serialization.JsonPropertyName("authorized_data")] + public Types.AuthorizedData AuthorizedData { get; set; } = new Types.AuthorizedData(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipResponse.cs new file mode 100644 index 00000000..7768b27a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/BuildMarketingPartnershipResponse.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/partnerships/build 接口的响应。 + /// + public class BuildMarketingPartnershipResponse : WechatTenpayResponse + { + public static class Types + { + public class Partner : QueryMarketingPartnershipsResponse.Types.Partnership.Types.Partner + { + } + + public class AuthorizedData : QueryMarketingPartnershipsResponse.Types.Partnership.Types.AuthorizedData + { + } + } + + /// + /// 获取或设置合作方信息。 + /// + [Newtonsoft.Json.JsonProperty("partner")] + [System.Text.Json.Serialization.JsonPropertyName("partner")] + public Types.Partner Partner { get; set; } = default!; + + /// + /// 获取或设置被授权数据。 + /// + [Newtonsoft.Json.JsonProperty("authorized_data")] + [System.Text.Json.Serialization.JsonPropertyName("authorized_data")] + public Types.AuthorizedData AuthorizedData { get; set; } = default!; + + /// + /// 获取或设置合作状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置建立合作关系时间。 + /// + [Newtonsoft.Json.JsonProperty("build_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("build_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BuildTime { get; set; } + + /// + /// 获取或设置创建时间。 + /// + [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("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/MarketingPartnerships/QueryMarketingPartnershipsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/QueryMarketingPartnershipsRequest.cs new file mode 100644 index 00000000..468b6947 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/QueryMarketingPartnershipsRequest.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/partnerships 接口的请求。 + /// + public class QueryMarketingPartnershipsRequest : WechatTenpayRequest + { + public static class Types + { + public class Partner + { + /// + /// 获取或设置合作方类别。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = string.Empty; + + /// + /// 获取或设置合作方 AppId。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置合作方商户号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id")] + public string? MerchantId { get; set; } + } + + public class AuthorizedData + { + /// + /// 获取或设置授权业务类别。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public string BusinessType { get; set; } = string.Empty; + + /// + /// 获取或设置授权场景。 + /// + [Newtonsoft.Json.JsonProperty("scenarios")] + [System.Text.Json.Serialization.JsonPropertyName("scenarios")] + public string? Scenarios { get; set; } + + /// + /// 获取或设置授权批次 ID。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string? StockId { get; set; } + } + } + + /// + /// 获取或设置合作方信息。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public Types.Partner Partner { get; set; } = new Types.Partner(); + + /// + /// 获取或设置被授权数据。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public Types.AuthorizedData AuthorizedData { get; set; } = new Types.AuthorizedData(); + + /// + /// 获取或设置分页大小。 + /// + [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/MarketingPartnerships/QueryMarketingPartnershipsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/QueryMarketingPartnershipsResponse.cs new file mode 100644 index 00000000..a6cc5afb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/QueryMarketingPartnershipsResponse.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/partnerships 接口的响应。 + /// + public class QueryMarketingPartnershipsResponse : WechatTenpayResponse + { + public static class Types + { + public class Partnership + { + public static class Types + { + public class Partner + { + /// + /// 获取或设置合作方类别。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置合作方 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置合作方商户号。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id")] + public string? MerchantId { get; set; } + } + + public class AuthorizedData + { + /// + /// 获取或设置授权业务类别。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public string BusinessType { get; set; } = default!; + + /// + /// 获取或设置授权场景列表。 + /// + [Newtonsoft.Json.JsonProperty("scenarios")] + [System.Text.Json.Serialization.JsonPropertyName("scenarios")] + public string[]? Scenarios { get; set; } + + /// + /// 获取或设置授权批次 ID。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string? StockId { get; set; } + } + } + + /// + /// 获取或设置合作方信息。 + /// + [Newtonsoft.Json.JsonProperty("partner")] + [System.Text.Json.Serialization.JsonPropertyName("partner")] + public Types.Partner Partner { get; set; } = default!; + + /// + /// 获取或设置被授权数据。 + /// + [Newtonsoft.Json.JsonProperty("authorized_data")] + [System.Text.Json.Serialization.JsonPropertyName("authorized_data")] + public Types.AuthorizedData AuthorizedData { get; set; } = default!; + + /// + /// 获取或设置合作状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置建立合作关系时间。 + /// + [Newtonsoft.Json.JsonProperty("build_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("build_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BuildTime { get; set; } + + /// + /// 获取或设置终止合作关系时间。 + /// + [Newtonsoft.Json.JsonProperty("terminate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("terminate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? TerminateTime { get; set; } + + /// + /// 获取或设置创建时间。 + /// + [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("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; } + } + } + + /// + /// 获取或设置服务人员列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Partnership[] PartnershipList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingPartnerships/TerminateMarketingPartnershipRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipRequest.cs new file mode 100644 index 00000000..79326306 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipRequest.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/partnerships/terminate 接口的请求。 + /// + public class TerminateMarketingPartnershipRequest : WechatTenpayRequest + { + public static class Types + { + public class Partner : BuildMarketingPartnershipRequest.Types.Partner + { + } + + public class AuthorizedData : BuildMarketingPartnershipRequest.Types.AuthorizedData + { + } + } + + /// + /// 获取或设置业务请求幂等值。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string IdempotencyKey { get; set; } = string.Empty; + + /// + /// 获取或设置合作方信息。 + /// + [Newtonsoft.Json.JsonProperty("partner")] + [System.Text.Json.Serialization.JsonPropertyName("partner")] + public Types.Partner Partner { get; set; } = new Types.Partner(); + + /// + /// 获取或设置被授权数据。 + /// + [Newtonsoft.Json.JsonProperty("authorized_data")] + [System.Text.Json.Serialization.JsonPropertyName("authorized_data")] + public Types.AuthorizedData AuthorizedData { get; set; } = new Types.AuthorizedData(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipResponse.cs new file mode 100644 index 00000000..19f728b1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPartnerships/TerminateMarketingPartnershipResponse.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/partnerships/terminate 接口的响应。 + /// + public class TerminateMarketingPartnershipResponse : WechatTenpayResponse + { + /// + /// 获取或设置终止合作关系时间。 + /// + [Newtonsoft.Json.JsonProperty("terminate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("terminate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset TerminateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.cs new file mode 100644 index 00000000..d7b6f890 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.cs @@ -0,0 +1,276 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/unique-threshold-activity 接口的请求。 + /// + public class CreateMarketingPayGiftActivityUniqueThresholdActivityRequest : WechatTenpayRequest + { + public static class Types + { + public class ActivityBaseInformation + { + public static class Types + { + public class AvailablePeriods + { + public static class Types + { + public class AvailableTime + { + /// + /// 获取或设置开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BeginTime { get; set; } + + /// + /// 获取或设置结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + } + + public class AvailableDayTime + { + /// + /// 获取或设置每日可用开始时间(格式:HHmmss)。 + /// + [Newtonsoft.Json.JsonProperty("begin_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("begin_day_time")] + public string BeginDayTimeString { get; set; } = string.Empty; + + /// + /// 获取或设置每日可用结束时间(格式:HHmmss)。 + /// + [Newtonsoft.Json.JsonProperty("end_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_day_time")] + public string EndDayTimeString { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置可用时间列表。 + /// + [Newtonsoft.Json.JsonProperty("available_time")] + [System.Text.Json.Serialization.JsonPropertyName("available_time")] + public IList? AvailableTimeList { get; set; } + + /// + /// 获取或设置每日可用时间列表。 + /// + [Newtonsoft.Json.JsonProperty("available_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("available_day_time")] + public IList? AvailableDayTimeList { get; set; } + } + } + + /// + /// 获取或设置活动名称。 + /// + [Newtonsoft.Json.JsonProperty("activity_name")] + [System.Text.Json.Serialization.JsonPropertyName("activity_name")] + public string ActivityName { get; set; } = string.Empty; + + /// + /// 获取或设置活动副标题。 + /// + [Newtonsoft.Json.JsonProperty("activity_second_title")] + [System.Text.Json.Serialization.JsonPropertyName("activity_second_title")] + public string ActivitySecondTitle { get; set; } = string.Empty; + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置品牌 Logo 媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("merchant_logo_url")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_logo_url")] + public string MerchantLogoMediaUrl { get; set; } = string.Empty; + + /// + /// 获取或设置背景颜色。 + /// + [Newtonsoft.Json.JsonProperty("background_color")] + [System.Text.Json.Serialization.JsonPropertyName("background_color")] + public string? BackgroundColor { get; set; } + + /// + /// 获取或设置活动开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BeginTime { get; set; } + + /// + /// 获取或设置活动结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + + /// + /// 获取或设置可用时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("available_periods")] + [System.Text.Json.Serialization.JsonPropertyName("available_periods")] + public Types.AvailablePeriods? AvailablePeriods { get; set; } + + /// + /// 获取或设置投放目的。 + /// + [Newtonsoft.Json.JsonProperty("delivery_purpose")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_purpose")] + public string DeliveryPurpose { get; set; } = string.Empty; + + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string? MiniProgramPath { get; set; } + } + + public class AwardSendRule + { + public static class Types + { + public class Award + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = string.Empty; + + /// + /// 获取或设置奖品原始图媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("original_image_url")] + [System.Text.Json.Serialization.JsonPropertyName("original_image_url")] + public string OriginalImageMediaUrl { get; set; } = string.Empty; + + /// + /// 获取或设置奖品缩略图媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("thumbnail_url")] + [System.Text.Json.Serialization.JsonPropertyName("thumbnail_url")] + public string? ThumbnailMediaUrl { get; set; } + } + } + + /// + /// 获取或设置消费金额门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_amount_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_amount_minimum")] + public int TransactionAmountMinimum { get; set; } + + /// + /// 获取或设置发放内容。 + /// + [Newtonsoft.Json.JsonProperty("send_content")] + [System.Text.Json.Serialization.JsonPropertyName("send_content")] + public string SendContent { get; set; } = string.Empty; + + /// + /// 获取或设置奖品类型。 + /// + [Newtonsoft.Json.JsonProperty("award_type")] + [System.Text.Json.Serialization.JsonPropertyName("award_type")] + public string AwardType { get; set; } = string.Empty; + + /// + /// 获取或设置奖品基本信息列表。 + /// + [Newtonsoft.Json.JsonProperty("award_list")] + [System.Text.Json.Serialization.JsonPropertyName("award_list")] + public IList? AwardList { get; set; } + + /// + /// 获取或设置发券商户号选项。 + /// + [Newtonsoft.Json.JsonProperty("merchant_option")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_option")] + public string MerchantOption { get; set; } = string.Empty; + + /// + /// 获取或设置发券商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id_list")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id_list")] + public IList? MerchantIdList { get; set; } + } + + public class AdvancedSetting + { + /// + /// 获取或设置投放用户类别。 + /// + [Newtonsoft.Json.JsonProperty("delivery_user_category")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_user_category")] + public string? DeliveryUserCategory { get; set; } + + /// + /// 获取或设置商家会员 AppId。 + /// + [Newtonsoft.Json.JsonProperty("merchant_member_appid")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_member_appid")] + public string? MerchantMemberAppId { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tags")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tags")] + public IList? GoodsTagList { get; set; } + } + } + + /// + /// 获取或设置活动基本信息。 + /// + [Newtonsoft.Json.JsonProperty("activity_base_info")] + [System.Text.Json.Serialization.JsonPropertyName("activity_base_info")] + public Types.ActivityBaseInformation ActivityBaseInformation { get; set; } = new Types.ActivityBaseInformation(); + + /// + /// 获取或设置活动奖品发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("award_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("award_send_rule")] + public Types.AwardSendRule AwardSendRule { get; set; } = new Types.AwardSendRule(); + + /// + /// 获取或设置活动高级设置信息。 + /// + [Newtonsoft.Json.JsonProperty("advanced_setting")] + [System.Text.Json.Serialization.JsonPropertyName("advanced_setting")] + public Types.AdvancedSetting? AdvancedSetting { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.cs new file mode 100644 index 00000000..1066cf2a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/unique-threshold-activity 接口的响应。 + /// + public class CreateMarketingPayGiftActivityUniqueThresholdActivityResponse : WechatTenpayResponse + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { 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/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.cs new file mode 100644 index 00000000..11bcc0e0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id} 接口的请求。 + /// + public class GetMarketingPayGiftActivityByActivityIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ActivityId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.cs new file mode 100644 index 00000000..6c9e597b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id} 接口的响应。 + /// + public class GetMarketingPayGiftActivityByActivityIdResponse : WechatTenpayResponse + { + public static class Types + { + public class ActivityBaseInformation + { + public static class Types + { + public class AvailablePeriods + { + public static class Types + { + public class AvailableTime + { + /// + /// 获取或设置开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BeginTime { get; set; } + + /// + /// 获取或设置结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + } + + public class AvailableDayTime + { + /// + /// 获取或设置每日可用开始时间(格式:HHmmss)。 + /// + [Newtonsoft.Json.JsonProperty("begin_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("begin_day_time")] + public string BeginDayTimeString { get; set; } = default!; + + /// + /// 获取或设置每日可用结束时间(格式:HHmmss)。 + /// + [Newtonsoft.Json.JsonProperty("end_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_day_time")] + public string EndDayTimeString { get; set; } = default!; + } + } + + /// + /// 获取或设置可用时间列表。 + /// + [Newtonsoft.Json.JsonProperty("available_time")] + [System.Text.Json.Serialization.JsonPropertyName("available_time")] + public Types.AvailableTime[]? AvailableTimeList { get; set; } + + /// + /// 获取或设置每日可用时间列表。 + /// + [Newtonsoft.Json.JsonProperty("available_day_time")] + [System.Text.Json.Serialization.JsonPropertyName("available_day_time")] + public Types.AvailableDayTime[]? AvailableDayTimeList { get; set; } + } + } + + /// + /// 获取或设置活动名称。 + /// + [Newtonsoft.Json.JsonProperty("activity_name")] + [System.Text.Json.Serialization.JsonPropertyName("activity_name")] + public string ActivityName { get; set; } = default!; + + /// + /// 获取或设置活动副标题。 + /// + [Newtonsoft.Json.JsonProperty("activity_second_title")] + [System.Text.Json.Serialization.JsonPropertyName("activity_second_title")] + public string ActivitySecondTitle { get; set; } = default!; + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置品牌 Logo 媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("merchant_logo_url")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_logo_url")] + public string MerchantLogoMediaUrl { get; set; } = default!; + + /// + /// 获取或设置背景颜色。 + /// + [Newtonsoft.Json.JsonProperty("background_color")] + [System.Text.Json.Serialization.JsonPropertyName("background_color")] + public string? BackgroundColor { get; set; } + + /// + /// 获取或设置活动开始时间。 + /// + [Newtonsoft.Json.JsonProperty("begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset BeginTime { get; set; } + + /// + /// 获取或设置活动结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + + /// + /// 获取或设置可用时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("available_periods")] + [System.Text.Json.Serialization.JsonPropertyName("available_periods")] + public Types.AvailablePeriods? AvailablePeriods { get; set; } + + /// + /// 获取或设置投放目的。 + /// + [Newtonsoft.Json.JsonProperty("delivery_purpose")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_purpose")] + public string DeliveryPurpose { get; set; } = default!; + + /// + /// 获取或设置商家小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_appid")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_appid")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置商家小程序路径。 + /// + [Newtonsoft.Json.JsonProperty("mini_programs_path")] + [System.Text.Json.Serialization.JsonPropertyName("mini_programs_path")] + public string? MiniProgramPath { get; set; } + } + + public class AwardSendRule + { + public static class Types + { + public class FullSendRule + { + public static class Types + { + public class Award + { + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置奖品原始图媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("original_image_url")] + [System.Text.Json.Serialization.JsonPropertyName("original_image_url")] + public string OriginalImageMediaUrl { get; set; } = default!; + + /// + /// 获取或设置奖品缩略图媒体文件地址。 + /// + [Newtonsoft.Json.JsonProperty("thumbnail_url")] + [System.Text.Json.Serialization.JsonPropertyName("thumbnail_url")] + public string? ThumbnailMediaUrl { get; set; } + } + } + + /// + /// 获取或设置消费金额门槛(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("transaction_amount_minimum")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_amount_minimum")] + public int TransactionAmountMinimum { get; set; } + + /// + /// 获取或设置发放内容。 + /// + [Newtonsoft.Json.JsonProperty("send_content")] + [System.Text.Json.Serialization.JsonPropertyName("send_content")] + public string SendContent { get; set; } = default!; + + /// + /// 获取或设置奖品类型。 + /// + [Newtonsoft.Json.JsonProperty("award_type")] + [System.Text.Json.Serialization.JsonPropertyName("award_type")] + public string AwardType { get; set; } = default!; + + /// + /// 获取或设置奖品基本信息列表。 + /// + [Newtonsoft.Json.JsonProperty("award_list")] + [System.Text.Json.Serialization.JsonPropertyName("award_list")] + public Types.Award[]? AwardList { get; set; } + + /// + /// 获取或设置发券商户号选项。 + /// + [Newtonsoft.Json.JsonProperty("merchant_option")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_option")] + public string MerchantOption { get; set; } = default!; + + /// + /// 获取或设置发券商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id_list")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id_list")] + public string[]? MerchantIdList { get; set; } + } + } + + /// + /// 获取或设置满送活动奖品发放规则选项。 + /// + [Newtonsoft.Json.JsonProperty("full_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("full_send_rule")] + public Types.FullSendRule FullSendRule { get; set; } = default!; + } + + public class AdvancedSetting + { + /// + /// 获取或设置投放用户类别。 + /// + [Newtonsoft.Json.JsonProperty("delivery_user_category")] + [System.Text.Json.Serialization.JsonPropertyName("delivery_user_category")] + public string? DeliveryUserCategory { get; set; } + + /// + /// 获取或设置商家会员 AppId。 + /// + [Newtonsoft.Json.JsonProperty("merchant_member_appid")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_member_appid")] + public string? MerchantMemberAppId { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tags")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tags")] + public string[]? GoodsTagList { get; set; } + } + } + + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置活动类型。 + /// + [Newtonsoft.Json.JsonProperty("activity_type")] + [System.Text.Json.Serialization.JsonPropertyName("activity_type")] + public string? ActivityType { get; set; } + + /// + /// 获取或设置活动状态。 + /// + [Newtonsoft.Json.JsonProperty("activity_status")] + [System.Text.Json.Serialization.JsonPropertyName("activity_status")] + public string ActivityStatus { get; set; } = default!; + + /// + /// 获取或设置创建商户号。 + /// + [Newtonsoft.Json.JsonProperty("creator_merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("creator_merchant_id")] + public string CreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置所属商户号。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant_id")] + public string BelongMerchantId { get; set; } = default!; + + /// + /// 获取或设置活动基本信息。 + /// + [Newtonsoft.Json.JsonProperty("activity_base_info")] + [System.Text.Json.Serialization.JsonPropertyName("activity_base_info")] + public Types.ActivityBaseInformation ActivityBaseInformation { get; set; } = default!; + + /// + /// 获取或设置活动奖品发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("award_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("award_send_rule")] + public Types.AwardSendRule AwardSendRule { get; set; } = default!; + + /// + /// 获取或设置活动高级设置信息。 + /// + [Newtonsoft.Json.JsonProperty("advanced_setting")] + [System.Text.Json.Serialization.JsonPropertyName("advanced_setting")] + public Types.AdvancedSetting? AdvancedSetting { get; set; } + + /// + /// 获取或设置活动暂停时间。 + /// + [Newtonsoft.Json.JsonProperty("pause_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("pause_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? PauseTime { get; set; } + + /// + /// 获取或设置活动恢复时间。 + /// + [Newtonsoft.Json.JsonProperty("recovery_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("recovery_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? RecoveryTime { get; set; } + + /// + /// 获取或设置活动创建时间。 + /// + [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("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/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsRequest.cs new file mode 100644 index 00000000..4e717a1e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/paygiftactivity/activities/{activity_id}/goods 接口的请求。 + /// + public class QueryMarketingPayGiftActivityGoodsRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ActivityId { get; set; } = string.Empty; + + /// + /// 获取或设置分页大小。 + /// + [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/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsResponse.cs new file mode 100644 index 00000000..9af71ea0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Goods/QueryMarketingPayGiftActivityGoodsResponse.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/paygiftactivity/activities/{activity_id}/goods 接口的响应。 + /// + public class QueryMarketingPayGiftActivityGoodsResponse : WechatTenpayResponse + { + public static class Types + { + public class Goods + { + /// + /// 获取或设置商品编码。 + /// + [Newtonsoft.Json.JsonProperty("goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("goods_id")] + public string GoodsId { 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("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; } + } + } + + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置商品列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Goods[] GoodsList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantRequest.cs new file mode 100644 index 00000000..d0dcc836 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id}/merchants/add 接口的请求。 + /// + public class AddMarketingPayGiftActivityMerchantRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ActivityId { get; set; } = string.Empty; + + /// + /// 获取或设置发券商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id_list")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id_list")] + public IList MerchantIdList { get; set; } = new List(); + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("add_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("add_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantResponse.cs new file mode 100644 index 00000000..eb06ecd3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/AddMarketingPayGiftActivityMerchantResponse.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id}/merchants/add 接口的响应。 + /// + public class AddMarketingPayGiftActivityMerchantResponse : WechatTenpayResponse + { + public static class Types + { + public class InvalidMerchant + { + /// + /// 获取或设置商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置无效原因。 + /// + [Newtonsoft.Json.JsonProperty("invalid_reason")] + [System.Text.Json.Serialization.JsonPropertyName("invalid_reason")] + public string MerchantMemberAppId { get; set; } = default!; + } + } + + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置校验失败的发券商户信息。 + /// + [Newtonsoft.Json.JsonProperty("invalid_merchant_id_list")] + [System.Text.Json.Serialization.JsonPropertyName("invalid_merchant_id_list")] + public Types.InvalidMerchant[]? InvalidMerchantList { get; set; } + + /// + /// 获取或设置添加时间。 + /// + [Newtonsoft.Json.JsonProperty("add_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("add_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? AddTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantRequest.cs new file mode 100644 index 00000000..34be7eea --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id}/merchants/delete 接口的请求。 + /// + public class DeleteMarketingPayGiftActivityMerchantRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ActivityId { get; set; } = string.Empty; + + /// + /// 获取或设置删除的发券商户号列表。 + /// + [Newtonsoft.Json.JsonProperty("merchant_id_list")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_id_list")] + public IList MerchantIdList { get; set; } = new List(); + + /// + /// 获取或设置商户请求单号。 + /// + [Newtonsoft.Json.JsonProperty("delete_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("delete_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantResponse.cs new file mode 100644 index 00000000..95feef36 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/DeleteMarketingPayGiftActivityMerchantResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id}/merchants/delete 接口的响应。 + /// + public class DeleteMarketingPayGiftActivityMerchantResponse : WechatTenpayResponse + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置添加时间。 + /// + [Newtonsoft.Json.JsonProperty("delete_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("delete_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset DeleteTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsRequest.cs new file mode 100644 index 00000000..f463f337 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/paygiftactivity/activities/{activity_id}/merchants 接口的请求。 + /// + public class QueryMarketingPayGiftActivityMerchantsRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ActivityId { get; set; } = string.Empty; + + /// + /// 获取或设置分页大小。 + /// + [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/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsResponse.cs new file mode 100644 index 00000000..150b8c41 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/Merchants/QueryMarketingPayGiftActivityMerchantsResponse.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/paygiftactivity/activities/{activity_id}/merchants 接口的响应。 + /// + public class QueryMarketingPayGiftActivityMerchantsResponse : WechatTenpayResponse + { + public static class Types + { + public class Merchant + { + /// + /// 获取或设置商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string? MerchantName { get; set; } + + /// + /// 获取或设置创建时间。 + /// + [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("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; } + } + } + + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置活动商户列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Merchant[] MerchantList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.cs new file mode 100644 index 00000000..70bcadb2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/paygiftactivity/activities 接口的请求。 + /// + public class QueryMarketingPayGiftActivitiesRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动名称。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? ActivityName { get; set; } + + /// + /// 获取或设置活动状态。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? ActivityStatus { get; set; } + + /// + /// 获取或设置奖品类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? AwardType { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Limit { get; set; } = 10; + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int Offset { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.cs new file mode 100644 index 00000000..4366f12e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /marketing/paygiftactivity/activities 接口的响应。 + /// + public class QueryMarketingPayGiftActivitiesResponse : WechatTenpayResponse + { + public static class Types + { + public class Activity + { + public static class Types + { + public class ActivityBaseInformation : GetMarketingPayGiftActivityByActivityIdResponse.Types.ActivityBaseInformation + { + } + + public class AwardSendRule : GetMarketingPayGiftActivityByActivityIdResponse.Types.AwardSendRule + { + } + + public class AdvancedSetting : GetMarketingPayGiftActivityByActivityIdResponse.Types.AdvancedSetting + { + } + } + + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置活动类型。 + /// + [Newtonsoft.Json.JsonProperty("activity_type")] + [System.Text.Json.Serialization.JsonPropertyName("activity_type")] + public string? ActivityType { get; set; } + + /// + /// 获取或设置活动状态。 + /// + [Newtonsoft.Json.JsonProperty("activity_status")] + [System.Text.Json.Serialization.JsonPropertyName("activity_status")] + public string ActivityStatus { get; set; } = default!; + + /// + /// 获取或设置创建商户号。 + /// + [Newtonsoft.Json.JsonProperty("creator_merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("creator_merchant_id")] + public string CreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置所属商户号。 + /// + [Newtonsoft.Json.JsonProperty("belong_merchant_id")] + [System.Text.Json.Serialization.JsonPropertyName("belong_merchant_id")] + public string BelongMerchantId { get; set; } = default!; + + /// + /// 获取或设置活动基本信息。 + /// + [Newtonsoft.Json.JsonProperty("activity_base_info")] + [System.Text.Json.Serialization.JsonPropertyName("activity_base_info")] + public Types.ActivityBaseInformation ActivityBaseInformation { get; set; } = default!; + + /// + /// 获取或设置活动奖品发放规则信息。 + /// + [Newtonsoft.Json.JsonProperty("award_send_rule")] + [System.Text.Json.Serialization.JsonPropertyName("award_send_rule")] + public Types.AwardSendRule AwardSendRule { get; set; } = default!; + + /// + /// 获取或设置活动高级设置信息。 + /// + [Newtonsoft.Json.JsonProperty("advanced_setting")] + [System.Text.Json.Serialization.JsonPropertyName("advanced_setting")] + public Types.AdvancedSetting? AdvancedSetting { get; set; } + + /// + /// 获取或设置活动暂停时间。 + /// + [Newtonsoft.Json.JsonProperty("pause_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("pause_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? PauseTime { get; set; } + + /// + /// 获取或设置活动恢复时间。 + /// + [Newtonsoft.Json.JsonProperty("recovery_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("recovery_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? RecoveryTime { get; set; } + + /// + /// 获取或设置活动创建时间。 + /// + [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("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; } + } + } + + /// + /// 获取或设置活动列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Activity[] ActivityList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.cs new file mode 100644 index 00000000..17208706 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id}/terminate 接口的请求。 + /// + public class TerminateMarketingPayGiftActivityRequest : WechatTenpayRequest + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ActivityId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.cs new file mode 100644 index 00000000..ff9be470 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /marketing/paygiftactivity/activities/{activity_id}/terminate 接口的响应。 + /// + public class TerminateMarketingPayGiftActivityResponse : WechatTenpayResponse + { + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string ActivityId { get; set; } = default!; + + /// + /// 获取或设置终止时间。 + /// + [Newtonsoft.Json.JsonProperty("terminate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("terminate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset TerminateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceRequest.cs new file mode 100644 index 00000000..e8c4bf7c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/balance/{account_type} 接口的请求。 + /// + public class GetMerchantFundBalanceRequest : WechatTenpayRequest + { + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AccountType { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceResponse.cs new file mode 100644 index 00000000..f23cd863 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundBalanceResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/balance/{account_type} 接口的响应。 + /// + public class GetMerchantFundBalanceResponse : WechatTenpayResponse + { + /// + /// 获取或设置可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("available_amount")] + [System.Text.Json.Serialization.JsonPropertyName("available_amount")] + public long AvailableAmount { get; set; } + + /// + /// 获取或设置不可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pending_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pending_amount")] + public long PendingAmount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.cs new file mode 100644 index 00000000..36cd6a87 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/dayendbalance/{account_type} 接口的请求。 + /// + public class GetMerchantFundDayendBalanceRequest : WechatTenpayRequest + { + /// + /// 获取或设置账户类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AccountType { get; set; } = string.Empty; + + /// + /// 获取或设置日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string DateString { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.cs new file mode 100644 index 00000000..38eff0e0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/dayendbalance/{account_type} 接口的响应。 + /// + public class GetMerchantFundDayendBalanceResponse : WechatTenpayResponse + { + /// + /// 获取或设置可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("available_amount")] + [System.Text.Json.Serialization.JsonPropertyName("available_amount")] + public long AvailableAmount { get; set; } + + /// + /// 获取或设置不可用余额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pending_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pending_amount")] + public long PendingAmount { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.cs new file mode 100644 index 00000000..a6ece831 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/withdraw/bill-type/{bill_type} 接口的请求。 + /// + public class GetMerchantFundWithdrawBillRequest : WechatTenpayRequest + { + /// + /// 获取或设置账单日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BillDateString { get; set; } = string.Empty; + + /// + /// 获取或设置资金账户类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BillType { get; set; } = "NO_SUCC"; + + /// + /// 获取或设置压缩类型。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? TarType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.cs new file mode 100644 index 00000000..d82e5ded --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/withdraw/bill-type/{bill_type} 接口的响应。 + /// + public class GetMerchantFundWithdrawBillResponse : WechatTenpayResponse + { + /// + /// 获取或设置哈希类型。 + /// + [Newtonsoft.Json.JsonProperty("hash_type")] + [System.Text.Json.Serialization.JsonPropertyName("hash_type")] + public string HashType { get; set; } = default!; + + /// + /// 获取或设置哈希值。 + /// + [Newtonsoft.Json.JsonProperty("hash_value")] + [System.Text.Json.Serialization.JsonPropertyName("hash_value")] + public string HashValue { get; set; } = default!; + + /// + /// 获取或设置账单下载地址。 + /// + [Newtonsoft.Json.JsonProperty("download_url")] + [System.Text.Json.Serialization.JsonPropertyName("download_url")] + public string DownloadUrl { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.cs new file mode 100644 index 00000000..817fa7d1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant/fund/withdraw 接口的请求。 + /// + public class CreateMerchantFundWithdrawRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = string.Empty; + + /// + /// 获取或设置提现金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置提现备注。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + + /// + /// 获取或设置银行附言。 + /// + [Newtonsoft.Json.JsonProperty("bank_memo")] + [System.Text.Json.Serialization.JsonPropertyName("bank_memo")] + public string? BankMemo { get; set; } + + /// + /// 获取或设置出款账户类型。 + /// + [Newtonsoft.Json.JsonProperty("account_type")] + [System.Text.Json.Serialization.JsonPropertyName("account_type")] + public string AccountType { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.cs new file mode 100644 index 00000000..2c2f1ad4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant/fund/withdraw 接口的响应。 + /// + public class CreateMerchantFundWithdrawResponse : WechatTenpayResponse + { + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付提现单号。 + /// + [Newtonsoft.Json.JsonProperty("withdraw_id")] + [System.Text.Json.Serialization.JsonPropertyName("withdraw_id")] + public string WithdrawId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.cs new file mode 100644 index 00000000..57717523 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/withdraw/out-request-no/{out_request_no} 接口的请求。 + /// + public class GetMerchantFundWithdrawByOutRequestNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutRequestNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.cs new file mode 100644 index 00000000..889225e7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/withdraw/out-request-no/{out_request_no} 接口的响应。 + /// + public class GetMerchantFundWithdrawByOutRequestNumberResponse : WechatTenpayResponse + { + /// + /// 获取或设置商户提现单号。 + /// + [Newtonsoft.Json.JsonProperty("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string OutRequestNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付提现单号。 + /// + [Newtonsoft.Json.JsonProperty("withdraw_id")] + [System.Text.Json.Serialization.JsonPropertyName("withdraw_id")] + public string WithdrawId { get; set; } = default!; + + /// + /// 获取或设置提现单状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置提现金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置提现备注。 + /// + [Newtonsoft.Json.JsonProperty("remark")] + [System.Text.Json.Serialization.JsonPropertyName("remark")] + public string? Remark { get; set; } + + /// + /// 获取或设置提现备注。 + /// + [Newtonsoft.Json.JsonProperty("bank_memo")] + [System.Text.Json.Serialization.JsonPropertyName("bank_memo")] + public string? BankMemo { get; set; } + + /// + /// 获取或设置出款账户类型。 + /// + [Newtonsoft.Json.JsonProperty("account_type")] + [System.Text.Json.Serialization.JsonPropertyName("account_type")] + public string AccountType { get; set; } = default!; + + /// + /// 获取或设置失败原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? FailReason { get; set; } + + /// + /// 获取或设置提现失败解决方案。 + /// + [Newtonsoft.Json.JsonProperty("solution")] + [System.Text.Json.Serialization.JsonPropertyName("solution")] + public string? FailSolution { get; set; } + + /// + /// 获取或设置发起提现时间。 + /// + [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("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/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.cs new file mode 100644 index 00000000..95cd0220 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/withdraw/{withdraw_id} 接口的请求。 + /// + public class GetMerchantFundWithdrawByWithdrawIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信支付提现单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WithdrawId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.cs new file mode 100644 index 00000000..b0046a6a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant/fund/withdraw/{withdraw_id} 接口的响应。 + /// + public class GetMerchantFundWithdrawByWithdrawIdResponse : GetMerchantFundWithdrawByOutRequestNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageRequest.cs new file mode 100644 index 00000000..c0cb92a8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant/media/upload 接口的请求。 + /// + public class UploadMerchantMediaImageRequest : WechatTenpayRequest + { + /// + /// 获取或设置图片文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = new byte[0]; + + /// + /// 获取或设置图片文件名(必须以 jpg、bmp、png 为后缀)。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("filename")] + [System.Text.Json.Serialization.JsonPropertyName("filename")] + public string? FileName { get; set; } + + /// + /// 获取或设置图片文件摘要。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("sha256")] + [System.Text.Json.Serialization.JsonPropertyName("sha256")] + public string? FileHash { get; set; } + + /// + /// 获取或设置图片文件 Conent-Type。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileContentType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageResponse.cs new file mode 100644 index 00000000..487365ba --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaImageResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant/media/upload 接口的响应。 + /// + public class UploadMerchantMediaImageResponse : WechatTenpayResponse + { + /// + /// 获取或设置媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("media_id")] + [System.Text.Json.Serialization.JsonPropertyName("media_id")] + public string MediaId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoRequest.cs new file mode 100644 index 00000000..fa57576e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant/media/video_upload 接口的请求。 + /// + public class UploadMerchantMediaVideoRequest : WechatTenpayRequest + { + /// + /// 获取或设置视频文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = new byte[0]; + + /// + /// 获取或设置视频文件名(必须以 avi、wmv、mpeg、mp4、mov、mkv、flv、f4v、m4v、rmvb 为后缀)。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("filename")] + [System.Text.Json.Serialization.JsonPropertyName("filename")] + public string? FileName { get; set; } + + /// + /// 获取或设置视频文件摘要。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("sha256")] + [System.Text.Json.Serialization.JsonPropertyName("sha256")] + public string? FileHash { get; set; } + + /// + /// 获取或设置视频文件 Conent-Type。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileContentType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoResponse.cs new file mode 100644 index 00000000..0e269d3f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantMedia/UploadMerchantMediaVideoResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant/media/video_upload 接口的响应。 + /// + public class UploadMerchantMediaVideoResponse : UploadMerchantMediaImageResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.cs new file mode 100644 index 00000000..e15eb755 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/complaint-notifications 接口的请求。 + /// + public class CreateMerchantServiceComplaintNotificationRequest : WechatTenpayRequest + { + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("url")] + [System.Text.Json.Serialization.JsonPropertyName("url")] + public string NotifyUrl { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.cs new file mode 100644 index 00000000..4f4b9687 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/complaint-notifications 接口的响应。 + /// + public class CreateMerchantServiceComplaintNotificationResponse : GetMerchantServiceComplaintNotificationResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.cs new file mode 100644 index 00000000..02b3bd2d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [DELETE] /merchant-service/complaint-notifications 接口的请求。 + /// + public class DeleteMerchantServiceComplaintNotificationRequest : WechatTenpayRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.cs new file mode 100644 index 00000000..47fbf877 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [DELETE] /merchant-service/complaint-notifications 接口的响应。 + /// + public class DeleteMerchantServiceComplaintNotificationResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.cs new file mode 100644 index 00000000..ade07022 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaint-notifications 接口的请求。 + /// + public class GetMerchantServiceComplaintNotificationRequest : WechatTenpayRequest + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.cs new file mode 100644 index 00000000..996243c4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaint-notifications 接口的响应。 + /// + public class GetMerchantServiceComplaintNotificationResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("url")] + [System.Text.Json.Serialization.JsonPropertyName("url")] + public string NotifyUrl { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.cs new file mode 100644 index 00000000..f4abdd4f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PUT] /merchant-service/complaint-notifications 接口的请求。 + /// + public class UpdateMerchantServiceComplaintNotificationRequest : WechatTenpayRequest + { + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("url")] + [System.Text.Json.Serialization.JsonPropertyName("url")] + public string NotifyUrl { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.cs new file mode 100644 index 00000000..4bf8ab91 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PUT] /merchant-service/complaint-notifications 接口的响应。 + /// + public class UpdateMerchantServiceComplaintNotificationResponse : GetMerchantServiceComplaintNotificationResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.cs new file mode 100644 index 00000000..0cf0634f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/complaints-v2/{complaint_id}/response 接口的请求。 + /// + public class CreateMerchantServiceComplaintResponseRequest : WechatTenpayRequest + { + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ComplaintId { get; set; } = string.Empty; + + /// + /// 获取或设置被诉商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("complainted_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("complainted_mchid")] + public string? ComplaintedMerchantId { get; set; } + + /// + /// 获取或设置回复内容。 + /// + [Newtonsoft.Json.JsonProperty("response_content")] + [System.Text.Json.Serialization.JsonPropertyName("response_content")] + public string ResponseContent { get; set; } = string.Empty; + + /// + /// 获取或设置回复图片 MediaId 列表。 + /// + [Newtonsoft.Json.JsonProperty("response_images")] + [System.Text.Json.Serialization.JsonPropertyName("response_images")] + public IList? ResponseMediaIdList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.cs new file mode 100644 index 00000000..537828a6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/complaints-v2/{complaint_id}/response 接口的响应。 + /// + public class CreateMerchantServiceComplaintResponseResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.cs new file mode 100644 index 00000000..825f9652 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaints-v2/{complaint_id} 接口的请求。 + /// + public class GetMerchantServiceComplaintByComplaintIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ComplaintId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs new file mode 100644 index 00000000..c9cd583c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaints-v2/{complaint_id} 接口的响应。 + /// + public class GetMerchantServiceComplaintByComplaintIdResponse : WechatTenpayResponse + { + public static class Types + { + public class ComplaintOrder + { + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { 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("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } + } + + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonProperty("complaint_id")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_id")] + public string ComplaintId { get; set; } = default!; + + /// + /// 获取或设置被诉商户号。 + /// + [Newtonsoft.Json.JsonProperty("complainted_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("complainted_mchid")] + public string ComplaintedMerchantId { get; set; } = default!; + + /// + /// 获取或设置投诉详情。 + /// + [Newtonsoft.Json.JsonProperty("complaint_detail")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_detail")] + public string ComplaintDetail { get; set; } = default!; + + /// + /// 获取或设置投诉单状态。 + /// + [Newtonsoft.Json.JsonProperty("complaint_state")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_state")] + public string ComplaintState { get; set; } = default!; + + /// + /// 获取或设置投诉时间。 + /// + [Newtonsoft.Json.JsonProperty("complaint_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("complaint_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ComplaintTime { get; set; } + + /// + /// 获取或设置投诉人联系方式(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("payer_phone")] + [System.Text.Json.Serialization.JsonPropertyName("payer_phone")] + public string? PayerPhoneEncryptedData { get; set; } + + /// + /// 获取或设置投诉人 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("payer_openid")] + [System.Text.Json.Serialization.JsonPropertyName("payer_openid")] + public string? PayerOpenId { get; set; } + + /// + /// 获取或设置投诉单关联订单列表。 + /// + [Newtonsoft.Json.JsonProperty("complaint_order_info")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_order_info")] + public Types.ComplaintOrder[]? ComplaintOrderList { get; set; } + + /// + /// 获取或设置投诉单是否已全额退款。 + /// + [Newtonsoft.Json.JsonProperty("complaint_full_refunded")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_full_refunded")] + public bool IsFullRefunded { get; set; } + + /// + /// 获取或设置是否有待回复的用户留言。 + /// + [Newtonsoft.Json.JsonProperty("incoming_user_response")] + [System.Text.Json.Serialization.JsonPropertyName("incoming_user_response")] + public bool HasIncomingUserResponse { get; set; } + + /// + /// 获取或设置用户投诉次数。 + /// + [Newtonsoft.Json.JsonProperty("user_complaint_times")] + [System.Text.Json.Serialization.JsonPropertyName("user_complaint_times")] + public int UserComplaintTimes { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.cs new file mode 100644 index 00000000..d124a382 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaints-v2/{complaint_id}/negotiation-historys 接口的请求。 + /// + public class QueryMerchantServiceComplaintNegotiationHistoriesRequest : WechatTenpayRequest + { + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ComplaintId { get; set; } = string.Empty; + + /// + /// 获取或设置分页大小。 + /// + [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/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs new file mode 100644 index 00000000..611f63a1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaints-v2/{complaint_id}/negotiation-historys 接口的响应。 + /// + public class QueryMerchantServiceComplaintNegotiationHistoriesResponse : WechatTenpayResponse + { + public static class Types + { + public class NegotiationHistory + { + /// + /// 获取或设置操作流水号。 + /// + [Newtonsoft.Json.JsonProperty("log_id")] + [System.Text.Json.Serialization.JsonPropertyName("log_id")] + public string LogId { get; set; } = default!; + + /// + /// 获取或设置操作人。 + /// + [Newtonsoft.Json.JsonProperty("operator")] + [System.Text.Json.Serialization.JsonPropertyName("operator")] + public string Operator { get; set; } = default!; + + /// + /// 获取或设置操作时间。 + /// + [Newtonsoft.Json.JsonProperty("operate_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("operate_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset OperateTime { get; set; } + + /// + /// 获取或设置操作时间。 + /// + [Newtonsoft.Json.JsonProperty("operate_type")] + [System.Text.Json.Serialization.JsonPropertyName("operate_type")] + public string OperateType { get; set; } = default!; + + /// + /// 获取或设置操作内容。 + /// + [Newtonsoft.Json.JsonProperty("operate_details")] + [System.Text.Json.Serialization.JsonPropertyName("operate_details")] + public string? OperateDetails { get; set; } + + /// + /// 获取或设置图片凭证地址列表。 + /// + [Newtonsoft.Json.JsonProperty("image_list")] + [System.Text.Json.Serialization.JsonPropertyName("image_list")] + public string[]? ImageUrlList { get; set; } + } + } + + /// + /// 获取或设置投诉协商历史列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.NegotiationHistory[] NegotiationHistoryList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.cs new file mode 100644 index 00000000..e34b4295 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaints-v2 接口的请求。 + /// + public class QueryMerchantServiceComplaintsRequest : WechatTenpayRequest + { + /// + /// 获取或设置开始日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string BeginDateString { get; set; } = string.Empty; + + /// + /// 获取或设置结束日期(格式:yyyy-MM-dd)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string EndDateString { get; set; } = string.Empty; + + /// + /// 获取或设置被诉商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? ComplaintedMerchantId { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [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/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs new file mode 100644 index 00000000..66abc382 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /merchant-service/complaints-v2 接口的响应。 + /// + public class QueryMerchantServiceComplaintsResponse : WechatTenpayResponse + { + public static class Types + { + public class Complaint + { + public static class Types + { + public class ComplaintOrder + { + /// + /// 获取或设置微信订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { 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("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } + } + + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonProperty("complaint_id")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_id")] + public string ComplaintId { get; set; } = default!; + + /// + /// 获取或设置门店 ID。 + /// + [Newtonsoft.Json.JsonProperty("complaint_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("complaint_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset ComplaintTime { get; set; } + + /// + /// 获取或设置投诉详情。 + /// + [Newtonsoft.Json.JsonProperty("complaint_detail")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_detail")] + public string ComplaintDetail { get; set; } = default!; + + /// + /// 获取或设置投诉单状态。 + /// + [Newtonsoft.Json.JsonProperty("complaint_state")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_state")] + public string ComplaintState { get; set; } = default!; + + /// + /// 获取或设置投诉人联系方式(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("payer_phone")] + [System.Text.Json.Serialization.JsonPropertyName("payer_phone")] + public string? PayerPhoneEncryptedData { get; set; } + + /// + /// 获取或设置投诉人 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("payer_openid")] + [System.Text.Json.Serialization.JsonPropertyName("payer_openid")] + public string? PayerOpenId { get; set; } + + /// + /// 获取或设置投诉单关联订单列表。 + /// + [Newtonsoft.Json.JsonProperty("complaint_order_info")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_order_info")] + public Types.ComplaintOrder[]? ComplaintOrderList { get; set; } + + /// + /// 获取或设置投诉单是否已全额退款。 + /// + [Newtonsoft.Json.JsonProperty("complaint_full_refunded")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_full_refunded")] + public bool IsFullRefunded { get; set; } + + /// + /// 获取或设置是否有待回复的用户留言。 + /// + [Newtonsoft.Json.JsonProperty("incoming_user_response")] + [System.Text.Json.Serialization.JsonPropertyName("incoming_user_response")] + public bool HasIncomingUserResponse { get; set; } + + /// + /// 获取或设置用户投诉次数。 + /// + [Newtonsoft.Json.JsonProperty("user_complaint_times")] + [System.Text.Json.Serialization.JsonPropertyName("user_complaint_times")] + public int UserComplaintTimes { get; set; } + } + } + + /// + /// 获取或设置用户投诉列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Complaint[] ComplaintList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.cs new file mode 100644 index 00000000..774cf3a8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/complaints-v2/{complaint_id}/complete 接口的请求。 + /// + public class SetMerchantServiceComplaintCompleteRequest : WechatTenpayRequest + { + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ComplaintId { get; set; } = string.Empty; + + /// + /// 获取或设置被诉商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("complainted_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("complainted_mchid")] + public string? ComplaintedMerchantId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.cs new file mode 100644 index 00000000..8f2649d2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/complaints-v2/{complaint_id}/complete 接口的响应。 + /// + public class SetMerchantServiceComplaintCompleteResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageRequest.cs new file mode 100644 index 00000000..aa2acd22 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/images/upload 接口的请求。 + /// + public class UploadMerchantServiceImageRequest : WechatTenpayRequest + { + /// + /// 获取或设置图片文件字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = new byte[0]; + + /// + /// 获取或设置图片文件名(必须以 jpg、bmp、png 为后缀)。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("filename")] + [System.Text.Json.Serialization.JsonPropertyName("filename")] + public string? FileName { get; set; } + + /// + /// 获取或设置图片文件摘要。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonProperty("sha256")] + [System.Text.Json.Serialization.JsonPropertyName("sha256")] + public string? FileHash { get; set; } + + /// + /// 获取或设置图片文件 Conent-Type。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileContentType { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageResponse.cs new file mode 100644 index 00000000..7ec5bb95 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MerchantService/UploadMerchantServiceImageResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /merchant-service/images/upload 接口的响应。 + /// + public class UploadMerchantServiceImageResponse : WechatTenpayResponse + { + /// + /// 获取或设置媒体文件标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("media_id")] + [System.Text.Json.Serialization.JsonPropertyName("media_id")] + public string MediaId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionRequest.cs new file mode 100644 index 00000000..4850f427 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/out-trade-no/{out_trade_no}/close 接口的请求。 + /// + public class ClosePayPartnerTransactionRequest : ClosePayTransactionRequest + { + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionResponse.cs new file mode 100644 index 00000000..87531d00 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/ClosePayPartnerTransactionResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/out-trade-no/{out_trade_no}/close 接口的响应。 + /// + public class ClosePayPartnerTransactionResponse : ClosePayTransactionResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.cs new file mode 100644 index 00000000..fbb90158 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/app 接口的请求。 + /// + public class CreatePayPartnerTransactionAppRequest : CreatePayTransactionAppRequest + { + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public override string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.cs new file mode 100644 index 00000000..32b064df --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/app 接口的响应。 + /// + public class CreatePayPartnerTransactionAppResponse : CreatePayTransactionAppResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.cs new file mode 100644 index 00000000..1a1c9589 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/h5 接口的请求。 + /// + public class CreatePayPartnerTransactionH5Request : CreatePayTransactionH5Request + { + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public override string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.cs new file mode 100644 index 00000000..91240ef7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/h5 接口的响应。 + /// + public class CreatePayPartnerTransactionH5Response : CreatePayTransactionH5Response + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.cs new file mode 100644 index 00000000..0daa51b3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/jsapi 接口的请求。 + /// + public class CreatePayPartnerTransactionJsapiRequest : CreatePayTransactionJsapiRequest + { + public new static class Types + { + public class Payer + { + /// + /// 获取或设置用户在服务商下唯一标识。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("sp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置用户在子商户下唯一标识。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("sub_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] + public string? SubOpenId { get; set; } + } + } + + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public override string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("payer")] + [System.Text.Json.Serialization.JsonPropertyName("payer")] + public new Types.Payer? Payer { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.cs new file mode 100644 index 00000000..c0ff04b3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/jsapi 接口的响应。 + /// + public class CreatePayPartnerTransactionJsapiResponse : CreatePayTransactionJsapiResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.cs new file mode 100644 index 00000000..61af311c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/native 接口的请求。 + /// + public class CreatePayPartnerTransactionNativeRequest : CreatePayTransactionNativeRequest + { + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public override string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.cs new file mode 100644 index 00000000..1d837772 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/native 接口的响应。 + /// + public class CreatePayPartnerTransactionNativeResponse : CreatePayTransactionNativeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.cs new file mode 100644 index 00000000..ad628157 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/partner/transactions/id/{transaction_id} 接口的请求。 + /// + public class GetPayPartnerTransactionByIdRequest : GetPayTransactionByIdRequest + { + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.cs new file mode 100644 index 00000000..4dbcb3e3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/partner/transactions/id/{transaction_id} 接口的响应。 + /// + public class GetPayPartnerTransactionByIdResponse : GetPayPartnerTransactionByOutTradeNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.cs new file mode 100644 index 00000000..6344e090 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/partner/transactions/out-trade-no/{out_trade_no} 接口的请求。 + /// + public class GetPayPartnerTransactionByOutTradeNumberRequest : GetPayTransactionByOutTradeNumberRequest + { + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs new file mode 100644 index 00000000..f3110053 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/partner/transactions/out-trade-no/{out_trade_no} 接口的响应。 + /// + public class GetPayPartnerTransactionByOutTradeNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Payer + { + /// + /// 获取或设置用户在服务商下唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("sp_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置用户在子商户下唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("sub_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] + public string? SubOpenId { get; set; } + } + + public class Amount : GetPayTransactionByOutTradeNumberResponse.Types.Amount + { + } + + public class Scene : GetPayTransactionByOutTradeNumberResponse.Types.Scene + { + } + + public class Promotion : GetPayTransactionByOutTradeNumberResponse.Types.Promotion + { + } + } + + /// + /// 获取或设置服务商商户号。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置子商户商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置子商户 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; } + + /// + /// 获取或设置交易类型。 + /// + [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("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { 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/PayScorePermissions/ApplyPayScorePermissionsRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsRequest.cs new file mode 100644 index 00000000..5423c374 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/permissions 接口的请求。 + /// + public class ApplyPayScorePermissionsRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置授权协议号。 + /// + [Newtonsoft.Json.JsonProperty("authorization_code")] + [System.Text.Json.Serialization.JsonPropertyName("authorization_code")] + public string AuthorizationCode { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsResponse.cs new file mode 100644 index 00000000..ce0c2942 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/ApplyPayScorePermissionsResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/permissions 接口的响应。 + /// + public class ApplyPayScorePermissionsResponse : WechatTenpayResponse + { + /// + /// 获取或设置预授权 Token。 + /// + [Newtonsoft.Json.JsonProperty("apply_permissions_token")] + [System.Text.Json.Serialization.JsonPropertyName("apply_permissions_token")] + public string ApplyPermissionsToken { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.cs new file mode 100644 index 00000000..39cbda06 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/permissions/authorization-code/{authorization_code} 接口的请求。 + /// + public class GetPayScorePermissionsByAuthorizationCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置授权协议号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AuthorizationCode { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ServiceId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.cs new file mode 100644 index 00000000..ab934877 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/permissions/authorization-code/{authorization_code} 接口的响应。 + /// + public class GetPayScorePermissionsByAuthorizationCodeResponse : 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置授权协议号。 + /// + [Newtonsoft.Json.JsonProperty("authorization_code")] + [System.Text.Json.Serialization.JsonPropertyName("authorization_code")] + public string AuthorizationCode { get; set; } = default!; + + /// + /// 获取或设置授权状态。 + /// + [Newtonsoft.Json.JsonProperty("authorization_state")] + [System.Text.Json.Serialization.JsonPropertyName("authorization_state")] + public string AuthorizationState { get; set; } = default!; + + /// + /// 获取或设置通知回调地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置最近一次解除授权时间。 + /// + [Newtonsoft.Json.JsonProperty("cancel_authorization_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("cancel_authorization_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? AuthorizationCancelTime { get; set; } + + /// + /// 获取或设置最近一次解除授权时间。 + /// + [Newtonsoft.Json.JsonProperty("authorization_success_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("authorization_success_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? AuthorizationSuccessTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.cs new file mode 100644 index 00000000..c07386b2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/permissions/openid/{openid} 接口的请求。 + /// + public class GetPayScorePermissionsByOpenIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string ServiceId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.cs new file mode 100644 index 00000000..db791891 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/permissions/openid/{openid} 接口的响应。 + /// + public class GetPayScorePermissionsByOpenIdResponse : GetPayScorePermissionsByAuthorizationCodeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.cs new file mode 100644 index 00000000..8f07ed30 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/permissions/authorization-code/{authorization_code}/terminate 接口的请求。 + /// + public class TerminatePayScorePermissionsByAuthorizationCodeRequest : WechatTenpayRequest + { + /// + /// 获取或设置授权协议号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string AuthorizationCode { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置撤销原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? Reason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.cs new file mode 100644 index 00000000..9ab006b7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/permissions/authorization-code/{authorization_code}/terminate 接口的响应。 + /// + public class TerminatePayScorePermissionsByAuthorizationCodeResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.cs new file mode 100644 index 00000000..14fdf768 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/permissions/openid/{openid}/terminate 接口的请求。 + /// + public class TerminatePayScorePermissionsByOpenIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OpenId { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置撤销原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? Reason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.cs new file mode 100644 index 00000000..8a4b61e4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/permissions/openid/{openid}/terminate 接口的响应。 + /// + public class TerminatePayScorePermissionsByOpenIdResponse : TerminatePayScorePermissionsByAuthorizationCodeResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.cs new file mode 100644 index 00000000..dc5886d3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/cancel 接口的请求。 + /// + public class CancelPayScoreServiceOrderRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置取消原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? Reason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.cs new file mode 100644 index 00000000..cb82968a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/cancel 接口的响应。 + /// + public class CancelPayScoreServiceOrderResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs new file mode 100644 index 00000000..ed929351 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/direct-complete 接口的请求。 + /// + public class CreatePayScoreServiceOrderDirectCompleteRequest : WechatTenpayRequest + { + public static class Types + { + public class Payment : CreatePayScoreServiceOrderRequest.Types.Payment + { + } + + public class Discount : CreatePayScoreServiceOrderRequest.Types.Discount + { + } + + public class TimeRange + { + /// + /// 获取或设置服务开始时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + public DateTimeOffset StartTime { get; set; } + + /// + /// 获取或设置服务开始时间备注。 + /// + [Newtonsoft.Json.JsonProperty("start_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("start_time_remark")] + public string? StartTimeRemark { get; set; } + + /// + /// 获取或设置服务结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + public DateTimeOffset EndTime { get; set; } + + /// + /// 获取或设置服务结束时间备注。 + /// + [Newtonsoft.Json.JsonProperty("end_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("end_time_remark")] + public string? EndTimeRemark { get; set; } + } + + public class Location : CreatePayScoreServiceOrderRequest.Types.Location + { + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置服务信息。 + /// + [Newtonsoft.Json.JsonProperty("service_introduction")] + [System.Text.Json.Serialization.JsonPropertyName("service_introduction")] + public string ServiceInstruction { get; set; } = string.Empty; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public IList PostPaymentList { get; set; } = new List(); + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public IList? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange TimeRange { get; set; } = new Types.TimeRange(); + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置是否分账。 + /// + [Newtonsoft.Json.JsonProperty("profit_sharing")] + [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] + public bool? IsProfitSharing { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.cs new file mode 100644 index 00000000..2dd4ce3e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder 接口的响应。 + /// + public class CreatePayScoreServiceOrderDirectCompleteResponse : WechatTenpayResponse + { + public static class Types + { + public class Payment : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Payment + { + } + + public class Discount : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Discount + { + } + + public class TimeRange : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.TimeRange + { + } + + public class Location : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Location + { + } + + public class RiskFund : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.RiskFund + { + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信支付服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置服务信息。 + /// + [Newtonsoft.Json.JsonProperty("service_introduction")] + [System.Text.Json.Serialization.JsonPropertyName("service_introduction")] + public string ServiceIntroduction { get; set; } = default!; + + /// + /// 获取或设置服务订单状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置服务订单状态说明。 + /// + [Newtonsoft.Json.JsonProperty("state_description")] + [System.Text.Json.Serialization.JsonPropertyName("state_description")] + public string StateDescription { get; set; } = default!; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string Attachment { get; set; } = default!; + + /// + /// 获取或设置通知回调地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public Types.Payment[] PostPaymentList { get; set; } = default!; + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public Types.Discount[]? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange TimeRange { get; set; } = default!; + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置是否分账。 + /// + [Newtonsoft.Json.JsonProperty("profit_sharing")] + [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] + public bool? IsProfitSharing { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.cs new file mode 100644 index 00000000..47953c27 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder 接口的请求。 + /// + public class CreatePayScoreServiceOrderRequest : WechatTenpayRequest + { + public static class Types + { + public class Payment + { + /// + /// 获取或设置付费项目名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置付费说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置付费金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置付费数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int? Count { get; set; } + } + + public class Discount + { + /// + /// 获取或设置优惠名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置优惠说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int? Count { get; set; } + } + + public class TimeRange + { + /// + /// 获取或设置服务开始时间字符串(格式:yyyyMMddHHmmss / yyyyMMdd / "OnAccept")。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + public string? StartTimeString { get; set; } + + /// + /// 获取或设置服务开始时间备注。 + /// + [Newtonsoft.Json.JsonProperty("start_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("start_time_remark")] + public string? StartTimeRemark { get; set; } + + /// + /// 获取或设置服务结束时间字符串(格式:yyyyMMddHHmmss / yyyyMMdd)。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + public string? EndTimeString { get; set; } + + /// + /// 获取或设置服务结束时间备注。 + /// + [Newtonsoft.Json.JsonProperty("end_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("end_time_remark")] + public string? EndTimeRemark { get; set; } + } + + public class Location + { + /// + /// 获取或设置服务开始地点。 + /// + [Newtonsoft.Json.JsonProperty("start_location")] + [System.Text.Json.Serialization.JsonPropertyName("start_location")] + public string StartLocation { get; set; } = string.Empty; + + /// + /// 获取或设置服务结束地点。 + /// + [Newtonsoft.Json.JsonProperty("end_location")] + [System.Text.Json.Serialization.JsonPropertyName("end_location")] + public string EndLocation { get; set; } = string.Empty; + } + + public class RiskFund + { + /// + /// 获取或设置风险金名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + /// + /// 获取或设置风险金说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置风险金金额。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = string.Empty; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置服务信息。 + /// + [Newtonsoft.Json.JsonProperty("service_introduction")] + [System.Text.Json.Serialization.JsonPropertyName("service_introduction")] + public string ServiceInstruction { get; set; } = string.Empty; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置是否需要用户确认。 + /// + [Newtonsoft.Json.JsonProperty("need_user_confirm")] + [System.Text.Json.Serialization.JsonPropertyName("need_user_confirm")] + public bool? RequireUserConfirm { get; set; } + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public IList PostPaymentList { get; set; } = new List(); + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public IList? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange TimeRange { get; set; } = new Types.TimeRange(); + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置订单风险金信息。 + /// + [Newtonsoft.Json.JsonProperty("risk_fund")] + [System.Text.Json.Serialization.JsonPropertyName("risk_fund")] + public Types.RiskFund RiskFund { get; set; } = new Types.RiskFund(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.cs new file mode 100644 index 00000000..048065f0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder 接口的响应。 + /// + public class CreatePayScoreServiceOrderResponse : WechatTenpayResponse + { + public static class Types + { + public class Payment : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Payment + { + } + + public class Discount : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Discount + { + } + + public class TimeRange : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.TimeRange + { + } + + public class Location : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Location + { + } + + public class RiskFund : GetPayScoreServiceOrderByOutOrderNumberResponse.Types.RiskFund + { + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信支付服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置服务信息。 + /// + [Newtonsoft.Json.JsonProperty("service_introduction")] + [System.Text.Json.Serialization.JsonPropertyName("service_introduction")] + public string ServiceIntroduction { get; set; } = default!; + + /// + /// 获取或设置服务订单状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置服务订单状态说明。 + /// + [Newtonsoft.Json.JsonProperty("state_description")] + [System.Text.Json.Serialization.JsonPropertyName("state_description")] + public string StateDescription { get; set; } = default!; + + /// + /// 获取或设置跳转微信侧小程序订单数据。 + /// + [Newtonsoft.Json.JsonProperty("package")] + [System.Text.Json.Serialization.JsonPropertyName("package")] + public string Package { get; set; } = default!; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string Attachment { get; set; } = default!; + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public Types.Payment[]? PostPaymentList { get; set; } + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public Types.Discount[]? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange? TimeRange { get; set; } + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置订单风险金信息。 + /// + [Newtonsoft.Json.JsonProperty("risk_fund")] + [System.Text.Json.Serialization.JsonPropertyName("risk_fund")] + public Types.RiskFund? RiskFund { get; set; } + + /// + /// 获取或设置通知回调地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.cs new file mode 100644 index 00000000..3933b692 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/serviceorder 接口的请求。 + /// + public class GetPayScoreServiceOrderByOutOrderNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs new file mode 100644 index 00000000..8a1da4b0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs @@ -0,0 +1,362 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/serviceorder 接口的响应。 + /// + public class GetPayScoreServiceOrderByOutOrderNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Payment + { + /// + /// 获取或设置付费项目名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置付费说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置付费金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置付费数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + } + + public class Discount + { + /// + /// 获取或设置优惠名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置优惠说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int Count { get; set; } + } + + public class TimeRange + { + /// + /// 获取或设置服务开始时间字符串(格式:yyyyMMddHHmmss / yyyyMMdd / "OnAccept")。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + public string? StartTimeString { get; set; } + + /// + /// 获取或设置服务开始时间备注。 + /// + [Newtonsoft.Json.JsonProperty("start_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("start_time_remark")] + public string? StartTimeRemark { get; set; } + + /// + /// 获取或设置服务结束时间字符串(格式:yyyyMMddHHmmss / yyyyMMdd)。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + public string? EndTimeString { get; set; } + + /// + /// 获取或设置服务结束时间备注。 + /// + [Newtonsoft.Json.JsonProperty("end_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("end_time_remark")] + public string? EndTimeRemark { get; set; } + } + + public class Location + { + /// + /// 获取或设置服务开始地点。 + /// + [Newtonsoft.Json.JsonProperty("start_location")] + [System.Text.Json.Serialization.JsonPropertyName("start_location")] + public string? StartLocation { get; set; } + + /// + /// 获取或设置服务结束地点。 + /// + [Newtonsoft.Json.JsonProperty("end_location")] + [System.Text.Json.Serialization.JsonPropertyName("end_location")] + public string? EndLocation { get; set; } + } + + public class RiskFund + { + /// + /// 获取或设置风险金名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置风险金说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置风险金金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + } + + public class Collection + { + public static class Types + { + public class CollectionDetail + { + /// + /// 获取或设置收款序号。 + /// + [Newtonsoft.Json.JsonProperty("seq")] + [System.Text.Json.Serialization.JsonPropertyName("seq")] + public int SequenceNumber { get; set; } + + /// + /// 获取或设置单笔收款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置收款成功渠道。 + /// + [Newtonsoft.Json.JsonProperty("paid_type")] + [System.Text.Json.Serialization.JsonPropertyName("paid_type")] + public string? PaidType { get; set; } + + /// + /// 获取或设置收款成功时间。 + /// + [Newtonsoft.Json.JsonProperty("paid_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("paid_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + public DateTimeOffset? PaidTime { get; set; } + + /// + /// 获取或设置微信支付交易单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + } + } + + /// + /// 获取或设置收款状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置总收款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置待收金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("paying_amount")] + [System.Text.Json.Serialization.JsonPropertyName("paying_amount")] + public int PayingAmount { get; set; } + + /// + /// 获取或设置已收金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("paid_amount")] + [System.Text.Json.Serialization.JsonPropertyName("paid_amount")] + public int PaidAmount { get; set; } + + /// + /// 获取或设置收款明细列表。 + /// + [Newtonsoft.Json.JsonProperty("details")] + [System.Text.Json.Serialization.JsonPropertyName("details")] + public Types.CollectionDetail[] DetailList { get; set; } = default!; + } + } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置服务信息。 + /// + [Newtonsoft.Json.JsonProperty("service_introduction")] + [System.Text.Json.Serialization.JsonPropertyName("service_introduction")] + public string ServiceIntroduction { get; set; } = default!; + + /// + /// 获取或设置服务订单状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置服务订单状态说明。 + /// + [Newtonsoft.Json.JsonProperty("state_description")] + [System.Text.Json.Serialization.JsonPropertyName("state_description")] + public string? StateDescription { get; set; } + + /// + /// 获取或设置商户收款总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int? TotalAmount { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public Types.Payment[]? PostPaymentList { get; set; } + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public Types.Discount[]? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange? TimeRange { get; set; } + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置订单风险金信息。 + /// + [Newtonsoft.Json.JsonProperty("risk_fund")] + [System.Text.Json.Serialization.JsonPropertyName("risk_fund")] + public Types.RiskFund? RiskFund { get; set; } + + /// + /// 获取或设置通知回调地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置是否需要收款。 + /// + [Newtonsoft.Json.JsonProperty("need_collection")] + [System.Text.Json.Serialization.JsonPropertyName("need_collection")] + public bool? RequireCollection { get; set; } + + /// + /// 获取或设置收款信息。 + /// + [Newtonsoft.Json.JsonProperty("collection")] + [System.Text.Json.Serialization.JsonPropertyName("collection")] + public Types.Collection? Collection { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.cs new file mode 100644 index 00000000..732c61cb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/serviceorder 接口的请求。 + /// + public class GetPayScoreServiceOrderByQueryIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置回跳查询 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string QueryId { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.cs new file mode 100644 index 00000000..65fa0674 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /payscore/serviceorder 接口的响应。 + /// + public class GetPayScoreServiceOrderByQueryIdResponse : GetPayScoreServiceOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.cs new file mode 100644 index 00000000..b26de64f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/modify 接口的请求。 + /// + public class ModifyPayScoreServiceOrderRequest : WechatTenpayRequest + { + public static class Types + { + public class Payment : CreatePayScoreServiceOrderRequest.Types.Payment + { + } + + public class Discount : CreatePayScoreServiceOrderRequest.Types.Discount + { + } + } + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public IList PostPaymentList { get; set; } = new List(); + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public IList? PostDiscountList { get; set; } + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置修改原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? Reason { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.cs new file mode 100644 index 00000000..dca10d09 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/modify 接口的响应。 + /// + public class ModifyPayScoreServiceOrderResponse : GetPayScoreServiceOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.cs new file mode 100644 index 00000000..7cdc34cb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/complete 接口的请求。 + /// + public class SetPayScoreServiceOrderCompleteRequest : WechatTenpayRequest + { + public static class Types + { + public class Payment : CreatePayScoreServiceOrderRequest.Types.Payment + { + } + + public class Discount : CreatePayScoreServiceOrderRequest.Types.Discount + { + } + + public class TimeRange : CreatePayScoreServiceOrderRequest.Types.TimeRange + { + } + + public class Location + { + /// + /// 获取或设置服务结束地点。 + /// + [Newtonsoft.Json.JsonProperty("end_location")] + [System.Text.Json.Serialization.JsonPropertyName("end_location")] + public string EndLocation { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public IList PostPaymentList { get; set; } = new List(); + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public IList? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange? TimeRange { get; set; } + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int TotalAmount { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置是否分账。 + /// + [Newtonsoft.Json.JsonProperty("profit_sharing")] + [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] + public bool? IsProfitSharing { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.cs new file mode 100644 index 00000000..9a6546e4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/complete 接口的响应。 + /// + public class SetPayScoreServiceOrderCompleteResponse : GetPayScoreServiceOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.cs new file mode 100644 index 00000000..8ba82e53 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/pay 接口的请求。 + /// + public class SetPayScoreServiceOrderPayRequest : WechatTenpayRequest + { + public static class Types + { + public class Payment : CreatePayScoreServiceOrderRequest.Types.Payment + { + } + + public class Discount : CreatePayScoreServiceOrderRequest.Types.Discount + { + } + + public class Location + { + /// + /// 获取或设置服务结束地点。 + /// + [Newtonsoft.Json.JsonProperty("end_location")] + [System.Text.Json.Serialization.JsonPropertyName("end_location")] + public string EndLocation { get; set; } = string.Empty; + } + } + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.cs new file mode 100644 index 00000000..2518e9db --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/pay 接口的响应。 + /// + public class SetPayScoreServiceOrderPayResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string OrderId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs new file mode 100644 index 00000000..a0be354b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/sync 接口的请求。 + /// + public class SetPayScoreServiceOrderSyncRequest : WechatTenpayRequest + { + public static class Types + { + public class Detail + { + /// + /// 获取或设置收款成功时间字符串(格式:yyyyMMddHHmmss 或 yyyyMMdd)。 + /// + [Newtonsoft.Json.JsonProperty("paid_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("paid_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + public DateTimeOffset? PaidTime { get; set; } + } + } + + /// + /// 获取或设置商户服务订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutOrderNumber { 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("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = string.Empty; + + /// + /// 获取或设置场景类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = "Order_Paid"; + + /// + /// 获取或设置内容详情信息。 + /// + [Newtonsoft.Json.JsonProperty("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.cs new file mode 100644 index 00000000..d43ff514 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /payscore/serviceorder/{out_order_no}/sync 接口的响应。 + /// + public class SetPayScoreServiceOrderSyncResponse : GetPayScoreServiceOrderByOutOrderNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionRequest.cs new file mode 100644 index 00000000..a43bb4e0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/out-trade-no/{out_trade_no}/close 接口的请求。 + /// + public class ClosePayTransactionRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutTradeNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionResponse.cs new file mode 100644 index 00000000..1129128e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ClosePayTransactionResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/out-trade-no/{out_trade_no}/close 接口的响应。 + /// + public class ClosePayTransactionResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs new file mode 100644 index 00000000..26e5fc3a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs @@ -0,0 +1,257 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/app 接口的请求。 + /// + public class CreatePayTransactionAppRequest : WechatTenpayRequest + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = "CNY"; + } + + public class Detail + { + public static class Types + { + public class GoodsDetail + { + /// + /// 获取或设置商户侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_goods_id")] + public string MerchantGoodsId { get; set; } = string.Empty; + + /// + /// 获取或设置微信侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_goods_id")] + public string? WechatpayGoodsId { get; set; } + + /// + /// 获取或设置商品名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string? GoodsName { get; set; } + + /// + /// 获取或设置商品数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置商品单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public int UnitPrice { get; set; } + } + } + + /// + /// 获取或设置订单原价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("cost_price")] + [System.Text.Json.Serialization.JsonPropertyName("cost_price")] + public int? CostPrice { get; set; } + + /// + /// 获取或设置商品小票 ID。 + /// + [Newtonsoft.Json.JsonProperty("invoice_id")] + [System.Text.Json.Serialization.JsonPropertyName("invoice_id")] + public string? InvoiceId { get; set; } + + /// + /// 获取或设置单品列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_detail")] + [System.Text.Json.Serialization.JsonPropertyName("goods_detail")] + public List? GoodsList { get; set; } + } + + public class Scene + { + public static class Types + { + public class Store + { + /// + /// 获取或设置门店编号。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public string Id { get; set; } = string.Empty; + + /// + /// 获取或设置门店名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// 获取或设置地区编码。 + /// + [Newtonsoft.Json.JsonProperty("area_code")] + [System.Text.Json.Serialization.JsonPropertyName("area_code")] + public string? AreaCode { get; set; } + + /// + /// 获取或设置详细地址。 + /// + [Newtonsoft.Json.JsonProperty("address")] + [System.Text.Json.Serialization.JsonPropertyName("address")] + public string? Address { get; set; } + } + } + + /// + /// 获取或设置用户终端 IP。 + /// + [Newtonsoft.Json.JsonProperty("payer_client_ip")] + [System.Text.Json.Serialization.JsonPropertyName("payer_client_ip")] + public string ClientIp { get; set; } = string.Empty; + + /// + /// 获取或设置商户端设备号。 + /// + [Newtonsoft.Json.JsonProperty("device_id")] + [System.Text.Json.Serialization.JsonPropertyName("device_id")] + public string? DeviceId { get; set; } + + /// + /// 获取或设置商户门店信息。 + /// + [Newtonsoft.Json.JsonProperty("store_info")] + [System.Text.Json.Serialization.JsonPropertyName("store_info")] + public Types.Store? Store { get; set; } + } + + public class Settlement + { + /// + /// 获取或设置是否分账。 + /// + [Newtonsoft.Json.JsonProperty("profit_sharing")] + [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] + public bool? IsProfitSharing { get; set; } + + /// + /// 获取或设置补差金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("subsidy_amount")] + [System.Text.Json.Serialization.JsonPropertyName("subsidy_amount")] + public int? SubsidyAmount { get; set; } + } + } + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public virtual string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { 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("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { 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("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { 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/PayTransactions/CreatePayTransactionAppResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppResponse.cs new file mode 100644 index 00000000..87de84f2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/app 接口的响应。 + /// + public class CreatePayTransactionAppResponse : WechatTenpayResponse + { + /// + /// 获取或设置预支付交易会话标识。 + /// + [Newtonsoft.Json.JsonProperty("prepay_id")] + [System.Text.Json.Serialization.JsonPropertyName("prepay_id")] + public string PrepayId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Request.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Request.cs new file mode 100644 index 00000000..46e8c2ce --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Request.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/h5 接口的请求。 + /// + public class CreatePayTransactionH5Request : WechatTenpayRequest + { + public static class Types + { + public class Amount : CreatePayTransactionAppRequest.Types.Amount + { + } + + public class Detail : CreatePayTransactionAppRequest.Types.Detail + { + } + + public class Scene : CreatePayTransactionAppRequest.Types.Scene + { + public static new class Types + { + public class H5 + { + /// + /// 获取或设置场景类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = "Wap"; + + /// + /// 获取或设置应用名称。 + /// + [Newtonsoft.Json.JsonProperty("app_name")] + [System.Text.Json.Serialization.JsonPropertyName("app_name")] + public string? AppName { get; set; } + + /// + /// 获取或设置网站 URL。 + /// + [Newtonsoft.Json.JsonProperty("app_url")] + [System.Text.Json.Serialization.JsonPropertyName("app_url")] + public string? AppUrl { get; set; } + + /// + /// 获取或设置 iOS 平台 BundleID。 + /// + [Newtonsoft.Json.JsonProperty("bundle_id")] + [System.Text.Json.Serialization.JsonPropertyName("bundle_id")] + public string? BundleId { get; set; } + + /// + /// 获取或设置 Android 平台 PackageName。 + /// + [Newtonsoft.Json.JsonProperty("package_name")] + [System.Text.Json.Serialization.JsonPropertyName("package_name")] + public string? PackageName { get; set; } + } + } + + /// + /// 获取或设置 H5 场景信息。 + /// + [Newtonsoft.Json.JsonProperty("h5_info")] + [System.Text.Json.Serialization.JsonPropertyName("h5_info")] + public Types.H5 H5 { get; set; } = new Types.H5(); + } + + public class Settlement : CreatePayTransactionAppRequest.Types.Settlement + { + } + } + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public virtual string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { 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("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { 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("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene Scene { get; set; } = new Types.Scene(); + + /// + /// 获取或设置结算信息。 + /// + [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/PayTransactions/CreatePayTransactionH5Response.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Response.cs new file mode 100644 index 00000000..f898680e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionH5Response.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/h5 接口的响应。 + /// + public class CreatePayTransactionH5Response : WechatTenpayResponse + { + /// + /// 获取或设置支付跳转链接。 + /// + [Newtonsoft.Json.JsonProperty("h5_url")] + [System.Text.Json.Serialization.JsonPropertyName("h5_url")] + public string H5Url { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiRequest.cs new file mode 100644 index 00000000..aee6df86 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiRequest.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/jsapi 接口的请求。 + /// + public class CreatePayTransactionJsapiRequest : WechatTenpayRequest + { + public static class Types + { + public class Payer + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = string.Empty; + } + + public class Amount : CreatePayTransactionAppRequest.Types.Amount + { + } + + public class Detail : CreatePayTransactionAppRequest.Types.Detail + { + } + + public class Scene : CreatePayTransactionAppRequest.Types.Scene + { + } + + public class Settlement : CreatePayTransactionAppRequest.Types.Settlement + { + } + } + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public virtual string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { 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("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { 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("payer")] + [System.Text.Json.Serialization.JsonPropertyName("payer")] + public Types.Payer Payer { get; set; } = new Types.Payer(); + + /// + /// 获取或设置商品信息。 + /// + [Newtonsoft.Json.JsonProperty("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { 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/PayTransactions/CreatePayTransactionJsapiResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiResponse.cs new file mode 100644 index 00000000..00c837df --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionJsapiResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/jsapi 接口的响应。 + /// + public class CreatePayTransactionJsapiResponse : WechatTenpayResponse + { + /// + /// 获取或设置预支付交易会话标识。 + /// + [Newtonsoft.Json.JsonProperty("prepay_id")] + [System.Text.Json.Serialization.JsonPropertyName("prepay_id")] + public string PrepayId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeRequest.cs new file mode 100644 index 00000000..199bc3a3 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeRequest.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/native 接口的请求。 + /// + public class CreatePayTransactionNativeRequest : WechatTenpayRequest + { + public static class Types + { + public class Amount : CreatePayTransactionAppRequest.Types.Amount + { + } + + public class Detail : CreatePayTransactionAppRequest.Types.Detail + { + } + + public class Scene : CreatePayTransactionAppRequest.Types.Scene + { + } + + public class Settlement : CreatePayTransactionAppRequest.Types.Settlement + { + } + } + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public virtual string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { 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("time_expire")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_expire")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { 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("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene Scene { get; set; } = new Types.Scene(); + + /// + /// 获取或设置结算信息。 + /// + [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/PayTransactions/CreatePayTransactionNativeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeResponse.cs new file mode 100644 index 00000000..9d07d3e5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionNativeResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/native 接口的响应。 + /// + public class CreatePayTransactionNativeResponse : WechatTenpayResponse + { + /// + /// 获取或设置二维码链接。 + /// + [Newtonsoft.Json.JsonProperty("code_url")] + [System.Text.Json.Serialization.JsonPropertyName("code_url")] + public string QrcodeUrl { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdRequest.cs new file mode 100644 index 00000000..e5772f0e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/transactions/id/{transaction_id} 接口的请求。 + /// + public class GetPayTransactionByIdRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string TransactionId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdResponse.cs new file mode 100644 index 00000000..349241fc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByIdResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/transactions/id/{transaction_id} 接口的响应。 + /// + public class GetPayTransactionByIdResponse : GetPayTransactionByOutTradeNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberRequest.cs new file mode 100644 index 00000000..3bd3bdd7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/transactions/out-trade-no/{out_trade_no} 接口的请求。 + /// + public class GetPayTransactionByOutTradeNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual string? MerchantId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutTradeNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberResponse.cs new file mode 100644 index 00000000..21c08f9d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/GetPayTransactionByOutTradeNumberResponse.cs @@ -0,0 +1,286 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /pay/transactions/out-trade-no/{out_trade_no} 接口的响应。 + /// + public class GetPayTransactionByOutTradeNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Payer + { + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + } + + public class Amount + { + /// + /// 获取或设置总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string? Currency { get; set; } + + /// + /// 获取或设置用户支付金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("payer_total")] + [System.Text.Json.Serialization.JsonPropertyName("payer_total")] + public int? PayerTotal { get; set; } + + /// + /// 获取或设置用户支付币种。 + /// + [Newtonsoft.Json.JsonProperty("payer_currency")] + [System.Text.Json.Serialization.JsonPropertyName("payer_currency")] + public string? PayerCurrency { get; set; } + } + + public class Scene + { + /// + /// 获取或设置商户端设备号。 + /// + [Newtonsoft.Json.JsonProperty("device_id")] + [System.Text.Json.Serialization.JsonPropertyName("device_id")] + public string? DeviceId { get; set; } + } + + public class Promotion + { + public static class Types + { + public class GoodsDetail + { + /// + /// 获取或设置商品编码。 + /// + [Newtonsoft.Json.JsonProperty("goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("goods_id")] + public string GoodsId { get; set; } = default!; + + /// + /// 获取或设置商品数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置商品单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public int UnitPrice { get; set; } + + /// + /// 获取或设置商品优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("discount_amount")] + [System.Text.Json.Serialization.JsonPropertyName("discount_amount")] + public int DiscountAmount { get; set; } + + /// + /// 获取或设置商品备注。 + /// + [Newtonsoft.Json.JsonProperty("goods_remark")] + [System.Text.Json.Serialization.JsonPropertyName("goods_remark")] + public string? GoodsRemark { get; set; } + } + } + + /// + /// 获取或设置券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string Id { get; set; } = default!; + + /// + /// 获取或设置优惠名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// 获取或设置优惠范围。 + /// + [Newtonsoft.Json.JsonProperty("scope")] + [System.Text.Json.Serialization.JsonPropertyName("scope")] + public string Scope { get; set; } = default!; + + /// + /// 获取或设置优惠类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置优惠券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string? StockId { get; set; } + + /// + /// 获取或设置微信出资(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_contribute")] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_contribute")] + public int? WechatpayContribute { get; set; } + + /// + /// 获取或设置商户出资(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("merchant_contribute")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_contribute")] + public int? MerchantContribute { get; set; } + + /// + /// 获取或设置其他出资(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("other_contribute")] + [System.Text.Json.Serialization.JsonPropertyName("other_contribute")] + public int? OtherContribute { get; set; } + + /// + /// 获取或设置优惠币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string? Currency { get; set; } + + /// + /// 获取或设置单品列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_detail")] + [System.Text.Json.Serialization.JsonPropertyName("goods_detail")] + public Types.GoodsDetail[]? GoodsList { get; set; } + } + } + + /// + /// 获取或设置微信商户号。 + /// + [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("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; } + + /// + /// 获取或设置交易类型。 + /// + [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("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { 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/Refund/CreateRefundDomesticRefundRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundRequest.cs new file mode 100644 index 00000000..7e9bdde6 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundRequest.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /refund/domestic/refunds 接口的请求。 + /// + public class CreateRefundDomesticRefundRequest : WechatTenpayRequest + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置原订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund")] + [System.Text.Json.Serialization.JsonPropertyName("refund")] + public int Refund { get; set; } + + /// + /// 获取或设置退款币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = "CNY"; + } + + public class GoodsDetail + { + /// + /// 获取或设置商户侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_goods_id")] + public string MerchantGoodsId { get; set; } = string.Empty; + + /// + /// 获取或设置微信侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_goods_id")] + public string? WechatpayGoodsId { get; set; } + + /// + /// 获取或设置商品名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string? GoodsName { get; set; } + + /// + /// 获取或设置商品单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public int UnitPrice { get; set; } + + /// + /// 获取或设置商品退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_amount")] + [System.Text.Json.Serialization.JsonPropertyName("refund_amount")] + public int RefundAmount { get; set; } + + /// + /// 获取或设置商品退货数量(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_quantity")] + [System.Text.Json.Serialization.JsonPropertyName("refund_quantity")] + public int RefundQuantity { get; set; } + } + } + + /// + /// 获取或设置子单子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置商户订单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + + /// + /// 获取或设置商户订单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置商户退款单号。 + /// + [Newtonsoft.Json.JsonProperty("out_refund_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_refund_no")] + public string OutRefundNumber { get; set; } = string.Empty; + + /// + /// 获取或设置退款原因。 + /// + [Newtonsoft.Json.JsonProperty("reason")] + [System.Text.Json.Serialization.JsonPropertyName("reason")] + public string? Reason { get; set; } + + /// + /// 获取或设置回调通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + + /// + /// 获取或设置退款资金来源。 + /// + [Newtonsoft.Json.JsonProperty("funds_account")] + [System.Text.Json.Serialization.JsonPropertyName("funds_account")] + public string? FundsAccount { get; set; } + + /// + /// 获取或设置退款金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = new Types.Amount(); + + /// + /// 获取或设置退款商品列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_detail")] + [System.Text.Json.Serialization.JsonPropertyName("goods_detail")] + public List? GoodsList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundResponse.cs new file mode 100644 index 00000000..ad3342a9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/CreateRefundDomesticRefundResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /refund/domestic/refunds 接口的响应。 + /// + public class CreateRefundDomesticRefundResponse : GetRefundDomesticRefundByOutRefundNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.cs new file mode 100644 index 00000000..170d0997 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /refund/domestic/refunds/{out_refund_no} 接口的请求。 + /// + public class GetRefundDomesticRefundByOutRefundNumberRequest : WechatTenpayRequest + { + /// + /// 获取或设置子单子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string OutRefundNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.cs new file mode 100644 index 00000000..c1dc443b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /refund/domestic/refunds/{out_refund_no} 接口的响应。 + /// + public class GetRefundDomesticRefundByOutRefundNumberResponse : WechatTenpayResponse + { + public static class Types + { + public class Amount + { + /// + /// 获取或设置原订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total")] + [System.Text.Json.Serialization.JsonPropertyName("total")] + public int Total { get; set; } + + /// + /// 获取或设置退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund")] + [System.Text.Json.Serialization.JsonPropertyName("refund")] + public int Refund { get; set; } + + /// + /// 获取或设置退款币种。 + /// + [Newtonsoft.Json.JsonProperty("currency")] + [System.Text.Json.Serialization.JsonPropertyName("currency")] + public string Currency { get; set; } = "CNY"; + + /// + /// 获取或设置用户支付金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("payer_total")] + [System.Text.Json.Serialization.JsonPropertyName("payer_total")] + public int PayerTotal { get; set; } + + /// + /// 获取或设置用户退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("payer_refund")] + [System.Text.Json.Serialization.JsonPropertyName("payer_refund")] + public int PayerRefund { get; set; } + + /// + /// 获取或设置应结订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("settlement_total")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_total")] + public int SettlementTotal { get; set; } + + /// + /// 获取或设置应结退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("settlement_refund")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_refund")] + public int SettlementRefund { get; set; } + + /// + /// 获取或设置优惠退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("discount_refund")] + [System.Text.Json.Serialization.JsonPropertyName("discount_refund")] + public int DiscountRefund { get; set; } + } + + public class Promotion + { + public static class Types + { + public class GoodsDetail + { + /// + /// 获取或设置商户侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_goods_id")] + public string MerchantGoodsId { get; set; } = default!; + + /// + /// 获取或设置微信侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("wechatpay_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("wechatpay_goods_id")] + public string? WechatpayGoodsId { get; set; } + + /// + /// 获取或设置商品名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string? GoodsName { get; set; } + + /// + /// 获取或设置商品单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public int UnitPrice { get; set; } + + /// + /// 获取或设置商品退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_amount")] + [System.Text.Json.Serialization.JsonPropertyName("refund_amount")] + public int RefundAmount { get; set; } + + /// + /// 获取或设置商品退货数量(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_quantity")] + [System.Text.Json.Serialization.JsonPropertyName("refund_quantity")] + public int RefundQuantity { get; set; } + } + } + + /// + /// 获取或设置券 ID。 + /// + [Newtonsoft.Json.JsonProperty("promotion_id")] + [System.Text.Json.Serialization.JsonPropertyName("promotion_id")] + public string PromotionId { get; set; } = default!; + + /// + /// 获取或设置优惠范围。 + /// + [Newtonsoft.Json.JsonProperty("scope")] + [System.Text.Json.Serialization.JsonPropertyName("scope")] + public string Scope { get; set; } = default!; + + /// + /// 获取或设置优惠类型。 + /// + [Newtonsoft.Json.JsonProperty("type")] + [System.Text.Json.Serialization.JsonPropertyName("type")] + public string Type { get; set; } = default!; + + /// + /// 获取或设置优惠券面额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置优惠退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_amount")] + [System.Text.Json.Serialization.JsonPropertyName("refund_amount")] + public int RefundAmount { get; set; } + + /// + /// 获取或设置单品列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_detail")] + [System.Text.Json.Serialization.JsonPropertyName("goods_detail")] + public Types.GoodsDetail[]? GoodsList { get; set; } + } + } + + /// + /// 获取或设置微信支付退款号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置商户退款单号。 + /// + [Newtonsoft.Json.JsonProperty("out_refund_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_refund_no")] + public string OutRefundNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { 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("channel")] + [System.Text.Json.Serialization.JsonPropertyName("channel")] + public string Channel { get; set; } = default!; + + /// + /// 获取或设置退款入账账户。 + /// + [Newtonsoft.Json.JsonProperty("user_received_account")] + [System.Text.Json.Serialization.JsonPropertyName("user_received_account")] + public string UserReceivedAccount { get; set; } = default!; + + /// + /// 获取或设置退款成功时间。 + /// + [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("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("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置退款资金来源。 + /// + [Newtonsoft.Json.JsonProperty("funds_account")] + [System.Text.Json.Serialization.JsonPropertyName("funds_account")] + public string FundsAccount { get; set; } = default!; + + /// + /// 获取或设置退款金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + + /// + /// 获取或设置优惠退款信息。 + /// + [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/SmartGuide/AssignSmartGuideRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideRequest.cs new file mode 100644 index 00000000..d47feaf4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /smartguide/guides/{guide_id}/assign 接口的请求。 + /// + public class AssignSmartGuideRequest : WechatTenpayRequest + { + /// + /// 获取或设置服务人员 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string GuideId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideResponse.cs new file mode 100644 index 00000000..ee7b2b4b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/AssignSmartGuideResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /smartguide/guides/{guide_id}/assign 接口的响应。 + /// + public class AssignSmartGuideResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs new file mode 100644 index 00000000..2d2f1cfe --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideRequest.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /smartguide/guides 接口的请求。 + /// + public class CreateSmartGuideRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置企业 ID。 + /// + [Newtonsoft.Json.JsonProperty("corpid")] + [System.Text.Json.Serialization.JsonPropertyName("corpid")] + public string CorpId { get; set; } = string.Empty; + + /// + /// 获取或设置门店 ID。 + /// + [Newtonsoft.Json.JsonProperty("store_id")] + [System.Text.Json.Serialization.JsonPropertyName("store_id")] + public int StoreId { get; set; } + + /// + /// 获取或设置企业微信的员工 ID。 + /// + [Newtonsoft.Json.JsonProperty("userid")] + [System.Text.Json.Serialization.JsonPropertyName("userid")] + public string UserId { get; set; } = string.Empty; + + /// + /// 获取或设置企业微信的员工姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string UserNameEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置企业微信的员工手机号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("mobile")] + [System.Text.Json.Serialization.JsonPropertyName("mobile")] + public string UserMobileEncryptedData { get; set; } = string.Empty; + + /// + /// 获取或设置企业微信的员工个人二维码地址。 + /// + [Newtonsoft.Json.JsonProperty("qr_code")] + [System.Text.Json.Serialization.JsonPropertyName("qr_code")] + public string UserQrcodeUrl { get; set; } = string.Empty; + + /// + /// 获取或设置企业微信的员工头像地址。 + /// + [Newtonsoft.Json.JsonProperty("avatar")] + [System.Text.Json.Serialization.JsonPropertyName("avatar")] + public string UserAvatarUrl { get; set; } = string.Empty; + + /// + /// 获取或设置群二维码地址。 + /// + [Newtonsoft.Json.JsonProperty("group_qrcode")] + [System.Text.Json.Serialization.JsonPropertyName("group_qrcode")] + public string? GroupQrcodeUrl { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideResponse.cs new file mode 100644 index 00000000..da0d8aa7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/CreateSmartGuideResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /smartguide/guides 接口的响应。 + /// + public class CreateSmartGuideResponse : WechatTenpayResponse + { + /// + /// 获取或设置服务人员 ID。 + /// + [Newtonsoft.Json.JsonProperty("guide_id")] + [System.Text.Json.Serialization.JsonPropertyName("guide_id")] + public string GuideId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs new file mode 100644 index 00000000..6679d14d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /smartguide/guides 接口的请求。 + /// + public class QuerySmartGuidesRequest : WechatTenpayRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置门店 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int StoreId { get; set; } + + /// + /// 获取或设置企业微信的员工 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? UserId { get; set; } + + /// + /// 获取或设置企业微信的员工手机号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? UserMobile { get; set; } + + /// + /// 获取或设置企业微信的员工工号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? UserWorkId { get; set; } + + /// + /// 获取或设置分页大小。 + /// + [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/SmartGuide/QuerySmartGuidesResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs new file mode 100644 index 00000000..ce8e50ec --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/QuerySmartGuidesResponse.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [GET] /smartguide/guides 接口的响应。 + /// + public class QuerySmartGuidesResponse : WechatTenpayResponse + { + public static class Types + { + public class Guide + { + /// + /// 获取或设置服务人员 ID。 + /// + [Newtonsoft.Json.JsonProperty("guide_id")] + [System.Text.Json.Serialization.JsonPropertyName("guide_id")] + public string GuideId { get; set; } = default!; + + /// + /// 获取或设置门店 ID。 + /// + [Newtonsoft.Json.JsonProperty("store_id")] + [System.Text.Json.Serialization.JsonPropertyName("store_id")] + public int StoreId { get; set; } + + /// + /// 获取或设置企业微信的员工 ID。 + /// + [Newtonsoft.Json.JsonProperty("userid")] + [System.Text.Json.Serialization.JsonPropertyName("userid")] + public string UserId { get; set; } = default!; + + /// + /// 获取或设置企业微信的员工姓名(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string UserNameEncryptedData { get; set; } = default!; + + /// + /// 获取或设置企业微信的员工手机号码(需使用商户私钥解密)。 + /// + [Newtonsoft.Json.JsonProperty("mobile")] + [System.Text.Json.Serialization.JsonPropertyName("mobile")] + public string UserMobileEncryptedData { get; set; } = default!; + + /// + /// 获取或设置企业微信的员工工号。 + /// + [Newtonsoft.Json.JsonProperty("work_id")] + [System.Text.Json.Serialization.JsonPropertyName("work_id")] + public string UserWorkId { get; set; } = default!; + } + } + + /// + /// 获取或设置服务人员列表。 + /// + [Newtonsoft.Json.JsonProperty("data")] + [System.Text.Json.Serialization.JsonPropertyName("data")] + public Types.Guide[] GuideList { get; set; } = default!; + + /// + /// 获取或设置分页大小。 + /// + [Newtonsoft.Json.JsonProperty("limit")] + [System.Text.Json.Serialization.JsonPropertyName("limit")] + public int Limit { get; set; } + + /// + /// 获取或设置分页开始位置。 + /// + [Newtonsoft.Json.JsonProperty("offset")] + [System.Text.Json.Serialization.JsonPropertyName("offset")] + public int Offset { 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/SmartGuide/UpdateSmartGuideRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs new file mode 100644 index 00000000..42ab1ca5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /smartguide/guides/{guide_id} 接口的请求。 + /// + public class UpdateSmartGuideRequest : WechatTenpayRequest + { + /// + /// 获取或设置服务人员 ID。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string GuideId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置企业微信的员工姓名(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? UserNameEncryptedData { get; set; } + + /// + /// 获取或设置企业微信的员工手机号码(需使用微信支付平台公钥加密)。 + /// + [Newtonsoft.Json.JsonProperty("mobile")] + [System.Text.Json.Serialization.JsonPropertyName("mobile")] + public string? UserMobileEncryptedData { get; set; } + + /// + /// 获取或设置企业微信的员工个人二维码地址。 + /// + [Newtonsoft.Json.JsonProperty("qr_code")] + [System.Text.Json.Serialization.JsonPropertyName("qr_code")] + public string? UserQrcodeUrl { get; set; } + + /// + /// 获取或设置企业微信的员工头像地址。 + /// + [Newtonsoft.Json.JsonProperty("avatar")] + [System.Text.Json.Serialization.JsonPropertyName("avatar")] + public string? UserAvatarUrl { get; set; } + + /// + /// 获取或设置群二维码地址。 + /// + [Newtonsoft.Json.JsonProperty("group_qrcode")] + [System.Text.Json.Serialization.JsonPropertyName("group_qrcode")] + public string? GroupQrcodeUrl { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideResponse.cs new file mode 100644 index 00000000..c428fe48 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/SmartGuide/UpdateSmartGuideResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [PATCH] /smartguide/guides/{guide_id} 接口的响应。 + /// + public class UpdateSmartGuideResponse : WechatTenpayResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallRefundResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallRefundResource.cs new file mode 100644 index 00000000..d431a418 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallRefundResource.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 MALL_REFUND.SUCCESS 通知的数据。 + /// + public class MallRefundResource : WechatTenpayCallback.Types.IDecryptedResource + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置商圈商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = default!; + + /// + /// 获取或设置门店名称。 + /// + [Newtonsoft.Json.JsonProperty("shop_name")] + [System.Text.Json.Serialization.JsonPropertyName("shop_name")] + public string ShopName { get; set; } = default!; + + /// + /// 获取或设置门店编号。 + /// + [Newtonsoft.Json.JsonProperty("shop_number")] + [System.Text.Json.Serialization.JsonPropertyName("shop_number")] + public string ShopNumber { get; set; } = default!; + + /// + /// 获取或设置微信 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("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置微信支付退款号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置消费金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("pay_amount")] + [System.Text.Json.Serialization.JsonPropertyName("pay_amount")] + public int PayAmount { get; set; } + + /// + /// 获取或设置退款金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("refund_amount")] + [System.Text.Json.Serialization.JsonPropertyName("refund_amount")] + public int RefundAmount { get; set; } + + /// + /// 获取或设置退款成功时间。 + /// + [Newtonsoft.Json.JsonProperty("refund_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("refund_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset SuccessTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallTransactionResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallTransactionResource.cs new file mode 100644 index 00000000..20cc362b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/BusinessCircle/MallTransactionResource.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 MALL_TRANSACTION.SUCCESS 通知的数据。 + /// + public class MallTransactionResource : WechatTenpayCallback.Types.IDecryptedResource + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置商圈商户名称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = default!; + + /// + /// 获取或设置门店名称。 + /// + [Newtonsoft.Json.JsonProperty("shop_name")] + [System.Text.Json.Serialization.JsonPropertyName("shop_name")] + public string ShopName { get; set; } = default!; + + /// + /// 获取或设置门店编号。 + /// + [Newtonsoft.Json.JsonProperty("shop_number")] + [System.Text.Json.Serialization.JsonPropertyName("shop_number")] + public string ShopNumber { get; set; } = default!; + + /// + /// 获取或设置微信 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("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int Amount { get; set; } + + /// + /// 获取或设置交易完成时间。 + /// + [Newtonsoft.Json.JsonProperty("time_end")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_end")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset SuccessTime { get; set; } + + /// + /// 获取或设置手动提交积分标记。 + /// + [Newtonsoft.Json.JsonProperty("commit_tag")] + [System.Text.Json.Serialization.JsonPropertyName("commit_tag")] + public string? CommitTag { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/CombineTransactions/CombineTransactionResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/CombineTransactions/CombineTransactionResource.cs new file mode 100644 index 00000000..9d8184bf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/CombineTransactions/CombineTransactionResource.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 TRANSACTION.SUCCESS 通知的数据。 + /// + public class CombineTransactionResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class SubOrder : Models.GetCombineTransactionByCombineOutTradeNumberResponse.Types.SubOrder + { + } + + public class Scene : Models.GetCombineTransactionByCombineOutTradeNumberResponse.Types.Scene + { + } + + public class Payer : Models.GetCombineTransactionByCombineOutTradeNumberResponse.Types.Payer + { + } + } + + /// + /// 获取或设置合单微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("combine_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_mchid")] + public string CombineMerchantId { get; set; } = default!; + + /// + /// 获取或设置合单微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("combine_appid")] + [System.Text.Json.Serialization.JsonPropertyName("combine_appid")] + public string CombineAppId { get; set; } = default!; + + /// + /// 获取或设置合单商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("combine_out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("combine_out_trade_no")] + public string CombineOutTradeNumber { get; set; } = default!; + + /// + /// 获取或设置子单列表。 + /// + [Newtonsoft.Json.JsonProperty("sub_orders")] + [System.Text.Json.Serialization.JsonPropertyName("sub_orders")] + public Types.SubOrder[]? SubOrderList { get; set; } = default!; + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("combine_payer_info")] + [System.Text.Json.Serialization.JsonPropertyName("combine_payer_info")] + public Types.Payer? CombinePayer { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/DiscountCard/DiscountCardResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/DiscountCard/DiscountCardResource.cs new file mode 100644 index 00000000..5ec84b82 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/DiscountCard/DiscountCardResource.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 DISCOUNT_CARD.USER_ACCEPTED 通知的数据。 + /// 表示 DISCOUNT_CARD.AGREEMENT_ENDED 通知的数据。 + /// 表示 DISCOUNT_CARD.USER_PAID 通知的数据。 + /// + public class DiscountCardResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class TimeRange : Models.GetDiscountCardByOutCardCodeResponse.Types.TimeRange + { + } + + public class Payment : Models.GetDiscountCardByOutCardCodeResponse.Types.Payment + { + } + + public class Objective : Models.GetDiscountCardByOutCardCodeResponse.Types.Objective + { + } + + public class Reward : Models.GetDiscountCardByOutCardCodeResponse.Types.Reward + { + } + } + + /// + /// 获取或设置微信商户号。 + /// + [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("out_card_code")] + [System.Text.Json.Serialization.JsonPropertyName("out_card_code")] + public string OutCardCode { get; set; } = default!; + + /// + /// 获取或设置先享卡模板 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_template_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_template_id")] + public string CardTemplateId { get; set; } = default!; + + /// + /// 获取或设置先享卡 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_id")] + public string CardId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置约定时间期限信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange? TimeRange { get; set; } + + /// + /// 获取或设置状态。 + /// + [Newtonsoft.Json.JsonProperty("state")] + [System.Text.Json.Serialization.JsonPropertyName("state")] + public string State { get; set; } = default!; + + /// + /// 获取或设置未完成约定原因。 + /// + [Newtonsoft.Json.JsonProperty("unfinished_reason")] + [System.Text.Json.Serialization.JsonPropertyName("unfinished_reason")] + public string? UnfinishedReason { get; set; } + + /// + /// 获取或设置享受优惠总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int? TotalAmount { get; set; } + + /// + /// 获取或设置用户退回优惠的付款信息。 + /// + [Newtonsoft.Json.JsonProperty("pay_information")] + [System.Text.Json.Serialization.JsonPropertyName("pay_information")] + public Types.Payment? Payment { get; set; } + + /// + /// 获取或设置目标列表。 + /// + [Newtonsoft.Json.JsonProperty("objectives")] + [System.Text.Json.Serialization.JsonPropertyName("objectives")] + public Types.Objective[]? Objectives { get; set; } + + /// + /// 获取或设置优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("rewards")] + [System.Text.Json.Serialization.JsonPropertyName("rewards")] + public Types.Reward[]? Rewards { get; set; } + + /// + /// 获取或设置邀请者用户标识。 + /// + [Newtonsoft.Json.JsonProperty("sharer_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sharer_openid")] + public string? SharerOpenId { get; set; } + + /// + /// 获取或设置创卡时间。 + /// + [Newtonsoft.Json.JsonProperty("create_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("create_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? CreateTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingBusifavor/MarketingBusifavorCouponResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingBusifavor/MarketingBusifavorCouponResource.cs new file mode 100644 index 00000000..2a779619 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingBusifavor/MarketingBusifavorCouponResource.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 COUPON.SEND 通知的数据。 + /// + public class MarketingBusifavorCouponResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class Attachment + { + /// + /// 获取或设置交易订单编号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + + /// + /// 获取或设置支付有礼活动编号或营销馆活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("act_code")] + [System.Text.Json.Serialization.JsonPropertyName("act_code")] + public string? ActivityCode { get; set; } + + /// + /// 获取或设置营销馆 ID。 + /// + [Newtonsoft.Json.JsonProperty("hall_code")] + [System.Text.Json.Serialization.JsonPropertyName("hall_code")] + public string? HallCode { get; set; } + + /// + /// 获取或设置营销馆所属商户号。 + /// + [Newtonsoft.Json.JsonProperty("hall_belong_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("hall_belong_mch_id")] + public string? HallbelongMerchantId { get; set; } + + /// + /// 获取或设置会员卡 ID。 + /// + [Newtonsoft.Json.JsonProperty("card_id")] + [System.Text.Json.Serialization.JsonPropertyName("card_id")] + public string? CardId { get; set; } + + /// + /// 获取或设置会员卡 Code。 + /// + [Newtonsoft.Json.JsonProperty("code")] + [System.Text.Json.Serialization.JsonPropertyName("code")] + public string? CardCode { get; set; } + + /// + /// 获取或设置会员活动 ID。 + /// + [Newtonsoft.Json.JsonProperty("activity_id")] + [System.Text.Json.Serialization.JsonPropertyName("activity_id")] + public string? ActivityId { get; set; } + } + } + + /// + /// 获取或设置事件类型。 + /// + [Newtonsoft.Json.JsonProperty("event_type")] + [System.Text.Json.Serialization.JsonPropertyName("event_type")] + public string EventType { get; set; } = default!; + + /// + /// 获取或设置商家券 Code。 + /// + [Newtonsoft.Json.JsonProperty("coupon_code")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_code")] + public string CouponCode { get; set; } = default!; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置用户统一标识。 + /// + [Newtonsoft.Json.JsonProperty("unionid")] + [System.Text.Json.Serialization.JsonPropertyName("unionid")] + public string? UnionId { get; set; } + + /// + /// 获取或设置发放时间。 + /// + [Newtonsoft.Json.JsonProperty("send_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("send_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset SendTime { get; set; } + + /// + /// 获取或设置发券商户号。 + /// + [Newtonsoft.Json.JsonProperty("send_channel")] + [System.Text.Json.Serialization.JsonPropertyName("send_channel")] + public string SendChannel { get; set; } = default!; + + /// + /// 获取或设置发券商户号。 + /// + [Newtonsoft.Json.JsonProperty("send_merchant")] + [System.Text.Json.Serialization.JsonPropertyName("send_merchant")] + public string SendMerchantId { get; set; } = default!; + + /// + /// 获取或设置发券附加信息。 + /// + [Newtonsoft.Json.JsonProperty("attach_info")] + [System.Text.Json.Serialization.JsonPropertyName("attach_info")] + public Types.Attachment? Attachment { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingFavor/MarketingFavorCouponResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingFavor/MarketingFavorCouponResource.cs new file mode 100644 index 00000000..b53f2b38 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MarketingFavor/MarketingFavorCouponResource.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 COUPON.USE 通知的数据。 + /// + public class MarketingFavorCouponResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class SingleItemDiscountOff + { + /// + /// 获取或设置单品最高优惠价格(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("single_price_max")] + [System.Text.Json.Serialization.JsonPropertyName("single_price_max")] + public int? SinglePriceMax { get; set; } + } + + public class DiscountTo + { + /// + /// 获取或设置减至后优惠单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("cut_to_price")] + [System.Text.Json.Serialization.JsonPropertyName("cut_to_price")] + public int? CutToPrice { get; set; } + + /// + /// 获取或设置最高价格(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("max_price")] + [System.Text.Json.Serialization.JsonPropertyName("max_price")] + public int? MaxPrice { get; set; } + } + + public class NormalCoupon : Models.QueryMarketingFavorUserCouponsResponse.Types.Coupon.Types.NormalCoupon + { + } + + public class Consumption : Models.QueryMarketingFavorUserCouponsResponse.Types.Coupon.Types.Consumption + { + } + } + + /// + /// 获取或设置代金券 ID。 + /// + [Newtonsoft.Json.JsonProperty("coupon_id")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_id")] + public string CouponId { get; set; } = default!; + + /// + /// 获取或设置批次号。 + /// + [Newtonsoft.Json.JsonProperty("stock_id")] + [System.Text.Json.Serialization.JsonPropertyName("stock_id")] + public string StockId { get; set; } = default!; + + /// + /// 获取或设置创建批次的商户号。 + /// + [Newtonsoft.Json.JsonProperty("stock_creator_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("stock_creator_mchid")] + public string StockCreatorMerchantId { get; set; } = default!; + + /// + /// 获取或设置代金券名称。 + /// + [Newtonsoft.Json.JsonProperty("coupon_name")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_name")] + public string CouponName { get; set; } = default!; + + /// + /// 获取或设置券类型。 + /// + [Newtonsoft.Json.JsonProperty("coupon_type")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_type")] + public string CouponType { get; set; } = default!; + + /// + /// 获取或设置券状态。 + /// + [Newtonsoft.Json.JsonProperty("status")] + [System.Text.Json.Serialization.JsonPropertyName("status")] + public string Status { get; set; } = default!; + + /// + /// 获取或设置使用说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = default!; + + /// + /// 获取或设置可用开始时间。 + /// + [Newtonsoft.Json.JsonProperty("available_begin_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_begin_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableBeginTime { get; set; } + + /// + /// 获取或设置可用结束时间。 + /// + [Newtonsoft.Json.JsonProperty("available_end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("available_end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset AvailableEndTime { get; set; } + + /// + /// 获取或设置是否无资金流。 + /// + [Newtonsoft.Json.JsonProperty("no_cash")] + [System.Text.Json.Serialization.JsonPropertyName("no_cash")] + public bool IsNoCash { get; set; } + + /// + /// 获取或设置是否单品优惠。 + /// + [Newtonsoft.Json.JsonProperty("singleitem")] + [System.Text.Json.Serialization.JsonPropertyName("singleitem")] + public bool IsSingleItem { get; set; } + + /// + /// 获取或设置单品优惠特定信息。 + /// + [Newtonsoft.Json.JsonProperty("singleitem_discount_off")] + [System.Text.Json.Serialization.JsonPropertyName("singleitem_discount_off")] + public Types.SingleItemDiscountOff? SingleItemDiscountOff { get; set; } + + /// + /// 获取或设置减至优惠特定信息。 + /// + [Newtonsoft.Json.JsonProperty("discount_to")] + [System.Text.Json.Serialization.JsonPropertyName("discount_to")] + public Types.DiscountTo? DiscountTo { get; set; } + + /// + /// 获取或设置普通满减券信息。 + /// + [Newtonsoft.Json.JsonProperty("normal_coupon_information")] + [System.Text.Json.Serialization.JsonPropertyName("normal_coupon_information")] + public Types.NormalCoupon? NormalCoupon { get; set; } + + /// + /// 获取或设置实扣代金券核销信息。 + /// + [Newtonsoft.Json.JsonProperty("consume_information")] + [System.Text.Json.Serialization.JsonPropertyName("consume_information")] + public Types.Consumption? Consumption { get; set; } + + /// + /// 获取或设置领券时间。 + /// + [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/Resources/MerchantService/ComplaintResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MerchantService/ComplaintResource.cs new file mode 100644 index 00000000..41681b34 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/MerchantService/ComplaintResource.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 COMPLAINT.CREATE 通知的数据。 + /// 表示 COMPLAINT.STATE_CHANGE 通知的数据。 + /// + public class ComplaintResource : WechatTenpayCallback.Types.IDecryptedResource + { + /// + /// 获取或设置投诉单号。 + /// + [Newtonsoft.Json.JsonProperty("complaint_id")] + [System.Text.Json.Serialization.JsonPropertyName("complaint_id")] + public string ComplaintId { get; set; } = default!; + + /// + /// 获取或设置动作类型。 + /// + [Newtonsoft.Json.JsonProperty("action_type")] + [System.Text.Json.Serialization.JsonPropertyName("action_type")] + public string ActionType { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerRefundResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerRefundResource.cs new file mode 100644 index 00000000..21424e6c --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerRefundResource.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 REFUND.SUCCESS (仅服务商)通知的数据。 + /// 表示 REFUND.ABNORMAL (仅服务商)通知的数据。 + /// 表示 REFUND.CLOSED (仅服务商)通知的数据。 + /// + public class PartnerRefundResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class Amount : Models.GetRefundDomesticRefundByOutRefundNumberResponse.Types.Amount + { + } + } + + /// + /// 获取或设置服务商商户号。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置子商户商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { 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("out_refund_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_refund_no")] + public string OutRefundNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付退款号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置退款状态。 + /// + [Newtonsoft.Json.JsonProperty("refund_status")] + [System.Text.Json.Serialization.JsonPropertyName("refund_status")] + public string RefundStatus { get; set; } = default!; + + /// + /// 获取或设置退款入账账户。 + /// + [Newtonsoft.Json.JsonProperty("user_received_account")] + [System.Text.Json.Serialization.JsonPropertyName("user_received_account")] + public string UserReceivedAccount { get; set; } = default!; + + /// + /// 获取或设置退款成功时间。 + /// + [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("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerTransactionResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerTransactionResource.cs new file mode 100644 index 00000000..15eab04b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayPartnerTransactions/PartnerTransactionResource.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 TRANSACTION.SUCCESS (仅限服务商)通知的数据。 + /// + public class PartnerTransactionResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class Payer : Models.GetPayPartnerTransactionByOutTradeNumberResponse.Types.Payer + { + } + + public class Amount : Models.GetPayPartnerTransactionByOutTradeNumberResponse.Types.Amount + { + } + + public class Scene : Models.GetPayPartnerTransactionByOutTradeNumberResponse.Types.Scene + { + } + + public class Promotion : Models.GetPayPartnerTransactionByOutTradeNumberResponse.Types.Promotion + { + } + } + + /// + /// 获取或设置服务商商户号。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置子商户商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public string AppId { get; set; } = default!; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [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.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("success_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + 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("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { 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/Resources/PayScorePermissions/PayScorePermissionsResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScorePermissions/PayScorePermissionsResource.cs new file mode 100644 index 00000000..c943cb6a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScorePermissions/PayScorePermissionsResource.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 PAYSCORE.USER_OPEN_SERVICE 通知的数据。 + /// 表示 PAYSCORE.USER_CLOSE_SERVICE 通知的数据。 + /// + public class PayScorePermissionsResource : WechatTenpayCallback.Types.IDecryptedResource + { + /// + /// 获取或设置微信商户号。 + /// + [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("out_request_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_request_no")] + public string? OutRequestNumber { get; set; } + + /// + /// 获取或设置授权协议号。 + /// + [Newtonsoft.Json.JsonProperty("authorization_code")] + [System.Text.Json.Serialization.JsonPropertyName("authorization_code")] + public string? AuthorizationCode { get; set; } + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置回调状态。 + /// + [Newtonsoft.Json.JsonProperty("user_service_status")] + [System.Text.Json.Serialization.JsonPropertyName("user_service_status")] + public string? UserServiceStatus { get; set; } + + /// + /// 获取或设置服务开启或解除授权时间。 + /// + [Newtonsoft.Json.JsonProperty("openorclose_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("openorclose_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + public DateTimeOffset? OpenOrCloseTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScoreServiceOrder/PayScoreServiceOrderResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScoreServiceOrder/PayScoreServiceOrderResource.cs new file mode 100644 index 00000000..9c6877eb --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayScoreServiceOrder/PayScoreServiceOrderResource.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 PAYSCORE.USER_CONFIRM 通知的数据。 + /// 表示 PAYSCORE.USER_PAID 通知的数据。 + /// + public class PayScoreServiceOrderResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class Payment + { + /// + /// 获取或设置付费项目名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// 获取或设置付费说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置付费金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int? Amount { get; set; } + + /// + /// 获取或设置付费数量。 + /// + [Newtonsoft.Json.JsonProperty("count")] + [System.Text.Json.Serialization.JsonPropertyName("count")] + public int? Count { get; set; } + } + + public class Discount + { + /// + /// 获取或设置优惠名称。 + /// + [Newtonsoft.Json.JsonProperty("name")] + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = default!; + + /// + /// 获取或设置优惠说明。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? Description { get; set; } + + /// + /// 获取或设置优惠金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public int? Amount { get; set; } + } + + public class TimeRange + { + /// + /// 获取或设置服务开始时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("start_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + public DateTimeOffset StartTime { get; set; } + + /// + /// 获取或设置服务开始时间备注。 + /// + [Newtonsoft.Json.JsonProperty("start_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("start_time_remark")] + public string? StartTimeRemark { get; set; } + + /// + /// 获取或设置服务结束时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("end_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + + /// + /// 获取或设置服务结束时间备注。 + /// + [Newtonsoft.Json.JsonProperty("end_time_remark")] + [System.Text.Json.Serialization.JsonPropertyName("end_time_remark")] + public string? EndTimeRemark { get; set; } + } + + public class Location : Models.GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Location + { + } + + public class RiskFund : Models.GetPayScoreServiceOrderByOutOrderNumberResponse.Types.RiskFund + { + } + + public class Collection : Models.GetPayScoreServiceOrderByOutOrderNumberResponse.Types.Collection + { + } + } + + /// + /// 获取或设置微信商户号。 + /// + [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("out_order_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_order_no")] + public string OutOrderNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付服务订单号。 + /// + [Newtonsoft.Json.JsonProperty("order_id")] + [System.Text.Json.Serialization.JsonPropertyName("order_id")] + public string? OrderId { get; set; } + + /// + /// 获取或设置服务 ID。 + /// + [Newtonsoft.Json.JsonProperty("service_id")] + [System.Text.Json.Serialization.JsonPropertyName("service_id")] + public string ServiceId { get; set; } = default!; + + /// + /// 获取或设置服务信息。 + /// + [Newtonsoft.Json.JsonProperty("service_introduction")] + [System.Text.Json.Serialization.JsonPropertyName("service_introduction")] + public string ServiceIntroduction { 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("state_description")] + [System.Text.Json.Serialization.JsonPropertyName("state_description")] + public string? StateDescription { get; set; } + + /// + /// 获取或设置商户收款总金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_amount")] + [System.Text.Json.Serialization.JsonPropertyName("total_amount")] + public int? TotalAmount { get; set; } + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置付费项目列表。 + /// + [Newtonsoft.Json.JsonProperty("post_payments")] + [System.Text.Json.Serialization.JsonPropertyName("post_payments")] + public Types.Payment[]? PostPaymentList { get; set; } + + /// + /// 获取或设置商户优惠列表。 + /// + [Newtonsoft.Json.JsonProperty("post_discounts")] + [System.Text.Json.Serialization.JsonPropertyName("post_discounts")] + public Types.Discount[]? PostDiscountList { get; set; } + + /// + /// 获取或设置服务时间段信息。 + /// + [Newtonsoft.Json.JsonProperty("time_range")] + [System.Text.Json.Serialization.JsonPropertyName("time_range")] + public Types.TimeRange? TimeRange { get; set; } + + /// + /// 获取或设置服务位置信息。 + /// + [Newtonsoft.Json.JsonProperty("location")] + [System.Text.Json.Serialization.JsonPropertyName("location")] + public Types.Location? Location { get; set; } + + /// + /// 获取或设置订单风险金信息。 + /// + [Newtonsoft.Json.JsonProperty("risk_fund")] + [System.Text.Json.Serialization.JsonPropertyName("risk_fund")] + public Types.RiskFund? RiskFund { get; set; } + + /// + /// 获取或设置是否需要收款。 + /// + [Newtonsoft.Json.JsonProperty("need_collection")] + [System.Text.Json.Serialization.JsonPropertyName("need_collection")] + public bool? RequireCollection { get; set; } + + /// + /// 获取或设置收款信息。 + /// + [Newtonsoft.Json.JsonProperty("collection")] + [System.Text.Json.Serialization.JsonPropertyName("collection")] + public Types.Collection? Collection { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayTransactions/TransactionResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayTransactions/TransactionResource.cs new file mode 100644 index 00000000..b31969ed --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/PayTransactions/TransactionResource.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 TRANSACTION.SUCCESS (仅限直连商户)通知的数据。 + /// + public class TransactionResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class Payer : Models.GetPayTransactionByOutTradeNumberResponse.Types.Payer + { + } + + public class Amount : Models.GetPayTransactionByOutTradeNumberResponse.Types.Amount + { + } + + public class Scene : Models.GetPayTransactionByOutTradeNumberResponse.Types.Scene + { + } + + public class Promotion : Models.GetPayTransactionByOutTradeNumberResponse.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("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.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("success_time")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset SuccessTime { get; set; } + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("payer")] + [System.Text.Json.Serialization.JsonPropertyName("payer")] + public Types.Payer Payer { get; set; } = default!; + + /// + /// 获取或设置金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { 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/Resources/Refund/RefundResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/Refund/RefundResource.cs new file mode 100644 index 00000000..fedd5944 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Resources/Refund/RefundResource.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Resources +{ + /// + /// 表示 REFUND.SUCCESS (仅直连商户)通知的数据。 + /// 表示 REFUND.ABNORMAL (仅直连商户)通知的数据。 + /// 表示 REFUND.CLOSED (仅直连商户)通知的数据。 + /// + public class RefundResource : WechatTenpayCallback.Types.IDecryptedResource + { + public static class Types + { + public class Amount : Models.GetRefundDomesticRefundByOutRefundNumberResponse.Types.Amount + { + } + } + + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { 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("out_refund_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_refund_no")] + public string OutRefundNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付退款号。 + /// + [Newtonsoft.Json.JsonProperty("refund_id")] + [System.Text.Json.Serialization.JsonPropertyName("refund_id")] + public string RefundId { get; set; } = default!; + + /// + /// 获取或设置退款状态。 + /// + [Newtonsoft.Json.JsonProperty("refund_status")] + [System.Text.Json.Serialization.JsonPropertyName("refund_status")] + public string RefundStatus { get; set; } = default!; + + /// + /// 获取或设置退款入账账户。 + /// + [Newtonsoft.Json.JsonProperty("user_received_account")] + [System.Text.Json.Serialization.JsonPropertyName("user_received_account")] + public string UserReceivedAccount { get; set; } = default!; + + /// + /// 获取或设置退款成功时间。 + /// + [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("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj new file mode 100644 index 00000000..bb63dbfc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/SKIT.FlurlHttpClient.Wechat.TenpayV3.csproj @@ -0,0 +1,34 @@ + + + + net461; netstandard2.0 + 8.0 + enable + true + + + + SKIT.FlurlHttpClient.Wechat.TenpayV3 + MIT + https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat + Flurl.Http Wechat Weixin MicroMessage Tenpay Wxpay 微信 微信支付 微信商户 + 1.0.0-rc + Flurl.Http client for Wechat Tenpay API. 基于 Flurl.Http 的微信支付 API v3 版客户端,支持直连商户、服务商模式,支持基础支付、代金券、商家券、委托营销、消费卡、支付有礼、微信支付分、微信先享卡、支付即服务、点金计划、智慧商圈、电商收付通、消费者投诉等功能。 + Fu Diwei + git + https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/AesUtil.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/AesUtil.cs new file mode 100644 index 00000000..b8a9f044 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/AesUtil.cs @@ -0,0 +1,69 @@ +using System; +using System.Text; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Security; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities +{ + /// + /// AES 算法工具类。 + /// + public static class AesUtil + { + private const int AES_TAG_LENGH_BIT = 128; + private const string AES_GCM_CIPHER_ALG = "AES/GCM/NoPadding"; + + /// + /// 基于 GCM 模式解密数据。 + /// + /// AES 密钥字节数组。 + /// 附加数据包字节数组。 + /// 加密使用的随机串初始化向量字节数组。 + /// 待解密数据字节数组。 + /// 解密后的数据字节数组。 + public static byte[] DecryptWithGCM(byte[] aesKeyBytes, byte[] nonceBytes, byte[] associatedDataBytes, byte[] cipherBytes) + { + if (aesKeyBytes == null) throw new ArgumentNullException(nameof(aesKeyBytes)); + if (nonceBytes == null) throw new ArgumentNullException(nameof(nonceBytes)); + if (associatedDataBytes == null) throw new ArgumentNullException(nameof(associatedDataBytes)); + if (cipherBytes == null) throw new ArgumentNullException(nameof(cipherBytes)); + + IBufferedCipher cipher = CipherUtilities.GetCipher(AES_GCM_CIPHER_ALG); + ICipherParameters aeadParams = new AeadParameters( + new KeyParameter(aesKeyBytes), + AES_TAG_LENGH_BIT, + nonceBytes, + associatedDataBytes + ); + cipher.Init(false, aeadParams); + byte[] plainBytes = new byte[cipher.GetOutputSize(cipherBytes.Length)]; + int len = cipher.ProcessBytes(cipherBytes, 0, cipherBytes.Length, plainBytes, 0); + cipher.DoFinal(plainBytes, len); + return plainBytes; + } + + /// + /// 基于 GCM 模式解密数据。 + /// + /// AES 密钥。 + /// 加密使用的随机串初始化向量。 + /// 附加数据包。 + /// 经 Base64 编码后的待解密数据。 + /// 解密后的文本数据。 + public static string DecryptWithGCM(string aesKey, string nonce, string? associatedData, string cipherText) + { + if (aesKey == null) throw new ArgumentNullException(nameof(aesKey)); + if (nonce == null) throw new ArgumentNullException(nameof(nonce)); + if (cipherText == null) throw new ArgumentNullException(nameof(cipherText)); + + byte[] plainBytes = DecryptWithGCM( + aesKeyBytes: Encoding.UTF8.GetBytes(aesKey), + nonceBytes: Encoding.UTF8.GetBytes(nonce), + associatedDataBytes: Encoding.UTF8.GetBytes(associatedData ?? string.Empty), + cipherBytes: Convert.FromBase64String(cipherText) + ); + return Encoding.UTF8.GetString(plainBytes); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/RsaUtil.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/RsaUtil.cs new file mode 100644 index 00000000..5b8f3755 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/RsaUtil.cs @@ -0,0 +1,274 @@ +using System; +using System.IO; +using System.Text; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Engines; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.X509; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities +{ + /// + /// RSA 算法工具类。 + /// + public static class RsaUtil + { + // REF: https://github.com/bcgit/bc-csharp/blob/master/crypto/src/security/CipherUtilities.cs + private const string RSA_CIPHER_ALG = "RSA/ECB/PKCS1"; + // REF: https://github.com/bcgit/bc-csharp/blob/master/crypto/src/security/SignerUtilities.cs + private const string RSA_SIGNER_ALG = "SHA-256withRSA"; + + /// + /// 使用私钥基于 SHA-256 算法生成签名。 + /// + /// PKCS#8 私钥字节数组。 + /// 待签名的数据字节数组。 + /// 签名字节数组。 + public static byte[] SignWithSHA256(byte[] privateKeyBytes, byte[] plainBytes) + { + if (privateKeyBytes == null) throw new ArgumentNullException(nameof(privateKeyBytes)); + if (plainBytes == null) throw new ArgumentNullException(nameof(plainBytes)); + + RsaKeyParameters rsaKeyParams = (RsaKeyParameters)PrivateKeyFactory.CreateKey(privateKeyBytes); + return SignWithSHA256(rsaKeyParams, plainBytes); + } + + /// + /// 使用私钥基于 SHA-256 算法生成签名。 + /// + /// PKCS#8 私钥(pem 格式)。 + /// 待签名的文本数据。 + /// 经 Base64 编码的签名。 + public static string SignWithSHA256(string privateKey, string plainText) + { + if (privateKey == null) throw new ArgumentNullException(nameof(privateKey)); + if (plainText == null) throw new ArgumentNullException(nameof(plainText)); + + byte[] privateKeyBytes = ConvertPkcs8PrivateKeyToByteArray(privateKey); + byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); + byte[] signBytes = SignWithSHA256(privateKeyBytes, plainBytes); + return Convert.ToBase64String(signBytes); + } + + /// + /// 使用公钥基于 SHA-256 算法验证签名。 + /// + /// PKCS#8 公钥字节数据。 + /// 待验证的数据字节数据。 + /// 待验证的签名字节数据。 + /// 验证结果。 + public static bool VerifyWithSHA256(byte[] publicKeyBytes, byte[] plainBytes, byte[] signBytes) + { + if (publicKeyBytes == null) throw new ArgumentNullException(nameof(publicKeyBytes)); + if (plainBytes == null) throw new ArgumentNullException(nameof(plainBytes)); + if (signBytes == null) throw new ArgumentNullException(nameof(signBytes)); + + RsaKeyParameters rsaKeyParams = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyBytes); + return VerifyWithSHA256(rsaKeyParams, plainBytes, signBytes); + } + + /// + /// 使用公钥基于 SHA-256 算法验证签名。 + /// + /// PKCS#8 公钥(pem 格式)。 + /// 待验证的文本数据。 + /// 经 Base64 编码的待验证的签名。 + /// 验证结果。 + public static bool VerifyWithSHA256(string publicKey, string plainText, string signature) + { + if (publicKey == null) throw new ArgumentNullException(nameof(publicKey)); + if (plainText == null) throw new ArgumentNullException(nameof(plainText)); + if (signature == null) throw new ArgumentNullException(nameof(signature)); + + byte[] publicKeyBytes = ConvertPkcs8PublicKeyToByteArray(publicKey); + byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); + byte[] signBytes = Convert.FromBase64String(signature); + return VerifyWithSHA256(publicKeyBytes, plainBytes, signBytes); + } + + /// + /// 使用证书基于 SHA-256 算法验证签名。 + /// + /// 证书(cer 格式)。 + /// 待验证的文本数据。 + /// 经 Base64 编码的待验证的签名。 + /// 验证结果。 + public static bool VerifyWithSHA256ByCertificate(string certificate, string plainText, string signature) + { + if (certificate == null) throw new ArgumentNullException(nameof(certificate)); + if (plainText == null) throw new ArgumentNullException(nameof(plainText)); + if (signature == null) throw new ArgumentNullException(nameof(signature)); + + RsaKeyParameters rsaKeyParams = ConvertCertificateToPublicKeyParams(certificate); + byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); + byte[] signBytes = Convert.FromBase64String(signature); + return VerifyWithSHA256(rsaKeyParams, plainBytes, signBytes); + } + + /// + /// 使用私钥基于 ECB 模式解密数据。 + /// + /// PKCS#8 私钥字节数据。 + /// 待解密的数据字节数据。 + /// 解密后的数据字节数组。 + public static byte[] DecryptWithECB(byte[] privateKeyBytes, byte[] cipherBytes) + { + if (privateKeyBytes == null) throw new ArgumentNullException(nameof(privateKeyBytes)); + if (cipherBytes == null) throw new ArgumentNullException(nameof(cipherBytes)); + + RsaKeyParameters rsaKeyParams = (RsaKeyParameters)PrivateKeyFactory.CreateKey(privateKeyBytes); + return DecryptWithECB(rsaKeyParams, cipherBytes); + } + + /// + /// 使用私钥基于 ECB 模式解密数据。 + /// + /// PKCS#8 私钥(pem 格式)。 + /// 经 Base64 编码的待解密数据。 + /// 解密后的文本数据。 + public static string DecryptWithECB(string privateKey, string cipherText) + { + if (privateKey == null) throw new ArgumentNullException(nameof(privateKey)); + if (cipherText == null) throw new ArgumentNullException(nameof(cipherText)); + + byte[] privateKeyBytes = ConvertPkcs8PrivateKeyToByteArray(privateKey); + byte[] cipherBytes = Convert.FromBase64String(cipherText); + byte[] plainBytes = DecryptWithECB(privateKeyBytes, cipherBytes); + return Encoding.UTF8.GetString(plainBytes); + } + + /// + /// 使用公钥基于 ECB 模式加密数据。 + /// + /// PKCS#8 公钥字节数据。 + /// 待加密的数据字节数据。 + /// 加密后的数据字节数组。 + public static byte[] EncryptWithECB(byte[] publicKeyBytes, byte[] plainBytes) + { + if (publicKeyBytes == null) throw new ArgumentNullException(nameof(publicKeyBytes)); + if (plainBytes == null) throw new ArgumentNullException(nameof(plainBytes)); + + RsaKeyParameters rsaKeyParams = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyBytes); + return EncryptWithECB(rsaKeyParams, plainBytes); + } + + /// + /// 使用公钥基于 ECB 模式加密数据。 + /// + /// PKCS#8 公钥(pem 格式)。 + /// 待加密的文本数据。 + /// 经 Base64 编码的加密数据。 + public static string EncryptWithECB(string publicKey, string plainText) + { + if (publicKey == null) throw new ArgumentNullException(nameof(publicKey)); + if (plainText == null) throw new ArgumentNullException(nameof(plainText)); + + byte[] publicKeyBytes = ConvertPkcs8PublicKeyToByteArray(publicKey); + byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); + byte[] cipherBytes = EncryptWithECB(publicKeyBytes, plainBytes); + return Convert.ToBase64String(cipherBytes); + } + + /// + /// 使用证书基于 ECB 模式加密数据。 + /// + /// 证书(cer 格式)。 + /// 待加密的文本数据。 + /// 经 Base64 编码的加密数据。 + public static string EncryptWithECBByCertificate(string certificate, string plainText) + { + if (certificate == null) throw new ArgumentNullException(nameof(certificate)); + if (plainText == null) throw new ArgumentNullException(nameof(plainText)); + + RsaKeyParameters rsaKeyParams = ConvertCertificateToPublicKeyParams(certificate); + byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); + byte[] cipherBytes = EncryptWithECB(rsaKeyParams, plainBytes); + return Convert.ToBase64String(cipherBytes); + } + + /// + /// 从 CER 证书中提取 PKCS#8 公钥。 + /// + /// 即从 -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- + /// 转为 -----BEGIN PUBLIC KEY----- ..... -----END PUBLIC KEY----- + /// + /// + /// 证书(cer 格式)。 + /// PKCS#8 公钥(pem 格式)。 + public static string ExportPublicKey(string certificate) + { + using (TextWriter swriter = new StringWriter()) + { + RsaKeyParameters rsaKeyParams = ConvertCertificateToPublicKeyParams(certificate); + PemWriter pemWriter = new PemWriter(swriter); + pemWriter.WriteObject(rsaKeyParams); + pemWriter.Writer.Flush(); + return swriter.ToString()!; + } + } + + private static byte[] ConvertPkcs8PrivateKeyToByteArray(string privateKey) + { + privateKey = privateKey + .Replace("-----BEGIN PRIVATE KEY-----", "") + .Replace("-----END PRIVATE KEY-----", "") + .Replace("\r", "") + .Replace("\n", "") + .Replace("\\s", ""); + return Convert.FromBase64String(privateKey); + } + + private static byte[] ConvertPkcs8PublicKeyToByteArray(string publicKey) + { + publicKey = publicKey + .Replace("-----BEGIN PUBLIC KEY-----", "") + .Replace("-----END PUBLIC KEY-----", "") + .Replace("\r", "") + .Replace("\n", "") + .Replace("\\s", ""); + return Convert.FromBase64String(publicKey); + } + + private static RsaKeyParameters ConvertCertificateToPublicKeyParams(string certificate) + { + using (TextReader sreader = new StringReader(certificate)) + { + PemReader pemReader = new PemReader(sreader); + X509Certificate cert = (X509Certificate)pemReader.ReadObject(); + return (RsaKeyParameters)cert.GetPublicKey(); + } + } + + private static byte[] SignWithSHA256(RsaKeyParameters rsaKeyParams, byte[] plainBytes) + { + ISigner signer = SignerUtilities.GetSigner(RSA_SIGNER_ALG); + signer.Init(true, rsaKeyParams); + signer.BlockUpdate(plainBytes, 0, plainBytes.Length); + return signer.GenerateSignature(); + } + + private static bool VerifyWithSHA256(RsaKeyParameters rsaKeyParams, byte[] plainBytes, byte[] signBytes) + { + ISigner signer = SignerUtilities.GetSigner(RSA_SIGNER_ALG); + signer.Init(false, rsaKeyParams); + signer.BlockUpdate(plainBytes, 0, plainBytes.Length); + return signer.VerifySignature(signBytes); + } + + private static byte[] EncryptWithECB(RsaKeyParameters rsaKeyParams, byte[] plainBytes) + { + IBufferedCipher cipher = CipherUtilities.GetCipher(RSA_CIPHER_ALG); + cipher.Init(true, rsaKeyParams); + return cipher.DoFinal(plainBytes); + } + + private static byte[] DecryptWithECB(RsaKeyParameters rsaKeyParams, byte[] cipherBytes) + { + IBufferedCipher cipher = CipherUtilities.GetCipher(RSA_CIPHER_ALG); + cipher.Init(false, rsaKeyParams); + return cipher.DoFinal(cipherBytes); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Sha256Util.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Sha256Util.cs new file mode 100644 index 00000000..a9ff90aa --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Utilities/Sha256Util.cs @@ -0,0 +1,42 @@ +using System; +using System.Text; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Digests; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities +{ + /// + /// SHA-256 算法工具类。 + /// + public static class Sha256Util + { + /// + /// 获取信息摘要。 + /// + /// 信息字节数组。 + /// 信息摘要。 + public static string Hash(byte[] bytes) + { + if (bytes == null) throw new ArgumentNullException(nameof(bytes)); + + IDigest digest = new Sha256Digest(); + byte[] hashBytes = new byte[digest.GetDigestSize()]; + digest.BlockUpdate(bytes, 0, bytes.Length); + digest.DoFinal(hashBytes, 0); + return BitConverter.ToString(hashBytes).Replace("-", ""); + } + + /// + /// 获取信息摘要。 + /// + /// 文本信息。 + /// 信息摘要。 + public static string Hash(string message) + { + if (message == null) throw new ArgumentNullException(nameof(message)); + + byte[] bytes = Encoding.UTF8.GetBytes(message); + return Hash(bytes); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayAuthSchemes.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayAuthSchemes.cs new file mode 100644 index 00000000..372fecdd --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayAuthSchemes.cs @@ -0,0 +1,15 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 微信支付 API 接口签名认证方式。 + /// + public static class WechatTenpayAuthSchemes + { + /// + /// WECHATPAY2-SHA256-RSA2048(默认)。 + /// + public const string WECHATPAY2_SHA256_RSA2048 = "WECHATPAY2-SHA256-RSA2048"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayCallback.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayCallback.cs new file mode 100644 index 00000000..ff36c268 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayCallback.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 表示微信支付 API 回调通知事件的基类。 + /// + public abstract class WechatTenpayCallback + { + public static class Types + { + public class Resource + { + /// + /// 获取或设置加密算法类型。 + /// + [Newtonsoft.Json.JsonProperty("algorithm")] + [System.Text.Json.Serialization.JsonPropertyName("algorithm")] + public string Algorithm { get; set; } = default!; + + /// + /// 获取或设置加密前的对象类型。 + /// + [Newtonsoft.Json.JsonProperty("original_type")] + [System.Text.Json.Serialization.JsonPropertyName("original_type")] + public string? OriginalType { get; set; } + + /// + /// 获取或设置加密使用的附加数据。 + /// + [Newtonsoft.Json.JsonProperty("associated_data")] + [System.Text.Json.Serialization.JsonPropertyName("associated_data")] + public string? AssociatedData { get; set; } + + /// + /// 获取或设置加密使用的随机串初始化向量。 + /// + [Newtonsoft.Json.JsonProperty("nonce")] + [System.Text.Json.Serialization.JsonPropertyName("nonce")] + public string Nonce { get; set; } = default!; + + /// + /// 获取或设置 Base64 编码后的密文。 + /// + [Newtonsoft.Json.JsonProperty("ciphertext")] + [System.Text.Json.Serialization.JsonPropertyName("ciphertext")] + public string CipherText { get; set; } = default!; + } + + public interface IDecryptedResource + { + } + } + + /// + /// 获取或设置通知 ID。 + /// + [Newtonsoft.Json.JsonProperty("id")] + [System.Text.Json.Serialization.JsonPropertyName("id")] + public string Id { get; set; } = default!; + + /// + /// 获取或设置通知类型。 + /// + [Newtonsoft.Json.JsonProperty("event_type")] + [System.Text.Json.Serialization.JsonPropertyName("event_type")] + public string EventType { get; set; } = default!; + + /// + /// 获取或设置通知简要说明。 + /// + [Newtonsoft.Json.JsonProperty("summary")] + [System.Text.Json.Serialization.JsonPropertyName("summary")] + public string? Summary { get; set; } + + /// + /// 获取或设置通知数据类型。 + /// + [Newtonsoft.Json.JsonProperty("resource_type")] + [System.Text.Json.Serialization.JsonPropertyName("resource_type")] + public string ResourceType { get; set; } = default!; + + /// + /// 获取或设置通知数据。 + /// + [Newtonsoft.Json.JsonProperty("resource")] + [System.Text.Json.Serialization.JsonPropertyName("resource")] + public Types.Resource Resource { 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/WechatTenpayClient.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs new file mode 100644 index 00000000..7b04d265 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using Flurl.Http.Configuration; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 一个微信支付 API HTTP 客户端。 + /// + public partial class WechatTenpayClient : WechatClientBase + { + /// + /// 获取当前客户端使用的微信商户号。 + /// + public string MerchantId { get; } + + /// + /// 获取当前客户端使用的微信商户 API 证书序列号(用于请求签名)。 + /// + internal string MerchantCertSerialNumber { get; } + + /// + /// 获取当前客户端使用的微信商户 API 证书私钥(用于请求签名、响应数据解密)。 + /// + internal string MerchantCertPrivateKey { get; } + + /// + /// 获取当前客户端使用的微信商户 API v3 密钥(用于事件数据解密)。 + /// + internal string MerchantV3Secret { get; } + + /// + /// 获取当前客户端使用的 JSON 序列化器。 + /// + internal ISerializer JsonSerializer + { + get { return ProxyFlurlClient.Settings?.JsonSerializer ?? new FlurlNewtonsoftJsonSerializer(); } + } + + /// + /// 用指定的配置项初始化 类的新实例。 + /// + /// 配置项。 + public WechatTenpayClient(WechatTenpayClientOptions options) + { + if (options == null) throw new ArgumentNullException(nameof(options)); + + MerchantId = options.MerchantId; + MerchantCertSerialNumber = options.MerchantCertSerialNumber; + MerchantCertPrivateKey = options.MerchantCertPrivateKey; + MerchantV3Secret = options.MerchantV3Secret; + + ProxyFlurlClient.BaseUrl = options.Endpoints ?? WechatTenpayEndpoints.DEFAULT; + ProxyFlurlClient.Configure(settings => + { + settings.Timeout = TimeSpan.FromMilliseconds(options.Timeout); + }); + ProxyFlurlClient.Headers.Remove("Accept"); + ProxyFlurlClient.Headers.Remove("Accept-Language"); + ProxyFlurlClient.Headers.Remove("User-Agent"); + ProxyFlurlClient.WithHeader("Accept", "application/json"); + ProxyFlurlClient.WithHeader("Accept-Language", options.AcceptLanguage); + ProxyFlurlClient.WithHeader("User-Agent", options.UserAgent); + + var interceptorAuthenticator = new Interceptors.WechatTenpayAuthenticator( + scheme: options.AuthScheme, + mchId: options.MerchantId, + mchCertSn: options.MerchantCertSerialNumber, + mchCertPk: options.MerchantCertPrivateKey + ); + ProxyFlurlClient.BeforeCall((call) => interceptorAuthenticator.Authenticate(call)); + } + + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + /// + public async Task SendRequestAsync(IFlurlRequest request, HttpContent? content = null, CancellationToken cancellationToken = default) + where T : WechatTenpayResponse, new() + { + if (content != null) + { + if (string.IsNullOrEmpty(content.Headers.ContentType?.MediaType)) + content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + } + + try + { + using IFlurlResponse response = await base.SendRequestAsync(request, content, cancellationToken).ConfigureAwait(false); + return await GetResposneAsync(response).ConfigureAwait(false); + } + catch (FlurlHttpException ex) + { + throw new WechatTenpayException(ex.Message, ex); + } + } + + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + /// + public async Task SendRequestWithJsonAsync(IFlurlRequest request, object? data = null, CancellationToken cancellationToken = default) + where T : WechatTenpayResponse, new() + { + try + { + using IFlurlResponse response = await base.SendRequestWithJsonAsync(request, data, cancellationToken).ConfigureAwait(false); + return await GetResposneAsync(response).ConfigureAwait(false); + } + catch (FlurlHttpException ex) + { + throw new WechatTenpayException(ex.Message, ex); + } + } + + private async Task GetResposneAsync(IFlurlResponse response) + where T : WechatTenpayResponse, new() + { + string contentType = response.Headers.GetAll("Content-Type").FirstOrDefault() ?? string.Empty; + bool contentTypeIsNotJson = + (response.StatusCode == (int)HttpStatusCode.NoContent) || + (response.StatusCode == (int)HttpStatusCode.OK && !contentType.StartsWith("application/json") && !contentType.StartsWith("text/json")); + + T result = contentTypeIsNotJson ? new T() : await response.GetJsonAsync().ConfigureAwait(false); + result.RawStatus = response.StatusCode; + result.RawHeaders = new ReadOnlyDictionary( + response.Headers + .GroupBy(e => e.Name) + .ToDictionary( + k => k.Key, + v => string.Join(", ", v.Select(e => e.Value)) + ) + ); + result.RawBytes = await response.ResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + result.WechatpayRequestId = response.Headers.GetAll("Request-ID").FirstOrDefault() ?? string.Empty; + result.WechatpayNonce = response.Headers.GetAll("Wechatpay-Nonce").FirstOrDefault() ?? string.Empty; + result.WechatpayTimestamp = response.Headers.GetAll("Wechatpay-Timestamp").FirstOrDefault() ?? string.Empty; + result.WechatpaySignature = response.Headers.GetAll("Wechatpay-Signature").FirstOrDefault() ?? string.Empty; + result.WechatpayCertSerialNumber = response.Headers.GetAll("Wechatpay-Serial").FirstOrDefault() ?? string.Empty; + return result; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClientOptions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClientOptions.cs new file mode 100644 index 00000000..9ef82513 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClientOptions.cs @@ -0,0 +1,61 @@ +using System; +using System.Reflection; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 一个用于构造 时使用的配置项。 + /// + public class WechatTenpayClientOptions + { + /// + /// 获取或设置请求超时时间(单位:毫秒)。 + /// 默认值:30000 + /// + public int Timeout { get; set; } = 30 * 1000; + + /// + /// 获取或设置微信支付 API 域名。 + /// 默认值: + /// + public string? Endpoints { get; set; } = WechatTenpayEndpoints.DEFAULT; + + /// + /// 获取或设置声明应答中的错误描述使用的自然语言语种。 + /// 默认值:根据操作系统自动生成 + /// + public string UserAgent { get; set; } = $"OS/{Environment.OSVersion.Platform} SKIT.FlurlHttpClient.Wechat.Tenpay/{Assembly.GetExecutingAssembly().GetName().Version}"; + + /// + /// 获取或设置声明应答中的错误描述使用的自然语言语种。 + /// 默认值:zh_CN + /// + public string AcceptLanguage { get; set; } = "zh-CN"; + + /// + /// 获取或设置微信支付 API 签名认证方式。 + /// 默认值: + /// + public string AuthScheme { get; set; } = WechatTenpayAuthSchemes.WECHATPAY2_SHA256_RSA2048; + + /// + /// 获取或设置微信商户号。 + /// + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信商户 API v3 密钥(注意与 API 密钥相区分)。 + /// + public string MerchantV3Secret { get; set; } = default!; + + /// + /// 获取或设置微信商户 API 证书序列号。 + /// + public string MerchantCertSerialNumber { get; set; } = default!; + + /// + /// 获取或设置微信商户 API 证书私钥。 + /// + public string MerchantCertPrivateKey { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayEndpoints.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayEndpoints.cs new file mode 100644 index 00000000..af780220 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayEndpoints.cs @@ -0,0 +1,25 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 微信支付 API 接口域名。 + /// + public static class WechatTenpayEndpoints + { + /// + /// 主域名(默认)。 + /// + public const string DEFAULT = "https://api.mch.weixin.qq.com/v3"; + + /// + /// 容灾备用域名。 + /// + public const string BACKUP = "https://api2.mch.weixin.qq.com/v3"; + + /// + /// 沙箱域名。 + /// + public const string SANDBOX = "https://api.mch.weixin.qq.com/sandboxnew/v3"; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs new file mode 100644 index 00000000..455233cf --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs @@ -0,0 +1,27 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 当调用微信支付 API 出错时引发的异常。 + /// + public class WechatTenpayException : WechatExceptionBase + { + /// + public WechatTenpayException() + { + } + + /// + public WechatTenpayException(string message) + : base(message) + { + } + + /// + public WechatTenpayException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayRequest.cs new file mode 100644 index 00000000..fe401853 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayRequest.cs @@ -0,0 +1,25 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 表示微信支付 API 请求的基类。 + /// + public abstract class WechatTenpayRequest : IWechatRequest + { + /// + /// 获取或设置请求超时时间(单位:毫秒)。 + /// 如果不指定将使用构造 时的 参数,这在需要指定特定耗时请求(比如上传或下载文件)的超时时间时很有用。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual int? Timeout { get; set; } + + /// + /// 获取或设置微信请求使用的微信支付平台证书序列号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual string? WechatpayCertSerialNumber { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs new file mode 100644 index 00000000..ade78f67 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayResponse.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 +{ + /// + /// 表示微信支付 API 响应的基类。 + /// + public abstract class WechatTenpayResponse : IWechatResponse + { + /// + /// 获取原始的 HTTP 响应状态码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int RawStatus { get; internal set; } + + /// + /// 获取原始的 HTTP 响应表头集合。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public IDictionary RawHeaders { get; internal set; } = default!; + + /// + /// 获取原始的 HTTP 响应正文。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] RawBytes { get; internal set; } = default!; + + /// + /// 获取微信请求唯一标识。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WechatpayRequestId { get; internal set; } = default!; + + /// + /// 获取微信应答时间戳。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WechatpayTimestamp { get; internal set; } = default!; + + /// + /// 获取微信应答随机串。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WechatpayNonce { get; internal set; } = default!; + + /// + /// 获取微信应答签名。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WechatpaySignature { get; internal set; } = default!; + + /// + /// 获取微信应答签名使用的微信支付平台证书序列号。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string WechatpayCertSerialNumber { get; internal set; } = default!; + + /// + /// 获取微信支付 API 返回的错误码。 + /// + [Newtonsoft.Json.JsonProperty("code")] + [System.Text.Json.Serialization.JsonPropertyName("code")] + public virtual string? ErrorCode { get; set; } + + /// + /// 获取微信支付 API 返回的错误描述。 + /// + [Newtonsoft.Json.JsonProperty("message")] + [System.Text.Json.Serialization.JsonPropertyName("message")] + public virtual string? ErrorMessage { get; set; } + + /// + /// 获取微信支付 API 返回的错误详细信息。 + /// + [Newtonsoft.Json.JsonProperty("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public virtual Dictionary? ErrorDetail { get; set; } + + /// + /// 获取一个值,该值指示调用微信 API 是否成功(即 HTTP 状态码为 200 或 204、且 code 值为空)。 + /// + /// + public virtual bool IsSuccessful() + { + return (RawStatus == 200 || RawStatus == 204) && string.IsNullOrEmpty(ErrorCode); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339DateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339DateTimeOffsetConverter.cs new file mode 100644 index 00000000..ec47a5c4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339DateTimeOffsetConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class RFC3339DateTimeOffsetConverter : JsonConverter + { + private readonly JsonConverter _converter = new RFC3339NullableDateTimeOffsetConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) ?? default; + } + + public override void WriteJson(JsonWriter writer, DateTimeOffset value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value, serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339NullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339NullableDateTimeOffsetConverter.cs new file mode 100644 index 00000000..cc2e278d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/Newtonsoft.Json/RFC3339NullableDateTimeOffsetConverter.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + public class RFC3339NullableDateTimeOffsetConverter : JsonConverter + { + internal const string DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:sszzz"; + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override DateTimeOffset? ReadJson(JsonReader reader, Type objectType, DateTimeOffset? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return existingValue; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + if (DateTimeOffset.TryParseExact(value, DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTimeOffset result)) + return result; + + if (DateTimeOffset.TryParse(value, out result)) + return result; + } + else if (reader.TokenType == JsonToken.Date) + { + reader.DateFormatString = DATETIME_FORMAT; + return serializer.Deserialize(reader); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, DateTimeOffset? value, JsonSerializer serializer) + { + if (value.HasValue) + writer.WriteValue(value.Value.ToString(DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339DateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339DateTimeOffsetConverter.cs new file mode 100644 index 00000000..1f941571 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339DateTimeOffsetConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class RFC3339DateTimeOffsetConverter : JsonConverter + { + private readonly JsonConverter _converter = new RFC3339NullableDateTimeOffsetConverter(); + + public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339NullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339NullableDateTimeOffsetConverter.cs new file mode 100644 index 00000000..41c56e69 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/RFC3339NullableDateTimeOffsetConverter.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class RFC3339NullableDateTimeOffsetConverter : JsonConverter + { + internal const string DATETIME_FORMAT = Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter.DATETIME_FORMAT; + + public override DateTimeOffset? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if (DateTimeOffset.TryParseExact(value, DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out DateTimeOffset result)) + return result; + + if (DateTimeOffset.TryParse(value, out result)) + return result; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteStringValue(value.Value.ToString(DATETIME_FORMAT, DateTimeFormatInfo.InvariantInfo)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedBooleanConverter.cs new file mode 100644 index 00000000..50bb5eb7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedBooleanConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class StringTypedBooleanConverter : JsonConverter + { + private readonly JsonConverter _converter = new StringTypedNullableBooleanConverter(); + + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedNullableBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedNullableBooleanConverter.cs new file mode 100644 index 00000000..8bfb78f8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Converters/System.Text.Json/StringTypedNullableBooleanConverter.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + public class StringTypedNullableBooleanConverter : JsonConverter + { + public override bool? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.True) + { + return true; + } + else if (reader.TokenType == JsonTokenType.False) + { + return false; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if ("true".Equals(value, StringComparison.InvariantCultureIgnoreCase)) + return true; + else if ("false".Equals(value, StringComparison.InvariantCultureIgnoreCase)) + return false; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, bool? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteStringValue(value.Value ? "true" : "false"); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Extensions/FlurlHttpRequestVerbExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat/Extensions/FlurlHttpRequestVerbExtensions.cs new file mode 100644 index 00000000..5df0c754 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Extensions/FlurlHttpRequestVerbExtensions.cs @@ -0,0 +1,43 @@ +using System; +using System.Net.Http; +using Flurl; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat +{ + public static class FlurlHttpRequestVerbExtensions + { + public static IFlurlRequest WithVerb(this string url, string method) + { + return WithVerb(url, new HttpMethod(method)); + } + + public static IFlurlRequest WithVerb(this string url, HttpMethod method) + { + return WithVerb(Url.Parse(url), method); + } + + public static IFlurlRequest WithVerb(this Url url, string method) + { + return WithVerb(url, new HttpMethod(method)); + } + + public static IFlurlRequest WithVerb(this Url url, HttpMethod method) + { + return WithVerb(new FlurlRequest(url), method); + } + + public static IFlurlRequest WithVerb(this IFlurlRequest request, string method) + { + return WithVerb(request, new HttpMethod(method)); + } + + public static IFlurlRequest WithVerb(this IFlurlRequest request, HttpMethod method) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + + request.Verb = method; + return request; + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs b/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs new file mode 100644 index 00000000..ac750c4d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs @@ -0,0 +1,33 @@ +using System; +using System.Net.Http; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat +{ + /// + /// SKIT.FlurlHttpClient.Wechat 客户端接口。 + /// + public interface IWechatClient : IDisposable + { + /// + /// 配置客户端。 + /// + /// + public void Configure(Action configure); + + /// + /// 使用当前客户端生成一个新的 对象。 + /// + /// + /// + IFlurlRequest CreateRequest(params object[] urlSegments); + + /// + /// 使用当前客户端生成一个新的 对象。 + /// + /// + /// + /// + IFlurlRequest CreateRequest(HttpMethod method, params object[] urlSegments); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/IWechatRequest.cs b/src/SKIT.FlurlHttpClient.Wechat/IWechatRequest.cs new file mode 100644 index 00000000..e4737cce --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/IWechatRequest.cs @@ -0,0 +1,17 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat +{ + /// + /// SKIT.FlurlHttpClient.Wechat 请求接口。 + /// + public interface IWechatRequest + { + /// + /// 获取或设置请求超时时间(单位:毫秒)。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int? Timeout { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/IWechatResponse.cs b/src/SKIT.FlurlHttpClient.Wechat/IWechatResponse.cs new file mode 100644 index 00000000..a41a5735 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/IWechatResponse.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat +{ + /// + /// SKIT.FlurlHttpClient.Wechat 响应接口。 + /// + public interface IWechatResponse + { + /// + /// 获取原始的 HTTP 响应状态码。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public int RawStatus { get; } + + /// + /// 获取原始的 HTTP 响应表头集合。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public IDictionary RawHeaders { get; } + + /// + /// 获取原始的 HTTP 响应正文。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] RawBytes { get; } + + /// + /// 获取一个值,该值指示调用 API 是否成功。 + /// + /// + bool IsSuccessful(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/SKIT.FlurlHttpClient.Wechat.csproj b/src/SKIT.FlurlHttpClient.Wechat/SKIT.FlurlHttpClient.Wechat.csproj new file mode 100644 index 00000000..ee757b97 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/SKIT.FlurlHttpClient.Wechat.csproj @@ -0,0 +1,28 @@ + + + + net461; netstandard2.0 + 8.0 + enable + true + + + + SKIT.FlurlHttpClient.Wechat + MIT + https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat + Flurl.Http Wechat Weixin MicroMessage 微信 + 1.0.0-rc + The core of a Flurl.Http client for Wechat. SKIT.FlurlClient.Wechat 核心库。 + Fu Diwei + git + https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git + + + + + + + + + diff --git a/src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlNewtonsoftJsonSerializer.cs b/src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlNewtonsoftJsonSerializer.cs new file mode 100644 index 00000000..382663f5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlNewtonsoftJsonSerializer.cs @@ -0,0 +1,75 @@ +using System; +using System.IO; +using Flurl.Http.Configuration; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace SKIT.FlurlHttpClient.Wechat +{ + public class FlurlNewtonsoftJsonSerializer : ISerializer + { + private readonly JsonSerializerSettings _settings; + + public FlurlNewtonsoftJsonSerializer() + : this(GetDefaultSerializerSettings()) + { + } + + public FlurlNewtonsoftJsonSerializer(JsonSerializerSettings settings) + { + if (settings == null) throw new ArgumentNullException(nameof(settings)); + + _settings = settings; + } + + public static JsonSerializerSettings GetDefaultSerializerSettings() + { + var jsonSettings = new JsonSerializerSettings(); + jsonSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + jsonSettings.PreserveReferencesHandling = PreserveReferencesHandling.None; + jsonSettings.NullValueHandling = NullValueHandling.Ignore; + jsonSettings.Formatting = Formatting.None; + jsonSettings.ContractResolver = new DefaultContractResolver(); + return jsonSettings; + } + + public T Deserialize(string json) + { + return JsonConvert.DeserializeObject(json, _settings); + } + + T ISerializer.Deserialize(Stream stream) + { + if (stream.CanSeek) + { + stream.Seek(0, SeekOrigin.Begin); + } + + using (var reader = new StreamReader(stream)) + { + string json = reader.ReadToEnd(); + return Deserialize(json); + } + } + + public object Deserialize(string json, Type type) + { + return JsonConvert.DeserializeObject(json, type, _settings)!; + } + + public string Serialize(T obj) + { + return JsonConvert.SerializeObject(obj, _settings); + } + + public string Serialize(object obj) + { + return JsonConvert.SerializeObject(obj, _settings); + } + + public string Serialize(object obj, Type type) + { + return JsonConvert.SerializeObject(obj, type, _settings); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlSystemTextJsonSerializer.cs b/src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlSystemTextJsonSerializer.cs new file mode 100644 index 00000000..abaf0de8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/Serialization/FlurlSystemTextJsonSerializer.cs @@ -0,0 +1,77 @@ +using System; +using System.IO; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Json.Serialization; +using Flurl.Http.Configuration; + +namespace SKIT.FlurlHttpClient.Wechat +{ + public class FlurlSystemTextJsonSerializer : ISerializer + { + private readonly JsonSerializerOptions _options; + + public FlurlSystemTextJsonSerializer() + : this(GetDefaultSerializerOptions()) + { + } + + public FlurlSystemTextJsonSerializer(JsonSerializerOptions options) + { + if (options == null) throw new ArgumentNullException(nameof(options)); + + _options = options; + } + + public static JsonSerializerOptions GetDefaultSerializerOptions() + { + var jsonOptions = new JsonSerializerOptions(); + jsonOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; + jsonOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; + jsonOptions.IgnoreNullValues = true; + jsonOptions.WriteIndented = false; + jsonOptions.PropertyNamingPolicy = null; + jsonOptions.PropertyNameCaseInsensitive = true; + return jsonOptions; + } + + public T Deserialize(string json) + { + return JsonSerializer.Deserialize(json, _options)!; + } + + T ISerializer.Deserialize(Stream stream) + { + if (stream.CanSeek) + { + stream.Seek(0, SeekOrigin.Begin); + } + + using (var reader = new StreamReader(stream)) + { + string json = reader.ReadToEnd(); + return Deserialize(json); + } + } + + public object Deserialize(string json, Type type) + { + return JsonSerializer.Deserialize(json, type, _options)!; + } + + public string Serialize(T obj) + { + return JsonSerializer.Serialize(obj, _options); + } + + public string Serialize(object obj) + { + return JsonSerializer.Serialize(obj, _options); + } + + public string Serialize(object obj, Type type) + { + return JsonSerializer.Serialize(obj, type, _options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs new file mode 100644 index 00000000..5db829c1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using Flurl.Http.Configuration; + +namespace SKIT.FlurlHttpClient.Wechat +{ + /// + /// SKIT.FlurlHttpClient.Wechat 客户端基类。 + /// + public abstract class WechatClientBase : IWechatClient + { + /// + /// + /// + protected IFlurlClient ProxyFlurlClient { get; } + + /// + /// + /// + protected WechatClientBase() + { + ProxyFlurlClient = new FlurlClient(); + ProxyFlurlClient.Configure(settings => + { + settings.JsonSerializer = new FlurlSystemTextJsonSerializer(); + }); + } + + /// + public void Configure(Action configure) + { + if (configure == null) throw new ArgumentNullException(nameof(configure)); + + ProxyFlurlClient.Configure(flurlSettings => + { + var settings = new WechatClientSettings(); + settings.Timeout = flurlSettings.Defaults.Timeout; + settings.ConnectionLeaseTimeout = flurlSettings.ConnectionLeaseTimeout; + settings.JsonSerializer = flurlSettings.Defaults.JsonSerializer; + settings.UrlEncodedSerializer = flurlSettings.Defaults.UrlEncodedSerializer; + settings.HttpClientFactory = flurlSettings.HttpClientFactory; + configure.Invoke(settings); + + flurlSettings.Timeout = settings.Timeout; + flurlSettings.ConnectionLeaseTimeout = settings.ConnectionLeaseTimeout; + flurlSettings.JsonSerializer = settings.JsonSerializer; + flurlSettings.UrlEncodedSerializer = settings.UrlEncodedSerializer; + flurlSettings.HttpClientFactory = settings.HttpClientFactory; + }); + } + + /// + public IFlurlRequest CreateRequest(params object[] urlSegments) + { + return CreateRequest(HttpMethod.Get, urlSegments); + } + + /// + public IFlurlRequest CreateRequest(HttpMethod method, params object[] urlSegments) + { + return ProxyFlurlClient.Request(urlSegments).WithVerb(method); + } + + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + protected virtual async Task SendRequestAsync(IFlurlRequest request, HttpContent? content = null, CancellationToken cancellationToken = default) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + + var response = await request + .WithClient(ProxyFlurlClient) + .AllowAnyHttpStatus() + .SendAsync(request.Verb, content, cancellationToken) + .ConfigureAwait(false); + return response; + } + + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + protected virtual async Task SendRequestWithJsonAsync(IFlurlRequest request, object? data = null, CancellationToken cancellationToken = default) + { + if (request == null) throw new ArgumentNullException(nameof(request)); + + var response = await request + .WithClient(ProxyFlurlClient) + .AllowAnyHttpStatus() + .SendJsonAsync(request.Verb, data, cancellationToken) + .ConfigureAwait(false); + return response; + } + + /// + /// + /// + public virtual void Dispose() + { + ProxyFlurlClient?.Dispose(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatClientSettings.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatClientSettings.cs new file mode 100644 index 00000000..a0c78cea --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/WechatClientSettings.cs @@ -0,0 +1,43 @@ +using System; +using Flurl.Http.Configuration; + +namespace SKIT.FlurlHttpClient.Wechat +{ + /// + /// SKIT.FlurlHttpClient.Wechat 客户端配置项。 + /// + public sealed class WechatClientSettings + { + /// + /// + /// + public TimeSpan? Timeout { get; set; } + + /// + /// + /// + public TimeSpan? ConnectionLeaseTimeout { get; set; } + + /// + /// + /// + public ISerializer JsonSerializer { get; set; } = default!; + + /// + /// + /// + public ISerializer UrlEncodedSerializer { get; set; } = default!; + + /// + /// + /// + public IHttpClientFactory HttpClientFactory { get; set; } = default!; + + /// + /// + /// + internal WechatClientSettings() + { + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatExceptionBase.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatExceptionBase.cs new file mode 100644 index 00000000..6b7e3912 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat/WechatExceptionBase.cs @@ -0,0 +1,27 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat +{ + /// + /// SKIT.FlurlHttpClient.Wechat 引发的异常基类。 + /// + public abstract class WechatExceptionBase : Exception + { + /// + public WechatExceptionBase() + { + } + + /// + public WechatExceptionBase(string message) + : base(message) + { + } + + /// + public WechatExceptionBase(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/.gitignore b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/.gitignore new file mode 100644 index 00000000..63666fbf --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/.gitignore @@ -0,0 +1 @@ +appsettings.local.json \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpResponse.json new file mode 100644 index 00000000..12963516 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetApiDomainIpResponse.json @@ -0,0 +1,3 @@ +{ + "ip_list": [ "127.0.0.1", "127.0.0.2", "101.226.103.0/25" ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpResponse.json new file mode 100644 index 00000000..12963516 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinGetCallbackIpResponse.json @@ -0,0 +1,3 @@ +{ + "ip_list": [ "127.0.0.1", "127.0.0.2", "101.226.103.0/25" ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketResponse.json new file mode 100644 index 00000000..e78bed24 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTicketGetTicketResponse.json @@ -0,0 +1,6 @@ +{ + "errcode": 0, + "errmsg": "ok", + "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA", + "expires_in": 7200 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenResponse.json new file mode 100644 index 00000000..8421c2d9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Cgibin/CgibinTokenResponse.json @@ -0,0 +1,4 @@ +{ + "access_token": "ACCESS_TOKEN", + "expires_in": 7200 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateRequest.json new file mode 100644 index 00000000..2efb144d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateRequest.json @@ -0,0 +1,5 @@ +{ + "tag": { + "name": "广东" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateResponse.json new file mode 100644 index 00000000..a0c5d30e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsCreateResponse.json @@ -0,0 +1,6 @@ +{ + "tag": { + "id": 134, + "name": "广东" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteRequest.json new file mode 100644 index 00000000..9c005e6c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteRequest.json @@ -0,0 +1,5 @@ +{ + "tag": { + "id": 134 + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsDeleteResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetResponse.json new file mode 100644 index 00000000..f74f6837 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsGetResponse.json @@ -0,0 +1,19 @@ +{ + "tags": [ + { + "id": 1, + "name": "每天一罐可乐星人", + "count": 0 + }, + { + "id": 2, + "name": "星标组", + "count": 0 + }, + { + "id": 127, + "name": "广东", + "count": 5 + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateRequest.json new file mode 100644 index 00000000..b79c3f65 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateRequest.json @@ -0,0 +1,6 @@ +{ + "tag": { + "id": 134, + "name": "广东人" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinTagsUpdateResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetRequest.json new file mode 100644 index 00000000..06a049e4 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetRequest.json @@ -0,0 +1,4 @@ +{ + "tagid": 134, + "next_openid": "" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetResponse.json new file mode 100644 index 00000000..2b51c948 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/CgibinUserTagGetResponse.json @@ -0,0 +1,10 @@ +{ + "count": 2, + "data": { + "openid": [ + "ocYxcuAEy30bX0NXmGn4ypqx3tI0", + "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" + ] + }, + "next_openid": "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListRequest.json new file mode 100644 index 00000000..ccc72eff --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListRequest.json @@ -0,0 +1,3 @@ +{ + "openid": "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListResponse.json new file mode 100644 index 00000000..96a47f0d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsGetIdListResponse.json @@ -0,0 +1,3 @@ +{ + "tagid_list": [ 134, 2 ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.json new file mode 100644 index 00000000..47cd47db --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingRequest.json @@ -0,0 +1,7 @@ +{ + "openid_list": [ + "ocYxcuAEy30bX0NXmGn4ypqx3tI0", + "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" + ], + "tagid": 134 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchTaggingResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.json new file mode 100644 index 00000000..47cd47db --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingRequest.json @@ -0,0 +1,7 @@ +{ + "openid_list": [ + "ocYxcuAEy30bX0NXmGn4ypqx3tI0", + "ocYxcuBt0mRugKZ7tGAHPnUaOW7Y" + ], + "tagid": 134 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/Members/CgibinTagsMembersBatchUntaggingResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.json new file mode 100644 index 00000000..aa362b79 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListRequest.json @@ -0,0 +1,3 @@ +{ + "openid_list": [ "OPENID1", "OPENID2" ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchBlackListResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.json new file mode 100644 index 00000000..aa362b79 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListRequest.json @@ -0,0 +1,3 @@ +{ + "openid_list": [ "OPENID1", "OPENID2" ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersBatchUnblackListResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.json new file mode 100644 index 00000000..ad0993ec --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListRequest.json @@ -0,0 +1,3 @@ +{ + "begin_openid": "OPENID1" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.json new file mode 100644 index 00000000..93b306ea --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinTags/MembersBlackList/CgibinTagsMembersGetBlackListResponse.json @@ -0,0 +1,12 @@ +{ + "total": 23000, + "count": 10000, + "data": { + "openid": [ + "OPENID1", + "OPENID2", + "OPENID10000" + ] + }, + "next_openid": "OPENID10000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetRequest.json new file mode 100644 index 00000000..79b2e4e9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetRequest.json @@ -0,0 +1,12 @@ +{ + "user_list": [ + { + "openid": "otvxTs4dckWG7imySrJd6jSi0CWE", + "lang": "zh_CN" + }, + { + "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg", + "lang": "zh_CN" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetResponse.json new file mode 100644 index 00000000..04b339c7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoBatchGetResponse.json @@ -0,0 +1,31 @@ +{ + "user_info_list": [ + { + "subscribe": 1, + "openid": "otvxTs4dckWG7imySrJd6jSi0CWE", + "nickname": "iWithery", + "sex": 1, + "language": "zh_CN", + "city": "揭阳", + "province": "广东", + "country": "中国", + + "headimgurl": "http://thirdwx.qlogo.cn/mmopen/xbIQx1GRqdvyqkMMhEaGOX802l1CyqMJNgUzKP8MeAeHFicRDSnZH7FY4XB7p8XHXIf6uJA2SCunTPicGKezDC4saKISzRj3nz/0", + + "subscribe_time": 1434093047, + "unionid": "oR5GjjgEhCMJFyzaVZdrxZ2zRRF4", + "remark": "", + + "groupid": 0, + "tagid_list": [ 128, 2 ], + "subscribe_scene": "ADD_SCENE_QR_CODE", + "qr_scene": 98765, + "qr_scene_str": "" + + }, + { + "subscribe": 0, + "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoResponse.json new file mode 100644 index 00000000..66c4ba88 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoResponse.json @@ -0,0 +1,19 @@ +{ + "subscribe": 1, + "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", + "nickname": "Band", + "sex": 1, + "language": "zh_CN", + "city": "广州", + "province": "广东", + "country": "中国", + "headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", + "subscribe_time": 1382694957, + "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL", + "remark": "", + "groupid": 0, + "tagid_list": [ 128, 2 ], + "subscribe_scene": "ADD_SCENE_QR_CODE", + "qr_scene": 98765, + "qr_scene_str": "" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkRequest.json new file mode 100644 index 00000000..f39ab3b7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkRequest.json @@ -0,0 +1,4 @@ +{ + "openid": "oDF3iY9ffA-hqb2vVvbr7qxf6A0Q", + "remark": "pangzi" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserInfoUpdateRemarkResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserResponse.json new file mode 100644 index 00000000..5e799223 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CgibinUser/CgibinUserResponse.json @@ -0,0 +1,8 @@ +{ + "total": 2, + "count": 2, + "data": { + "openid": [ "OPENID1", "OPENID2" ] + }, + "next_openid": "NEXT_OPENID" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthResponse.json new file mode 100644 index 00000000..f752befe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsAuthResponse.json @@ -0,0 +1,4 @@ +{ + "errcode": 0, + "errmsg": "ok" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionResponse.json new file mode 100644 index 00000000..d2b771bd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsJsCode2SessionResponse.json @@ -0,0 +1,5 @@ +{ + "openid": "OPENID", + "unionid": "UNIONID", + "session_key": "SESSION_KEY" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenResponse.json new file mode 100644 index 00000000..6a0c7a00 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2AccessTokenResponse.json @@ -0,0 +1,7 @@ +{ + "access_token": "ACCESS_TOKEN", + "expires_in": 7200, + "refresh_token": "REFRESH_TOKEN", + "openid": "OPENID", + "scope": "SCOPE" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenResponse.json new file mode 100644 index 00000000..6a0c7a00 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsOAuth2RefreshTokenResponse.json @@ -0,0 +1,7 @@ +{ + "access_token": "ACCESS_TOKEN", + "expires_in": 7200, + "refresh_token": "REFRESH_TOKEN", + "openid": "OPENID", + "scope": "SCOPE" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoResponse.json new file mode 100644 index 00000000..bd59458c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Sns/SnsUserInfoResponse.json @@ -0,0 +1,11 @@ +{ + "openid": "OPENID", + "nickname": "NICKNAME", + "sex": 1, + "province": "PROVINCE", + "city": "CITY", + "country": "COUNTRY", + "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", + "privilege": [ "PRIVILEGE1", "PRIVILEGE2" ], + "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj new file mode 100644 index 00000000..28b84863 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj @@ -0,0 +1,32 @@ + + + + netcoreapp3.1 + 8.0 + + + + + + + PreserveNewest + + + PreserveNewest + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestClients.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestClients.cs new file mode 100644 index 00000000..1861fcbd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestClients.cs @@ -0,0 +1,14 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + class TestClients + { + static TestClients() + { + Instance = new WechatApiClient(TestConfigs.WechatAppId, TestConfigs.WechatAppSecret); + } + + public static readonly WechatApiClient Instance; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs new file mode 100644 index 00000000..ca05585a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs @@ -0,0 +1,28 @@ +using System; +using System.IO; +using System.Text.Json; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + class TestConfigs + { + static TestConfigs() + { + // NOTICE: 请在项目根目录下建立 appsettings.local.json,按照 appsettings.json 的格式填入测试参数。 + // WARN: 敏感信息请不要提交到 git! + + using var stream = File.OpenRead("appsettings.local.json"); + using var json = JsonDocument.Parse(stream); + var config = json.RootElement.GetProperty("WechatConfig"); + WechatAppId = config.GetProperty("AppId").GetString(); + WechatAppSecret = config.GetProperty("AppSecret").GetString(); + WechatAccessToken = config.GetProperty("AccessToken").GetString(); + WechatOpenId = config.GetProperty("OpenId").GetString(); + } + + public static readonly string WechatAppId; + public static readonly string WechatAppSecret; + public static readonly string WechatAccessToken; + public static readonly string WechatOpenId; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDefinitionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDefinitionTests.cs new file mode 100644 index 00000000..86658e2c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDefinitionTests.cs @@ -0,0 +1,292 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class WechatApiDefinitionTests + { + private static readonly Assembly _assembly = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Api"); + + [Fact(DisplayName = "验证模型定义")] + public void ModelDefinitionsTest() + { + static void SetPropertiesValueRecursively(object obj) + { + var lstProperty = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); + foreach (var tProperty in lstProperty) + { + if (tProperty.SetMethod == null || !tProperty.SetMethod.IsPublic) + continue; + + if (tProperty.PropertyType.IsPrimitive) + { + // noop + } + else if (tProperty.PropertyType.IsArray) + { + Type tEl = tProperty.PropertyType.Assembly.GetType(tProperty.PropertyType.FullName.Replace("[]", string.Empty)); + object propEl = (tEl == typeof(string)) ? string.Empty : Activator.CreateInstance(tEl); + propEl = Convert.ChangeType(propEl, tEl); + SetPropertiesValueRecursively(propEl); + + Array prop = Array.CreateInstance(tEl, 1); + prop.SetValue(propEl, 0); + + tProperty.SetValue(obj, prop); + } + else if (tProperty.PropertyType == typeof(string)) + { + tProperty.SetValue(obj, string.Empty); + } + else if (tProperty.PropertyType.Namespace == "System" && + tProperty.PropertyType.Name.StartsWith("Nullable")) + { + // noop + } + else if (tProperty.PropertyType.Namespace == "System.Collections.Generic" && + (tProperty.PropertyType.Name.StartsWith("IDictionary") || tProperty.PropertyType.Name.StartsWith("Dictionary"))) + { + // noop + } + else if (tProperty.PropertyType.Namespace == "System.Collections.Generic" && + (tProperty.PropertyType.Name.StartsWith("IList") || tProperty.PropertyType.Name.StartsWith("List"))) + { + Type tGeneric = tProperty.PropertyType.GetGenericArguments().Single(); + object propEl = (tGeneric == typeof(string)) ? string.Empty : Activator.CreateInstance(tGeneric); + propEl = Convert.ChangeType(propEl, tGeneric); + SetPropertiesValueRecursively(propEl); + + Type tList = typeof(List<>).MakeGenericType(new Type[] { tGeneric }); + object prop = Activator.CreateInstance(tList); + + tList.GetMethod("Add").Invoke(prop, new[] { propEl }); + + tProperty.SetValue(obj, prop); + } + else + { + object prop = Activator.CreateInstance(tProperty.PropertyType); + SetPropertiesValueRecursively(prop); + + tProperty.SetValue(obj, prop); + } + } + }; + + var lstModel = _assembly.GetTypes() + .Where(e => + e.Namespace != null && + e.Namespace.Equals(_assembly.GetName().Name + "Models") && + e.IsClass && + !e.IsAbstract && + !e.IsInterface && + !e.IsNested + ) + .ToList(); + + var exceptions = new List(); + + foreach (Type tModel in lstModel) + { + // 模型命名结尾必为 Request 或 Response + if (!tModel.Name.EndsWith("Request") && !tModel.Name.EndsWith("Response")) + { + exceptions.Add(tModel); + continue; + } + + // Request 必继承自 WechatApiRequest、且有同名 Response + if (tModel.Name.EndsWith("Request")) + { + if (!typeof(WechatApiRequest).IsAssignableFrom(tModel)) + { + exceptions.Add(tModel); + continue; + } + + if (!lstModel.Any(e => e.Name == $"{tModel.Name.Substring(0, tModel.Name.Length - "Request".Length)}Response")) + { + exceptions.Add(tModel); + continue; + } + } + + // Request 必继承自 WechatApiResponse、且有同名 Request + if (tModel.Name.EndsWith("Response")) + { + if (!typeof(WechatApiResponse).IsAssignableFrom(tModel)) + { + exceptions.Add(tModel); + continue; + } + + if (!lstModel.Any(e => e.Name == $"{tModel.Name.Substring(0, tModel.Name.Length - "Response".Length)}Request")) + { + exceptions.Add(tModel); + continue; + } + } + + // 递归构造模型,并尝试 JSON 序列化以检测是否有序列化问题 + try + { + object instance = _assembly.CreateInstance(tModel.Namespace + "." + tModel.Name); + SetPropertiesValueRecursively(instance); + + new FlurlNewtonsoftJsonSerializer().Serialize(instance); + new FlurlSystemTextJsonSerializer().Serialize(instance); + } + catch (Exception ex) + { + throw new Exception($"Serialize `{tModel.Name}` failed.", ex); + } + } + + Assert.Empty(exceptions); + } + + [Fact(DisplayName = "验证接口定义")] + public void InterfaceDefinitionsTest() + { + var lstInterface = _assembly.GetTypes() + .Where(e => + e.Namespace != null && + e.Namespace.Equals(_assembly.GetName().Name) && + e.Name.StartsWith("WechatApiClientExecute") && + e.Name.EndsWith("Extensions") + ) + .ToList(); + + var exceptions = new List(); + + foreach (Type tInterface in lstInterface) + { + var lstMethod = tInterface.GetMethods() + .Where(e => + e.IsPublic && + e.IsStatic && + e.GetParameters().FirstOrDefault().ParameterType == typeof(WechatApiClient) + ) + .ToList(); + foreach (MethodInfo tMethod in lstMethod) + { + var lstParam = tMethod.GetParameters(); + + // 参数签名必为 this client + request + cancelToken + if (lstParam.Length != 3) + { + exceptions.Add(tMethod); + continue; + } + + // 第二个参数必为 WechatApiRequest 子类 + if (!typeof(WechatApiRequest).IsAssignableFrom(lstParam[1].ParameterType)) + { + exceptions.Add(tMethod); + continue; + } + + // 方法名与第二个参数、返回值均有相同命名 + string func = tMethod.Name; + string para = lstParam[1].ParameterType.Name; + string retv = tMethod.ReturnType.GenericTypeArguments.FirstOrDefault()?.Name; + if (para == null || !para.EndsWith("Request")) + { + exceptions.Add(tMethod); + continue; + } + else if (retv == null || !retv.EndsWith("Response")) + { + exceptions.Add(tMethod); + continue; + } + else if (!string.Equals(func, $"Execute{para.Substring(0, para.Length - "Request".Length)}Async")) + { + exceptions.Add(tMethod); + continue; + } + else if (!string.Equals(func, $"Execute{retv.Substring(0, retv.Length - "Response".Length)}Async")) + { + exceptions.Add(tMethod); + continue; + } + } + } + + Assert.Empty(exceptions); + } + + [Fact(DisplayName = "验证字段定义")] + public void FieldDefinitionsTest() + { + static string[] GetFiles(string path) + { + var results = new List(); + + string[] dirs = Directory.GetDirectories(path); + string[] files = Directory.GetFiles(path); + + results.AddRange(files); + + foreach (string dir in dirs) + { + results.AddRange(GetFiles(dir)); + } + + return results.ToArray(); + } + + string workdir = Path.Combine(Environment.CurrentDirectory, "ModelSamples"); + Assert.True(Directory.Exists(workdir)); + + var lstFile = GetFiles(workdir) + .Where(e => string.Equals(Path.GetExtension(e), ".json", StringComparison.InvariantCultureIgnoreCase)) + .ToList(); + Assert.NotEmpty(lstFile); + + var exceptions = new List(); + + foreach (string file in lstFile) + { + string json = File.ReadAllText(file); + string name = Path.GetFileNameWithoutExtension(file); + + Type type = _assembly.GetType($"{_assembly.GetName().Name}.Models.{name}"); + if (type == null) + { + exceptions.Add(name); + continue; + } + + try + { + var settings = FlurlNewtonsoftJsonSerializer.GetDefaultSerializerSettings(); + settings.CheckAdditionalContent = true; + settings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Error; + new FlurlNewtonsoftJsonSerializer(settings).Deserialize(json, type); + + new FlurlSystemTextJsonSerializer().Deserialize(json, type); + } + catch (Exception ex) + { + exceptions.Add(name); + + if (ex is Newtonsoft.Json.JsonException) + throw new Exception($"Deserialize `{name}` by Newtonsoft.Json failed.", ex); + else if (ex is System.Text.Json.JsonException) + throw new Exception($"Deserialize `{name}` by System.Text.Json failed.", ex); + else + throw new Exception($"Deserialize `{name}` failed.", ex); + } + } + + Assert.Empty(exceptions); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAccessTokenTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAccessTokenTests.cs new file mode 100644 index 00000000..de797648 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAccessTokenTests.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class WechatApiExecuteCgibinWithAccessTokenTests + { + [Fact(DisplayName = "[GET] /cgi-bin/ticket/getticket")] + public async Task CgibinTicketGetTicketTest() + { + var request = new Models.CgibinTicketGetTicketRequest() + { + AccessToken = TestConfigs.WechatAccessToken + }; + var response = await TestClients.Instance.ExecuteCgibinTicketGetTicketAsync(request); + + Assert.NotNull(response.Ticket); + } + + [Fact(DisplayName = "[GET] /cgi-bin/getcallbackip")] + public async Task CgibinGetCallbackIpTest() + { + var request = new Models.CgibinGetCallbackIpRequest() + { + AccessToken = TestConfigs.WechatAccessToken + }; + var response = await TestClients.Instance.ExecuteCgibinGetCallbackIpAsync(request); + + Assert.NotEmpty(response.IPList); + } + + [Fact(DisplayName = "[GET] /cgi-bin/get_api_domain_ip")] + public async Task CgibinGetApiDomainIpTest() + { + var request = new Models.CgibinGetApiDomainIpRequest() + { + AccessToken = TestConfigs.WechatAccessToken + }; + var response = await TestClients.Instance.ExecuteCgibinGetApiDomainIpAsync(request); + + Assert.NotEmpty(response.IPList); + } + + [Fact(DisplayName = "[GET] /cgi-bin/user/info")] + public async Task CgibinUserInfoTest() + { + var request = new Models.CgibinUserInfoRequest() + { + AccessToken = TestConfigs.WechatAccessToken, + OpenId = TestConfigs.WechatOpenId + }; + var response = await TestClients.Instance.ExecuteCgibinUserInfoAsync(request); + + Assert.NotEmpty(response.OpenId); + Assert.NotEmpty(response.Nickname); + Assert.True(response.Subscribe == 1); + } + + [Fact(DisplayName = "[POST] /cgi-bin/user/info/batchget")] + public async Task CgibinUserInfoBatchGetTest() + { + var request = new Models.CgibinUserInfoBatchGetRequest() + { + AccessToken = TestConfigs.WechatAccessToken, + UserList = new Models.CgibinUserInfoBatchGetRequest.Types.User[] + { + new Models.CgibinUserInfoBatchGetRequest.Types.User() { OpenId = TestConfigs.WechatOpenId } + } + }; + var response = await TestClients.Instance.ExecuteCgibinUserInfoBatchGetAsync(request); + + Assert.NotEmpty(response.UserList); + Assert.NotEmpty(response.UserList.First().OpenId); + Assert.NotEmpty(response.UserList.First().Nickname); + Assert.True(response.UserList.First().Subscribe == 1); + } + + [Fact(DisplayName = "[POST] /cgi-bin/user/info/updateremark")] + public async Task CgibinUserInfoUpdateRemarkTest() + { + var request = new Models.CgibinUserInfoUpdateRemarkRequest() + { + AccessToken = TestConfigs.WechatAccessToken, + OpenId = TestConfigs.WechatOpenId, + Remark = "FAKE_REMARK" + }; + var response = await TestClients.Instance.ExecuteCgibinUserInfoUpdateRemarkAsync(request); + + Assert.Equal(0, response.ErrorCode); + } + + [Fact(DisplayName = "[GET] /cgi-bin/user")] + public async Task CgibinUserTest() + { + var request = new Models.CgibinUserRequest() + { + AccessToken = TestConfigs.WechatAccessToken + }; + var response = await TestClients.Instance.ExecuteCgibinUserAsync(request); + + Assert.NotEmpty(response.Data.OpenIdList); + Assert.True(response.Total > 0); + Assert.True(response.Count > 0); + } + + [Fact(DisplayName = "[POST] /cgi-bin/tags/create")] + public async Task CgibinTagsCreateTest() + { + var request = new Models.CgibinTagsCreateRequest() + { + AccessToken = TestConfigs.WechatAccessToken, + Tag = new Models.CgibinTagsCreateRequest.Types.Tag() + { + Name = "FAKE_TAGNAME" + } + }; + var response = await TestClients.Instance.ExecuteCgibinTagsCreateAsync(request); + + Assert.True(response.Tag.Id > 0); + Assert.Equal(request.Tag.Name, response.Tag.Name); + } + + [Fact(DisplayName = "[POST] /cgi-bin/tags/get")] + public async Task CgibinTagsGetTest() + { + var request = new Models.CgibinTagsGetRequest() + { + AccessToken = TestConfigs.WechatAccessToken + }; + var response = await TestClients.Instance.ExecuteCgibinTagsGetAsync(request); + + Assert.NotEmpty(response.Tags); + Assert.True(response.Tags.First().Id > 0); + Assert.NotNull(response.Tags.First().Name); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAppSecretTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAppSecretTests.cs new file mode 100644 index 00000000..60ef8d82 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinWithAppSecretTests.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class WechatApiExecuteCgibinWithAppSecretTests + { + [Fact(DisplayName = "[GET] /sns/cgi-bin/token")] + public async Task CgibinTokenTest() + { + var request = new Models.CgibinTokenRequest(); + var response = await TestClients.Instance.ExecuteCgibinTokenAsync(request); + + Assert.NotNull(response.AccessToken); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs new file mode 100644 index 00000000..f6903ea6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class WechatApiExecuteSnsWithAccessTokenTests + { + [Fact(DisplayName = "[GET] /sns/userinfo")] + public async Task SnsUserInfoTest() + { + var request = new Models.SnsUserInfoRequest() + { + AccessToken = "FAKE_SNSACCESSTOKEN", + OpenId = TestConfigs.WechatOpenId + }; + var response = await TestClients.Instance.ExecuteSnsUserInfoAsync(request); + + Assert.NotNull(response.OpenId); + Assert.NotNull(response.Nickname); + } + + [Fact(DisplayName = "[GET] /sns/auth")] + public async Task SnsAuthTest() + { + var request = new Models.SnsAuthRequest() + { + AccessToken = "FAKE_SNSACCESSTOKEN", + OpenId = TestConfigs.WechatOpenId + }; + var response = await TestClients.Instance.ExecuteSnsAuthAsync(request); + + Assert.Equal(0, response.ErrorCode); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs new file mode 100644 index 00000000..888ab58b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class WechatApiExecuteSnsWithAppSecretTests + { + [Fact(DisplayName = "[GET] /sns/oauth2/access_token")] + public async Task SnsOAuth2AccessTokenTest() + { + var request = new Models.SnsOAuth2AccessTokenRequest() + { + Code = "FAKE_CODE" + }; + var response = await TestClients.Instance.ExecuteSnsOAuth2AccessTokenAsync(request); + + Assert.NotNull(response.AccessToken); + Assert.NotNull(response.RefreshToken); + Assert.NotNull(response.OpenId); + } + + [Fact(DisplayName = "[GET] /sns/oauth2/refresh_token")] + public async Task SnsOAuth2RefreshTokenTest() + { + var request = new Models.SnsOAuth2RefreshTokenRequest() + { + RefreshToken = "FAKE_REFRESHTOKEN" + }; + var response = await TestClients.Instance.ExecuteSnsOAuth2RefreshTokenAsync(request); + + Assert.NotNull(response.AccessToken); + Assert.NotNull(response.RefreshToken); + } + + [Fact(DisplayName = "[GET] /sns/jscode2session")] + public async Task SnsJsCode2SessionTest() + { + var request = new Models.SnsJsCode2SessionRequest() + { + JsCode = "FAKE_CODE" + }; + var response = await TestClients.Instance.ExecuteSnsJsCode2SessionAsync(request); + + Assert.NotNull(response.OpenId); + Assert.NotNull(response.SessionKey); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/appsettings.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/appsettings.json new file mode 100644 index 00000000..2a6e2b26 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/appsettings.json @@ -0,0 +1,8 @@ +{ + "WechatConfig": { + "AppId": "请在此填写用于测试的微信 AppId", + "AppSecret": "请在此填写用于测试的微信 AppSecret", + "AccessToken": "请在此填写用于测试的微信 AccessToken", + "OpenId": "请在此填写用于测试的微信用户唯一标识" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/.gitignore b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/.gitignore new file mode 100644 index 00000000..63666fbf --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/.gitignore @@ -0,0 +1 @@ +appsettings.local.json \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.json new file mode 100644 index 00000000..17cfd5c3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentRequest.json @@ -0,0 +1,149 @@ +{ + "business_code": "1900013511_10000", + "contact_info": { + "contact_name": "pVd1HJ6zyvPedmty7/mYNxLMpyOb+tI0pQO/0kjiwfqdfg==", + "contact_id_number": "pVd1HJ6zyvPedzGaV+X5Kz4jBHLiCyObapQO/0kjiwfqdfg==", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "mobile_phone": "pVd1HJ6zyv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==", + "contact_email": "pVd1HJ6I0m+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==" + }, + "subject_info": { + "subject_type": "SUBJECT_TYPE_ENTERPRISE", + "business_license_info": { + "license_copy": "47ZC6GC-cuxi-v-4KGprrKhwFNIO4kqg05InE4d2I6_H7I4", + "license_number": "123456789012345678", + "merchant_name": "腾讯科技有限公司", + "legal_person": "张三" + }, + "certificate_info": { + "cert_copy": "0P3ng6KTICz7ScmhEIThCaV-4BBJehHhAZN6BKXQPcs-VvdSo", + "cert_type": "CERTIFICATE_TYPE_2388", + "cert_number": "111111111111", + "merchant_name": "xx公益团体", + "company_address": "广东省深圳市南山区xx路xx号", + "legal_person": "李四", + "period_begin": "2019-08-01", + "period_end": "2029-08-01" + }, + "organization_info": { + "organization_copy": "47ZC6GC-vnrbEny__Ie_An5-tCpqxwFNIO4kqg05InE4d2I6_H7I4", + "organization_code": "123456789-A", + "org_period_begin": "2019-08-01", + "org_period_end": "2029-08-01" + }, + "certificate_letter_copy": "47ZC6GC-vnrbEny__Ie_An5-DIUv0OF4wFNIO4kqg05InE4d2I6_H7I4", + "identity_info": { + "id_doc_type": "IDENTIFICATION_TYPE_IDCARD", + "id_card_info": { + "id_card_copy": "jTpGmxUX3FBWVQ5NJTZvlD8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ", + "id_card_national": "47ZC6GC-vnrbEny__Ie_An5-tCpqxuUv0OF4wFNIO4kqg05InE4d2I6_H7I4", + "id_card_name": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9t/wDa4SzfeespQO/0kjiwfqdfg==", + "id_card_number": "AOZdYGISxo4y44/UgZ69bdu9X+tq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==", + "card_period_begin": "2026-06-06", + "card_period_end": "2026-06-06" + }, + "id_doc_info": { + "id_doc_copy": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5Nxpn0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ", + "id_doc_name": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPR/wDa4SzfeespQO/0kjiwfqdfg==", + "id_doc_number": "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ94P4TG5xzchG/5IL9DBd+Z0zZXkw==", + "doc_period_begin": "2019-06-06", + "doc_period_end": "2026-06-06" + }, + "owner": "true" + }, + "ubo_info": { + "id_type": "IDENTIFICATION_TYPE_IDCARD", + "id_card_copy": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4c0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ", + "id_card_national": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cTvDujqhThn4ReFxikqJ5YW6zFQ", + "id_doc_copy": "jTpGmxUX3FBWVQ5NJTZvlKXhBTEO_JqRTvDujqhThn4ReFxikqJ5YW6zFQ", + "name": "AOZdYGISxo4y44/Ug4P4TG5xzchG/5IL9DBd+Z0zZXkw==", + "id_number": "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+Le4P4TG5xzchG/5IL9DBd+Z0zZXkw==", + "id_period_begin": "2019-06-06", + "id_period_end": "2026-06-06" + } + }, + "business_info": { + "merchant_shortname": "张三餐饮店", + "service_phone": "0758XXXXX", + "sales_info": { + "sales_scenes_type": [ + "SALES_SCENES_STORE" + ], + "biz_store_info": { + "biz_store_name": "大郎烧饼", + "biz_address_code": "440305", + "biz_store_address": "南山区xx大厦x层xxxx室", + "store_entrance_pic": [ + "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCzzhJehHhAZN6BKXQPcs-VvdSo" + ], + "indoor_pic": [ + "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4R9FwczhJehHhAZN6BKXQPcs-VvdSo" + ], + "biz_sub_appid": "wx1234567890123456" + }, + "mp_info": { + "mp_appid": "wx1234567890123456", + "mp_sub_appid": "wx1234567890123456", + "mp_pics": [ + "ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ] + }, + "mini_program_info": { + "mini_program_appid": "wx1234567890123456", + "mini_program_sub_appid": "wx1234567890123456", + "mini_program_pics": [ + "ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ] + }, + "app_info": { + "app_appid": "wx1234567890123456", + "app_sub_appid": "wx1234567890123456", + "app_pics": [ + "ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ] + }, + "web_info": { + "domain": "http://www.qq.com", + "web_authorisation": "47ZC6GC-vnrbEny__Ie_An5-tCpqxucBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4", + "web_appid": "wx1234567890123456" + }, + "wework_info": { + "corp_id": "wx1234567890123456", + "sub_corp_id": "wx1234567890123456", + "wework_pics": [ + "ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ] + } + } + }, + "settlement_info": { + "settlement_id": "719", + "qualification_type": "餐饮", + "qualifications": [ + "ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ], + "activities_id": "20191030111cff5b5e", + "activities_rate": "0.6", + "activities_additions": [ + "ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ] + }, + "bank_account_info": { + "bank_account_type": "BANK_ACCOUNT_TYPE_CORPORATE", + "account_name": "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+L79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==", + "account_bank": "工商银行", + "bank_address_code": "110000", + "bank_branch_id": "402713354941", + "bank_name": "施秉县农村信用合作联社城关信用社", + "account_number": "d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2hcR3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w==" + }, + "addition_info": { + "legal_person_commitment": "47ZC6GC-vnrbEny__Ie3JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4", + "legal_person_video": "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-v4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4", + "business_addition_pics": [ + "ZC6GC-vnrbEny__Ie_An5-tCp3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD", + "ZC6GC-vnrbEny__Ie_An5-tCp3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBD" + ], + "business_addition_msg": "特殊情况,说明原因" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.json new file mode 100644 index 00000000..dc6cb641 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/CreateApplyForSubMerchantApplymentResponse.json @@ -0,0 +1,3 @@ +{ + "applyment_id": 2000002124775691 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.json new file mode 100644 index 00000000..ebb18cd6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByApplymentIdResponse.json @@ -0,0 +1,15 @@ +{ + "business_code": "1900013511_10000", + "applyment_id": 2000002124775691, + "sub_mchid": "1234567890", + "sign_url": "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + "applyment_state": "APPLYMENT_STATE_FINISHED", + "applyment_state_msg": "审核中", + "audit_detail": [ + { + "field": "id_card_copy", + "field_name": "身份证复印件", + "reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.json new file mode 100644 index 00000000..ebb18cd6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/GetApplyForSubMerchantApplymentByBusinessCodeResponse.json @@ -0,0 +1,15 @@ +{ + "business_code": "1900013511_10000", + "applyment_id": 2000002124775691, + "sub_mchid": "1234567890", + "sign_url": "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + "applyment_state": "APPLYMENT_STATE_FINISHED", + "applyment_state_msg": "审核中", + "audit_detail": [ + { + "field": "id_card_copy", + "field_name": "身份证复印件", + "reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.json new file mode 100644 index 00000000..74919eed --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/GetApplyForSubMerchantSettlementResponse.json @@ -0,0 +1,8 @@ +{ + "account_type": "ACCOUNT_TYPE_BUSINESS", + "account_bank": "工商银行", + "bank_name": "施秉县农村信用合作联社城关信用社", + "bank_branch_id": "402713354941", + "account_number": "***************8678", + "verify_result": "VERIFY_SUCCESS" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.json new file mode 100644 index 00000000..d4246ad3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementRequest.json @@ -0,0 +1,8 @@ +{ + "account_type": "ACCOUNT_TYPE_BUSINESS", + "account_bank": "工商银行", + "bank_address_code": "110000", + "bank_name": "施秉县农村信用合作联社城关信用社", + "bank_branch_id": "402713354941", + "account_number": "d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w==" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4SubMerchant/Settlement/ModifyApplyForSubMerchantSettlementResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByApplymentIdResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CancelApplyForSubjectApplymentByBusinessCodeResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentRequest.json new file mode 100644 index 00000000..3aeae593 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentRequest.json @@ -0,0 +1,51 @@ +{ + "business_code": "1111111111", + "contact_info": { + "name": "wRNIsXOvVuTYIhVxZJCD8uJIGmNPGozCe44Ph8rD+QAJEPxw==", + "mobile": "w+zPKEVNm7IDxPvK55P0OfNd5E5VXoWbRwyyGk37HiB6C/F2lUog==", + "id_card_number": "rjbq82xBwMixDGA5A4x6/hqZRAYmaeM+yyjn9BU8qUBZga+mKqQ==" + }, + "subject_info": { + "subject_type": "SUBJECT_TYPE_ENTERPRISE", + "business_licence_info": { + "licence_number": "914201123033363296", + "licence_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo", + "merchant_name": "李四网络有限公司", + "legal_person": "李四", + "company_address": "广东省深圳市南山区xx路xx号", + "licence_valid_date": "[\"1970-01-01\",\"forever\"]" + }, + "certificate_info": { + "cert_type": "CERTIFICATE_TYPE_2388", + "cert_number": "111111111111", + "cert_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo", + "merchant_name": "xx公益团体", + "legal_person": "李四", + "company_address": "广东省深圳市南山区xx路xx号", + "cert_valid_date": "[\"1970-01-01\",\"forever\"]" + }, + "company_prove_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo", + "assist_prove_info": { + "micro_biz_type": "MICRO_TYPE_STORE", + "store_name": "大郎烧饼", + "store_address_code": "440305", + "store_address": "广东省深圳市南山区xx大厦x层xxxx室", + "store_header_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo", + "store_indoor_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo" + } + }, + "identification_info": { + "identification_type": "IDENTIFICATION_TYPE_IDCARD", + "identification_name": "MZnwEx6zotwIz6ctW2/iQL5z94odwP9sKiFRL8Aii3L4U74RPCPztcJOScaXsaGs82HJNU3K+46ndk7prENiPDw==", + "identification_number": "ZTnn5dKGCvP4csw4XTLug/+VLB+4R6nxSPQwqSpmPVZtXmye+/3s9O+y32w==", + "identification_valid_date": "[\"1970-01-01\",\"forever\"]", + "identification_front_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo", + "identification_back_copy": "0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo" + }, + "addition_info": { + "confirm_mchid_list": [ + "20001113", + "20001112" + ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentResponse.json new file mode 100644 index 00000000..2eb0f392 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/CreateApplyForSubjectApplymentResponse.json @@ -0,0 +1,3 @@ +{ + "applyment_id": 20000000011111 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.json new file mode 100644 index 00000000..b9f83382 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByApplymentIdResponse.json @@ -0,0 +1,6 @@ +{ + "applyment_state": "APPLYMENT_STATE_PASSED", + "qrcode_data": "cGFnZXMvYXBwbHkvYXBpdzQvd2VsY29tZS93ZWxjb21lP2FwcGx5bWVudF9pZD14eHg=", + "reject_param": "merchant_name", + "reject_reason": "公司名称与工商局登记不一致" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.json new file mode 100644 index 00000000..b9f83382 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/GetApplyForSubjectApplymentByBusinessCodeResponse.json @@ -0,0 +1,6 @@ +{ + "applyment_state": "APPLYMENT_STATE_PASSED", + "qrcode_data": "cGFnZXMvYXBwbHkvYXBpdzQvd2VsY29tZS93ZWxjb21lP2FwcGx5bWVudF9pZD14eHg=", + "reject_param": "merchant_name", + "reject_reason": "公司名称与工商局登记不一致" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.json new file mode 100644 index 00000000..378bad7b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Apply4Subject/MerchantsState/GetApplyForSubjectApplymentMerchantStateResponse.json @@ -0,0 +1,3 @@ +{ + "authorize_state": "AUTHORIZE_STATE_AUTHORIZED" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/DownloadBillFileResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillResponse.json new file mode 100644 index 00000000..f82c3e75 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillFundflowBillResponse.json @@ -0,0 +1,5 @@ +{ + "download_url": "https://api.mch.weixin.qq.com/v3/billdownload/file?token=E-bFy6HgY_ffEOQutOpiFXX-SHI3EWhUQtPKAUd1iDGBGUA6Bfbzmcc-CWdJE23-", + "hash_type": "SHA1", + "hash_value": "8257296d67cd621531ddb3f6d3ed10d3ea45dd09" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillResponse.json new file mode 100644 index 00000000..f82c3e75 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Bill/GetBillTradeBillResponse.json @@ -0,0 +1,5 @@ +{ + "download_url": "https://api.mch.weixin.qq.com/v3/billdownload/file?token=E-bFy6HgY_ffEOQutOpiFXX-SHI3EWhUQtPKAUd1iDGBGUA6Bfbzmcc-CWdJE23-", + "hash_type": "SHA1", + "hash_value": "8257296d67cd621531ddb3f6d3ed10d3ea45dd09" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.json new file mode 100644 index 00000000..f3b69114 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Amounts/GetBrandProfitSharingOrderAmountsResponse.json @@ -0,0 +1,4 @@ +{ + "transaction_id": "4208450740201411110007820472", + "unsplit_amount": 1000 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.json new file mode 100644 index 00000000..8c02bf8c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/BrandConfigs/GetBrandProfitBrandConfigsResponse.json @@ -0,0 +1,4 @@ +{ + "brand_mchid": "1900000109", + "max_ratio": 2000 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.json new file mode 100644 index 00000000..9a35e796 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderRequest.json @@ -0,0 +1,17 @@ +{ + "brand_mchid": "1900000108", + "sub_mchid": "1900000109", + "appid": "wx8888888888888888", + "sub_appid": "wx8888888888888889", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "receivers": [ + { + "type": "MERCHANT_ID", + "account": "1900000110", + "amount": 100, + "description": "1900000109分给商户1900000110" + } + ], + "finish": true +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.json new file mode 100644 index 00000000..a98acb07 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingOrderResponse.json @@ -0,0 +1,7 @@ +{ + "sub_mchid": "1900000109", + "brand_mchid": "1900000108", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "order_id": "6754760740201411110007865434" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.json new file mode 100644 index 00000000..fa366b7b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderRequest.json @@ -0,0 +1,8 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "description": "分账回退" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.json new file mode 100644 index 00000000..83138f73 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/CreateBrandProfitSharingReturnOrderResponse.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "return_no": "3008450740201411110007820472", + "result": "SUCCESS", + "fail_reason": "TIME_OUT_CLOSED", + "finish_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.json new file mode 100644 index 00000000..f39a118b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingOrderByOutOrderNumberResponse.json @@ -0,0 +1,29 @@ +{ + "transaction_id": "4208450740201411110007820472", + "receivers": [ + { + "result": "SUCCESS", + "amount": 10, + "description": "分帐1900000110", + "type": "MERCHANT_ID", + "fail_reason": "NO_RELATION", + "account": "1900000109", + "finish_time": "2015-05-20T13:29:35.120+08:00" + }, + { + "result": "SUCCESS", + "amount": 10, + "description": "分帐1900000110", + "type": "MERCHANT_ID", + "fail_reason": "NO_RELATION", + "account": "1900000109", + "finish_time": "2015-05-20T13:29:35.120+08:00" + } + ], + "finish_description": "分账完结", + "out_order_no": "P20150806125346", + "sub_mchid": "1900000109", + "finish_amount": 100, + "order_id": "3008450740201411110007820472", + "status": "FINISHED" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.json new file mode 100644 index 00000000..83138f73 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOrderIdResponse.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "return_no": "3008450740201411110007820472", + "result": "SUCCESS", + "fail_reason": "TIME_OUT_CLOSED", + "finish_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.json new file mode 100644 index 00000000..83138f73 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/GetBrandProfitSharingReturnOrderByOutOrderNumberResponse.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "return_no": "3008450740201411110007820472", + "result": "SUCCESS", + "fail_reason": "TIME_OUT_CLOSED", + "finish_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.json new file mode 100644 index 00000000..67dc3bfb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverRequest.json @@ -0,0 +1,9 @@ +{ + "brand_mchid": "1900000108", + "appid": "wx8888888888888888", + "sub_appid": "wx8888888888888889", + "type": "MERCHANT_ID", + "account": "1900000109", + "name": "张三网络公司", + "relation_type": "SUPPLIER" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.json new file mode 100644 index 00000000..4191a7d3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/AddBrandProfitSharingReceiverResponse.json @@ -0,0 +1,5 @@ +{ + "brand_mchid": "1900000108", + "type": "MERCHANT_ID", + "account": "1900000109" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.json new file mode 100644 index 00000000..a744ed5d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverRequest.json @@ -0,0 +1,7 @@ +{ + "brand_mchid": "1900000108", + "appid": "wx8888888888888888", + "sub_appid": "wx8888888888888889", + "type": "MERCHANT_ID", + "account": "1900000109" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.json new file mode 100644 index 00000000..4191a7d3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/Receivers/DeleteBrandProfitSharingReceiverResponse.json @@ -0,0 +1,5 @@ +{ + "brand_mchid": "1900000108", + "type": "MERCHANT_ID", + "account": "1900000109" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.json new file mode 100644 index 00000000..2c8c75d6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishRequest.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "description": "分账完结" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.json new file mode 100644 index 00000000..9acb975e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BrandProfitSharing/SetBrandProfitSharingOrderFinishResponse.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "order_id": "3008450740201411110007820472" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.json new file mode 100644 index 00000000..439afcd1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/GetBusinessCircleUserAuthorizationByOpenIdResponse.json @@ -0,0 +1,5 @@ +{ + "openid": "oWmnN4xxxxxxxxxxe92NHIGf1xd8", + "authorize_state": "AUTHORIZED", + "authorize_time": "2020-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsRequest.json new file mode 100644 index 00000000..178c2da0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsRequest.json @@ -0,0 +1,10 @@ +{ + "sub_mchid": "1234567890", + "transaction_id": "4200000533202000000000000000", + "appid": "wx8828b70xxxxxxx8", + "openid": "otPAN5xxxxxxxxrOEG6lUv_pzacc", + "earn_points": true, + "increased_points": 100, + "points_update_time": "2020-05-20T13:29:35.120+08:00", + "total_points": 888888 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/BusinessCircle/NotifyBusinessCirclePointsResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesResponse.json new file mode 100644 index 00000000..3c8b52f1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Certificates/QueryCertificatesResponse.json @@ -0,0 +1,26 @@ +{ + "data": [ + { + "serial_no": "5157F09EFDC096DE15EBE81A47057A7232F1B8E1", + "effective_time": "2018-06-08T10:34:56+08:00", + "expire_time": "2018-12-08T10:34:56+08:00", + "encrypt_certificate": { + "algorithm": "AEAD_AES_256_GCM", + "nonce": "61f9c719728a", + "associated_data": "certificate", + "ciphertext": "sRvt… " + } + }, + { + "serial_no": "50062CE505775F070CAB06E697F1BBD1AD4F4D87", + "effective_time": "2018-12-07T10:34:56+08:00", + "expire_time": "2020-12-07T10:34:56+08:00", + "encrypt_certificate": { + "algorithm": "AEAD_AES_256_GCM", + "nonce": "35f9c719727b", + "associated_data": "certificate", + "ciphertext": "aBvt… " + } + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionRequest.json new file mode 100644 index 00000000..7b7d2b33 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionRequest.json @@ -0,0 +1,10 @@ +{ + "combine_appid": "wxd678efh567hg6787", + "sub_orders": [ + { + "mchid": "1900000109", + "out_trade_no": "20150806125346", + "sub_mchid": "1230000109" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CloseCombineTransactionResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppRequest.json new file mode 100644 index 00000000..3a049ae7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppRequest.json @@ -0,0 +1,28 @@ +{ + "combine_out_trade_no": "20150806125346", + "combine_mchid": "1900000109", + "combine_appid": "wxd678efh567hg6787", + "scene_info": { + "device_id": "POS1:123", + "payer_client_ip": "14.17.22.32" + }, + "sub_orders": [ + { + "mchid": "1900000109", + "attach": "深圳分店", + "amount": { + "total_amount": 10, + "currency": "CNY" + }, + "out_trade_no": "20150806125346", + "sub_mchid": "1230000109", + "description": "腾讯充值中心-QQ会员充值" + } + ], + "combine_payer_info": { + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "time_start": "2019-12-31T15:59:59+08:00", + "time_expire": "2019-12-31T16:59:59+08:00", + "notify_url": "https://yourapp.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppResponse.json new file mode 100644 index 00000000..8e7139f0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionAppResponse.json @@ -0,0 +1,3 @@ +{ + "prepay_id": "wx201410272009395522657a690389285100" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Request.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Request.json new file mode 100644 index 00000000..e13b6125 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Request.json @@ -0,0 +1,36 @@ +{ + "combine_out_trade_no": "20150806125346", + "combine_mchid": "1900000109", + "combine_appid": "wxd678efh567hg6787", + "scene_info": { + "device_id": "013467007045764", + "payer_client_ip": "14.23.150.211", + "h5_info": { + "app_name": "王者荣耀", + "app_url": "https://pay.qq.com", + "bundle_id": "com.tencent.wzryiOS", + "package_name": "com.tencent.tmgp.sgame", + "type": "iOS" + } + }, + "sub_orders": [ + { + "mchid": "1230000109", + "attach": "深圳分店", + "amount": { + "total_amount": 10, + "currency": "CNY" + }, + "out_trade_no": "20150806125346", + "sub_mchid": "1900000109", + "description": "腾讯充值中心-QQ会员充值", + "settle_info": { + "profit_sharing": true, + "subsidy_amount": 10 + } + } + ], + "time_start": "2019-12-31T15:59:59+08:00", + "time_expire": "2019-12-31T16:59:59+08:00", + "notify_url": "https://yourapp.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Response.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Response.json new file mode 100644 index 00000000..30c11776 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionH5Response.json @@ -0,0 +1,3 @@ +{ + "h5_url": "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiRequest.json new file mode 100644 index 00000000..3a049ae7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiRequest.json @@ -0,0 +1,28 @@ +{ + "combine_out_trade_no": "20150806125346", + "combine_mchid": "1900000109", + "combine_appid": "wxd678efh567hg6787", + "scene_info": { + "device_id": "POS1:123", + "payer_client_ip": "14.17.22.32" + }, + "sub_orders": [ + { + "mchid": "1900000109", + "attach": "深圳分店", + "amount": { + "total_amount": 10, + "currency": "CNY" + }, + "out_trade_no": "20150806125346", + "sub_mchid": "1230000109", + "description": "腾讯充值中心-QQ会员充值" + } + ], + "combine_payer_info": { + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "time_start": "2019-12-31T15:59:59+08:00", + "time_expire": "2019-12-31T16:59:59+08:00", + "notify_url": "https://yourapp.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiResponse.json new file mode 100644 index 00000000..8e7139f0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionJsapiResponse.json @@ -0,0 +1,3 @@ +{ + "prepay_id": "wx201410272009395522657a690389285100" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeRequest.json new file mode 100644 index 00000000..6e256d58 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeRequest.json @@ -0,0 +1,44 @@ +{ + "combine_appid": "wxd678efh567hg6787", + "combine_out_trade_no": "20150806125346", + "combine_mchid": "1900000109", + "scene_info": { + "device_id": "POS1:1", + "payer_client_ip": "14.17.22.32" + }, + "sub_orders": [ + { + "mchid": "1230000109", + "attach": "深圳分店", + "amount": { + "total_amount": 10, + "currency": "CNY" + }, + "out_trade_no": "20150806125346", + "sub_mchid": "1900000109", + "description": "腾讯充值中心-QQ会员充值", + "settle_info": { + "profit_sharing": false, + "subsidy_amount": 10 + } + }, + { + "mchid": "1230000109", + "attach": "深圳分店", + "amount": { + "total_amount": 10, + "currency": "CNY" + }, + "out_trade_no": "20150806125346", + "sub_mchid": "1900000109", + "description": "腾讯充值中心-QQ会员充值", + "settle_info": { + "profit_sharing": false, + "subsidy_amount": 10 + } + } + ], + "time_start": "2000-01-23T04:56:07.000+00:00", + "time_expire": "2000-01-23T04:56:07.000+00:00", + "notify_url": "https://yourapp.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeResponse.json new file mode 100644 index 00000000..457404a8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/CreateCombineTransactionNativeResponse.json @@ -0,0 +1,3 @@ +{ + "code_url": "weixin://pay.weixin.qq.com/bizpayurl/up?pr=NwY5Mz9&groupid=00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.json new file mode 100644 index 00000000..45a84857 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/CombineTransactions/GetCombineTransactionByCombineOutTradeNumberResponse.json @@ -0,0 +1,30 @@ +{ + "combine_appid": "wxd678efh567hg6787", + "combine_mchid": "1230000109", + "combine_payer_info": { + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "sub_orders": [ + { + "mchid": "1900000109", + "trade_type": "JSAPI", + "trade_state": "SUCCESS", + "bank_type": "CMC", + "attach": "深圳分店", + "success_time": "2015-05-20T13:29:35.120+08:00", + "amount": { + "total_amount": 10, + "payer_amount": 10, + "currency": "CNY", + "payer_currency": "CNY" + }, + "transaction_id": "1009660380201506130728806387", + "out_trade_no": "20150806125346", + "sub_mchid": "1230000109" + } + ], + "scene_info": { + "device_id": "POS1:1" + }, + "combine_out_trade_no": "1217752501201407033233368018" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeResponse.json new file mode 100644 index 00000000..77b64223 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/GetDiscountCardByOutCardCodeResponse.json @@ -0,0 +1,143 @@ +{ + "unfinished_reason": "DUE_TO_QUIT", + "mchid": "1230000109", + "create_time": "2015-05-20T13:29:35.12+08:00", + "openid": "oUpF8uMuAJ2pxb1Q9zNjWeS6o", + "pay_information": { + "transaction_id": "1009660380201506130728806387", + "pay_state": "PAYING", + "pay_amount": 100, + "pay_time": "2015-05-20T13:29:35.12+08:00" + }, + "sharer_openid": "oUpF8uMuAJ2pxb1Q9zNjWUHsd", + "card_id": "233bcbf407e87789b8e471f251774f95", + "card_template_id": "87789b2f25177433bcbf407e8e471f95", + "out_card_code": "6e8369071cd942c0476613f9d1ce9ca3", + "time_range": { + "end_time": "2015-05-20T13:29:35.12+08:00", + "begin_time": "2015-05-20T13:29:35.12+08:00" + }, + "total_amount": 1000, + "appid": "wxd678efh567hg6787", + "objectives": [ + { + "unit": "次", + "name": "一周购买三次商品", + "count": 1, + "description": "特价商品", + "objective_completion_records": [ + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + }, + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + } + ], + "objective_id": "123456" + }, + { + "unit": "次", + "name": "一周购买三次商品", + "count": 1, + "description": "特价商品", + "objective_completion_records": [ + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + }, + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + } + ], + "objective_id": "123456" + } + ], + "state": "ONGOING", + "rewards": [ + { + "unit": "个", + "amount": 100, + "count_type": "COUNT_LIMIT", + "name": "八折优惠", + "count": 1, + "description": "特价商品优惠", + "reward_id": "123456", + "reward_usage_records": [ + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + }, + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + } + ] + }, + { + "unit": "个", + "amount": 100, + "count_type": "COUNT_LIMIT", + "name": "八折优惠", + "count": 1, + "description": "特价商品优惠", + "reward_id": "123456", + "reward_usage_records": [ + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + }, + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardRequest.json new file mode 100644 index 00000000..705124bb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardRequest.json @@ -0,0 +1,6 @@ +{ + "out_card_code": "6e8369071cd942c0476613f9d1ce9ca3", + "card_template_id": "87789b2f25177433bcbf407e8e471f95", + "appid": "wxd678efh567hg6787", + "notify_url": "https://api.test.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardResponse.json new file mode 100644 index 00000000..e24a7f19 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/PrepareDiscountCardResponse.json @@ -0,0 +1,3 @@ +{ + "prepare_card_token": "zyx53Nkey8o4bHpxTQvd8m7e92nG5mG2" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.json new file mode 100644 index 00000000..52960d4a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordRequest.json @@ -0,0 +1,35 @@ +{ + "card_template_id": "87789b2f25177433bcbf407e8e471f95", + "reward_usage_records": [ + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + } + ], + "objective_completion_records": [ + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + }, + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/DiscountCard/UserRecords/AddDiscountCardUserRecordResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentRequest.json new file mode 100644 index 00000000..7b2d0fd8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentRequest.json @@ -0,0 +1,48 @@ +{ + "organization_type": "2", + "business_license_info": { + "business_license_copy": "47ZC6GC-vnrbEg05InE4d2I6_H7I4", + "business_license_number": "123456789012345678", + "merchant_name": "腾讯科技有限公司", + "legal_person": "张三" + }, + "organization_cert_info": { + "organization_copy": "47ZC6GC-vnrbEny__Ie_An5-tCpqxuGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 ", + "organization_time": "[\"2014-01-01\",\"长期\"]", + "organization_number": "12345679-A" + }, + "id_card_info": { + "id_card_copy": "jTpGmxUX3FBWVQ5NJTZvlKC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ", + "id_card_national": "47ZC6GC-vnrbEny__Ie_AnGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4", + "id_card_name": "pVd1HJ6z7UtC + xriudjD5AqhZ9evAM + Jv1z0NVa8MRtelw / wDa4SzfeespQO / 0 kjiwfqdfg =", + "id_card_number": "UZFETyabYFFlgvGh6R4vTzDRgzvA2HtP5VHahNhSUqhR9iuGTunRPRVFg ==", + "id_card_valid_time": "2026-06-06" + }, + "need_account_info": true, + "account_info": { + "bank_account_type": "74", + "account_name": "fTA4TXc8yMOwFCYeGPktOOSbOBei3KAmUWHGxCQo2hfaC7xumTqXR7 / NyRHpFKXURQFcmmw ==", + "account_bank": "工商银行", + "bank_address_code": "110000", + "bank_branch_id": "402713354941", + "bank_name": "施秉县农村信用合作联社城关信用社", + "account_number": "d+xT+MQCvrLHUVD5Fnx30mr4L8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC" + }, + "contact_info": { + "contact_type": "65", + "contact_name": "pVd1HJ6zyvPedzGaV+Xy7UDa4SzfeespQO / 0 kjiwfqdfg ==", + "contact_id_card_number": "UZFETyabYFFlgvGh6R4vTzDEOiZZ4ka9+5RgzvA2rJx+NztYUbN209rqR9iuGTunRPRVFg ==", + "mobile_phone": "Uy5Hb0c5Se/orEbrWze/ROHu9EPAs/CigDlJ2fnyzC1ppJNBrqcBszhYQUlu5zn6o2uZpBhAsQwd3QAjw==", + "contact_email": "Uy5Hb0c5Se/orEbrWze/ROHu9EPAs/CigDlJ2fnyzC1ppJNaLZExOEzmUn6o2uZpBhAsQwd3QAjw==" + }, + "sales_scene_info": { + "store_name": "爱烧烤", + "store_url": "http://www.qq.com", + "store_qr_code": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAujqhThn4ReFxikqJ5YW6zFQ" + }, + "merchant_shortname": "爱烧烤", + "out_request_no": "APPLYMENT_00000000001", + "qualifications": "[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"]", + "business_addition_pics": "[\"jTpGmg05InE4d2I6_H7I4\"]", + "business_addition_desc": "特殊情况,说明原因" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentResponse.json new file mode 100644 index 00000000..00f1ad40 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/CreateEcommerceApplymentResponse.json @@ -0,0 +1,4 @@ +{ + "applyment_id": 2000002124775691, + "out_request_no": "APPLYMENT_00000000001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.json new file mode 100644 index 00000000..ea1899aa --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByApplymentIdResponse.json @@ -0,0 +1,26 @@ +{ + "applyment_state": "FINISH", + "applyment_state_desc": "审核中", + "sign_url": "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + "sub_mchid": "1542488631", + "account_validation": { + "account_name": "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + "account_no": "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4 rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + "pay_amount": 124, + "destination_account_number": "7222223333322332", + "destination_account_name": "财付通支付科技有限公司", + "destination_account_bank": "招商银行威盛大厦支行", + "city": "深圳", + "remark": "入驻账户验证", + "deadline": "2018-12-10 17:09:01" + }, + "audit_detail": [ + { + "param_name": "id_card_copy", + "reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。" + } + ], + "legal_validation_url": "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + "out_request_no": "APPLYMENT_00000000001", + "applyment_id": 2000002124775691 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.json new file mode 100644 index 00000000..ea1899aa --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.json @@ -0,0 +1,26 @@ +{ + "applyment_state": "FINISH", + "applyment_state_desc": "审核中", + "sign_url": "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + "sub_mchid": "1542488631", + "account_validation": { + "account_name": "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + "account_no": "aOf7Gk2qT26kakkuTZpbFAn7Mb7xcar0LlQaYoi3+LnnWwgAsfaUUTg9+GmYJq6YCz+RiluWHeHFq1lt8n3eIkF0laVvqmAU80xIWGZgWJnRmnRuZxsg0HJZfnUac2JfqyuL8OoyM2YSuYDqdsyvcOlgUQgq8MPCR6pmvhBCmIeJvnVSm8J+L+yx912itUmTDxhdBlu1CFBIUefME9nYB70vCVTNAVXgURkf65mjHMBiE9Y+wrPZVmTIIz3C3PtPVMZYDEvBT4 rDdICA3ZYXshYqeOSslSjSMf+MhhC4oaujiISFzq3AE+as7mAEDJly+DgRuVs74msmKUH8pl+3oA==", + "pay_amount": 124, + "destination_account_number": "7222223333322332", + "destination_account_name": "财付通支付科技有限公司", + "destination_account_bank": "招商银行威盛大厦支行", + "city": "深圳", + "remark": "入驻账户验证", + "deadline": "2018-12-10 17:09:01" + }, + "audit_detail": [ + { + "param_name": "id_card_copy", + "reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。" + } + ], + "legal_validation_url": "https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002126198476&sign=b207b673049a32c858f3aabd7d27c7ec", + "out_request_no": "APPLYMENT_00000000001", + "applyment_id": 2000002124775691 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillResponse.json new file mode 100644 index 00000000..be6470fc --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceBill/GetEcommerceBillFundflowBillResponse.json @@ -0,0 +1,13 @@ +{ + "download_bill_count": 1, + "download_bill_list": [ + { + "bill_sequence": 1, + "hash_type": "SHA1", + "hash_value": "79bb0f45fc4c42234a918000b2668d689e2bde04", + "download_url": "https://api.mch.weixin.qq.com/v3/bill/downloadurl?token=xxx", + "encrypt_key": "YpkbxSne+mDwyXq//xYPmtr9eQ5LsH7zLMZSs+GSEcY4wjhlsfioS4n9X6q1ZBL0wM1v5qd7KhWuj0rFJ4N1FidP7Q8KDy25QDTt46wiKnsPKSCAXWRFNw1D2JmJBqZsc9y5g0DupONWKYB2GfRigRDEBVszj67uOIILPdxOKX1w3N4jvu0U9IFanJa7ldm70KVvYrMWVgQFDPbgjh1gVDbuTAjmPN88AobLdkiegnBUS2woDZW+PfhPo13kweOiR3h1gXIKRlnKnN3Jkkwpna/AFFijXrFphO3voSuiV0CfptfzTtcae4X3DYG3RSroKqmpa+5tuy2aU2VJUSIuFQ==", + "nonce": "a8607ef79034c49c" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceResponse.json new file mode 100644 index 00000000..cc73da89 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundBalanceResponse.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900000109", + "available_amount": 10000, + "pending_amount": 0, + "account_type": "BASIC" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.json new file mode 100644 index 00000000..368c02e4 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundBalance/GetEcommerceFundDayendBalanceResponse.json @@ -0,0 +1,5 @@ +{ + "sub_mchid": "1900000109", + "available_amount": 10000, + "pending_amount": 0 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.json new file mode 100644 index 00000000..25a50e27 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawRequest.json @@ -0,0 +1,7 @@ +{ + "sub_mchid": "1900000109", + "out_request_no": "20190611222222222200000000012122", + "amount": 1, + "remark": "交易提现", + "bank_memo": "微信支付提现" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.json new file mode 100644 index 00000000..7a0080a8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/CreateEcommerceFundWithdrawResponse.json @@ -0,0 +1,5 @@ +{ + "sub_mchid": "1900000109", + "withdraw_id": "12321937198237912739132791732912793127931279317929791239112123", + "out_request_no": "20190611222222222200000000012122" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.json new file mode 100644 index 00000000..61b732b9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByOutRequestNumberResponse.json @@ -0,0 +1,13 @@ +{ + "sub_mchid": "1900000109", + "sp_mchid": "1800000123", + "status": "CREATE_SUCCESS", + "withdraw_id": "12321937198237912739132791732912793127931279317929791239112123", + "out_request_no": "20190611222222222200000000012122", + "amount": 1, + "create_time": "2015-05-20T13:29:35.120+08:00", + "update_time": "2015-05-20T13:29:35.120+08:00", + "reason": "卡号错误", + "remark": "交易提现", + "bank_memo": "微信提现" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.json new file mode 100644 index 00000000..61b732b9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceFundWithdraw/GetEcommerceFundWithdrawByWithdrawIdResponse.json @@ -0,0 +1,13 @@ +{ + "sub_mchid": "1900000109", + "sp_mchid": "1800000123", + "status": "CREATE_SUCCESS", + "withdraw_id": "12321937198237912739132791732912793127931279317929791239112123", + "out_request_no": "20190611222222222200000000012122", + "amount": 1, + "create_time": "2015-05-20T13:29:35.120+08:00", + "update_time": "2015-05-20T13:29:35.120+08:00", + "reason": "卡号错误", + "remark": "交易提现", + "bank_memo": "微信提现" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.json new file mode 100644 index 00000000..f3b69114 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Amounts/GetEcommerceProfitSharingOrderAmountsResponse.json @@ -0,0 +1,4 @@ +{ + "transaction_id": "4208450740201411110007820472", + "unsplit_amount": 1000 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.json new file mode 100644 index 00000000..57f55793 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderRequest.json @@ -0,0 +1,15 @@ +{ + "appid": "wx8888888888888888", + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "receivers": [ + { + "type": "MERCHANT_ID", + "receiver_account": "1900000110", + "amount": 100, + "description": "分给商户1900000110" + } + ], + "finish": true +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.json new file mode 100644 index 00000000..9acb975e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingOrderResponse.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "order_id": "3008450740201411110007820472" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.json new file mode 100644 index 00000000..edec1482 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderRequest.json @@ -0,0 +1,9 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "description": "分账回退" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.json new file mode 100644 index 00000000..83138f73 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/CreateEcommerceProfitSharingReturnOrderResponse.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "return_no": "3008450740201411110007820472", + "result": "SUCCESS", + "fail_reason": "TIME_OUT_CLOSED", + "finish_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.json new file mode 100644 index 00000000..d1d16810 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingOrderByOutOrderNumberResponse.json @@ -0,0 +1,19 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "order_id": "3008450740201411110007820472", + "status": "FINISHED", + "receivers": [ + { + "receiver_mchid": "1900000110", + "amount": 100, + "description": "分给商户1900000110", + "result": "SUCCESS", + "finish_time": "2015-05-20T13:29:35.120+08:00", + "fail_reason": "ACCOUNT_ABNORMAL" + } + ], + "finish_amount": 100, + "finish_description": "分账完结" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.json new file mode 100644 index 00000000..83138f73 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOrderIdResponse.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "return_no": "3008450740201411110007820472", + "result": "SUCCESS", + "fail_reason": "TIME_OUT_CLOSED", + "finish_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.json new file mode 100644 index 00000000..83138f73 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/GetEcommerceProfitSharingReturnOrderByOutOrderNumberResponse.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900000109", + "order_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "out_return_no": "R20190516001", + "return_mchid": "86693852", + "amount": 10, + "return_no": "3008450740201411110007820472", + "result": "SUCCESS", + "fail_reason": "TIME_OUT_CLOSED", + "finish_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.json new file mode 100644 index 00000000..a5a1f90e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverRequest.json @@ -0,0 +1,7 @@ +{ + "appid": "wx8888888888888888", + "type": "MERCHANT_ID", + "account": "190001001", + "name": "张三网络公司", + "relation_type": "SUPPLIER" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.json new file mode 100644 index 00000000..bf2c1224 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/AddEcommerceProfitSharingReceiverResponse.json @@ -0,0 +1,4 @@ +{ + "type": "MERCHANT_ID", + "account": "190001001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.json new file mode 100644 index 00000000..59dd529c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverRequest.json @@ -0,0 +1,5 @@ +{ + "appid": "wx8888888888888888", + "type": "MERCHANT_ID", + "account": "190001001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.json new file mode 100644 index 00000000..bf2c1224 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/Receivers/DeleteEcommerceProfitSharingReceiverResponse.json @@ -0,0 +1,4 @@ +{ + "type": "MERCHANT_ID", + "account": "190001001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.json new file mode 100644 index 00000000..2c8c75d6 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishRequest.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "description": "分账完结" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.json new file mode 100644 index 00000000..9acb975e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceProfitSharing/SetEcommerceProfitSharingOrderFinishResponse.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "out_order_no": "P20150806125346", + "order_id": "3008450740201411110007820472" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundRequest.json new file mode 100644 index 00000000..3be1deee --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundRequest.json @@ -0,0 +1,16 @@ +{ + "sub_mchid": "1900000109", + "sp_appid": "wx8888888888888888", + "sub_appid": "wx8888888888888888", + "transaction_id": "1217752501201407033233368018", + "out_trade_no": "1217752501201407033233368018", + "out_refund_no": "1217752501201407033233368018", + "reason": "商品已售完", + "amount": { + "refund": 888, + "total": 888, + "currency": "CNY" + }, + "notify_url": "https://weixin.qq.com", + "refund_account": "REFUND_SOURCE_SUB_MERCHANT" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundResponse.json new file mode 100644 index 00000000..4ea74661 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/CreateEcommerceRefundResponse.json @@ -0,0 +1,28 @@ +{ + "refund_id": "1217752501201407033233368018", + "out_refund_no": "1217752501201407033233368018", + "create_time": "2018-06-08T10:34:56+08:00", + "amount": { + "refund": 888, + "payer_refund": 888, + "discount_refund": 888, + "currency": "CNY" + }, + "promotion_detail": [ + { + "promotion_id": "109518", + "scope": "SINGLE", + "type": "DISCOUNT", + "amount": 5, + "refund_amount": 100 + }, + { + "promotion_id": "109519", + "scope": "SINGLE", + "type": "DISCOUNT", + "amount": 5, + "refund_amount": 100 + } + ], + "refund_account": "REFUND_SOURCE_SUB_MERCHANT" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.json new file mode 100644 index 00000000..ec4e2bd5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByOutRefundNumberResponse.json @@ -0,0 +1,28 @@ +{ + "refund_id": "1217752501201407033233368018", + "out_refund_no": "1217752501201407033233368018", + "transaction_id": "1217752501201407033233368018", + "out_trade_no": "1217752501201407033233368018", + "channel": "ORIGINAL", + "user_received_account": "招商银行信用卡0403", + "success_time": "2018-06-08T10:34:56+08:00", + "create_time": "2018-06-08T10:34:56+08:00", + "status": "SUCCESS", + "amount": { + "refund": 888, + "payer_refund": 888, + "discount_refund": 888, + "currency": "CNY" + }, + "promotion_detail": [ + { + "promotion_id": "109519", + "scope": "SINGLE", + "type": "DISCOUNT", + "amount": 5, + "refund_amount": 100 + } + ], + "refund_account": "REFUND_SOURCE_SUB_MERCHANT", + "funds_account": "UNSETTLED" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.json new file mode 100644 index 00000000..ec4e2bd5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/GetEcommerceRefundByRefundIdResponse.json @@ -0,0 +1,28 @@ +{ + "refund_id": "1217752501201407033233368018", + "out_refund_no": "1217752501201407033233368018", + "transaction_id": "1217752501201407033233368018", + "out_trade_no": "1217752501201407033233368018", + "channel": "ORIGINAL", + "user_received_account": "招商银行信用卡0403", + "success_time": "2018-06-08T10:34:56+08:00", + "create_time": "2018-06-08T10:34:56+08:00", + "status": "SUCCESS", + "amount": { + "refund": 888, + "payer_refund": 888, + "discount_refund": 888, + "currency": "CNY" + }, + "promotion_detail": [ + { + "promotion_id": "109519", + "scope": "SINGLE", + "type": "DISCOUNT", + "amount": 5, + "refund_amount": 100 + } + ], + "refund_account": "REFUND_SOURCE_SUB_MERCHANT", + "funds_account": "UNSETTLED" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.json new file mode 100644 index 00000000..f0e4ec63 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceRequest.json @@ -0,0 +1,3 @@ +{ + "sub_mchid": "1900000109" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.json new file mode 100644 index 00000000..e3b72d1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/CreateEcommerceRefundReturnAdvanceResponse.json @@ -0,0 +1,11 @@ +{ + "refund_id": "50000000382019052709732678859", + "advance_return_id": "1215562501201407033233368018", + "return_amount": 888, + "payer_mchid": "1900000109", + "payer_account": "BASIC", + "payee_mchid": "1900000108", + "payee_account": "BASIC", + "result": "SUCCESS", + "success_time": "2018-06-08T10:34:56+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.json new file mode 100644 index 00000000..e3b72d1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceRefunds/ReturnAdvance/GetEcommerceRefundReturnAdvanceResponse.json @@ -0,0 +1,11 @@ +{ + "refund_id": "50000000382019052709732678859", + "advance_return_id": "1215562501201407033233368018", + "return_amount": 888, + "payer_mchid": "1900000109", + "payer_account": "BASIC", + "payee_mchid": "1900000108", + "payee_account": "BASIC", + "result": "SUCCESS", + "success_time": "2018-06-08T10:34:56+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyRequest.json new file mode 100644 index 00000000..3191544e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyRequest.json @@ -0,0 +1,5 @@ +{ + "sub_mchid": "1900013401", + "transaction_id": "4208450740201411110007820472", + "description": "订单退款" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyResponse.json new file mode 100644 index 00000000..95151fed --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CancelEcommerceSubsidyResponse.json @@ -0,0 +1,6 @@ +{ + "sub_mchid": "1900013401", + "transaction_id": "4208450740201411110007820472", + "result": "SUCCESS", + "description": "订单退款" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyRequest.json new file mode 100644 index 00000000..30ce22c9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyRequest.json @@ -0,0 +1,8 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "amount": 10, + "description": "测试备注", + "refund_id": "3008450740201411110007820472", + "out_subsidy_no": "P20150806125347" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyResponse.json new file mode 100644 index 00000000..d3f9445d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyResponse.json @@ -0,0 +1,9 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "subsidy_id": "3008450740201411110007820472", + "description": "满减补差活动", + "amount": 10, + "result": "PROCESSING", + "success_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.json new file mode 100644 index 00000000..04bca11b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnRequest.json @@ -0,0 +1,8 @@ +{ + "sub_mchid": "1900000109", + "out_order_no": "P20150806125346", + "transaction_id": "4208450740201411110007820472", + "refund_id": "3008450740201411110007820472", + "amount": 10, + "description": "测试备注" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.json new file mode 100644 index 00000000..924b6f2a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/EcommerceSubsidies/CreateEcommerceSubsidyReturnResponse.json @@ -0,0 +1,11 @@ +{ + "sub_mchid": "1900000109", + "transaction_id": "4208450740201411110007820472", + "subsidy_refund_id": "3008450740201411110007820472", + "refund_id": "3008450740201411110007820472", + "out_order_no": "P20150806125346", + "amount": 10, + "description": "测试备注", + "result": "SUCCESS", + "success_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.json new file mode 100644 index 00000000..8f19927d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusRequest.json @@ -0,0 +1,4 @@ +{ + "sub_mchid": "1234567890", + "operation_type": "OPEN" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.json new file mode 100644 index 00000000..b214ed4a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanCustomPageStatusResponse.json @@ -0,0 +1,3 @@ +{ + "sub_mchid": "1234567890" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusRequest.json new file mode 100644 index 00000000..8f19927d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusRequest.json @@ -0,0 +1,4 @@ +{ + "sub_mchid": "1234567890", + "operation_type": "OPEN" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusResponse.json new file mode 100644 index 00000000..b214ed4a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/ChangeGoldPlanStatusResponse.json @@ -0,0 +1,3 @@ +{ + "sub_mchid": "1234567890" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowRequest.json new file mode 100644 index 00000000..f0e4ec63 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowRequest.json @@ -0,0 +1,3 @@ +{ + "sub_mchid": "1900000109" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/CloseGoldPlanAdvertisingShowResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowRequest.json new file mode 100644 index 00000000..5b21ac96 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowRequest.json @@ -0,0 +1,8 @@ +{ + "sub_mchid": "1900000109", + "advertising_industry_filters": [ + "SOFTWARE", + "SECURITY", + "LOVE_MARRIAGE" + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/OpenGoldPlanAdvertisingShowResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.json new file mode 100644 index 00000000..5b21ac96 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterRequest.json @@ -0,0 +1,8 @@ +{ + "sub_mchid": "1900000109", + "advertising_industry_filters": [ + "SOFTWARE", + "SECURITY", + "LOVE_MARRIAGE" + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/GoldPlan/SetGoldPlanAdvertisingIndustryFilterResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.json new file mode 100644 index 00000000..28c30b35 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/GetMarketingBusifavorCallbackResponse.json @@ -0,0 +1,4 @@ +{ + "mchid": "10000098", + "notify_url": "https://pay.weixin.qq.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.json new file mode 100644 index 00000000..28c30b35 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackRequest.json @@ -0,0 +1,4 @@ +{ + "mchid": "10000098", + "notify_url": "https://pay.weixin.qq.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.json new file mode 100644 index 00000000..9e0cf4df --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Callbacks/UpdateMarketingBusifavorCallbackResponse.json @@ -0,0 +1,5 @@ +{ + "update_time": "2019-05-20T13:29:35+08:00", + "notify_url": "https://pay.weixin.qq.com", + "mchid": "10000098" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.json new file mode 100644 index 00000000..77bb90b9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponRequest.json @@ -0,0 +1,6 @@ +{ + "coupon_code": "sxxe34343434", + "out_trade_no": "MCH_102233445", + "stock_id": "100088", + "out_request_no": "1002600620019090123143254435" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.json new file mode 100644 index 00000000..be7b4877 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/AssociateMarketingBusifavorCouponResponse.json @@ -0,0 +1,3 @@ +{ + "wechatpay_associate_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.json new file mode 100644 index 00000000..df32bd58 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnRequest.json @@ -0,0 +1,5 @@ +{ + "coupon_code": "sxxe34343434", + "stock_id": "1234567891", + "return_request_no": "1002600620019090123143254436" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.json new file mode 100644 index 00000000..28e26dc5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/CreateMarketingBusifavorCouponReturnResponse.json @@ -0,0 +1,3 @@ +{ + "wechatpay_return_time": "2020-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.json new file mode 100644 index 00000000..97b388c1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponRequest.json @@ -0,0 +1,6 @@ +{ + "coupon_code": "sxxe34343434", + "stock_id": "1234567891", + "deactivate_request_no": "1002600620019090123143254436", + "deactivate_reason": "此券使用时间设置错误" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.json new file mode 100644 index 00000000..c364f6ab --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DeactivateMarketingBusifavorCouponResponse.json @@ -0,0 +1,3 @@ +{ + "wechatpay_deactivate_time": "2020-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.json new file mode 100644 index 00000000..c5c2d48a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponRequest.json @@ -0,0 +1,6 @@ +{ + "coupon_code": "213dsadfsa", + "out_trade_no": "treads8a9f980", + "stock_id": "100088", + "out_request_no": "fdsafdsafdsa231321" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.json new file mode 100644 index 00000000..c800cd31 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/DisassociateMarketingBusifavorCouponResponse.json @@ -0,0 +1,3 @@ +{ + "wechatpay_disassociate_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.json new file mode 100644 index 00000000..d94be984 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponRequest.json @@ -0,0 +1,6 @@ +{ + "send_time": "2019-12-31T13:29:35.120+08:00", + "openid": "obLatjhnqgy2syxrXVM3MJirbkdI", + "appid": "wxc0b84a53ed8e8d29", + "out_request_no": "oTYhjfdsahnssddj_0136" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.json new file mode 100644 index 00000000..92960e47 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SendMarketingBusifavorCouponResponse.json @@ -0,0 +1,3 @@ +{ + "card_code": "198555211279" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.json new file mode 100644 index 00000000..88e33b83 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedRequest.json @@ -0,0 +1,8 @@ +{ + "coupon_code": "sxxe34343434", + "stock_id": "100088", + "appid": "wx1234567889999", + "use_time": "2015-05-20T13:29:35+08:00", + "use_request_no": "1002600620019090123143254435", + "openid": "xsd3434454567676" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.json new file mode 100644 index 00000000..1f6d11bb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Coupons/SetMarketingBusifavorCouponUsedResponse.json @@ -0,0 +1,5 @@ +{ + "stock_id": "100088", + "openid": "dsadas34345454545", + "wechatpay_use_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockRequest.json new file mode 100644 index 00000000..49f67209 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockRequest.json @@ -0,0 +1,69 @@ +{ + "stock_name": "8月1日活动券", + "belong_merchant": "10000098", + "comment": "活动使用", + "goods_name": "填写代金券可适用的商品或服务", + "stock_type": "NORMAL", + "coupon_use_rule": { + "coupon_available_time": { + "available_begin_time": "2015-05-20T13:29:35+08:00", + "available_end_time": "2015-05-20T13:29:35+08:00", + "available_day_after_receive": 3, + "wait_days_after_receive": 7, + "available_week": { + "week_day": [ + 1, + 2 + ], + "available_day_time": [ + { + "begin_time": 3600, + "end_time": 86399 + } + ] + }, + "irregulary_avaliable_time": [ + { + "begin_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00" + } + ] + }, + "fixed_normal_coupon": { + "discount_amount": 5, + "transaction_minimum": 100 + }, + "use_method": "OFF_LINE", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "stock_send_rule": { + "max_coupons": 100, + "max_coupons_per_user": 5, + "max_coupons_by_day": 100, + "natural_person_limit": false, + "prevent_api_abuse": false, + "transferable": false, + "shareable": false + }, + "out_request_no": "100002322019090134234sfdf", + "custom_entrance": { + "mini_programs_info": { + "mini_programs_appid": "wx234545656765876", + "mini_programs_path": "/path/index/index", + "entrance_words": "欢迎选购", + "guiding_words": "获取更多优惠" + }, + "appid": "wx324345hgfhfghfg", + "hall_id": "233455656", + "store_id": "233554655" + }, + "display_pattern_info": { + "description": "xxx门店可用", + "merchant_logo_url": "https://xxx", + "merchant_name": "微信支付", + "background_color": "Color020", + "coupon_image_url": "https://qpic.cn/xxx" + }, + "coupon_code_mode": "WECHATPAY_MODE" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockResponse.json new file mode 100644 index 00000000..ecdeaeb1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/CreateMarketingBusifavorStockResponse.json @@ -0,0 +1,4 @@ +{ + "stock_id": "98065001", + "create_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.json new file mode 100644 index 00000000..1986c5ea --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/GetMarketingBusifavorStockByStockIdResponse.json @@ -0,0 +1,75 @@ +{ + "stock_name": "8月1日活动券", + "belong_merchant": "10000022", + "comment": "xxx店使用", + "goods_name": "xxx商品使用", + "stock_type": "NORMAL", + "coupon_use_rule": { + "coupon_available_time": { + "available_begin_time": "2015-05-20T13:29:35+08:00", + "available_end_time": "2015-05-20T13:29:35+08:00", + "available_day_after_receive": 3, + "available_week": { + "week_day": [ + "1", + "2" + ], + "available_day_time": [ + { + "begin_time": 3600, + "end_time": 86399 + } + ] + }, + "irregulary_avaliable_time": [ + { + "begin_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00" + } + ] + }, + "fixed_normal_coupon": { + "discount_amount": 5, + "transaction_minimum": 100 + }, + "use_method": "OFF_LINE", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "stock_send_rule": { + "max_amount": 100000, + "max_coupons": 100, + "max_coupons_per_user": 5, + "max_amount_by_day": 1000, + "max_coupons_by_day": 100, + "natural_person_limit": false, + "prevent_api_abuse": false, + "transferable": false, + "shareable": false + }, + "custom_entrance": { + "mini_programs_info": { + "mini_programs_appid": "wx234545656765876", + "mini_programs_path": "/path/index/index", + "entrance_words": "欢迎选购", + "guiding_words": "获取更多优惠" + }, + "appid": "wx324345hgfhfghfg", + "hall_id": "233455656", + "store_id": "233554655" + }, + "display_pattern_info": { + "description": "xxx门店可用", + "merchant_logo_url": "https://xxx", + "merchant_name": "微信支付", + "background_color": "Color020", + "coupon_image_url": "https://qpic.cn/xxx" + }, + "stock_state": "RUNNING", + "coupon_code_mode": "MERCHANT_UPLOAD", + "stock_id": "1212", + "coupon_code_count": { + "total_count": 100, + "available_count": 50 + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.json new file mode 100644 index 00000000..abd89e6e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptRequest.json @@ -0,0 +1,10 @@ +{ + "stock_id": "128888000000001", + "coupon_code": "ABCD12345678", + "transaction_id": "4200000913202101152566792388", + "payer_merchant": "1900000001", + "payee_merchant": "1900000002", + "amount": 100, + "description": "20210115DESCRIPTION", + "out_subsidy_no": "subsidy-abcd-12345678" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.json new file mode 100644 index 00000000..b045ce3b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyPayReceiptResponse.json @@ -0,0 +1,14 @@ +{ + "subsidy_receipt_id": "1120200119165100000000000001", + "stock_id": "128888000000001", + "coupon_code": "ABCD12345678", + "transaction_id": "4200000913202101152566792388", + "payer_merchant": "1900000001", + "payee_merchant": "1900000002", + "amount": 100, + "description": "20210115DESCRIPTION", + "status": "SUCCESS", + "success_time": "2021-01-20T10:29:35.120+08:00", + "out_subsidy_no": "subsidy-abcd-12345678", + "create_time": "2021-01-20T10:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.json new file mode 100644 index 00000000..d76c6057 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptRequest.json @@ -0,0 +1,11 @@ +{ + "stock_id": "128888000000001", + "coupon_code": "ABCD12345678", + "transaction_id": "4200000913202101152566792388", + "refund_id": "50100506732021010105138718375", + "payer_merchant": "1900000001", + "payee_merchant": "1900000002", + "amount": 100, + "description": "20210115DESCRIPTION", + "out_subsidy_return_no": "subsidy-abcd-12345678" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.json new file mode 100644 index 00000000..6b171183 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/CreateMarketingBusifavorSubsidyReturnReceiptResponse.json @@ -0,0 +1,16 @@ +{ + "subsidy_return_receipt_id": "2120200119165100000000000001", + "stock_id": "128888000000001", + "coupon_code": "ABCD12345678", + "transaction_id": "4200000913202101152566792388", + "refund_id": "50100506732021010105138718375", + "payer_merchant": "1900000001", + "payee_merchant": "1900000002", + "amount": 100, + "description": "20210115DESCRIPTION", + "status": "SUCCESS", + "return_done_time": "2021-01-20T10:29:35.120+08:00", + "subsidy_receipt_id": "1120200119165100000000000001", + "out_subsidy_return_no": "subsidy-abcd-12345678", + "return_create_time": "2021-01-20T10:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.json new file mode 100644 index 00000000..b045ce3b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/Subsidy/GetMarketingBusifavorSubsidyPayReceiptBySubsidyReceiptIdResponse.json @@ -0,0 +1,14 @@ +{ + "subsidy_receipt_id": "1120200119165100000000000001", + "stock_id": "128888000000001", + "coupon_code": "ABCD12345678", + "transaction_id": "4200000913202101152566792388", + "payer_merchant": "1900000001", + "payee_merchant": "1900000002", + "amount": 100, + "description": "20210115DESCRIPTION", + "status": "SUCCESS", + "success_time": "2021-01-20T10:29:35.120+08:00", + "out_subsidy_no": "subsidy-abcd-12345678", + "create_time": "2021-01-20T10:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.json new file mode 100644 index 00000000..c220e009 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetRequest.json @@ -0,0 +1,5 @@ +{ + "target_max_coupons": 3000, + "current_max_coupons": 500, + "modify_budget_request_no": "1002600620019090123143254436" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.json new file mode 100644 index 00000000..6d4f1eb8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockBudgetResponse.json @@ -0,0 +1,4 @@ +{ + "max_coupons": 300, + "max_coupons_by_day": 100 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.json new file mode 100644 index 00000000..24316119 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockRequest.json @@ -0,0 +1,36 @@ +{ + "custom_entrance": { + "mini_programs_info": { + "mini_programs_appid": "wx234545656765876", + "mini_programs_path": "/path/index/index", + "entrance_words": "欢迎选购", + "guiding_words": "获取更多优惠" + }, + "appid": "wx324345hgfhfghfg", + "hall_id": "233455656", + "code_display_mode": "BARCODE" + }, + "stock_name": "8月1日活动券", + "comment": "活动使用", + "goods_name": "xxx商品使用", + "out_request_no": "6122352020010133287985742", + "display_pattern_info": { + "description": "xxx门店可用", + "merchant_logo_url": "https://xxx", + "merchant_name": "微信支付", + "background_color": "xxxxx", + "coupon_image_url": "图片cdn地址" + }, + "coupon_use_rule": { + "use_method": "OFF_LINE", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "stock_send_rule": { + "natural_person_limit": false, + "prevent_api_abuse": false + }, + "notify_config": { + "notify_appid": "wx23232232323" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UpdateMarketingBusifavorStockResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.json new file mode 100644 index 00000000..83016589 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesRequest.json @@ -0,0 +1,7 @@ +{ + "coupon_code_list": [ + "ABC9588200", + "ABC9588201" + ], + "upload_request_no": "100002322019090134234sfdf" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.json new file mode 100644 index 00000000..e2f5f7c5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UploadMarketingBusifavorStockCouponCodesResponse.json @@ -0,0 +1,23 @@ +{ + "stock_id": "98065001", + "total_count": 500, + "success_count": 20, + "success_codes": [ + "MMAA12345" + ], + "success_time": "2015-05-20T13:29:35+08:00", + "fail_count": 10, + "fail_codes": [ + { + "coupon_code": "ABCD23456", + "code": "LENGTH_LIMIT", + "message": "长度超过最大值32位" + } + ], + "exist_codes": [ + "ABCD2345" + ], + "duplicate_codes": [ + "AACC2345" + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.json new file mode 100644 index 00000000..78481855 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/GetMarketingBusifavorUserCouponByCouponCodeResponse.json @@ -0,0 +1,68 @@ +{ + "belong_merchant": "100000222", + "stock_name": "商家券", + "comment": "xxx可用", + "goods_name": "xxx商品可用", + "stock_type": "NORMAL", + "transferable": false, + "shareable": false, + "coupon_state": "SENDED", + "display_pattern_info": { + "description": "xxx门店可用", + "merchant_logo_url": "https://xxx", + "merchant_name": "微信支付", + "background_color": "Color020", + "coupon_image_url": "https://qpic.cn/xxx" + }, + "coupon_use_rule": { + "coupon_available_time": { + "available_begin_time": "2015-05-20T13:29:35+08:00", + "available_end_time": "2015-05-20T13:29:35+08:00", + "available_day_after_receive": 3, + "available_week": { + "week_day": [ + "1", + "2" + ], + "available_day_time": [ + { + "begin_time": 3600, + "end_time": 86399 + } + ] + }, + "irregulary_avaliable_time": [ + { + "begin_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00" + } + ] + }, + "fixed_normal_coupon": { + "discount_amount": 5, + "transaction_minimum": 100 + }, + "use_method": "OFF_LINE", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "custom_entrance": { + "mini_programs_info": { + "mini_programs_appid": "wx234545656765876", + "mini_programs_path": "/path/index/index", + "entrance_words": "欢迎选购", + "guiding_words": "获取更多优惠" + }, + "appid": "wx324345hgfhfghfg", + "hall_id": "233455656", + "store_id": "233554655" + }, + "coupon_code": "123446565767", + "stock_id": "1002323", + "available_start_time": "2019-12-30T13:29:35+08:00", + "expire_time": "2019-12-31T13:29:35+08:00", + "receive_time": "2019-12-30T13:29:35+08:00", + "send_request_no": "MCHSEND202003101234", + "use_request_no": "MCHSEND202003101234", + "use_time": "2019-12-30T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsResponse.json new file mode 100644 index 00000000..840f63e7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingBusifavor/UserCoupons/QueryMarketingBusifavorUserCouponsResponse.json @@ -0,0 +1,74 @@ +{ + "data": [ + { + "belong_merchant": "100000222", + "stock_name": "商家券", + "comment": "xxx可用", + "goods_name": "xxx商品可用", + "stock_type": "NORMAL", + "transferable": false, + "shareable": "false", + "coupon_state": "SENDED", + "display_pattern_info": { + "merchant_logo_url": "https://xxx", + "merchant_name": "微信支付", + "background_color": "Color020", + "coupon_image_url": "https://qpic.cn/xxx" + }, + "coupon_use_rule": { + "coupon_available_time": { + "available_begin_time": "2015-05-20T13:29:35+08:00", + "available_end_time": "2015-05-20T13:29:35+08:00", + "available_day_after_receive": 3, + "available_week": { + "week_day": [ + "1", + "2" + ], + "available_day_time": [ + { + "begin_time": 3600, + "end_time": 86399 + } + ] + }, + "irregulary_avaliable_time": [ + { + "begin_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00" + } + ] + }, + "fixed_normal_coupon": { + "discount_amount": 5, + "transaction_minimum": 100 + }, + "use_method": "OFF_LINE", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "custom_entrance": { + "mini_programs_info": { + "mini_programs_appid": "wx234545656765876", + "mini_programs_path": "/path/index/index", + "entrance_words": "欢迎选购", + "guiding_words": "获取更多优惠" + }, + "appid": "wx324345hgfhfghfg", + "hall_id": "233455656", + "store_id": "233554655" + }, + "coupon_code": "123446565767", + "stock_id": "1002323", + "available_start_time": "2019-12-30T13:29:35+08:00", + "expire_time": "2019-12-31T13:29:35+08:00", + "receive_time": "2019-12-30T13:29:35+08:00", + "send_request_no": "MCHSEND202003101234", + "use_request_no": "MCHSEND202003101234", + "use_time": "2019-12-30T13:29:35+08:00" + } + ], + "total_count": 100, + "limit": 10, + "offset": 1 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.json new file mode 100644 index 00000000..44a77c34 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackRequest.json @@ -0,0 +1,4 @@ +{ + "mchid": "9856888", + "notify_url": "https://pay.weixin.qq.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.json new file mode 100644 index 00000000..92972df4 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/Callbacks/UpdateMarketingFavorCallbackResponse.json @@ -0,0 +1,4 @@ +{ + "update_time": "2015-05-20T13:29:35.120+08:00", + "notify_url": "api.weixin.qq.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockRequest.json new file mode 100644 index 00000000..1b384a87 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockRequest.json @@ -0,0 +1,45 @@ +{ + "stock_name": "微信支付代金券批次", + "comment": "零售批次", + "belong_merchant": "98568865", + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "stock_use_rule": { + "max_coupons": 100, + "max_amount": 5000, + "max_amount_by_day": 400, + "max_coupons_per_user": 3, + "natural_person_limit": false, + "prevent_api_abuse": false + }, + "pattern_info": { + "description": "微信支付营销代金券", + "merchant_logo": "https://qpic.cn/xxx", + "merchant_name": "微信支付", + "background_color": "COLOR020", + "coupon_image": "https://qpic.cn/xxx" + }, + "coupon_use_rule": { + "fixed_normal_coupon": { + "coupon_amount": 50, + "transaction_minimum": 100 + }, + "goods_tag": [ + "123321", + "123322" + ], + "trade_type": [ "OTHER", "APPPAY" ], + "combine_use": false, + "available_items": [ + "123321", + "123322" + ], + "available_merchants": [ + "9856000", + "9856001" + ] + }, + "no_cash": false, + "stock_type": "NORMAL", + "out_request_no": "89560002019101000121" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockResponse.json new file mode 100644 index 00000000..aec8d898 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/CreateMarketingFavorStockResponse.json @@ -0,0 +1,4 @@ +{ + "stock_id": "98065001", + "create_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdResponse.json new file mode 100644 index 00000000..f81303ab --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockByStockIdResponse.json @@ -0,0 +1,25 @@ +{ + "stock_id": "9836588", + "stock_creator_mchid": "123456", + "stock_name": "微信支付批次", + "status": "paused", + "create_time": "2015-05-20T13:29:35.120+08:00", + "description": "微信支付营销", + "stock_use_rule": { + "max_coupons": 100, + "max_amount": 5000, + "max_amount_by_day": 400, + "max_coupons_per_user": 3, + "trade_type": "MICROAPP" + }, + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "distributed_coupons": 100, + "no_cash": true, + "cut_to_message": { + "single_price_max": 100, + "cut_to_price": 5000 + }, + "singleitem": true, + "stock_type": "NORMAL" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.json new file mode 100644 index 00000000..ec362ccf --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockRefundFlowResponse.json @@ -0,0 +1,5 @@ +{ + "hash_type": "SHA1", + "hash_value": "8ae0eb442c408d2e90d669d6f4ad6b7e6e049d6f", + "url": "download://example.csv" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowResponse.json new file mode 100644 index 00000000..ec362ccf --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/GetMarketingFavorStockUseFlowResponse.json @@ -0,0 +1,5 @@ +{ + "hash_type": "SHA1", + "hash_value": "8ae0eb442c408d2e90d669d6f4ad6b7e6e049d6f", + "url": "download://example.csv" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockRequest.json new file mode 100644 index 00000000..f7ccd18a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockRequest.json @@ -0,0 +1,3 @@ +{ + "stock_creator_mchid": "8956000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockResponse.json new file mode 100644 index 00000000..b7aedd4a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/PauseMarketingFavorStockResponse.json @@ -0,0 +1,4 @@ +{ + "start_time": "2015-05-20T13:29:35.120+08:00", + "stock_id": "8965000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsResponse.json new file mode 100644 index 00000000..daf26731 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockItemsResponse.json @@ -0,0 +1,6 @@ +{ + "stock_id": "9865000", + "total_count": "200", + "offset": "10", + "limit": "10" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.json new file mode 100644 index 00000000..6b1077eb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStockMerchantsResponse.json @@ -0,0 +1,9 @@ +{ + "data": [ + "2480248941" + ], + "limit": 5, + "offset": 0, + "stock_id": "15019035", + "total_count": 1 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksResponse.json new file mode 100644 index 00000000..509d506f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/QueryMarketingFavorStocksResponse.json @@ -0,0 +1,32 @@ +{ + "total_count": 10, + "data": [ + { + "stock_id": "9836588", + "stock_creator_mchid": "123456", + "stock_name": "微信支付批次", + "status": "paused", + "create_time": "2015-05-20T13:29:35.120+08:00", + "description": "微信支付营销", + "stock_use_rule": { + "max_coupons": 100, + "max_amount": 5000, + "max_amount_by_day": 400, + "fixed_normal_coupon": { + "coupon_amount": 100, + "transaction_minimum": 100 + }, + "max_coupons_per_user": 3, + "trade_type": "APPPAY" + }, + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "distributed_coupons": 100, + "no_cash": true, + "singleitem": true, + "stock_type": "NORMAL" + } + ], + "limit": 8, + "offset": 1 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockRequest.json new file mode 100644 index 00000000..65b17de5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockRequest.json @@ -0,0 +1,3 @@ +{ + "stock_creator_mchid": "8956000" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockResponse.json new file mode 100644 index 00000000..b7aedd4a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/RestartMarketingFavorStockResponse.json @@ -0,0 +1,4 @@ +{ + "start_time": "2015-05-20T13:29:35.120+08:00", + "stock_id": "8965000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockRequest.json new file mode 100644 index 00000000..f7ccd18a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockRequest.json @@ -0,0 +1,3 @@ +{ + "stock_creator_mchid": "8956000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockResponse.json new file mode 100644 index 00000000..630ff928 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/StartMarketingFavorStockResponse.json @@ -0,0 +1,4 @@ +{ + "start_time": "2015-05-20T13:29:35.120+08:00", + "stock_id": "9865000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.json new file mode 100644 index 00000000..5b107dfd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/GetMarketingFavorUserCouponByCouponIdResponse.json @@ -0,0 +1,23 @@ +{ + "stock_creator_mchid": "9800064", + "stock_id": "9865888", + "coupon_id": "98674556", + "cut_to_message": { + "single_price_max": 100, + "cut_to_price": 100 + }, + "coupon_name": "微信支付代金券", + "status": "EXPIRED", + "description": "微信支付营销", + "create_time": "2015-05-20T13:29:35.120+08:00", + "coupon_type": "CUT_TO", + "no_cash": true, + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "singleitem": true, + "normal_coupon_information": { + "coupon_amount": 100, + "transaction_minimum": 100 + } + +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.json new file mode 100644 index 00000000..406523bd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/QueryMarketingFavorUserCouponsResponse.json @@ -0,0 +1,42 @@ +{ + "data": [ + { + "stock_creator_mchid": "9800064", + "stock_id": "9865888", + "coupon_id": "98674556", + "cut_to_message": { + "single_price_max": 100, + "cut_to_price": 100 + }, + "coupon_name": "微信支付代金券", + "status": "EXPIRED", + "description": "微信支付营销", + "create_time": "2015-05-20T13:29:35.120+08:00", + "coupon_type": "CUT_TO", + "no_cash": true, + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "singleitem": true, + "normal_coupon_information": { + "coupon_amount": 100, + "transaction_minimum": 100 + }, + "consume_information": { + "consume_time": "2015-05-20T13:29:35.120+08:00", + "consume_mchid": "9856081", + "transaction_id": "2345234523", + "goods_detail": [ + { + "goods_id": "a_goods1", + "quantity": 7, + "price": 1, + "discount_amount": 4 + } + ] + } + } + ], + "total_count": 100, + "limit": 10, + "offset": 10 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.json new file mode 100644 index 00000000..06f1fe97 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponRequest.json @@ -0,0 +1,6 @@ +{ + "stock_id": "9856000", + "out_request_no": "89560002019101000121", + "appid": "wx233544546545989", + "stock_creator_mchid": "8956000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.json new file mode 100644 index 00000000..8231e24c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingFavor/UsersCoupons/SendMarketingFavorUserCouponResponse.json @@ -0,0 +1,3 @@ +{ + "coupon_id": "9867041" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageResponse.json new file mode 100644 index 00000000..99699eaf --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMedia/UploadMarketingMediaImageResponse.json @@ -0,0 +1,3 @@ +{ + "media_url": "https://qpic.cn/xxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipRequest.json new file mode 100644 index 00000000..ec300f47 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipRequest.json @@ -0,0 +1,10 @@ +{ + "authorized_data": { + "business_type": "FAVOR_STOCK", + "stock_id": "2433405" + }, + "partner": { + "appid": "wx4e1916a585d1f4e9", + "type": "APPID" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipResponse.json new file mode 100644 index 00000000..2c47e210 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/BuildMarketingPartnershipResponse.json @@ -0,0 +1,15 @@ +{ + "authorized_data": { + "business_type": "FAVOR_STOCK", + "scenarios": [ "" ], + "stock_id": "2433405" + }, + "update_time": "2015-05-20T13:29:35.120+08:00", + "partner": { + "appid": "wx4e1916a585d1f4e9", + "type": "APPID" + }, + "create_time": "2015-05-20T13:29:35.120+08:00", + "build_time": "2015-05-20T13:29:35.120+08:00", + "state": "ESTABLISHED" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsResponse.json new file mode 100644 index 00000000..c847285d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/QueryMarketingPartnershipsResponse.json @@ -0,0 +1,35 @@ +{ + "data": [ + { + "authorized_data": { + "business_type": "FAVOR_STOCK", + "stock_id": "2433405" + }, + "partner": { + "appid": "wx4e1916a585d1f4e9", + "type": "APPID" + }, + "update_time": "2015-05-20T13:29:35.120+08:00", + "create_time": "2015-05-20T13:29:35.120+08:00", + "build_time": "2015-05-20T13:29:35.120+08:00", + "terminate_time": "2015-05-20T13:29:35.120+08:00" + }, + { + "authorized_data": { + "business_type": "FAVOR_STOCK", + "stock_id": "2433405" + }, + "partner": { + "appid": "wx4e1916a585d1f4e9", + "type": "APPID" + }, + "update_time": "2015-05-20T13:29:35.120+08:00", + "create_time": "2015-05-20T13:29:35.120+08:00", + "build_time": "2015-05-20T13:29:35.120+08:00", + "terminate_time": "2015-05-20T13:29:35.120+08:00" + } + ], + "offset": 0, + "total_count": 2, + "limit": 5 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipRequest.json new file mode 100644 index 00000000..ec300f47 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipRequest.json @@ -0,0 +1,10 @@ +{ + "authorized_data": { + "business_type": "FAVOR_STOCK", + "stock_id": "2433405" + }, + "partner": { + "appid": "wx4e1916a585d1f4e9", + "type": "APPID" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipResponse.json new file mode 100644 index 00000000..fbb54b34 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPartnerships/TerminateMarketingPartnershipResponse.json @@ -0,0 +1,3 @@ +{ + "terminate_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantRequest.json new file mode 100644 index 00000000..c70870b4 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantRequest.json @@ -0,0 +1,4 @@ +{ + "merchant_id_list": [ "100123456", "100123457" ], + "add_request_no": "100002322019090134234sfdf" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantResponse.json new file mode 100644 index 00000000..4a83902b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/AddMarketingPayGiftActivityMerchantResponse.json @@ -0,0 +1,14 @@ +{ + "activity_id": "1001234567", + "invalid_merchant_id_list": [ + { + "mchid": "1001234567", + "invalid_reason": "商户与活动创建方不具备父子关系" + }, + { + "mchid": "1001234567", + "invalid_reason": "商户与活动创建方不具备父子关系" + } + ], + "add_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.json new file mode 100644 index 00000000..dd676ff2 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityRequest.json @@ -0,0 +1,53 @@ +{ + "activity_base_info": { + "activity_name": "良品铺子回馈活动", + "activity_second_title": "海飞丝的券", + "merchant_logo_url": "https://tool.oschina.net/regex.jpg", + "background_color": "COLOR010", + "begin_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00", + "available_periods": { + "available_time": [ + { + "begin_time": "2015-05-20T00:00:00+08:00", + "end_time": "2015-05-20T23:59:59+08:00" + } + ], + "available_day_time": [ + { + "begin_day_time": "110000", + "end_day_time": "135959" + } + ] + }, + "out_request_no": "100002322019090134234sfdf", + "delivery_purpose": "OFF_LINE_PAY", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "award_send_rule": { + "transaction_amount_minimum": 100, + "send_content": "SINGLE_COUPON", + "award_type": "BUSIFAVOR", + "award_list": [ + { + "stock_id": "98065001", + "original_image_url": "https://tool.oschina.net/regex.jpg", + "thumbnail_url": "https://tool.oschina.net/regex.jpg" + } + ], + "merchant_option": "MANUAL_INPUT_MERCHANT", + "merchant_id_list": [ + "10000022", + "10000023" + ] + }, + "advanced_setting": { + "delivery_user_category": "DELIVERY_MEMBER_PERSON", + "merchant_member_appid": "34567890", + "goods_tags": [ + "xxx", + "yyy" + ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.json new file mode 100644 index 00000000..ffaba823 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/CreateMarketingPayGiftActivityUniqueThresholdActivityResponse.json @@ -0,0 +1,4 @@ +{ + "activity_id": "10028001", + "create_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantRequest.json new file mode 100644 index 00000000..6982ca34 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantRequest.json @@ -0,0 +1,4 @@ +{ + "merchant_id_list": [ "100123456", "100123457" ], + "delete_request_no": "100002322019090134234sfdf" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantResponse.json new file mode 100644 index 00000000..f56c4286 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/DeleteMarketingPayGiftActivityMerchantResponse.json @@ -0,0 +1,4 @@ +{ + "delete_time": "2015-05-20T13:29:35+08:00", + "activity_id": "126002309" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.json new file mode 100644 index 00000000..1e0c9f54 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/GetMarketingPayGiftActivityByActivityIdResponse.json @@ -0,0 +1,60 @@ +{ + "activity_id": "10028001", + "activity_type": "FULL_SEND_ACT_TYPE", + "activity_base_info": { + "activity_name": "良品铺子回馈活动", + "activity_second_title": "海飞丝的券", + "merchant_logo_url": "https://tool.oschina.net/regex.jpg", + "background_color": "COLOR020", + "begin_time": "2015-05-20T13:29:35+08:00", + "end_time": "2015-05-20T13:29:35+08:00", + "available_periods": { + "available_time": [ + { + "begin_time": "2015-05-20T00:00:00+08:00", + "end_time": "2015-05-20T23:59:59+08:00" + } + ], + "available_day_time": [ + { + "begin_day_time": "110000", + "end_day_time": "135959" + } + ] + }, + "out_request_no": "100002322019090134234sfdf", + "delivery_purpose": "OFF_LINE_PAY", + "mini_programs_appid": "wx23232232323", + "mini_programs_path": "/path/index/index" + }, + "award_send_rule": { + "full_send_rule": { + "transaction_amount_minimum": 100, + "send_content": "SINGLE_COUPON", + "award_type": "BUSIFAVOR", + "award_list": [ + { + "stock_id": "98065001", + "original_image_url": "https://tool.oschina.net/regex.jpg", + "thumbnail_url": "https://tool.oschina.net/regex.jpg" + } + ], + "merchant_option": "MANUAL_INPUT_MERCHANT" + } + }, + "advanced_setting": { + "delivery_user_category": "DELIVERY_MEMBER_PERSON", + "merchant_member_appid": "34567890", + "goods_tags": [ + "xxx", + "yyy" + ] + }, + "activity_status": "CREATE_ACT_STATUS", + "creator_merchant_id": "10000022", + "belong_merchant_id": "10000022", + "pause_time": "2015-05-20T13:29:35+08:00", + "recovery_time": "2015-05-20T13:29:35+08:00", + "create_time": "2015-05-20T13:29:35+08:00", + "update_time": "2015-05-20T13:29:35+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.json new file mode 100644 index 00000000..3adb74d2 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivitiesResponse.json @@ -0,0 +1,93 @@ +{ + "data": [ + { + "activity_base_info": { + "activity_name": "满减活动", + "activity_second_title": "满减活动副", + "background_color": "COLOR010", + "begin_time": "2020-06-02T10:00:00+08:00", + "delivery_purpose": "JUMP_MINI_APP", + "end_time": "2020-06-02T23:29:35+08:00", + "merchant_logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEI1qUibGfkJ4N3JCS5EmAH5xVmo9iam8msMM0XopTYGDGOQ/0", + "mini_programs_appid": "wxab8acb865bb1637e", + "mini_programs_path": "/path/index/index", + "out_request_no": "100002322020-0602-1047-99" + }, + "activity_id": "20406354", + "activity_status": "OVER_TIME_ACT_STATUS", + "activity_type": "FULL_SEND_ACT_TYPE", + "advanced_setting": { + "delivery_user_category": "DELIVERY_ALL_PERSON", + "goods_tags": [ + "0602-1047-99" + ] + }, + "award_send_rule": { + "full_send_rule": { + "award_list": [ + { + "original_image_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEI1qUibGfkJ4N3JCS5EmAH5xVmo9iam8msMM0XopTYGDGOQ/0", + "stock_id": "1263540000000013", + "thumbnail_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEI1qUibGfkJ4N3JCS5EmAH5xVmo9iam8msMM0XopTYGDGOQ/0" + } + ], + "award_type": "BUSIFAVOR", + "merchant_id_list": [], + "merchant_option": "MANUAL_INPUT_MERCHANT", + "send_content": "SINGLE_COUPON", + "transaction_amount_minimum": 1 + } + }, + "belong_merchant_id": "1900009251", + "create_time": "2020-06-02T10:47:26+08:00", + "creator_merchant_id": "1900009251", + "update_time": "2020-06-05T10:26:08+08:00" + }, + { + "activity_base_info": { + "activity_name": "满减活动", + "activity_second_title": "满减活动副", + "background_color": "COLOR010", + "begin_time": "2020-06-01T10:00:00+08:00", + "delivery_purpose": "JUMP_MINI_APP", + "end_time": "2020-06-01T23:29:35+08:00", + "merchant_logo_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEI1qUibGfkJ4N3JCS5EmAH5xVmo9iam8msMM0XopTYGDGOQ/0", + "mini_programs_appid": "wxab8acb865bb1637e", + "mini_programs_path": "/path/index/index", + "out_request_no": "100002322020-0601-1147-99" + }, + "activity_id": "10406354", + "activity_status": "OVER_TIME_ACT_STATUS", + "activity_type": "FULL_SEND_ACT_TYPE", + "advanced_setting": { + "delivery_user_category": "DELIVERY_ALL_PERSON", + "goods_tags": [ + "0601-1147-99" + ] + }, + "award_send_rule": { + "full_send_rule": { + "award_list": [ + { + "original_image_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEI1qUibGfkJ4N3JCS5EmAH5xVmo9iam8msMM0XopTYGDGOQ/0", + "stock_id": "1263540000000012", + "thumbnail_url": "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEI1qUibGfkJ4N3JCS5EmAH5xVmo9iam8msMM0XopTYGDGOQ/0" + } + ], + "award_type": "BUSIFAVOR", + "merchant_id_list": [], + "merchant_option": "MANUAL_INPUT_MERCHANT", + "send_content": "SINGLE_COUPON", + "transaction_amount_minimum": 1 + } + }, + "belong_merchant_id": "1900009251", + "create_time": "2020-06-01T11:49:06+08:00", + "creator_merchant_id": "1900009251", + "update_time": "2020-06-05T10:26:08+08:00" + } + ], + "total_count": 2, + "offset": 1, + "limit": 20 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsResponse.json new file mode 100644 index 00000000..30a31367 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityGoodsResponse.json @@ -0,0 +1,13 @@ +{ + "data": [ + { + "goods_id": "0345678", + "create_time": "2015-05-20T13:29:35+08:00", + "update_time": "2015-05-20T13:29:35+08:00" + } + ], + "total_count": 24, + "offset": 4, + "limit": 20, + "activity_id": "10028001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsResponse.json new file mode 100644 index 00000000..930b8ed0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/QueryMarketingPayGiftActivityMerchantsResponse.json @@ -0,0 +1,14 @@ +{ + "data": [ + { + "mchid": "6002309", + "merchant_name": "良品铺子", + "create_time": "2015-05-20T13:29:35+08:00", + "update_time": "2015-05-20T13:29:35+08:00" + } + ], + "total_count": 30, + "offset": 4, + "limit": 20, + "activity_id": "126002309" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.json new file mode 100644 index 00000000..c159a91c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingPayGiftActivity/TerminateMarketingPayGiftActivityResponse.json @@ -0,0 +1,4 @@ +{ + "terminate_time": "2015-05-20T13:29:35+08:00", + "activity_id": "10028001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceResponse.json new file mode 100644 index 00000000..fd9a9a08 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundBalanceResponse.json @@ -0,0 +1,4 @@ +{ + "available_amount": 10000, + "pending_amount": 0 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.json new file mode 100644 index 00000000..fd9a9a08 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundBalance/GetMerchantFundDayendBalanceResponse.json @@ -0,0 +1,4 @@ +{ + "available_amount": 10000, + "pending_amount": 0 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.json new file mode 100644 index 00000000..bc958bce --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/Bill/GetMerchantFundWithdrawBillResponse.json @@ -0,0 +1,5 @@ +{ + "hash_type": "SHA1", + "hash_value": "79bb0f45fc4c42234a918000b2668d689e2bde04", + "download_url": "https://xxxx.xxx.xxx" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.json new file mode 100644 index 00000000..30222e8c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawRequest.json @@ -0,0 +1,7 @@ +{ + "out_request_no": "20190611222222222200000000012122", + "amount": 1, + "remark": "交易提现", + "bank_memo": "xx平台提现", + "account_type": "BASIC" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.json new file mode 100644 index 00000000..ebe0dc10 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/CreateMerchantFundWithdrawResponse.json @@ -0,0 +1,4 @@ +{ + "withdraw_id": "123219371982379127391327917929791239112123", + "out_request_no": "2019061122220000012122" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.json new file mode 100644 index 00000000..fdad9fdd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByOutRequestNumberResponse.json @@ -0,0 +1,13 @@ +{ + "status": "CREATE_SUCCESS", + "withdraw_id": "12321937198237912739132791732912793127931279317929791239112123", + "out_request_no": "20190611222222222200000000012122", + "amount": 1, + "create_time": "2015-05-20T13:29:35.120+08:00", + "update_time": "2015-05-20T13:29:35.120+08:00", + "reason": "卡号错误", + "remark": "交易提现", + "bank_memo": "微信提现", + "account_type": "BASIC", + "solution": "请修改结算银行卡信息" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.json new file mode 100644 index 00000000..fdad9fdd --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantFundWithdraw/GetMerchantFundWithdrawByWithdrawIdResponse.json @@ -0,0 +1,13 @@ +{ + "status": "CREATE_SUCCESS", + "withdraw_id": "12321937198237912739132791732912793127931279317929791239112123", + "out_request_no": "20190611222222222200000000012122", + "amount": 1, + "create_time": "2015-05-20T13:29:35.120+08:00", + "update_time": "2015-05-20T13:29:35.120+08:00", + "reason": "卡号错误", + "remark": "交易提现", + "bank_memo": "微信提现", + "account_type": "BASIC", + "solution": "请修改结算银行卡信息" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageResponse.json new file mode 100644 index 00000000..3b134421 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaImageResponse.json @@ -0,0 +1,3 @@ +{ + "media_id": "H1ihR9JUtVj-J7CJqBUY5ZOrG_Je75H-rKhTG7FUmg9sxNTbRN54dFiUHnhgrBQ6EKeHoGcHTJMHn5TAuLVjHUQDBInSWXcIHYXOeRa2OHA " +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoResponse.json new file mode 100644 index 00000000..3b134421 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantMedia/UploadMerchantMediaVideoResponse.json @@ -0,0 +1,3 @@ +{ + "media_id": "H1ihR9JUtVj-J7CJqBUY5ZOrG_Je75H-rKhTG7FUmg9sxNTbRN54dFiUHnhgrBQ6EKeHoGcHTJMHn5TAuLVjHUQDBInSWXcIHYXOeRa2OHA " +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.json new file mode 100644 index 00000000..9adfb481 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationRequest.json @@ -0,0 +1,3 @@ +{ + "url": "https://www.xxx.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.json new file mode 100644 index 00000000..bdbcf083 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/CreateMerchantServiceComplaintNotificationResponse.json @@ -0,0 +1,4 @@ +{ + "mchid": "1900012181", + "url": "https://www.xxx.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/DeleteMerchantServiceComplaintNotificationResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.json new file mode 100644 index 00000000..bdbcf083 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/GetMerchantServiceComplaintNotificationResponse.json @@ -0,0 +1,4 @@ +{ + "mchid": "1900012181", + "url": "https://www.xxx.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.json new file mode 100644 index 00000000..9adfb481 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationRequest.json @@ -0,0 +1,3 @@ +{ + "url": "https://www.xxx.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.json new file mode 100644 index 00000000..bdbcf083 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintNotifications/UpdateMerchantServiceComplaintNotificationResponse.json @@ -0,0 +1,4 @@ +{ + "mchid": "1900012181", + "url": "https://www.xxx.com/notify" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.json new file mode 100644 index 00000000..3c67a251 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseRequest.json @@ -0,0 +1,7 @@ +{ + "complainted_mchid": "1900012181", + "response_content": "已与用户沟通解决", + "response_images": [ + "file23578_21798531.jpg" + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/CreateMerchantServiceComplaintResponseResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json new file mode 100644 index 00000000..e4be7b54 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/GetMerchantServiceComplaintByComplaintIdResponse.json @@ -0,0 +1,19 @@ +{ + "complaint_id": "200201820200101080076610000", + "complaint_time": "2015-05-20T13:29:35.120+08:00", + "complaint_detail": "反馈一个重复扣费的问题", + "complainted_mchid": "1900012181", + "complaint_state": "PENDING", + "payer_phone": "sGdNeTHMQGlxCWiUyHu6XNO9GCYln2Luv4HhwJzZBfcL12sB", + "payer_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "complaint_order_info": [ + { + "transaction_id": "4200000404201909069117582536", + "out_trade_no": "20190906154617947762231", + "amount": 3 + } + ], + "complaint_full_refunded": true, + "incoming_user_response": true, + "user_complaint_times": 1 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json new file mode 100644 index 00000000..630cc6a5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintNegotiationHistoriesResponse.json @@ -0,0 +1,17 @@ +{ + "data": [ + { + "log_id": "300285320210322170000071077", + "operator": "投诉人", + "operate_time": "2015-05-20T13:29:35.120+08:00", + "operate_type": "USER_CREATE_COMPLAINT", + "operate_details": "已与用户电话沟通解决", + "image_list": [ + "https://qpic.cn/xxx" + ] + } + ], + "limit": 10, + "offset": 50, + "total_count": 1000 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json new file mode 100644 index 00000000..6bc2e55b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/QueryMerchantServiceComplaintsResponse.json @@ -0,0 +1,30 @@ +{ + "data": [ + { + "complaint_id": "200201820200101080076610000", + "complaint_time": "2015-05-20T13:29:35.120+08:00", + "complaint_detail": "反馈一个重复扣费的问题", + "complaint_state": "PENDING", + "payer_phone": "Qe41VhP/sGdNeTHMQGlxCWiUyHu6XNO9GCYln2Luv4HhwJzZBfcL12sB+PgZcS5NhePBog30NgJ1xRaK+gbGDKwpg==", + "payer_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "complaint_order_info": [ + { + "transaction_id": "4200000404201909069117582536", + "out_trade_no": "20190906154617947762231", + "amount": 3 + }, + { + "transaction_id": "4200000404201909069117982536", + "out_trade_no": "20190906154617947772231", + "amount": 9 + } + ], + "complaint_full_refunded": true, + "incoming_user_response": true, + "user_complaint_times": 1 + } + ], + "limit": 5, + "offset": 10, + "total_count": 1000 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.json new file mode 100644 index 00000000..9cb1135d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteRequest.json @@ -0,0 +1,3 @@ +{ + "complainted_mchid": "1900012181" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/ComplaintsV2/SetMerchantServiceComplaintCompleteResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageResponse.json new file mode 100644 index 00000000..99fed1ff --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MerchantService/UploadMerchantServiceImageResponse.json @@ -0,0 +1,3 @@ +{ + "media_id": "BB04A5DEEFEA18D4F2554C1EDD3B610B.bmp" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionRequest.json new file mode 100644 index 00000000..2e09be83 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionRequest.json @@ -0,0 +1,4 @@ +{ + "sp_mchid": "1900007XXX", + "sub_mchid": "1900008XXX" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/ClosePayPartnerTransactionResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.json new file mode 100644 index 00000000..bdd7e2ca --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppRequest.json @@ -0,0 +1,13 @@ +{ + "sp_mchid": "1900007XXX", + "sub_mchid": "1900008XXX", + "out_trade_no": "APP1217752501201407033233368018", + "sp_appid": "wxdace645e0bc2cXXX", + "sub_appid": "wxb4ba3c02aa476XXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.json new file mode 100644 index 00000000..c6ad959b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionAppResponse.json @@ -0,0 +1,3 @@ +{ + "prepay_id": "wx26115431944423b7abc1d67996baf00000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.json new file mode 100644 index 00000000..8519b303 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Request.json @@ -0,0 +1,18 @@ +{ + "sp_mchid": "1900006XXX", + "out_trade_no": "H51217752501201407033233368018", + "sp_appid": "wxdace645e0bc2cXXX", + "sub_mchid": "1900006XXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + }, + "scene_info": { + "payer_client_ip": "127.0.0.1", + "h5_info": { + "type": "Wap" + } + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.json new file mode 100644 index 00000000..30c11776 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionH5Response.json @@ -0,0 +1,3 @@ +{ + "h5_url": "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.json new file mode 100644 index 00000000..825b693c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiRequest.json @@ -0,0 +1,16 @@ +{ + "sp_mchid": "1900007XXX", + "sub_mchid": "1900008XXX", + "out_trade_no": "1217752501201407033233368318", + "sp_appid": "wxdace645e0bc2cXXX", + "sub_appid": "wxdace645e0bc2cXXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + }, + "payer": { + "sp_openid": "o4GgauInH_RCEdvrrNGrntXDuXXX" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.json new file mode 100644 index 00000000..289a5274 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionJsapiResponse.json @@ -0,0 +1,3 @@ +{ + "prepay_id": "wx2611215250487459928b659bd466620000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.json new file mode 100644 index 00000000..80045612 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeRequest.json @@ -0,0 +1,13 @@ +{ + "sp_mchid": "1900007XXX", + "sub_mchid": "1900008XXX", + "out_trade_no": "native12177525012014070332333", + "sp_appid": "wxdace645e0bc2cXXX", + "sub_appid": "wxdace645e0bc2cXXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.json new file mode 100644 index 00000000..d5a929a5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/CreatePayPartnerTransactionNativeResponse.json @@ -0,0 +1,3 @@ +{ + "code_url": "weixin://wxpay/bizpayurl?pr=qnu8GBtzz" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.json new file mode 100644 index 00000000..5abc04be --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByIdResponse.json @@ -0,0 +1,25 @@ +{ + "amount": { + "currency": "CNY", + "payer_currency": "CNY", + "payer_total": 2, + "total": 2 + }, + "attach": "", + "bank_type": "CMB_DEBIT", + "out_trade_no": "b3682ea011c547a49e8d7cc93107b71c", + "payer": { + "sp_openid": "o4GgauMQHaUO8ujCGIXNKATQlXXX", + "sub_openid": "o4GgauMQHaUO8ujCGIXNKATQlXXX" + }, + "promotion_detail": [], + "sp_appid": "wxdace645e0bc2cXXX", + "sp_mchid": "1900007XXX", + "sub_appid": "wxdace645e0bc2cXXX", + "sub_mchid": "1900008XXX", + "success_time": "2021-03-03T15:27:14+08:00", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "trade_type": "JSAPI", + "transaction_id": "4200000985202103031441826014" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.json new file mode 100644 index 00000000..5abc04be --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayPartnerTransactions/GetPayPartnerTransactionByOutTradeNumberResponse.json @@ -0,0 +1,25 @@ +{ + "amount": { + "currency": "CNY", + "payer_currency": "CNY", + "payer_total": 2, + "total": 2 + }, + "attach": "", + "bank_type": "CMB_DEBIT", + "out_trade_no": "b3682ea011c547a49e8d7cc93107b71c", + "payer": { + "sp_openid": "o4GgauMQHaUO8ujCGIXNKATQlXXX", + "sub_openid": "o4GgauMQHaUO8ujCGIXNKATQlXXX" + }, + "promotion_detail": [], + "sp_appid": "wxdace645e0bc2cXXX", + "sp_mchid": "1900007XXX", + "sub_appid": "wxdace645e0bc2cXXX", + "sub_mchid": "1900008XXX", + "success_time": "2021-03-03T15:27:14+08:00", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "trade_type": "JSAPI", + "transaction_id": "4200000985202103031441826014" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsRequest.json new file mode 100644 index 00000000..580afc4e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsRequest.json @@ -0,0 +1,6 @@ +{ + "service_id": "500001", + "appid": "wxd678efh567hg6787", + "authorization_code": "1234323JKHDFE1243252", + "notify_url": "http://www.qq.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsResponse.json new file mode 100644 index 00000000..78b7ee74 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/ApplyPayScorePermissionsResponse.json @@ -0,0 +1,3 @@ +{ + "apply_permissions_token": "apply_permissions_token" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.json new file mode 100644 index 00000000..e64d628f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByAuthorizationCodeResponse.json @@ -0,0 +1,11 @@ +{ + "service_id": "2002000000000558128851361561536", + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "authorization_code": "1275342195190894594", + "authorization_state": "UNAVAILABLE", + "notify_url": "https://www.weixin.com", + "cancel_authorization_time": "2015-05-20T13:29:35.120+08:00", + "authorization_success_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.json new file mode 100644 index 00000000..e64d628f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/GetPayScorePermissionsByOpenIdResponse.json @@ -0,0 +1,11 @@ +{ + "service_id": "2002000000000558128851361561536", + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "authorization_code": "1275342195190894594", + "authorization_state": "UNAVAILABLE", + "notify_url": "https://www.weixin.com", + "cancel_authorization_time": "2015-05-20T13:29:35.120+08:00", + "authorization_success_time": "2015-05-20T13:29:35.120+08:00" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.json new file mode 100644 index 00000000..859fba7f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeRequest.json @@ -0,0 +1,4 @@ +{ + "service_id": "500001", + "reason": "撤销原因" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByAuthorizationCodeResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.json new file mode 100644 index 00000000..859fba7f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdRequest.json @@ -0,0 +1,4 @@ +{ + "service_id": "500001", + "reason": "撤销原因" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScorePermissions/TerminatePayScorePermissionsByOpenIdResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.json new file mode 100644 index 00000000..b573cc3e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderRequest.json @@ -0,0 +1,5 @@ +{ + "appid": "wxd678efh567hg6787", + "service_id": "500001", + "reason": "用户投诉" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.json new file mode 100644 index 00000000..ac12cdbe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CancelPayScoreServiceOrderResponse.json @@ -0,0 +1,7 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_order_no": "1230000109", + "service_id": "500001", + "order_id": "15646546545165651651" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.json new file mode 100644 index 00000000..b828a2de --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.json @@ -0,0 +1,50 @@ +{ + "post_payments": [ + { + "amount": 40000, + "name": "就餐费用服务费", + "count": 4, + "description": "就餐人均100元服务费:100/小时" + }, + { + "amount": 2000, + "name": "就餐费用服务费", + "count": 1, + "description": "就餐人均100元服务费:100/小时" + } + ], + "service_introduction": "某某酒店", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "profit_sharing": false, + "out_order_no": "1234323JKHDFE1243252", + "notify_url": "https://api.test.com", + "time_range": { + "start_time": "20091225091010", + "end_time_remark": "备注2", + "end_time": "20091225121010", + "start_time_remark": "备注1" + }, + "total_amount": 50000, + "goods_tag": "goods_tag1", + "service_id": "500001", + "appid": "wxd678efh567hg6787", + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "post_discounts": [ + { + "amount": 100, + "name": "满20减1元", + "count": 2, + "description": "不与其他优惠叠加" + }, + { + "amount": 100, + "name": "满20减1元", + "count": 2, + "description": "不与其他优惠叠加" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.json new file mode 100644 index 00000000..f53b948f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteResponse.json @@ -0,0 +1,51 @@ +{ + "post_payments": [ + { + "amount": 40000, + "name": "就餐费用服务费", + "count": 4, + "description": "就餐人均100元服务费:100/小时" + }, + { + "amount": 2000, + "name": "就餐费用服务费", + "count": 1, + "description": "就餐人均100元服务费:100/小时" + } + ], + "mchid": "1230000109", + "service_introduction": "某某酒店", + "notify_url": "https://api.test.com", + "state_description": "MCH_COMPLETE", + "out_order_no": "1234323JKHDFE1243252", + "time_range": { + "start_time": "20091225091010", + "end_time_remark": "备注2", + "end_time": "20091225121010", + "start_time_remark": "备注1" + }, + "total_amount": 50000, + "service_id": "500001", + "appid": "wxd678efh567hg6787", + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "state": "FINISHED", + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "order_id": "15646546545165651651", + "post_discounts": [ + { + "amount": 100, + "name": "满20减1元", + "count": 2, + "description": "不与其他优惠叠加" + }, + { + "amount": 100, + "name": "满20减1元", + "count": 2, + "description": "不与其他优惠叠加" + } + ] +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.json new file mode 100644 index 00000000..41c7e6f9 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderRequest.json @@ -0,0 +1,37 @@ +{ + "out_order_no": "1234323JKHDFE1243252", + "appid": "wxd678efh567hg6787", + "service_id": "500001", + "service_introduction": "某某酒店", + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加" + } + ], + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "notify_url": "https://api.test.com", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "need_user_confirm": true +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.json new file mode 100644 index 00000000..db49efde --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/CreatePayScoreServiceOrderResponse.json @@ -0,0 +1,40 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_order_no": "1234323JKHDFE1243252", + "service_id": "500001", + "service_introduction": "某某酒店", + "state": "CREATED", + "state_description": "MCH_COMPLETE", + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加" + } + ], + "risk_fund": { + "name": " ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "notify_url": "https://api.test.com", + "order_id": "15646546545165651651", + "package": " DJIOSQPYWDxsjdldeuwhdodwxasd_dDiodnwjh9we " +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.json new file mode 100644 index 00000000..273d9663 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.json @@ -0,0 +1,57 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "service_id": "500001", + "out_order_no": "1234323JKHDFE1243252", + "service_introduction": "某某酒店", + "state": "DOING", + "state_description": "MCH_COMPLETE", + "total_amount": 3900, + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加", + "amount": 100 + } + ], + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "notify_url": "https://api.test.com", + "order_id": "15646546545165651651", + "need_collection": true, + "collection": { + "state": "USER_PAID", + "total_amount": 3900, + "paying_amount": 3000, + "paid_amount": 900, + "details": [ + { + "seq": 1, + "amount": 900, + "paid_type": "NEWTON", + "paid_time": "20091225091210", + "transaction_id": "15646546545165651651" + } + ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.json new file mode 100644 index 00000000..273d9663 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/GetPayScoreServiceOrderByQueryIdResponse.json @@ -0,0 +1,57 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "service_id": "500001", + "out_order_no": "1234323JKHDFE1243252", + "service_introduction": "某某酒店", + "state": "DOING", + "state_description": "MCH_COMPLETE", + "total_amount": 3900, + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加", + "amount": 100 + } + ], + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "notify_url": "https://api.test.com", + "order_id": "15646546545165651651", + "need_collection": true, + "collection": { + "state": "USER_PAID", + "total_amount": 3900, + "paying_amount": 3000, + "paid_amount": 900, + "details": [ + { + "seq": 1, + "amount": 900, + "paid_type": "NEWTON", + "paid_time": "20091225091210", + "transaction_id": "15646546545165651651" + } + ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.json new file mode 100644 index 00000000..aa24eff8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderRequest.json @@ -0,0 +1,21 @@ +{ + "appid": "wxd678efh567hg6787", + "service_id": "500001", + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加", + "amount": 100 + } + ], + "total_amount": 2000, + "reason": "用户投诉" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.json new file mode 100644 index 00000000..d22dfd71 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/ModifyPayScoreServiceOrderResponse.json @@ -0,0 +1,39 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "service_id": "500001", + "out_order_no": "1234323JKHDFE1243252", + "service_introduction": "某某酒店", + "state": "CREATED", + "state_description": "MCH_COMPLETE", + "total_amount": 2000, + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 2000 + } + ], + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "order_id": "15646546545165651651", + "need_collection": true, + "collection": { + "state": "USER_PAYING", + "total_amount": 2000, + "paying_amount": 2000, + "paid_amount": 0, + "details": [ {} ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.json new file mode 100644 index 00000000..e31a7944 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteRequest.json @@ -0,0 +1,28 @@ +{ + "appid": "wxd678efh567hg6787", + "service_id": "500001", + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加", + "amount": 4000 + } + ], + "total_amount": 3900, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "end_location": "嗨客时尚主题展餐厅" + }, + "profit_sharing": false +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.json new file mode 100644 index 00000000..7397a2cf --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderCompleteResponse.json @@ -0,0 +1,40 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_order_no": "1234323JKHDFE1243252", + "service_id": "500001", + "service_introduction": "某某酒店", + "state": "DOING", + "state_description": "", + "total_amount": 3900, + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 1, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加", + "amount": 1 + } + ], + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 4000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "order_id": "15646546545165651651", + "need_collection": true +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.json new file mode 100644 index 00000000..f408ccfb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayRequest.json @@ -0,0 +1,4 @@ +{ + "appid": "wxd678efh567hg6787", + "service_id": "500001" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.json new file mode 100644 index 00000000..ac12cdbe --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderPayResponse.json @@ -0,0 +1,7 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_order_no": "1230000109", + "service_id": "500001", + "order_id": "15646546545165651651" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.json new file mode 100644 index 00000000..0516098d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.json @@ -0,0 +1,8 @@ +{ + "appid": "wxd678efh567hg6787", + "service_id": "500001", + "type": "Order_Paid", + "detail": { + "paid_time": "20091225091210" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.json new file mode 100644 index 00000000..2daa31a7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayScoreServiceOrder/SetPayScoreServiceOrderSyncResponse.json @@ -0,0 +1,57 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "service_id": "500001", + "out_order_no": "1234323JKHDFE1243252", + "service_introduction": "某某酒店", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "state": "CREATED", + "state_description": "MCH_COMPLETE", + "total_amount": 3900, + "post_payments": [ + { + "name": "就餐费用服务费", + "amount": 4000, + "description": "就餐人均100元服务费:100/小时", + "count": 1 + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "description": "不与其他优惠叠加", + "amount": 100 + } + ], + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225121010" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "Easdfowealsdkjfnlaksjdlfkwqoi&wl3l2sald", + "notify_url": "https://api.test.com", + "order_id": "15646546545165651651", + "need_collection": true, + "collection": { + "state": "USER_PAID", + "total_amount": 3900, + "paying_amount": 0, + "paid_amount": 3900, + "details": [ + { + "amount": 10000, + "paid_type": "NEWTON", + "paid_time": "20091225091210", + "transaction_id": "15646546545165651651" + } + ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionRequest.json new file mode 100644 index 00000000..91048965 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionRequest.json @@ -0,0 +1,3 @@ +{ + "mchid": "1900006XXX" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/ClosePayTransactionResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppRequest.json new file mode 100644 index 00000000..05255f74 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppRequest.json @@ -0,0 +1,11 @@ +{ + "mchid": "1900006XXX", + "out_trade_no": "APP1217752501201407033233368018", + "appid": "wxb4ba3c02aa476XXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppResponse.json new file mode 100644 index 00000000..15df2d4e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionAppResponse.json @@ -0,0 +1,3 @@ +{ + "prepay_id": "wx261153585405162d4d02642eabe7000000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Request.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Request.json new file mode 100644 index 00000000..2d2e8b8b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Request.json @@ -0,0 +1,17 @@ +{ + "mchid": "1900006XXX", + "out_trade_no": "H51217752501201407033233368018", + "appid": "wxdace645e0bc2cXXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + }, + "scene_info": { + "payer_client_ip": "127.0.0.1", + "h5_info": { + "type": "Wap" + } + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Response.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Response.json new file mode 100644 index 00000000..e732f214 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionH5Response.json @@ -0,0 +1,3 @@ +{ + "h5_url": "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2916263004719461949c84457c735b0000&package=2150917749" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiRequest.json new file mode 100644 index 00000000..4407eeef --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiRequest.json @@ -0,0 +1,14 @@ +{ + "mchid": "1900006XXX", + "out_trade_no": "1217752501201407033233368318", + "appid": "wxdace645e0bc2cXXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + }, + "payer": { + "openid": "o4GgauInH_RCEdvrrNGrntXDuXXX" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiResponse.json new file mode 100644 index 00000000..86455792 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionJsapiResponse.json @@ -0,0 +1,3 @@ +{ + "prepay_id": "wx26112221580621e9b071c00d9e093b0000" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeRequest.json new file mode 100644 index 00000000..b2a8981d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeRequest.json @@ -0,0 +1,11 @@ +{ + "mchid": "1900006XXX", + "out_trade_no": "native12177525012014070332333", + "appid": "wxdace645e0bc2cXXX", + "description": "Image形象店-深圳腾大-QQ公仔", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeResponse.json new file mode 100644 index 00000000..94ba8f9a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/CreatePayTransactionNativeResponse.json @@ -0,0 +1,3 @@ +{ + "code_url": "weixin://wxpay/bizpayurl?pr=p4lpSuKzz" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdResponse.json new file mode 100644 index 00000000..33840a3e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByIdResponse.json @@ -0,0 +1,22 @@ +{ + "amount": { + "currency": "CNY", + "payer_currency": "CNY", + "payer_total": 1, + "total": 1 + }, + "appid": "wxdace645e0bc2cXXX", + "attach": "", + "bank_type": "OTHERS", + "mchid": "1900006XXX", + "out_trade_no": "44_2126281063_5504", + "payer": { + "openid": "o4GgauJP_mgWEWictzA15WT15XXX" + }, + "promotion_detail": [], + "success_time": "2021-03-22T10:29:05+08:00", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "trade_type": "JSAPI", + "transaction_id": "4200000891202103228088184743" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberResponse.json new file mode 100644 index 00000000..33840a3e --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/PayTransactions/GetPayTransactionByOutTradeNumberResponse.json @@ -0,0 +1,22 @@ +{ + "amount": { + "currency": "CNY", + "payer_currency": "CNY", + "payer_total": 1, + "total": 1 + }, + "appid": "wxdace645e0bc2cXXX", + "attach": "", + "bank_type": "OTHERS", + "mchid": "1900006XXX", + "out_trade_no": "44_2126281063_5504", + "payer": { + "openid": "o4GgauJP_mgWEWictzA15WT15XXX" + }, + "promotion_detail": [], + "success_time": "2021-03-22T10:29:05+08:00", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "trade_type": "JSAPI", + "transaction_id": "4200000891202103228088184743" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundRequest.json new file mode 100644 index 00000000..5a717bd0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundRequest.json @@ -0,0 +1,12 @@ +{ + "sub_mchid": "1900008XXX", + "notify_url": "https://weixin.qq.com/", + "amount": { + "total": 1, + "currency": "CNY", + "refund": 1 + }, + "transaction_id": "4200000991202103266853086457", + "out_refund_no": "sdk12345678920210326145039", + "reason": "商品已售完" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundResponse.json new file mode 100644 index 00000000..57b74234 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/CreateRefundDomesticRefundResponse.json @@ -0,0 +1,22 @@ +{ + "amount": { + "currency": "CNY", + "discount_refund": 0, + "payer_refund": 1, + "payer_total": 1, + "refund": 1, + "settlement_refund": 1, + "settlement_total": 1, + "total": 1 + }, + "channel": "ORIGINAL", + "create_time": "2021-03-26T14:52:08+08:00", + "funds_account": "UNSETTLED", + "out_refund_no": "sdk12345678920210326145039", + "out_trade_no": "sdk12345678920210326145039", + "promotion_detail": [], + "refund_id": "50001307732021032607480019805", + "status": "PROCESSING", + "transaction_id": "4200000991202103266853086457", + "user_received_account": "支付用户零钱" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.json new file mode 100644 index 00000000..0fb62956 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/Refund/GetRefundDomesticRefundByOutRefundNumberResponse.json @@ -0,0 +1,23 @@ +{ + "amount": { + "currency": "CNY", + "discount_refund": 0, + "payer_refund": 1, + "payer_total": 1, + "refund": 1, + "settlement_refund": 1, + "settlement_total": 1, + "total": 1 + }, + "channel": "ORIGINAL", + "create_time": "2021-03-26T14:52:08+08:00", + "funds_account": "UNSETTLED", + "out_refund_no": "sdk12345678920210326145039", + "out_trade_no": "sdk12345678920210326145039", + "promotion_detail": [], + "refund_id": "50001307732021032607480019805", + "status": "SUCCESS", + "success_time": "2021-03-26T14:52:11+08:00", + "transaction_id": "4200000991202103266853086457", + "user_received_account": "支付用户零钱" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideRequest.json new file mode 100644 index 00000000..8e51d94a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideRequest.json @@ -0,0 +1,3 @@ +{ + "out_trade_no": "20150806125346" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/AssignSmartGuideResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideRequest.json new file mode 100644 index 00000000..40b5aa9d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideRequest.json @@ -0,0 +1,10 @@ +{ + "store_id": 1234, + "corpid": "1234567890", + "name": "pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==", + "mobile": "pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==", + "qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx", + "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0", + "group_qrcode": "http://p.qpic.cn/wwhead/nMl9ssowtibVGyrmvBiaibzDtp/0", + "userid": "robert" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideResponse.json new file mode 100644 index 00000000..c3495b9d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/CreateSmartGuideResponse.json @@ -0,0 +1,3 @@ +{ + "guide_id": "LLA3WJ6DSZUfiaZDS79FH5Wm5m4X69TBic" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesRequest.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesRequest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesResponse.json new file mode 100644 index 00000000..ce2d6209 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/QuerySmartGuidesResponse.json @@ -0,0 +1,21 @@ +{ + "data": [ + { + "guide_id": "LLA3WJ6DSZUfiaZDS79FH5Wm5m4X69TBic", + "store_id": 1234, + "name": "str2WUc3Z83uMVcFQu38y9EcWR12FJ3jip5nyVKiqCF4iDSN+JRXjWsWlqTZ0Y8Q+piBCS5ACusK6nz7mKQeypi9fKjAggRfvNFPf/bNxPvork4mMVgZkA==", + "mobile": "str2WoWyZ83uMVcFQu38y9EcWR12FJ3jip5nyVKiqCF4iDSN+JRXjWsWlqTZ0Y8Q+piBCS5ACusK6nz7mKQeypi9fKjAggRfvNFPf/bNxPvork4mMVgZkA==", + "work_id": "robert" + }, + { + "guide_id": "LLA3WJ6DSZUfiaZDS79FH5Wm5m4X69TBic", + "store_id": 1234, + "name": "str2WUc3Z83uMVcFQu38y9EcWR12FJ3jip5nyVKiqCF4iDSN+JRXjWsWlqTZ0Y8Q+piBCS5ACusK6nz7mKQeypi9fKjAggRfvNFPf/bNxPvork4mMVgZkA==", + "mobile": "str2WoWyZ83uMVcFQu38y9EcWR12FJ3jip5nyVKiqCF4iDSN+JRXjWsWlqTZ0Y8Q+piBCS5ACusK6nz7mKQeypi9fKjAggRfvNFPf/bNxPvork4mMVgZkA==", + "userid": "robert" + } + ], + "total_count": 2, + "limit": 5, + "offset": 0 +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideRequest.json new file mode 100644 index 00000000..22cf4f61 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideRequest.json @@ -0,0 +1,7 @@ +{ + "name": "pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==", + "mobile": "pVd1HJ6v/69bDnuC4EL5Kz4jBHLiCa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==", + "qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx", + "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0", + "group_qrcode": "http://p.qpic.cn/wwhead/nMl9ssowtibVGyrmvBiaibzDtp/0" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideResponse.json new file mode 100644 index 00000000..22fdca1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/SmartGuide/UpdateSmartGuideResponse.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallRefundResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallRefundResource.json new file mode 100644 index 00000000..9794f6e5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallRefundResource.json @@ -0,0 +1,13 @@ +{ + "mchid": "1234567890", + "merchant_name": "万象天地", + "shop_name": "重庆烤鱼(万象天地店)", + "shop_number": "50001", + "openid": "swe23be954ffots3jrvjweslfmde", + "appid": "wx2c23be954ff1624f", + "refund_time": "2018-05-23T12:13:50+08:00", + "pay_amount": 100, + "refund_amount": 100, + "transaction_id": "42000001217201407033233368018", + "refund_id": "1217752501201407033233368999" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallTransactionResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallTransactionResource.json new file mode 100644 index 00000000..13831c9c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/BusinessCircle/MallTransactionResource.json @@ -0,0 +1,11 @@ +{ + "mchid": "1230000109", + "merchant_name": "腾讯广场", + "shop_name": "微信支付", + "shop_number": "123456", + "appid": "wxd678efh567hg6787", + "openid": "oUpF8uMuAJ2pxb1Q9zNjWUHsd", + "amount": 200, + "time_end": "2020-05-20T13:29:35+08:00", + "transaction_id": "1234567890" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/CombineTransactions/CombineTransactionResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/CombineTransactions/CombineTransactionResource.json new file mode 100644 index 00000000..8898b5c0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/CombineTransactions/CombineTransactionResource.json @@ -0,0 +1,29 @@ +{ + "combine_appid": "wxd678efh567hg6787", + "combine_out_trade_no": "20150806125346", + "combine_mchid": "1900000109", + "scene_info": { + "device_id": "POS1:1" + }, + "sub_orders": [ + { + "mchid": "1900000109", + "trade_type": "JSAPI", + "trade_state": "SUCCESS", + "bank_type": "CMC", + "attach": "深圳分店", + "amount": { + "total_amount": 10, + "currency": "CNY", + "payer_amount": 10, + "payer_currency": "CNY" + }, + "success_time": "2015-05-20T13:29:35.120+08:00", + "transaction_id": "1009660380201506130728806387", + "out_trade_no": "20150806125346" + } + ], + "combine_payer_info": { + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/DiscountCard/DiscountCardResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/DiscountCard/DiscountCardResource.json new file mode 100644 index 00000000..54d0e0f7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/DiscountCard/DiscountCardResource.json @@ -0,0 +1,135 @@ +{ + "card_id": "233bcbf407e87789b8e471f251774f95", + "card_template_id": "87789b2f25177433bcbf407e8e471f95", + "openid": "oUpF8uMuAJ2pxb1Q9zNjWeS6o", + "out_card_code": "6e8369071cd942c0476613f9d1ce9ca3", + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "time_range": { + "begin_time": "2020-05-20T13:29:35.120+08:00", + "end_time": "2020-05-21T13:29:35.120+08:00" + }, + "state": "ONGOING", + "create_time": "2020-05-20T13:29:35.120+08:00", + "objectives": [ + { + "unit": "次", + "name": "一周购买三次商品", + "count": 1, + "description": "特价商品", + "objective_completion_records": [ + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + }, + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + } + ], + "objective_id": "123456" + }, + { + "unit": "次", + "name": "一周购买三次商品", + "count": 1, + "description": "特价商品", + "objective_completion_records": [ + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + }, + { + "completion_time": "2015-05-20T13:29:35.120+08:00", + "objective_completion_serial_no": "578354545", + "description": "购买商品/取消购买商品", + "completion_count": 1, + "remark": "特价商品", + "completion_type": "INCREASE", + "objective_id": "123456" + } + ], + "objective_id": "123456" + } + ], + "rewards": [ + { + "unit": "个", + "amount": 100, + "count_type": "COUNT_LIMIT", + "name": "八折优惠", + "count": 1, + "description": "特价商品优惠", + "reward_id": "123456", + "reward_usage_records": [ + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + }, + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + } + ] + }, + { + "unit": "个", + "amount": 100, + "count_type": "COUNT_LIMIT", + "name": "八折优惠", + "count": 1, + "description": "特价商品优惠", + "reward_id": "123456", + "reward_usage_records": [ + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + }, + { + "usage_count": 100, + "amount": 1, + "usage_type": "INCREASE", + "usage_time": "2015-05-20T13:29:35.120+08:00", + "reward_usage_serial_no": "578354", + "description": "购买商品", + "reward_id": "123456", + "remark": "特价商品" + } + ] + } + ], + "sharer_openid": "oUpF8uMuAJ2pxb1Q9zNjWUHsd" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingBusifavor/MarketingBusifavorCouponResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingBusifavor/MarketingBusifavorCouponResource.json new file mode 100644 index 00000000..4cd8af80 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingBusifavor/MarketingBusifavorCouponResource.json @@ -0,0 +1,14 @@ +{ + "event_type": "EVENT_TYPE_BUSICOUPON_SEND", + "coupon_code": "1227944959000000911017", + "stock_id": "1286950000000039", + "send_time": "2019-12-17T10:35:53+08:00", + "openid": "odXnH1CJjeQoWTld48db-pnxs-Wg", + "unionid": "oOuyajgxj0oVwjocSoQm6mp7PGKw", + "send_channel": "BUSICOUPON_SEND_CHANNEL_PAYGIFT", + "send_merchant": "98568888", + "attach_info": { + "transaction_id": "4200000462220200226114599", + "act_code": "540358695" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingFavor/MarketingFavorCouponResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingFavor/MarketingFavorCouponResource.json new file mode 100644 index 00000000..aeb3cc37 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MarketingFavor/MarketingFavorCouponResource.json @@ -0,0 +1,38 @@ +{ + "stock_creator_mchid": "9800064", + "stock_id": "9865888", + "coupon_id": "98674556", + "singleitem_discount_off": { + "single_price_max": 100 + }, + "discount_to": { + "cut_to_price": 100, + "max_price": 10 + }, + "coupon_name": "微信支付代金券", + "status": "EXPIRED", + "description": "微信支付营销", + "create_time": "2015-05-20T13:29:35.120+08:00", + "coupon_type": "CUT_TO", + "no_cash": true, + "available_begin_time": "2015-05-20T13:29:35.120+08:00", + "available_end_time": "2015-05-20T13:29:35.120+08:00", + "singleitem": true, + "normal_coupon_information": { + "coupon_amount": 100, + "transaction_minimum": 100 + }, + "consume_information": { + "consume_time": "2015-05-20T13:29:35.120+08:00", + "consume_mchid": "9856081", + "transaction_id": "2345234523", + "goods_detail": [ + { + "goods_id": "a_goods1", + "quantity": 7, + "price": 1, + "discount_amount": 4 + } + ] + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MerchantService/ComplaintResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MerchantService/ComplaintResource.json new file mode 100644 index 00000000..c04e46d8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/MerchantService/ComplaintResource.json @@ -0,0 +1,4 @@ +{ + "complaint_id": "200201820200101080076610000", + "action_type": "CREATE_COMPLAINT" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerRefundResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerRefundResource.json new file mode 100644 index 00000000..11924eb1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerRefundResource.json @@ -0,0 +1,17 @@ +{ + "sp_mchid": "1900000100", + "sub_mchid": "1900000109", + "transaction_id": "1008450740201411110005820873", + "out_trade_no": "20150806125346", + "refund_id": "50200207182018070300011301001", + "out_refund_no": "7752501201407033233368018", + "refund_status": "SUCCESS", + "success_time": "2018-06-08T10:34:56+08:00", + "user_received_account": "招商银行信用卡0403", + "amount": { + "total": 999, + "refund": 999, + "payer_total": 999, + "payer_refund": 999 + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerTransactionResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerTransactionResource.json new file mode 100644 index 00000000..18a0c7a1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayPartnerTransactions/PartnerTransactionResource.json @@ -0,0 +1,83 @@ +{ + "sp_appid": "wx8888888888888888", + "sp_mchid": "1230000109", + "sub_appid": "wxd678efh567hg6999", + "sub_mchid": "1900000109", + "out_trade_no": "1217752501201407033233368018", + "trade_state_desc": "支付成功", + "trade_type": "MICROPAY", + "attach": "自定义数据", + "transaction_id": "1217752501201407033233368018", + "trade_state": "SUCCESS", + "bank_type": "CMC", + "success_time": "2018-06-08T10:34:56+08:00", + "amount": { + "payer_total": 100, + "total": 100, + "currency": "CNY", + "payer_currency": "CNY" + }, + "promotion_detail": [ + { + "amount": 100, + "wechatpay_contribute": 0, + "coupon_id": "109519", + "scope": "GLOBAL", + "merchant_contribute": 0, + "name": "单品惠-6", + "other_contribute": 0, + "currency": "CNY", + "stock_id": "931386", + "goods_detail": [ + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + }, + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + } + ] + }, + { + "amount": 100, + "wechatpay_contribute": 0, + "coupon_id": "109519", + "scope": "GLOBAL", + "merchant_contribute": 0, + "name": "单品惠-6", + "other_contribute": 0, + "currency": "CNY", + "stock_id": "931386", + "goods_detail": [ + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + }, + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + } + ] + } + ], + "payer": { + "sp_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "sub_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "scene_info": { + "device_id": "013467007045764" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScorePermissions/PayScorePermissionsResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScorePermissions/PayScorePermissionsResource.json new file mode 100644 index 00000000..38751b1c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScorePermissions/PayScorePermissionsResource.json @@ -0,0 +1,9 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_request_no": "1234323JKHDFE1243252", + "service_id": "500001", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "user_service_status": "USER_OPEN_SERVICE", + "openorclose_time": "20180225112233" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScoreServiceOrder/PayScoreServiceOrderResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScoreServiceOrder/PayScoreServiceOrderResource.json new file mode 100644 index 00000000..dc747850 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayScoreServiceOrder/PayScoreServiceOrderResource.json @@ -0,0 +1,40 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_order_no": "1234323JKHDFE1243252", + "service_id": "500001", + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "state": "DOING", + "state_description": "USER_CONFIRM", + "total_amount": "40000", + "service_introduction": "嗨客餐厅用餐", + "post_payments": [ + { + "name": "服务费", + "amount": 40000, + "description": "每分钟1元" + } + ], + "post_discounts": [ + { + "name": "满20减1元", + "amount": 1, + "description": "不与其他优惠叠加" + } + ], + "risk_fund": { + "name": "ESTIMATE_ORDER_COST", + "amount": 10000, + "description": "就餐的预估费用" + }, + "time_range": { + "start_time": "20091225091010", + "end_time": "20091225091210" + }, + "location": { + "start_location": "嗨客时尚主题展餐厅", + "end_location": "嗨客时尚主题展餐厅" + }, + "attach": "attach", + "order_id": "165461131" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayTransactions/TransactionResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayTransactions/TransactionResource.json new file mode 100644 index 00000000..50f37867 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/PayTransactions/TransactionResource.json @@ -0,0 +1,80 @@ +{ + "transaction_id": "1217752501201407033233368018", + "amount": { + "payer_total": 100, + "total": 100, + "currency": "CNY", + "payer_currency": "CNY" + }, + "mchid": "1230000109", + "trade_state": "SUCCESS", + "bank_type": "CMC", + "promotion_detail": [ + { + "amount": 100, + "wechatpay_contribute": 0, + "coupon_id": "109519", + "scope": "GLOBAL", + "merchant_contribute": 0, + "name": "单品惠-6", + "other_contribute": 0, + "currency": "CNY", + "stock_id": "931386", + "goods_detail": [ + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + }, + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + } + ] + }, + { + "amount": 100, + "wechatpay_contribute": 0, + "coupon_id": "109519", + "scope": "GLOBAL", + "merchant_contribute": 0, + "name": "单品惠-6", + "other_contribute": 0, + "currency": "CNY", + "stock_id": "931386", + "goods_detail": [ + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + }, + { + "goods_remark": "商品备注信息", + "quantity": 1, + "discount_amount": 1, + "goods_id": "M1006", + "unit_price": 100 + } + ] + } + ], + "success_time": "2018-06-08T10:34:56+08:00", + "payer": { + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "out_trade_no": "1217752501201407033233368018", + "appid": "wxd678efh567hg6787", + "trade_state_desc": "支付成功", + "trade_type": "MICROPAY", + "attach": "自定义数据", + "scene_info": { + "device_id": "013467007045764" + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/Refund/RefundResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/Refund/RefundResource.json new file mode 100644 index 00000000..8e1c9c06 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ResourceSamples/Refund/RefundResource.json @@ -0,0 +1,16 @@ +{ + "mchid": "1900000100", + "transaction_id": "1008450740201411110005820873", + "out_trade_no": "20150806125346", + "refund_id": "50200207182018070300011301001", + "out_refund_no": "7752501201407033233368018", + "refund_status": "SUCCESS", + "success_time": "2018-06-08T10:34:56+08:00", + "user_received_account": "招商银行信用卡0403", + "amount": { + "total": 999, + "refund": 999, + "payer_total": 999, + "payer_refund": 999 + } +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests.csproj b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests.csproj new file mode 100644 index 00000000..9546e059 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests.csproj @@ -0,0 +1,35 @@ + + + + netcoreapp3.1 + 8.0 + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestClients.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestClients.cs new file mode 100644 index 00000000..1f91832f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestClients.cs @@ -0,0 +1,20 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + class TestClients + { + static TestClients() + { + Instance = new WechatTenpayClient(new WechatTenpayClientOptions() + { + MerchantId = TestConfigs.WechatMerchantId, + MerchantV3Secret = TestConfigs.WechatMerchantSecret, + MerchantCertSerialNumber = TestConfigs.WechatMerchantCertSerialNumber, + MerchantCertPrivateKey = TestConfigs.WechatMerchantCertPrivateKey + }); + } + + public static readonly WechatTenpayClient Instance; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestConfigs.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestConfigs.cs new file mode 100644 index 00000000..7dba9fb7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestConfigs.cs @@ -0,0 +1,32 @@ +using System; +using System.IO; +using System.Text.Json; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + class TestConfigs + { + static TestConfigs() + { + // NOTICE: 请在项目根目录下建立 appsettings.local.json,按照 appsettings.json 的格式填入测试参数。 + // WARN: 敏感信息请不要提交到 git! + + using var stream = File.OpenRead("appsettings.local.json"); + using var json = JsonDocument.Parse(stream); + var config = json.RootElement.GetProperty("WechatConfig"); + WechatAppId = config.GetProperty("AppId").GetString(); + WechatMerchantId = config.GetProperty("MerchantId").GetString(); + WechatMerchantSecret = config.GetProperty("MerchantSecret").GetString(); + WechatMerchantCertSerialNumber = config.GetProperty("MerchantCertSerialNumber").GetString(); + WechatMerchantCertPrivateKey = config.GetProperty("MerchantCertPrivateKey").GetString(); + WechatOpenId = config.GetProperty("OpenId").GetString(); + } + + public static readonly string WechatAppId; + public static readonly string WechatMerchantId; + public static readonly string WechatMerchantSecret; + public static readonly string WechatMerchantCertSerialNumber; + public static readonly string WechatMerchantCertPrivateKey; + public static readonly string WechatOpenId; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayConverterTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayConverterTests.cs new file mode 100644 index 00000000..30df99e1 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayConverterTests.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayConverterTests + { + class JsonDateTimeOffsetTestEntity + { + [Newtonsoft.Json.JsonProperty("datetime_rfc3339")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("datetime_rfc3339")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] + public DateTimeOffset DateTimeWithRFC3339 { get; set; } + + [Newtonsoft.Json.JsonProperty("nullable_datetime_rfc3339")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("nullable_datetime_rfc3339")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] + public DateTimeOffset? NullableDateTimeWithRFC3339 { get; set; } + + [Newtonsoft.Json.JsonProperty("datetime_common_nosep")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("datetime_common_nosep")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + public DateTimeOffset DateTimeWithFullNoSep { get; set; } + + [Newtonsoft.Json.JsonProperty("nullable_datetime_common_nosep")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("nullable_datetime_common_nosep")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + public DateTimeOffset? NullableDateTimeWithFullNoSep { get; set; } + } + + class JsonStringTypedStringListOrArrayTestEntity + { + [Newtonsoft.Json.JsonProperty("string_ilist")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringTypedStringIListConverter))] + [System.Text.Json.Serialization.JsonPropertyName("string_ilist")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedStringIListConverter))] + public IList StringTypedIList { get; set; } + + [Newtonsoft.Json.JsonProperty("string_list")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringTypedStringListConverter))] + [System.Text.Json.Serialization.JsonPropertyName("string_list")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedStringListConverter))] + public List StringTypedList { get; set; } + + [Newtonsoft.Json.JsonProperty("string_array")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringTypedStringArrayConverter))] + [System.Text.Json.Serialization.JsonPropertyName("string_array")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.StringTypedStringArrayConverter))] + public string[] StringTypedArray { get; set; } + } + + [Fact(DisplayName = "日期时间 JSON 序列化 / 反序列化")] + public void JsonDateTimeOffsetTest() + { + const string FORMAT_RFC3339 = "yyyy-MM-dd'T'HH:mm:sszzz"; + const string FORMAT_FullNoSep = "yyyyMMddHHmmss"; + + string datestr = "2018-06-08T10:34:56+08:00"; + var date = DateTimeOffset.Parse(datestr); + var raw = new JsonDateTimeOffsetTestEntity(); + + Assert.Equal(datestr, date.ToString(FORMAT_RFC3339)); + + raw.DateTimeWithRFC3339 = date; + raw.DateTimeWithFullNoSep = date; + raw.NullableDateTimeWithRFC3339 = date; + raw.NullableDateTimeWithFullNoSep = date; + var json = new FlurlNewtonsoftJsonSerializer().Serialize(raw); + var entity = new FlurlNewtonsoftJsonSerializer().Deserialize(json); + + Assert.Contains($"\"datetime_rfc3339\":\"{datestr}\"", json); + Assert.Contains($"\"datetime_common_nosep\":\"{date.ToString(FORMAT_FullNoSep)}\"", json); + Assert.Contains($"\"nullable_datetime_rfc3339\":\"{datestr}\"", json); + Assert.Contains($"\"nullable_datetime_common_nosep\":\"{date.ToString(FORMAT_FullNoSep)}\"", json); + Assert.Equal(raw.DateTimeWithRFC3339, entity.DateTimeWithRFC3339); + Assert.Equal(raw.DateTimeWithFullNoSep, entity.DateTimeWithFullNoSep); + Assert.Equal(raw.NullableDateTimeWithRFC3339, entity.NullableDateTimeWithRFC3339); + Assert.Equal(raw.NullableDateTimeWithFullNoSep, entity.NullableDateTimeWithFullNoSep); + + raw.NullableDateTimeWithRFC3339 = null; + raw.NullableDateTimeWithFullNoSep = null; + json = new FlurlNewtonsoftJsonSerializer().Serialize(raw); + entity = new FlurlNewtonsoftJsonSerializer().Deserialize(json); + + Assert.Equal(datestr, date.ToString(FORMAT_RFC3339)); + Assert.DoesNotContain($"\"nullable_datetime_rfc3339\"", json); + Assert.DoesNotContain($"\"nullable_datetime_common_nosep\"", json); + Assert.Null(entity.NullableDateTimeWithRFC3339); + Assert.Null(entity.NullableDateTimeWithFullNoSep); + + json = new FlurlSystemTextJsonSerializer().Serialize(raw); + entity = new FlurlSystemTextJsonSerializer().Deserialize(json); + + Assert.Equal(datestr, date.ToString(FORMAT_RFC3339)); + Assert.DoesNotContain($"\"nullable_datetime_rfc3339\"", json); + Assert.DoesNotContain($"\"nullable_datetime_common_nosep\"", json); + Assert.Null(entity.NullableDateTimeWithRFC3339); + Assert.Null(entity.NullableDateTimeWithFullNoSep); + } + + [Fact(DisplayName = "字符串类型的字符串列表、数组 JSON 序列化 / 反序列化")] + public void JsonStringTypedStringListOrArrayTest() + { + const string STR = "test"; + + var raw = new JsonStringTypedStringListOrArrayTestEntity(); + raw.StringTypedIList = new List() { STR }; + raw.StringTypedList = new List() { STR }; + raw.StringTypedArray = new string[] { STR }; + + var json = new FlurlNewtonsoftJsonSerializer().Serialize(raw); + var entity = new FlurlNewtonsoftJsonSerializer().Deserialize(json); + + Assert.Contains($"\"string_ilist\":\"[\\\"{STR}\\\"]\"", json); + Assert.Contains($"\"string_list\":\"[\\\"{STR}\\\"]\"", json); + Assert.Contains($"\"string_array\":\"[\\\"{STR}\\\"]\"", json); + Assert.Contains(raw.StringTypedIList, e => STR.Equals(e)); + Assert.Contains(raw.StringTypedList, e => STR.Equals(e)); + Assert.Contains(raw.StringTypedArray, e => STR.Equals(e)); + + json = new FlurlSystemTextJsonSerializer().Serialize(raw); + entity = new FlurlSystemTextJsonSerializer().Deserialize(json); + + Assert.Contains($"\"string_ilist\":\"[\\\"{STR}\\\"]\"", json); + Assert.Contains($"\"string_list\":\"[\\\"{STR}\\\"]\"", json); + Assert.Contains($"\"string_array\":\"[\\\"{STR}\\\"]\"", json); + Assert.Contains(raw.StringTypedIList, e => STR.Equals(e)); + Assert.Contains(raw.StringTypedList, e => STR.Equals(e)); + Assert.Contains(raw.StringTypedArray, e => STR.Equals(e)); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayDefinitionTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayDefinitionTests.cs new file mode 100644 index 00000000..fd469eba --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayDefinitionTests.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayDefinitionTests + { + private static readonly Assembly _assembly = Assembly.Load("SKIT.FlurlHttpClient.Wechat.TenpayV3"); + + [Fact(DisplayName = "验证模型定义")] + public void ModelDefinitionsTest() + { + static void SetPropertiesValueRecursively(object obj) + { + var lstProperty = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); + foreach (var tProperty in lstProperty) + { + if (tProperty.SetMethod == null || !tProperty.SetMethod.IsPublic) + continue; + + if (tProperty.PropertyType.IsPrimitive) + { + // noop + } + else if (tProperty.PropertyType.IsArray) + { + Type tEl = tProperty.PropertyType.Assembly.GetType(tProperty.PropertyType.FullName.Replace("[]", string.Empty)); + object propEl = (tEl == typeof(string)) ? string.Empty : Activator.CreateInstance(tEl); + propEl = Convert.ChangeType(propEl, tEl); + SetPropertiesValueRecursively(propEl); + + Array prop = Array.CreateInstance(tEl, 1); + prop.SetValue(propEl, 0); + + tProperty.SetValue(obj, prop); + } + else if (tProperty.PropertyType == typeof(string)) + { + tProperty.SetValue(obj, string.Empty); + } + else if (tProperty.PropertyType.Namespace == "System" && + tProperty.PropertyType.Name.StartsWith("Nullable")) + { + // noop + } + else if (tProperty.PropertyType.Namespace == "System.Collections.Generic" && + (tProperty.PropertyType.Name.StartsWith("IDictionary") || tProperty.PropertyType.Name.StartsWith("Dictionary"))) + { + // noop + } + else if (tProperty.PropertyType.Namespace == "System.Collections.Generic" && + (tProperty.PropertyType.Name.StartsWith("IList") || tProperty.PropertyType.Name.StartsWith("List"))) + { + Type tGeneric = tProperty.PropertyType.GetGenericArguments().Single(); + object propEl = (tGeneric == typeof(string)) ? string.Empty : Activator.CreateInstance(tGeneric); + propEl = Convert.ChangeType(propEl, tGeneric); + SetPropertiesValueRecursively(propEl); + + Type tList = typeof(List<>).MakeGenericType(new Type[] { tGeneric }); + object prop = Activator.CreateInstance(tList); + + tList.GetMethod("Add").Invoke(prop, new[] { propEl }); + + tProperty.SetValue(obj, prop); + } + else + { + object prop = Activator.CreateInstance(tProperty.PropertyType); + SetPropertiesValueRecursively(prop); + + tProperty.SetValue(obj, prop); + } + } + }; + + var lstModel = _assembly.GetTypes() + .Where(e => + e.Namespace != null && + e.Namespace.Equals(_assembly.GetName().Name + "Models") && + e.IsClass && + !e.IsAbstract && + !e.IsInterface && + !e.IsNested + ) + .ToList(); + + var exceptions = new List(); + + foreach (Type tModel in lstModel) + { + // 模型命名结尾必为 Request 或 Response + if (!tModel.Name.EndsWith("Request") && !tModel.Name.EndsWith("Response")) + { + exceptions.Add(tModel); + continue; + } + + // Request 必继承自 WechatTenpayRequest、且有同名 Response + if (tModel.Name.EndsWith("Request")) + { + if (!typeof(WechatTenpayRequest).IsAssignableFrom(tModel)) + { + exceptions.Add(tModel); + continue; + } + + if (!lstModel.Any(e => e.Name == $"{tModel.Name.Substring(0, tModel.Name.Length - "Request".Length)}Response")) + { + exceptions.Add(tModel); + continue; + } + } + + // Request 必继承自 WechatTenpayResponse、且有同名 Request + if (tModel.Name.EndsWith("Response")) + { + if (!typeof(WechatTenpayResponse).IsAssignableFrom(tModel)) + { + exceptions.Add(tModel); + continue; + } + + if (!lstModel.Any(e => e.Name == $"{tModel.Name.Substring(0, tModel.Name.Length - "Response".Length)}Request")) + { + exceptions.Add(tModel); + continue; + } + } + + // 递归构造模型,并尝试 JSON 序列化以检测是否有序列化问题 + try + { + object instance = _assembly.CreateInstance(tModel.Namespace + "." + tModel.Name); + SetPropertiesValueRecursively(instance); + + new FlurlNewtonsoftJsonSerializer().Serialize(instance); + new FlurlSystemTextJsonSerializer().Serialize(instance); + } + catch (Exception ex) + { + throw new Exception($"Serialize `{tModel.Name}` failed.", ex); + } + } + + Assert.Empty(exceptions); + } + + [Fact(DisplayName = "验证接口定义")] + public void InterfaceDefinitionsTest() + { + var lstInterface = _assembly.GetTypes() + .Where(e => + e.Namespace != null && + e.Namespace.Equals(_assembly.GetName().Name) && + e.Name.StartsWith("WechatTenpayClientExecute") && + e.Name.EndsWith("Extensions") + ) + .ToList(); + + var exceptions = new List(); + + foreach (Type tInterface in lstInterface) + { + var lstMethod = tInterface.GetMethods() + .Where(e => + e.IsPublic && + e.IsStatic && + e.GetParameters().FirstOrDefault().ParameterType == typeof(WechatTenpayClient) + ) + .ToList(); + foreach (MethodInfo tMethod in lstMethod) + { + var lstParam = tMethod.GetParameters(); + + // 参数签名必为 this client + request + cancelToken + if (lstParam.Length != 3) + { + exceptions.Add(tMethod); + continue; + } + + // 第二个参数必为 WechatTenpayRequest 子类 + if (!typeof(WechatTenpayRequest).IsAssignableFrom(lstParam[1].ParameterType)) + { + exceptions.Add(tMethod); + continue; + } + + // 方法名与第二个参数、返回值均有相同命名 + string func = tMethod.Name; + string para = lstParam[1].ParameterType.Name; + string retv = tMethod.ReturnType.GenericTypeArguments.FirstOrDefault()?.Name; + if (para == null || !para.EndsWith("Request")) + { + exceptions.Add(tMethod); + continue; + } + else if (retv == null || !retv.EndsWith("Response")) + { + exceptions.Add(tMethod); + continue; + } + else if (!string.Equals(func, $"Execute{para.Substring(0, para.Length - "Request".Length)}Async")) + { + exceptions.Add(tMethod); + continue; + } + else if (!string.Equals(func, $"Execute{retv.Substring(0, retv.Length - "Response".Length)}Async")) + { + exceptions.Add(tMethod); + continue; + } + } + } + + Assert.Empty(exceptions); + } + + [Fact(DisplayName = "验证字段定义")] + public void FieldDefinitionsTest() + { + var exceptions = new List(); + + void VerifyJsonSamples(string subdir, string subns) + { + string[] GetFiles(string path) + { + var results = new List(); + + string[] dirs = Directory.GetDirectories(path); + string[] files = Directory.GetFiles(path); + + results.AddRange(files); + + foreach (string dir in dirs) + { + results.AddRange(GetFiles(dir)); + } + + return results.ToArray(); + } + + string workdir = Path.Combine(Environment.CurrentDirectory, subdir); + Assert.True(Directory.Exists(workdir)); + + var lstFile = GetFiles(workdir) + .Where(e => string.Equals(Path.GetExtension(e), ".json", StringComparison.InvariantCultureIgnoreCase)) + .ToList(); + Assert.NotEmpty(lstFile); + + foreach (string file in lstFile) + { + string json = File.ReadAllText(file); + string name = Path.GetFileNameWithoutExtension(file); + + Type type = _assembly.GetType($"{_assembly.GetName().Name}.{subns}.{name}"); + if (type == null) + { + exceptions.Add(name); + continue; + } + + try + { + var settings = FlurlNewtonsoftJsonSerializer.GetDefaultSerializerSettings(); + settings.CheckAdditionalContent = true; + settings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Error; + new FlurlNewtonsoftJsonSerializer(settings).Deserialize(json, type); + + new FlurlSystemTextJsonSerializer().Deserialize(json, type); + } + catch (Exception ex) + { + exceptions.Add(name); + + if (ex is Newtonsoft.Json.JsonException) + throw new Exception($"Deserialize `{name}` by Newtonsoft.Json failed.", ex); + else if (ex is System.Text.Json.JsonException) + throw new Exception($"Deserialize `{name}` by System.Text.Json failed.", ex); + else + throw new Exception($"Deserialize `{name}` failed.", ex); + } + } + } + + VerifyJsonSamples("ModelSamples", "Models"); + VerifyJsonSamples("ResourceSamples", "Resources"); + + Assert.Empty(exceptions); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteBillTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteBillTests.cs new file mode 100644 index 00000000..03720e77 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteBillTests.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteBillTests + { + [Fact(DisplayName = "[GET] /bill/tradebill")] + public async Task GetBillTradeBillTest() + { + var request = new Models.GetBillTradeBillRequest() + { + BillDateString = "2021-04-05" + }; + var response = await TestClients.Instance.ExecuteGetBillTradeBillAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.HashType); + Assert.NotNull(response.HashValue); + Assert.NotNull(response.DownloadUrl); + } + + [Fact(DisplayName = "[GET] /bill/fundflowbill")] + public async Task GetBillFundflowBillTest() + { + var request = new Models.GetBillFundflowBillRequest() + { + BillDateString = DateTimeOffset.Now.AddDays(-1).ToString("yyyy-MM-dd") + }; + var response = await TestClients.Instance.ExecuteGetBillFundflowBillAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.HashType); + Assert.NotNull(response.HashValue); + Assert.NotNull(response.DownloadUrl); + } + + [Fact(DisplayName = "[GET] /billdownload/file")] + public async Task DownloadBillFileTest() + { + var request = new Models.DownloadBillFileRequest() + { + DownloadUrl = "https://api.mch.weixin.qq.com/v3/billdownload/file?token=FAKE_TOKEN" + }; + var response = await TestClients.Instance.ExecuteDownloadBillFileAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotEmpty(response.RawBytes); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCertificatesTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCertificatesTests.cs new file mode 100644 index 00000000..2359df02 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCertificatesTests.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteCertificatesTests + { + [Fact(DisplayName = "[GET] /certificates")] + public async Task QueryCertificatesTest() + { + var request = new Models.QueryCertificatesRequest(); + var response = await TestClients.Instance.ExecuteQueryCertificatesAsync(request); + + Assert.NotEmpty(response.WechatpayRequestId); + Assert.NotEmpty(response.WechatpayCertSerialNumber); + Assert.NotEmpty(response.WechatpayTimestamp); + Assert.NotEmpty(response.WechatpayNonce); + Assert.NotEmpty(response.WechatpaySignature); + Assert.True(response.CertificateList.All(e => e.SerialNumber != null)); + Assert.True(response.CertificateList.All(e => e.EncryptCertificate != null)); + Assert.True(response.CertificateList.All(e => e.EffectiveTime < DateTimeOffset.Now)); + Assert.True(response.CertificateList.All(e => e.ExpireTime > DateTimeOffset.Now)); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCombineTransactionsTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCombineTransactionsTests.cs new file mode 100644 index 00000000..9724cbd0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteCombineTransactionsTests.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteCombineTransactionsTests + { + [Fact(DisplayName = "[POST] /combine-transactions/app")] + public async Task CreateCombineTransactionAppTest() + { + var request = new Models.CreateCombineTransactionAppRequest() + { + CombineAppId = TestConfigs.WechatAppId, + CombineOutTradeNumber = "TEST_COTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + SubOrderList = new Models.CreateCombineTransactionAppRequest.Types.SubOrder[] + { + new Models.CreateCombineTransactionAppRequest.Types.SubOrder() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + Description = "FAKE_DESCRIPTION", + Amount = new Models.CreateCombineTransactionAppRequest.Types.SubOrder.Types.Amount() + { + Total = 1 + } + } + }, + NotifyUrl = "http://127.0.0.1" + }; + var response = await TestClients.Instance.ExecuteCreateCombineTransactionAppAsync(request); + + Assert.NotNull(response.PrepayId); + } + + [Fact(DisplayName = "[POST] /combine-transactions/jsapi")] + public async Task CreateCombineTransactionJsapiTest() + { + var request = new Models.CreateCombineTransactionJsapiRequest() + { + CombineAppId = TestConfigs.WechatAppId, + CombineOutTradeNumber = "TEST_COTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + SubOrderList = new Models.CreateCombineTransactionJsapiRequest.Types.SubOrder[] + { + new Models.CreateCombineTransactionJsapiRequest.Types.SubOrder() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + "1", + Description = "FAKE_DESCRIPTION", + Amount = new Models.CreateCombineTransactionJsapiRequest.Types.SubOrder.Types.Amount() + { + Total = 1 + } + }, + new Models.CreateCombineTransactionJsapiRequest.Types.SubOrder() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + "2", + Description = "FAKE_DESCRIPTION", + Amount = new Models.CreateCombineTransactionJsapiRequest.Types.SubOrder.Types.Amount() + { + Total = 1 + } + } + }, + CombinePayer = new Models.CreateCombineTransactionJsapiRequest.Types.Payer() + { + OpenId = TestConfigs.WechatOpenId + }, + NotifyUrl = "http://127.0.0.1" + }; + var response = await TestClients.Instance.ExecuteCreateCombineTransactionJsapiAsync(request); + + Assert.NotNull(response.PrepayId); + } + + [Fact(DisplayName = "[POST] /combine-transactions/h5")] + public async Task CreateCombineTransactionH5Test() + { + var request = new Models.CreateCombineTransactionH5Request() + { + CombineAppId = TestConfigs.WechatAppId, + CombineOutTradeNumber = "TEST_COTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + SubOrderList = new Models.CreateCombineTransactionH5Request.Types.SubOrder[] + { + new Models.CreateCombineTransactionH5Request.Types.SubOrder() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + Description = "FAKE_DESCRIPTION", + Amount = new Models.CreateCombineTransactionH5Request.Types.SubOrder.Types.Amount() + { + Total = 1 + } + } + }, + NotifyUrl = "http://127.0.0.1" + }; + var response = await TestClients.Instance.ExecuteCreateCombineTransactionH5Async(request); + + Assert.NotNull(response.H5Url); + } + + [Fact(DisplayName = "[POST] /combine-transactions/native")] + public async Task CreateCombineTransactionNativeTest() + { + var request = new Models.CreateCombineTransactionNativeRequest() + { + CombineAppId = TestConfigs.WechatAppId, + CombineOutTradeNumber = "TEST_COTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + SubOrderList = new Models.CreateCombineTransactionNativeRequest.Types.SubOrder[] + { + new Models.CreateCombineTransactionNativeRequest.Types.SubOrder() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + Description = "FAKE_DESCRIPTION", + Amount = new Models.CreateCombineTransactionNativeRequest.Types.SubOrder.Types.Amount() + { + Total = 1 + } + } + }, + NotifyUrl = "http://127.0.0.1" + }; + var response = await TestClients.Instance.ExecuteCreateCombineTransactionNativeAsync(request); + + Assert.NotNull(response.QrcodeUrl); + } + + [Fact(DisplayName = "[GET] /combine-transactions/out-trade-no/{combine_out_trade_no}")] + public async Task GetCombineTransactionByCombineOutTradeNumberTest() + { + var request = new Models.GetCombineTransactionByCombineOutTradeNumberRequest() + { + CombineOutTradeNumber = "FAKE_OUTTRADENO" + }; + var response = await TestClients.Instance.ExecuteGetCombineTransactionByCombineOutTradeNumberAsync(request); + + Assert.NotNull(response.CombineAppId); + Assert.NotNull(response.CombineMerchantId); + Assert.NotNull(response.CombineOutTradeNumber); + Assert.NotEmpty(response.SubOrderList); + } + + [Fact(DisplayName = "[POST] /combine-transactions/out-trade-no/{combine_out_trade_no}/close")] + public async Task CloseCombineTransactionTest() + { + var request = new Models.CloseCombineTransactionRequest() + { + CombineAppId = TestConfigs.WechatAppId, + CombineOutTradeNumber = "FAKE_OUTTRADENO", + SubOrderList = new Models.CloseCombineTransactionRequest.Types.SubOrder[] + { + new Models.CloseCombineTransactionRequest.Types.SubOrder() + { + OutTradeNumber = "FAKE_OUTTRADENO" + } + } + }; + var response = await TestClients.Instance.ExecuteCloseCombineTransactionAsync(request); + + Assert.True(response.IsSuccessful()); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingBusifavorTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingBusifavorTests.cs new file mode 100644 index 00000000..046e3395 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingBusifavorTests.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMarketingBusifavorTests + { + [Fact(DisplayName = "[POST] /marketing/busifavor/stocks")] + public async Task CreateMarketingBusifavorStockTest() + { + var request = new Models.CreateMarketingBusifavorStockRequest() + { + StockName = "FAKE_STOCK", + StockType = "NORMAL", + OutRequestNumber = "TEST_ORN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + StockSendRule = new Models.CreateMarketingBusifavorStockRequest.Types.StockSendRule() + { + MaxCoupons = 1, + MaxCouponsPerUser = 1 + }, + CouponUseRule = new Models.CreateMarketingBusifavorStockRequest.Types.CouponUseRule() + { + CouponAvailableTime = new Models.CreateMarketingBusifavorStockRequest.Types.CouponUseRule.Types.CouponAvailableTime() + { + AvailableBeginTime = DateTime.Today.AddDays(1), + AvailableEndTime = DateTime.Today.AddDays(31) + }, + NormalCoupon = new Models.CreateMarketingBusifavorStockRequest.Types.CouponUseRule.Types.NormalCoupon() + { + DiscountAmount = 1, + TransactionMinimum = 1 + }, + UseMethod = "OFF_LINE" + }, + GoodsName = "FAKE_GOODS", + CouponCodeMode = "WECHATPAY_MODE" + }; + var response = await TestClients.Instance.ExecuteCreateMarketingBusifavorStockAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + } + + [Fact(DisplayName = "[GET] /marketing/busifavor/stocks/{stock_id}")] + public async Task GetMarketingBusifavorStockByStockIdTest() + { + var request = new Models.GetMarketingBusifavorStockByStockIdRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecuteGetMarketingBusifavorStockByStockIdAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + Assert.NotNull(response.StockName); + Assert.NotNull(response.StockType); + Assert.NotNull(response.StockState); + Assert.NotNull(response.StockSendRule); + Assert.NotNull(response.CouponUseRule); + Assert.NotNull(response.CouponCodeMode); + } + + [Fact(DisplayName = "[GET] /marketing/busifavor/users/{openid}/coupons")] + public async Task QueryMarketingBusifavorUserCouponsTest() + { + var request = new Models.QueryMarketingBusifavorUserCouponsRequest() + { + AppId = TestConfigs.WechatAppId, + OpenId = TestConfigs.WechatOpenId, + BelongMerchantId = TestConfigs.WechatMerchantId + }; + var response = await TestClients.Instance.ExecuteQueryMarketingBusifavorUserCouponsAsync(request); + + Assert.True(response.IsSuccessful()); + } + + [Fact(DisplayName = "[POST] /marketing/busifavor/callbacks")] + public async Task UpdateMarketingBusifavorCallbackTest() + { + var request = new Models.UpdateMarketingBusifavorCallbackRequest() + { + NotifyUrl = "https://FAKE_URL" + }; + var response = await TestClients.Instance.ExecuteUpdateMarketingBusifavorCallbackAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.NotifyUrl); + } + + [Fact(DisplayName = "[GET] /marketing/busifavor/callbacks")] + public async Task GetMarketingBusifavorCallbackTest() + { + var request = new Models.GetMarketingBusifavorCallbackRequest(); + var response = await TestClients.Instance.ExecuteGetMarketingBusifavorCallbackAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.NotifyUrl); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingFavorTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingFavorTests.cs new file mode 100644 index 00000000..47092423 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingFavorTests.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMarketingFavorTests + { + [Fact(DisplayName = "[POST] /marketing/favor/coupon-stocks")] + public async Task CreateMarketingFavorStockTest() + { + var request = new Models.CreateMarketingFavorStockRequest() + { + StockName = "FAKE_STOCK", + StockType = "NORMAL", + OutRequestNumber = "TEST_ORN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + AvailableBeginTime = DateTime.Today.AddDays(1), + AvailableEndTime = DateTime.Today.AddDays(31), + StockUseRule = new Models.CreateMarketingFavorStockRequest.Types.StockUseRule() + { + MaxCoupons = 1, + MaxAmount = 1, + MaxCouponsPerUser = 1 + }, + CouponUseRule = new Models.CreateMarketingFavorStockRequest.Types.CouponUseRule() + { + NormalCoupon = new Models.CreateMarketingFavorStockRequest.Types.CouponUseRule.Types.NormalCoupon() + { + CouponAmount = 1, + TransactionMinimum = 1 + }, + AvailableMerchantIdList = new List() { TestConfigs.WechatMerchantId } + }, + IsNoCash = false + }; + var response = await TestClients.Instance.ExecuteCreateMarketingFavorStockAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + } + + [Fact(DisplayName = "[POST] /marketing/favor/stocks/{stock_id}/start")] + public async Task StartMarketingFavorStockTest() + { + var request = new Models.StartMarketingFavorStockRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecuteStartMarketingFavorStockAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + } + + [Fact(DisplayName = "[POST] /marketing/favor/stocks/{stock_id}/pause")] + public async Task PauseMarketingFavorStockTest() + { + var request = new Models.PauseMarketingFavorStockRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecutePauseMarketingFavorStockAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + } + + [Fact(DisplayName = "[POST] /marketing/favor/stocks/{stock_id}/restart")] + public async Task RestartMarketingFavorStockTest() + { + var request = new Models.RestartMarketingFavorStockRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecuteRestartMarketingFavorStockAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + } + + [Fact(DisplayName = "[GET] /marketing/favor/stocks/{stock_id}")] + public async Task GetMarketingFavorStockByStockIdTest() + { + var request = new Models.GetMarketingFavorStockByStockIdRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecuteGetMarketingFavorStockByStockIdAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + } + + [Fact(DisplayName = "[GET] /marketing/favor/stocks")] + public async Task QueryMarketingFavorStocksTest() + { + var request = new Models.QueryMarketingFavorStocksRequest(); + var response = await TestClients.Instance.ExecuteQueryMarketingFavorStocksAsync(request); + + Assert.True(response.IsSuccessful()); + + if (response.StockList.Any()) + { + Assert.NotNull(response.StockList.First().StockId); + Assert.NotNull(response.StockList.First().StockName); + Assert.NotNull(response.StockList.First().StockType); + Assert.NotNull(response.StockList.First().StockCreatorMerchantId); + Assert.NotNull(response.StockList.First().StockUseRule); + Assert.NotNull(response.StockList.First().Status); + } + } + + [Fact(DisplayName = "[GET] /marketing/favor/stocks/{stock_id}/merchants")] + public async Task QueryMarketingFavorStockMerchantsTest() + { + var request = new Models.QueryMarketingFavorStockMerchantsRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecuteQueryMarketingFavorStockMerchantsAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + Assert.NotNull(response.MerchantIdList); + } + + [Fact(DisplayName = "[GET] /marketing/favor/stocks/{stock_id}/items")] + public async Task QueryMarketingFavorStockItemsTest() + { + var request = new Models.QueryMarketingFavorStockItemsRequest() + { + StockId = "FAKE_STOCKID" + }; + var response = await TestClients.Instance.ExecuteQueryMarketingFavorStockItemsAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.StockId); + Assert.NotNull(response.Items); + } + + [Fact(DisplayName = "[POST] /marketing/favor/callbacks")] + public async Task UpdateMarketingFavorCallbackTest() + { + var request = new Models.UpdateMarketingFavorCallbackRequest() + { + NotifyUrl = "https://FAKE_URL", + Switch = false + }; + var response = await TestClients.Instance.ExecuteUpdateMarketingFavorCallbackAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.NotifyUrl); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingMediaTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingMediaTests.cs new file mode 100644 index 00000000..d4adc63b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingMediaTests.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMarketingMediaTests + { + [Fact(DisplayName = "[POST] /marketing/favor/media/image-upload")] + public async Task UploadMarketingMediaImageTest() + { + var request = new Models.UploadMarketingMediaImageRequest() + { + FileName = "FAKE_IMAGE.jpg", + FileBytes = Convert.FromBase64String("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KK+bv25viR458H/ABS+E+meDNb8S6YNW1LffWuk22lyRaig1DS7fZePfRuY7QR3cxc2zR3BOwRsWwp8I8Hftl/FD4k+H9G1HVvEnij4dHSbnTJ2hubXQGXxYrHSIypKpc7bS7N9MyqjW92DsH7nGwkfe++3/pP/AMktN97IbTX3X/P/AORfltqfoRRXzTr3xA8eeI7T4i6BdeJ/EXhM/DiyuFm13RrLTmvtZmuJPtGn/ZhdW09v5iWapHKDAVea6wqjZXvnw40rVtC+HuhWWv6m+ta7aafBDqOoNHHGb65WNRLMVjREXe4ZsIiqM8KBxRHVc3p+N/ytr2uvkno7ev4W/O+nezK3jX4TaB8Q9VsL7V7Frm70yNo7WVbmWFoVaa3nONjLz5lrA2eo8vjgsD554v8A+Cf/AMKvHGnaLaX2g6tHb6Bc2d1aR2PiTVLAFrQQi3WXyLhPPjQ28DeVNvRmhRmUsoNezUUdb9tfu2DpY4X4mfs4+E/i54b8RaVrFrq0dv4qntLrUZtM1u+0q7eW1aJ7eSO5tZopoGRoYyDE6E7ec5Oes8NeH4PCfh2w0u1e9lttOt47aJ7y8mvbh0RQoMk8zPLK+By8jM7HJYkkmr1FC0VkG+/T+v0R/9k=") + }; + var response = await TestClients.Instance.ExecuteUploadMarketingMediaImageAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MediaUrl); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPartnershipsTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPartnershipsTests.cs new file mode 100644 index 00000000..1587d1e0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPartnershipsTests.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMarketingPartnershipsTests + { + [Fact(DisplayName = "[POST] /marketing/partnerships/build")] + public async Task BuildMarketingPartnershipTest() + { + var request = new Models.BuildMarketingPartnershipRequest() + { + Partner = new Models.BuildMarketingPartnershipRequest.Types.Partner() + { + Type = "MERCHANT", + MerchantId = TestConfigs.WechatMerchantId + }, + AuthorizedData = new Models.BuildMarketingPartnershipRequest.Types.AuthorizedData() + { + BusinessType = "FAVOR_STOCK" + } + }; + var response = await TestClients.Instance.ExecuteBuildMarketingPartnershipAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.State); + } + + [Fact(DisplayName = "[GET] /marketing/partnerships")] + public async Task QueryMarketingPartnershipsTest() + { + var request = new Models.QueryMarketingPartnershipsRequest() + { + Partner = new Models.QueryMarketingPartnershipsRequest.Types.Partner() + { + Type = "MERCHANT", + MerchantId = TestConfigs.WechatMerchantId + }, + AuthorizedData = new Models.QueryMarketingPartnershipsRequest.Types.AuthorizedData() + { + BusinessType = "FAVOR_STOCK" + } + }; + var response = await TestClients.Instance.ExecuteQueryMarketingPartnershipsAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.PartnershipList); + + if (response.PartnershipList.Any()) + { + Assert.NotNull(response.PartnershipList.First().Partner); + Assert.NotNull(response.PartnershipList.First().Partner.Type); + Assert.NotNull(response.PartnershipList.First().AuthorizedData); + Assert.NotNull(response.PartnershipList.First().AuthorizedData.BusinessType); + Assert.NotNull(response.PartnershipList.First().State); + } + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPayGiftActivityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPayGiftActivityTests.cs new file mode 100644 index 00000000..4d78ec08 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMarketingPayGiftActivityTests.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMarketingPayGiftActivityTests + { + [Fact(DisplayName = "[GET] /marketing/paygiftactivity/activities")] + public async Task QueryMarketingPayGiftActivitiesTest() + { + var request = new Models.QueryMarketingPayGiftActivitiesRequest(); + var response = await TestClients.Instance.ExecuteQueryMarketingPayGiftActivitiesAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.ActivityList); + + if (response.ActivityList.Any()) + { + Assert.NotNull(response.ActivityList.First().ActivityId); + Assert.NotNull(response.ActivityList.First().ActivityStatus); + Assert.NotNull(response.ActivityList.First().ActivityBaseInformation); + Assert.NotNull(response.ActivityList.First().AwardSendRule); + } + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantMediaTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantMediaTests.cs new file mode 100644 index 00000000..39045989 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantMediaTests.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMerchantMediaTests + { + [Fact(DisplayName = "[POST] /merchant/media/upload")] + public async Task UploadMerchantServiceImageTest() + { + var request = new Models.UploadMerchantMediaImageRequest() + { + FileName = "FAKE_IMAGE.jpg", + FileBytes = Convert.FromBase64String("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KK+bv25viR458H/ABS+E+meDNb8S6YNW1LffWuk22lyRaig1DS7fZePfRuY7QR3cxc2zR3BOwRsWwp8I8Hftl/FD4k+H9G1HVvEnij4dHSbnTJ2hubXQGXxYrHSIypKpc7bS7N9MyqjW92DsH7nGwkfe++3/pP/AMktN97IbTX3X/P/AORfltqfoRRXzTr3xA8eeI7T4i6BdeJ/EXhM/DiyuFm13RrLTmvtZmuJPtGn/ZhdW09v5iWapHKDAVea6wqjZXvnw40rVtC+HuhWWv6m+ta7aafBDqOoNHHGb65WNRLMVjREXe4ZsIiqM8KBxRHVc3p+N/ytr2uvkno7ev4W/O+nezK3jX4TaB8Q9VsL7V7Frm70yNo7WVbmWFoVaa3nONjLz5lrA2eo8vjgsD554v8A+Cf/AMKvHGnaLaX2g6tHb6Bc2d1aR2PiTVLAFrQQi3WXyLhPPjQ28DeVNvRmhRmUsoNezUUdb9tfu2DpY4X4mfs4+E/i54b8RaVrFrq0dv4qntLrUZtM1u+0q7eW1aJ7eSO5tZopoGRoYyDE6E7ec5Oes8NeH4PCfh2w0u1e9lttOt47aJ7y8mvbh0RQoMk8zPLK+By8jM7HJYkkmr1FC0VkG+/T+v0R/9k=") + }; + var response = await TestClients.Instance.ExecuteUploadMerchantMediaImageAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MediaId); + } + + [Fact(DisplayName = "[POST] /merchant/media/video_upload")] + public async Task UploadMerchantServiceVideoTest() + { + var request = new Models.UploadMerchantMediaVideoRequest() + { + FileName = "FAKE_IMAGE.mp4", + FileBytes = Convert.FromBase64String("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KK+bv25viR458H/ABS+E+meDNb8S6YNW1LffWuk22lyRaig1DS7fZePfRuY7QR3cxc2zR3BOwRsWwp8I8Hftl/FD4k+H9G1HVvEnij4dHSbnTJ2hubXQGXxYrHSIypKpc7bS7N9MyqjW92DsH7nGwkfe++3/pP/AMktN97IbTX3X/P/AORfltqfoRRXzTr3xA8eeI7T4i6BdeJ/EXhM/DiyuFm13RrLTmvtZmuJPtGn/ZhdW09v5iWapHKDAVea6wqjZXvnw40rVtC+HuhWWv6m+ta7aafBDqOoNHHGb65WNRLMVjREXe4ZsIiqM8KBxRHVc3p+N/ytr2uvkno7ev4W/O+nezK3jX4TaB8Q9VsL7V7Frm70yNo7WVbmWFoVaa3nONjLz5lrA2eo8vjgsD554v8A+Cf/AMKvHGnaLaX2g6tHb6Bc2d1aR2PiTVLAFrQQi3WXyLhPPjQ28DeVNvRmhRmUsoNezUUdb9tfu2DpY4X4mfs4+E/i54b8RaVrFrq0dv4qntLrUZtM1u+0q7eW1aJ7eSO5tZopoGRoYyDE6E7ec5Oes8NeH4PCfh2w0u1e9lttOt47aJ7y8mvbh0RQoMk8zPLK+By8jM7HJYkkmr1FC0VkG+/T+v0R/9k=") + }; + var response = await TestClients.Instance.ExecuteUploadMerchantMediaVideoAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MediaId); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantServiceTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantServiceTests.cs new file mode 100644 index 00000000..0e98c0a3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteMerchantServiceTests.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteMerchantServiceTests + { + [Fact(DisplayName = "[GET] /merchant-service/complaints-v2")] + public async Task QueryMerchantServiceComplaintsTest() + { + var request = new Models.QueryMerchantServiceComplaintsRequest() + { + BeginDateString = "2021-01-01", + EndDateString = "2021-01-30" + }; + var response = await TestClients.Instance.ExecuteQueryMerchantServiceComplaintsAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.ComplaintList); + + if (response.ComplaintList.Any()) + { + Assert.NotNull(response.ComplaintList.First().ComplaintId); + Assert.NotNull(response.ComplaintList.First().ComplaintDetail); + Assert.NotNull(response.ComplaintList.First().ComplaintState); + Assert.True(response.ComplaintList.First().UserComplaintTimes >= 1); + } + } + + [Fact(DisplayName = "[GET] /merchant-service/complaints-v2/{merchant_id}")] + public async Task GetMerchantServiceComplaintByComplaintIdTest() + { + var request = new Models.GetMerchantServiceComplaintByComplaintIdRequest() + { + ComplaintId = "FAKE_COMPLAINTID" + }; + var response = await TestClients.Instance.ExecuteGetMerchantServiceComplaintByComplaintIdAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.ComplaintId); + Assert.NotNull(response.ComplaintDetail); + Assert.NotNull(response.ComplaintState); + Assert.True(response.UserComplaintTimes >= 1); + } + + [Fact(DisplayName = "[GET] /merchant-service/complaints-v2/{merchant_id}/negotiation-historys")] + public async Task QueryMerchantServiceComplaintNegotiationHistoriesTest() + { + var request = new Models.QueryMerchantServiceComplaintNegotiationHistoriesRequest() + { + ComplaintId = "FAKE_COMPLAINTID" + }; + var response = await TestClients.Instance.ExecuteQueryMerchantServiceComplaintNegotiationHistoriesAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.NegotiationHistoryList); + + if (response.NegotiationHistoryList.Any()) + { + Assert.NotNull(response.NegotiationHistoryList.First().LogId); + Assert.NotNull(response.NegotiationHistoryList.First().Operator); + Assert.NotNull(response.NegotiationHistoryList.First().OperateType); + Assert.NotNull(response.NegotiationHistoryList.First().OperateDetails); + } + } + + [Fact(DisplayName = "[POST] /merchant-service/complaint-notifications")] + public async Task CreateMerchantServiceComplaintNotificationTest() + { + var request = new Models.CreateMerchantServiceComplaintNotificationRequest() + { + NotifyUrl = "https://FAKE_URL" + }; + var response = await TestClients.Instance.ExecuteCreateMerchantServiceComplaintNotificationAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MerchantId); + Assert.NotNull(response.NotifyUrl); + } + + [Fact(DisplayName = "[GET] /merchant-service/complaint-notifications")] + public async Task GetMerchantServiceComplaintNotificationTest() + { + var request = new Models.GetMerchantServiceComplaintNotificationRequest(); + var response = await TestClients.Instance.ExecuteGetMerchantServiceComplaintNotificationAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MerchantId); + Assert.NotNull(response.NotifyUrl); + } + + [Fact(DisplayName = "[PUT] /merchant-service/complaint-notifications")] + public async Task UpdateMerchantServiceComplaintNotificationTest() + { + var request = new Models.UpdateMerchantServiceComplaintNotificationRequest() + { + NotifyUrl = "https://FAKE_URL" + }; + var response = await TestClients.Instance.ExecuteUpdateMerchantServiceComplaintNotificationAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MerchantId); + Assert.NotNull(response.NotifyUrl); + } + + [Fact(DisplayName = "[DELETE] /merchant-service/complaint-notifications")] + public async Task DeleteMerchantServiceComplaintNotificationTest() + { + var request = new Models.DeleteMerchantServiceComplaintNotificationRequest(); + var response = await TestClients.Instance.ExecuteDeleteMerchantServiceComplaintNotificationAsync(request); + + Assert.True(response.IsSuccessful()); + } + + [Fact(DisplayName = "[POST] /merchant-service/images/upload")] + public async Task UploadMerchantServiceImageTest() + { + var request = new Models.UploadMerchantServiceImageRequest() + { + FileName = "FAKE_IMAGE.jpg", + FileBytes = Convert.FromBase64String("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KK+bv25viR458H/ABS+E+meDNb8S6YNW1LffWuk22lyRaig1DS7fZePfRuY7QR3cxc2zR3BOwRsWwp8I8Hftl/FD4k+H9G1HVvEnij4dHSbnTJ2hubXQGXxYrHSIypKpc7bS7N9MyqjW92DsH7nGwkfe++3/pP/AMktN97IbTX3X/P/AORfltqfoRRXzTr3xA8eeI7T4i6BdeJ/EXhM/DiyuFm13RrLTmvtZmuJPtGn/ZhdW09v5iWapHKDAVea6wqjZXvnw40rVtC+HuhWWv6m+ta7aafBDqOoNHHGb65WNRLMVjREXe4ZsIiqM8KBxRHVc3p+N/ytr2uvkno7ev4W/O+nezK3jX4TaB8Q9VsL7V7Frm70yNo7WVbmWFoVaa3nONjLz5lrA2eo8vjgsD554v8A+Cf/AMKvHGnaLaX2g6tHb6Bc2d1aR2PiTVLAFrQQi3WXyLhPPjQ28DeVNvRmhRmUsoNezUUdb9tfu2DpY4X4mfs4+E/i54b8RaVrFrq0dv4qntLrUZtM1u+0q7eW1aJ7eSO5tZopoGRoYyDE6E7ec5Oes8NeH4PCfh2w0u1e9lttOt47aJ7y8mvbh0RQoMk8zPLK+By8jM7HJYkkmr1FC0VkG+/T+v0R/9k=") + }; + var response = await TestClients.Instance.ExecuteUploadMerchantServiceImageAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.MediaId); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecutePayTransactionsTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecutePayTransactionsTests.cs new file mode 100644 index 00000000..58c37aef --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecutePayTransactionsTests.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecutePayTransactionsTests + { + [Fact(DisplayName = "[POST] /pay/transactions/app")] + public async Task CreatePayTransactionAppTest() + { + var request = new Models.CreatePayTransactionAppRequest() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + AppId = TestConfigs.WechatAppId, + Description = "FAKE_DESCRIPTION", + NotifyUrl = "http://127.0.0.1", + Amount = new Models.CreatePayTransactionAppRequest.Types.Amount() + { + Total = 1 + } + }; + var response = await TestClients.Instance.ExecuteCreatePayTransactionAppAsync(request); + + Assert.NotNull(response.PrepayId); + } + + [Fact(DisplayName = "[POST] /pay/transactions/jsapi")] + public async Task CreatePayTransactionJsapiTest() + { + var request = new Models.CreatePayTransactionJsapiRequest() + { + OutTradeNumber = "TEST" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + AppId = TestConfigs.WechatAppId, + Description = "FAKE_DESCRIPTION", + ExpireTime = DateTimeOffset.Now.AddMinutes(30), + NotifyUrl = "http://127.0.0.1", + Amount = new Models.CreatePayTransactionJsapiRequest.Types.Amount() + { + Total = 1 + }, + Payer = new Models.CreatePayTransactionJsapiRequest.Types.Payer() + { + OpenId = TestConfigs.WechatOpenId + } + }; + var response = await TestClients.Instance.ExecuteCreatePayTransactionJsapiAsync(request); + + Assert.NotNull(response.PrepayId); + } + + [Fact(DisplayName = "[POST] /pay/transactions/h5")] + public async Task CreatePayTransactionH5Test() + { + var request = new Models.CreatePayTransactionH5Request() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + AppId = TestConfigs.WechatAppId, + Description = "FAKE_DESCRIPTION", + NotifyUrl = "http://127.0.0.1", + Amount = new Models.CreatePayTransactionH5Request.Types.Amount() + { + Total = 1 + } + }; + var response = await TestClients.Instance.ExecuteCreatePayTransactionH5Async(request); + + Assert.NotNull(response.H5Url); + } + + [Fact(DisplayName = "[POST] /pay/transactions/native")] + public async Task CreatePayTransactionNativeTest() + { + var request = new Models.CreatePayTransactionNativeRequest() + { + OutTradeNumber = "TEST_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + AppId = TestConfigs.WechatAppId, + Description = "FAKE_DESCRIPTION", + NotifyUrl = "http://127.0.0.1", + Amount = new Models.CreatePayTransactionNativeRequest.Types.Amount() + { + Total = 1 + } + }; + var response = await TestClients.Instance.ExecuteCreatePayTransactionNativeAsync(request); + + Assert.NotNull(response.QrcodeUrl); + } + + [Fact(DisplayName = "[GET] /pay/transactions/id/{transaction_id}")] + public async Task GetPayTransactionByIdTest() + { + var request = new Models.GetPayTransactionByIdRequest() + { + TransactionId = "FAKE_TRANSACTIONID" + }; + var response = await TestClients.Instance.ExecuteGetPayTransactionByIdAsync(request); + + Assert.NotNull(response.AppId); + Assert.NotNull(response.MerchantId); + Assert.NotNull(response.OutTradeNumber); + Assert.NotNull(response.TransactionId); + Assert.NotNull(response.TradeState); + Assert.NotNull(response.TradeStateDescription); + Assert.True(response.Amount.Total > 0); + } + + [Fact(DisplayName = "[GET] /pay/transactions/out-trade-no/{out_trade_no}")] + public async Task GetPayTransactionByOutTradeNumberTest() + { + var request = new Models.GetPayTransactionByOutTradeNumberRequest() + { + OutTradeNumber = "FAKE_OUTTRADENO" + }; + var response = await TestClients.Instance.ExecuteGetPayTransactionByOutTradeNumberAsync(request); + + Assert.NotNull(response.AppId); + Assert.NotNull(response.MerchantId); + Assert.NotNull(response.OutTradeNumber); + Assert.NotNull(response.TradeState); + Assert.NotNull(response.TradeStateDescription); + Assert.True(response.Amount.Total > 0); + } + + [Fact(DisplayName = "[POST] /pay/transactions/out-trade-no/{out_trade_no}/close")] + public async Task ClosePayTransactionTest() + { + var request = new Models.ClosePayTransactionRequest() + { + OutTradeNumber = "TEST20210419193742518" + }; + var response = await TestClients.Instance.ExecuteClosePayTransactionAsync(request); + + Assert.True(response.IsSuccessful()); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteRefundTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteRefundTests.cs new file mode 100644 index 00000000..e48b57e7 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayExecuteRefundTests.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayExecuteRefundTests + { + [Fact(DisplayName = "[POST] /refund/domestic/refunds")] + public async Task CreateRefundDomesticRefundTest() + { + var request = new Models.CreateRefundDomesticRefundRequest() + { + OutTradeNumber = "FAKE_OUTTRADENO", + OutRefundNumber = "TEST_ORN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"), + Amount = new Models.CreateRefundDomesticRefundRequest.Types.Amount() + { + Total = 1, + Refund = 1 + }, + Reason = "FAKE_REASON" + }; + var response = await TestClients.Instance.ExecuteCreateRefundDomesticRefundAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.OutRefundNumber); + Assert.NotNull(response.OutTradeNumber); + Assert.NotNull(response.Channel); + Assert.NotNull(response.Status); + Assert.True(response.Amount.Total > 0); + Assert.True(response.Amount.Refund > 0); + Assert.True(response.Amount.PayerTotal > 0); + Assert.True(response.Amount.PayerRefund > 0); + } + + [Fact(DisplayName = "[GET] /refund/domestic/refunds/{out_refund_no}")] + public async Task GetRefundDomesticRefundByOutRefundNumberTest() + { + var request = new Models.GetRefundDomesticRefundByOutRefundNumberRequest() + { + OutRefundNumber = "FAKE_OUTREFUNDNO" + }; + var response = await TestClients.Instance.ExecuteGetRefundDomesticRefundByOutRefundNumberAsync(request); + + Assert.True(response.IsSuccessful()); + Assert.NotNull(response.RefundId); + Assert.NotNull(response.OutRefundNumber); + Assert.NotNull(response.TransactionId); + Assert.NotNull(response.OutTradeNumber); + Assert.NotNull(response.Channel); + Assert.NotNull(response.Status); + Assert.NotNull(response.UserReceivedAccount); + Assert.NotNull(response.FundsAccount); + Assert.True(response.Amount.Total > 0); + Assert.True(response.Amount.Refund > 0); + Assert.True(response.Amount.PayerTotal > 0); + Assert.True(response.Amount.PayerRefund > 0); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayResponseVerificationTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayResponseVerificationTests.cs new file mode 100644 index 00000000..4bef61da --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayResponseVerificationTests.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayResponseVerificationTests + { + [Fact(DisplayName = "验证响应签名")] + public async Task VerifyResponseSignatureTest() + { + var request = new Models.QueryCertificatesRequest(); + var response = await TestClients.Instance.ExecuteQueryCertificatesAsync(request); + + Assert.NotNull(response.WechatpayRequestId); + Assert.NotNull(response.WechatpayTimestamp); + Assert.NotNull(response.WechatpayNonce); + Assert.NotNull(response.WechatpayCertSerialNumber); + Assert.NotNull(response.WechatpaySignature); + + TestClients.Instance.DecryptResponseEncryptedData(response); + var certificateModel = response.CertificateList.SingleOrDefault(e => e.SerialNumber == response.WechatpayCertSerialNumber); + Assert.NotNull(certificateModel); + + // 通过证书验证签名 + Assert.True(TestClients.Instance.VerifyResponseSignatureByCertificate(response, certificate: certificateModel.EncryptCertificate.CipherText)); + // 通过公钥验证签名 + Assert.True(TestClients.Instance.VerifyResponseSignature(response, publicKey: Utilities.RsaUtil.ExportPublicKey(certificateModel.EncryptCertificate.CipherText))); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayUtilityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayUtilityTests.cs new file mode 100644 index 00000000..46a8b5b2 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatTenpayUtilityTests.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests +{ + public class WechatTenpayUtilityTests + { + [Fact(DisplayName = "证书和回调报文解密(AES-GCM)")] + public void AesGcmDecryptTest() + { + string aesKey = "f09b03a7a1902b5b4913856f1fd07ab1"; + string nonce = "aae8c2e79c5b"; + string associatedData = "certificate"; + string cipherText = "x9kkL5w1JuaypcjhrYIP+kVNlN8o8uN4yJyJjy5lg+PyPnQL2Zn//ORaXAyzdaK/WBMVd3u/Y9hLaTBLMyRXzowsrkJ5PT37johye48N7BAJQ0PJwW++d1RdhOOPjoqfmws6rSV5Gv2qhfdKjmpxVjr8xr71dtBt8J2wu+bAV99HHQoAynm/Pp9OQYZgpOQ+1cyFHd43TAxOoFfmixKrXr3HP8lJot0XCUSq4qkr1Hs44FV2KuzntSk8eqKr5N17UcuPF3VYnnnF/AvQ7HuLKWwrHhUbaXfkwy0Q2n36UJMfBj7344S97E8BnS89ojgOPQi+olBPyNgrtDWHgsJAKu7HA6PV/FgmXcrZirje/AH1u25es4z5xItHscm//6rDvALgf7greV5OJzMsSl/KVDtbkjDSzim0j4ZTduIfzh7l6jfOz115ITcNILT9ef2KkcMyBBc89GZlMGeHTbgsBHzGeLawX3dXFjqt5aMnHM3VWCovA2aUM4c//rqkZGf+Va86OEFoJQLiSTFpkOrKxcIxcrbKPLTgiDWRT3wzmnUDg7kSPbluzt3ROvMFq9lB8bO/pBd7TD2w87sfUdKLj69FniX6s37SBeRVhw8GSIvBf5lpLUhqL5zKYlbuAWePuz0wVV4NTtkaVKZlmm8KTODyZDFpsyKPubDDcwT1ftRf5aSVM4x04I/1B7GkNz/TOy+zpJ0h0B7VHdxyO5JYiI/1qsatX/FE2aJdQYMYOtqfDH7ZH5UUKIqo538OKvE2M4MlBR/aVE4z4QDKfE/1kYrOfvVGfDzF/FWHfUrcqB8kdQMvk8vCoM8yYZsX4KE1aoJbNM2pWv2tpr9JE8b/VQgUyHOgPYAha+UOmZki4Sfl9H62687EIWdbM57ZxmwIiBp60SrJLiBfZon9JqXKdtJOKj0CRokQiBnONNXCVerLFeBNQfeKRw8tgJXf+QPohMGYkSDdc8hTgdbmhTwB1Vv01stlYK12QMNRCovlp/fcmpB72Phlq+/3p5pqMzknw+qm5QAz7JnpZJCFHit52gHwAkKRkVPB3HF2rfLrdTYz5c9Bok1ICAY9My47eLFdduIe99V52cjMLQuUmNFBPrDdyZKVqIHJ/wtWO/wIFpAVGSJMHctyEKmeJVc1IQN74Wm00PrpPackHdO3G41bBmkp5pqUdsSgSkwdfNVqv0cMcSe04NrRGNKMcZ7TA/CMaP1YnhxvVE+z8aksJqSJ+gdplvuwl40y5C8UEHeAi1V8Q0Bf4YvYRgOVIWm2Lzjdn2z9PWLGcStUj11/1hthk2li4V3mgm2Cr2IZme2sn4rZmJ6dexGP1nk+ZYOq0xLE8F7oex9gyDN+A/6zHqnuhO/X08qye0gochMr8U89Qvj2c0L3P2mjCea2H1mEriAJPqMPMKIinh1lQJEZufnfCcPxbZLKTtl6zHtHgOztejd1gV/nUyCVKD4MCMfBDy9C/Af8pWx6akOg/QSQNIGA2AI6zprHn9zEjpFIzXJYvruVI22Yt6oF9Xnt7Ki82wRK2M96r4kj6cwSs4exMPGv8fWMrFTm0Br6p6T+HZsxyyn2ChuPIgpfisnce/ZaU/0xCZhK/K79+TK2GeeChq5oEpua/1tx4+kDHi7H9381pLJmy2oXW060c2mmwA9+EpcuwEDhr8fsnghbv41u7b1NhEmWNVUy29Dwaz61PPGUdh5DsvaKLWC+raZ/6UEKPw+tiABJ5o6u2jAWgmEYmmJCKapNgtfPc6D+O0aHH9oqh6u4+8NRAhusPZzDGWBr6AT4pexgWFeEhZhn6bXM9HhpUe0IhOTw5D+tqXrTlNon4kjYibiMUFy1h2YyYS3IEdu1J4xqvo0rFyCxF1C+P6ubc0tClRPkXg=="; + + string actualPlain = Utilities.AesUtil.DecryptWithGCM(aesKey: aesKey, nonce: nonce, associatedData: associatedData, cipherText: cipherText); + string expectdPlain = "-----BEGIN CERTIFICATE-----\nMIID3DCCAsSgAwIBAgIUGZNrTcamx3sFSJsQli3v9C6gZe8wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjAwODAxMDczNTE4WhcNMjUwNzMxMDczNTE4WjBuMRgwFgYDVQQDDA9U\nZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl\nbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo\nZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOAYHqxCqaRzoTIvgV\nixaYJJvmvHbiczbx5MQ9XL1ITSFxkTsNsk7RKHnO7eBS5imheJgQwd22Ky+XclSe\n7B4odssu/l/+gHo2gooTYrrCpQrOkpvGMf8R8aI56BQIF+vsomDvVq1NojHV2Fql\njMwFXzhj2EmU6p6gDv9iL7q1NrfnxFx8iJe4OhIB5Ek4qn1xXxrTUhiULd2vXlbI\nXhRetZSNcJsLt5Rw7D7c8F+aX2JchfeqsZECwKW7bSjMbVWWC6M9MgkB/aId8P0y\n7qEiiXFJkfkg1I/E1ud2apopsid5tdCyRRR6+MhhX2EC8S04MN4soUT7haqNNxX2\nrKHnAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc\nMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js\nP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ\nKoZIhvcNAQELBQADggEBAJyg2z4oLQmPfftLQWyzbUc9ONhRMtfA+tVlVBgtLLKn\nWuDlsmEntheM07fu84F4pcfs3yHzjD7pAOFbO4Yt1yhQ50DK35sjbRWepPdWJZLl\nni7KBctcmm0o4zq37oB7vonmBEbFqYs9DaINYOjgI3J25iSBkPVC7dBbvFj2xB0L\ncIcXipq30tDdC/oUem27MNzwZAt49WthKhw6u3HSkcE5cO4LyYTsJhSyG/7LXwvV\nMgX4Jyzo0SSiGOU1/beaZssTVI8sTPJVlHWjhNE3Lc2SaAlKGfGwvt0X3cEZEF+7\noEZIFTkkAF2JhqfnpR3gST0G8Umq1SaVtCPP/zVI8x0=\n-----END CERTIFICATE-----"; + + Assert.Equal(expectdPlain, actualPlain); + } + + [Fact(DisplayName = "从 RSA 证书中提取公钥")] + public void ExportRsaPublicKeyTest() + { + string cerText = "-----BEGIN CERTIFICATE-----\nMIID3DCCAsSgAwIBAgIUGZNrTcamx3sFSJsQli3v9C6gZe8wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjAwODAxMDczNTE4WhcNMjUwNzMxMDczNTE4WjBuMRgwFgYDVQQDDA9U\nZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl\nbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo\nZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOAYHqxCqaRzoTIvgV\nixaYJJvmvHbiczbx5MQ9XL1ITSFxkTsNsk7RKHnO7eBS5imheJgQwd22Ky+XclSe\n7B4odssu/l/+gHo2gooTYrrCpQrOkpvGMf8R8aI56BQIF+vsomDvVq1NojHV2Fql\njMwFXzhj2EmU6p6gDv9iL7q1NrfnxFx8iJe4OhIB5Ek4qn1xXxrTUhiULd2vXlbI\nXhRetZSNcJsLt5Rw7D7c8F+aX2JchfeqsZECwKW7bSjMbVWWC6M9MgkB/aId8P0y\n7qEiiXFJkfkg1I/E1ud2apopsid5tdCyRRR6+MhhX2EC8S04MN4soUT7haqNNxX2\nrKHnAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc\nMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js\nP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ\nKoZIhvcNAQELBQADggEBAJyg2z4oLQmPfftLQWyzbUc9ONhRMtfA+tVlVBgtLLKn\nWuDlsmEntheM07fu84F4pcfs3yHzjD7pAOFbO4Yt1yhQ50DK35sjbRWepPdWJZLl\nni7KBctcmm0o4zq37oB7vonmBEbFqYs9DaINYOjgI3J25iSBkPVC7dBbvFj2xB0L\ncIcXipq30tDdC/oUem27MNzwZAt49WthKhw6u3HSkcE5cO4LyYTsJhSyG/7LXwvV\nMgX4Jyzo0SSiGOU1/beaZssTVI8sTPJVlHWjhNE3Lc2SaAlKGfGwvt0X3cEZEF+7\noEZIFTkkAF2JhqfnpR3gST0G8Umq1SaVtCPP/zVI8x0=\n-----END CERTIFICATE-----"; + + string actualPublicKey = Utilities.RsaUtil.ExportPublicKey(cerText).Replace("\r", "").Replace("\n", ""); + string expectedPublicKey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgGB6sQqmkc6EyL4FYsWmCSb5rx24nM28eTEPVy9SE0hcZE7DbJO0Sh5zu3gUuYpoXiYEMHdtisvl3JUnuweKHbLLv5f/oB6NoKKE2K6wqUKzpKbxjH/EfGiOegUCBfr7KJg71atTaIx1dhapYzMBV84Y9hJlOqeoA7/Yi+6tTa358RcfIiXuDoSAeRJOKp9cV8a01IYlC3dr15WyF4UXrWUjXCbC7eUcOw+3PBfml9iXIX3qrGRAsClu20ozG1VlgujPTIJAf2iHfD9Mu6hIolxSZH5INSPxNbndmqaKbInebXQskUUevjIYV9hAvEtODDeLKFE+4WqjTcV9qyh5wIDAQAB-----END PUBLIC KEY-----"; + + Assert.Equal(expectedPublicKey, actualPublicKey, ignoreLineEndingDifferences: true); + } + + [Fact(DisplayName = "签名生成(SHA256WithRSA)")] + public void SHA256WithRSASignTest() + { + string plainText = "This is raw data string."; + string privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCquCFMOUauok1G\noY5K/mmL5p9x4NrRzQ8iK7u2XbYV8NuwQsJ8MA8rn6ukgcF8qbn98FyqXBYIGaOX\ncIw0el8ZRl8zQynVuyUJE8UF6gAWWVQquMjDJFZ7N8W5g3wCOe21tDtBeNPjTqpl\nPYI6kcBjbxPWxPDd8tlcsWHM+d61OBQq5Qjn7BXhdWd7rG1jiuSDmF45nc6/esVV\nmrDtFESetBsA2chsUXZM3eZCcuh51VajlG597e5imxpM0Kv4/g/qcjJYY7UVeO+Z\nLObnseIFVmYBKk9W/bMdaVEL1T6+v2V7akycEoP2L0gseUQYmArJAMgP+Vx/bdaf\n1ldcxYV1AgMBAAECggEBAIwkgTkYX5ymIXeU0cFgXfZ5iHQsWJUXl4++hOaswPf7\n8+wasZrOvPVbqsRtvA8BKWx7byZuV6uomHGN85p0xjJyYV4siWAps7pi3z7+m7m8\n9OnpLO18m/2kiAzFEfyl3yxlWqtha9dSUXCwcIJx+ZPmsEuC+hPI8oQ0HQvuJtNt\ncDmaFBp57kxjlO4Xm0xnvq2waSmAF4cO6Dk62gksu8G7//IyIHXqmRWSpI2b/Yqf\n84XtwLN8Zvq/3otYuWc3pFOaKHg2sJ/JwSU+yGdeIOtEXXFIDSD6p3KvIvjrD47D\na4optYReXP1k6e721z+XPBFP31i58iu1K8KOyjjJfsECgYEA41D6V1TrON31OOsM\n4jAtqyY/LVNdzT+I/S6lQruO9siRRJDYlAOdbM9VZnW/3rduPMBu4undbMkL5i8o\nlnwmLeWSupClA2WmUc8DWHlBO2s0lE+ZDZgOtpZ9qOBfm7L6jbjvzbGoyJgV6SeI\navH5SMQbFku5rlIi12hAb0Kv4uUCgYEAwELkPOKDH06SFOiuOzJcI4VyjK0V5LcW\njceTPkaT9d1evkrNgrHiG8CjYQ3V0lqSKhckFg2PwmPk72rC4n3aFCXurimv96rG\n5sBFFLgPbyoKZ3Z9JoDoe/6u6YIAV/GzxJ5QJaWQQ59MxToILYyq6aA6SrNOqRUP\nsKuvN8jBH1ECgYEA3dJ6yNgcRj0KfIWa5+qd1iMXiZKNuamjc3WeXTWL+DSW1bMH\nNcElUTYuHzMOjjavw2cBjjsrEWpLS09/qwHxe95IRfi6nksGd1Ss7hw9VM9z2rqm\nH4bf7LuEWlTB171bFQuAL1iL3VvUHdavH7WLTr/XsvUod/y89TlNj4UjACUCgYBB\nR3UPZyl2O8tF5isiVlsKhIj8UtiYK8IwqY7JGlWqqVs96VAWDCflnGbc0UHEhpQS\nToEmK7ygGCLnV6yMEoc1SBvebrEcupOGTcom2sgCypd1wbmElUhasYLaLhXHxn1v\nSQGVhr2Q+EmsvaOBM73kTU79hhwzNL97ERARNMy9wQKBgHCogsDPxSh8hEJR/PBo\nm6v/3R+Ou86K8nzulbyHGkDM7I2R//zGx4en1VxWFhsqywsGedugv1BMkgEcCFkT\njIXfYh9Uwn5iGUAZCczR5ZoETYAAzK2a/uaWf92iZEU0bHJaBA4egNxk1bFe+ECF\nTteN8Ag+UVtx0HU6ZNlyfetH\n-----END PRIVATE KEY-----"; + + string actualSign = Utilities.RsaUtil.SignWithSHA256(privateKey, plainText); + string expectdSign = "R27epmm4+hCNPyArxoXR03S6m1zb/JSbdGJ5d2xQHUs3BIciAUHOm9seOiUwbE5a8DUCBZq8q78krjEi4+j/ImdRUj2L+LYHD5HU0GB/9rQK5yapl/5gP8vAApZRfvL9PN8zvEC2v0exSM9AhIURe6zoet3MwmvzQBiYmcGblQIdS/gPqmmqJKEncHpgq6P08ARk4cUZjUqx5eOeFsruck/XmZwJbghmZdDIp9/norvJ3S/y295ndCd3WrZG3cK46X0SlD4P+Fr8FttzvvepXFRDRnRXkXWWXZDIJk/fADXBuemaCWjqRq5jdQ4+q4jeyqEeZX3GMpQr+byHyFXw1g=="; + + Assert.Equal(expectdSign, actualSign); + } + + [Fact(DisplayName = "签名验证(SHA256WithRSA)")] + public void SHA256WithRSAVerifyTest() + { + string plainText = "1618999027\n24326286f7bc8e8e1e03122a8a77fdbc\n{\"data\":[{\"effective_time\":\"2020-08-01T15:35:18+08:00\",\"encrypt_certificate\":{\"algorithm\":\"AEAD_AES_256_GCM\",\"associated_data\":\"certificate\",\"ciphertext\":\"x9kkL5w1JuaypcjhrYIP+kVNlN8o8uN4yJyJjy5lg+PyPnQL2Zn//ORaXAyzdaK/WBMVd3u/Y9hLaTBLMyRXzowsrkJ5PT37johye48N7BAJQ0PJwW++d1RdhOOPjoqfmws6rSV5Gv2qhfdKjmpxVjr8xr71dtBt8J2wu+bAV99HHQoAynm/Pp9OQYZgpOQ+1cyFHd43TAxOoFfmixKrXr3HP8lJot0XCUSq4qkr1Hs44FV2KuzntSk8eqKr5N17UcuPF3VYnnnF/AvQ7HuLKWwrHhUbaXfkwy0Q2n36UJMfBj7344S97E8BnS89ojgOPQi+olBPyNgrtDWHgsJAKu7HA6PV/FgmXcrZirje/AH1u25es4z5xItHscm//6rDvALgf7greV5OJzMsSl/KVDtbkjDSzim0j4ZTduIfzh7l6jfOz115ITcNILT9ef2KkcMyBBc89GZlMGeHTbgsBHzGeLawX3dXFjqt5aMnHM3VWCovA2aUM4c//rqkZGf+Va86OEFoJQLiSTFpkOrKxcIxcrbKPLTgiDWRT3wzmnUDg7kSPbluzt3ROvMFq9lB8bO/pBd7TD2w87sfUdKLj69FniX6s37SBeRVhw8GSIvBf5lpLUhqL5zKYlbuAWePuz0wVV4NTtkaVKZlmm8KTODyZDFpsyKPubDDcwT1ftRf5aSVM4x04I/1B7GkNz/TOy+zpJ0h0B7VHdxyO5JYiI/1qsatX/FE2aJdQYMYOtqfDH7ZH5UUKIqo538OKvE2M4MlBR/aVE4z4QDKfE/1kYrOfvVGfDzF/FWHfUrcqB8kdQMvk8vCoM8yYZsX4KE1aoJbNM2pWv2tpr9JE8b/VQgUyHOgPYAha+UOmZki4Sfl9H62687EIWdbM57ZxmwIiBp60SrJLiBfZon9JqXKdtJOKj0CRokQiBnONNXCVerLFeBNQfeKRw8tgJXf+QPohMGYkSDdc8hTgdbmhTwB1Vv01stlYK12QMNRCovlp/fcmpB72Phlq+/3p5pqMzknw+qm5QAz7JnpZJCFHit52gHwAkKRkVPB3HF2rfLrdTYz5c9Bok1ICAY9My47eLFdduIe99V52cjMLQuUmNFBPrDdyZKVqIHJ/wtWO/wIFpAVGSJMHctyEKmeJVc1IQN74Wm00PrpPackHdO3G41bBmkp5pqUdsSgSkwdfNVqv0cMcSe04NrRGNKMcZ7TA/CMaP1YnhxvVE+z8aksJqSJ+gdplvuwl40y5C8UEHeAi1V8Q0Bf4YvYRgOVIWm2Lzjdn2z9PWLGcStUj11/1hthk2li4V3mgm2Cr2IZme2sn4rZmJ6dexGP1nk+ZYOq0xLE8F7oex9gyDN+A/6zHqnuhO/X08qye0gochMr8U89Qvj2c0L3P2mjCea2H1mEriAJPqMPMKIinh1lQJEZufnfCcPxbZLKTtl6zHtHgOztejd1gV/nUyCVKD4MCMfBDy9C/Af8pWx6akOg/QSQNIGA2AI6zprHn9zEjpFIzXJYvruVI22Yt6oF9Xnt7Ki82wRK2M96r4kj6cwSs4exMPGv8fWMrFTm0Br6p6T+HZsxyyn2ChuPIgpfisnce/ZaU/0xCZhK/K79+TK2GeeChq5oEpua/1tx4+kDHi7H9381pLJmy2oXW060c2mmwA9+EpcuwEDhr8fsnghbv41u7b1NhEmWNVUy29Dwaz61PPGUdh5DsvaKLWC+raZ/6UEKPw+tiABJ5o6u2jAWgmEYmmJCKapNgtfPc6D+O0aHH9oqh6u4+8NRAhusPZzDGWBr6AT4pexgWFeEhZhn6bXM9HhpUe0IhOTw5D+tqXrTlNon4kjYibiMUFy1h2YyYS3IEdu1J4xqvo0rFyCxF1C+P6ubc0tClRPkXg==\",\"nonce\":\"aae8c2e79c5b\"},\"expire_time\":\"2025-07-31T15:35:18+08:00\",\"serial_no\":\"19936B4DC6A6C77B05489B10962DEFF42EA065EF\"}]}\n"; + string signText = "W9J+0KIextwTJp7GURTFmZoyk0OT/qqmlnPgizInZIJ+Tj7FoxKBY5v5r+Xawe54bOPqb+2O5P7fvWpPTQtMf/lJL8Rvify051xWHJtaGGiyOi4Cffx/Y4p2c8AaSB3J0tBOiVlBu/iUhORnG/lOhlrhjk1/mVAuYvtmA04U0qpoPO3vT8Pp/cqbt+quZhDkrSCqXku+yz9w8P2lVpPqCQjF83dKP6ZoHFlS8BDNm1qey/qmUDO/7U68pSmqquWbpbrruSBVmsYyLDXVd1gKAuXdOoM71kfm1QLrLW2N8fBz98L/AcGGbEFNyBWjQXfjKUHlCoYiukmlA24Vx1RDGw=="; + string publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgGB6sQqmkc6EyL4FYsW\nmCSb5rx24nM28eTEPVy9SE0hcZE7DbJO0Sh5zu3gUuYpoXiYEMHdtisvl3JUnuwe\nKHbLLv5f/oB6NoKKE2K6wqUKzpKbxjH/EfGiOegUCBfr7KJg71atTaIx1dhapYzM\nBV84Y9hJlOqeoA7/Yi+6tTa358RcfIiXuDoSAeRJOKp9cV8a01IYlC3dr15WyF4U\nXrWUjXCbC7eUcOw+3PBfml9iXIX3qrGRAsClu20ozG1VlgujPTIJAf2iHfD9Mu6h\nIolxSZH5INSPxNbndmqaKbInebXQskUUevjIYV9hAvEtODDeLKFE+4WqjTcV9qyh\n5wIDAQAB\n-----END PUBLIC KEY-----"; + string cerText = "-----BEGIN CERTIFICATE-----\nMIID3DCCAsSgAwIBAgIUGZNrTcamx3sFSJsQli3v9C6gZe8wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjAwODAxMDczNTE4WhcNMjUwNzMxMDczNTE4WjBuMRgwFgYDVQQDDA9U\nZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl\nbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo\nZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOAYHqxCqaRzoTIvgV\nixaYJJvmvHbiczbx5MQ9XL1ITSFxkTsNsk7RKHnO7eBS5imheJgQwd22Ky+XclSe\n7B4odssu/l/+gHo2gooTYrrCpQrOkpvGMf8R8aI56BQIF+vsomDvVq1NojHV2Fql\njMwFXzhj2EmU6p6gDv9iL7q1NrfnxFx8iJe4OhIB5Ek4qn1xXxrTUhiULd2vXlbI\nXhRetZSNcJsLt5Rw7D7c8F+aX2JchfeqsZECwKW7bSjMbVWWC6M9MgkB/aId8P0y\n7qEiiXFJkfkg1I/E1ud2apopsid5tdCyRRR6+MhhX2EC8S04MN4soUT7haqNNxX2\nrKHnAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc\nMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js\nP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ\nKoZIhvcNAQELBQADggEBAJyg2z4oLQmPfftLQWyzbUc9ONhRMtfA+tVlVBgtLLKn\nWuDlsmEntheM07fu84F4pcfs3yHzjD7pAOFbO4Yt1yhQ50DK35sjbRWepPdWJZLl\nni7KBctcmm0o4zq37oB7vonmBEbFqYs9DaINYOjgI3J25iSBkPVC7dBbvFj2xB0L\ncIcXipq30tDdC/oUem27MNzwZAt49WthKhw6u3HSkcE5cO4LyYTsJhSyG/7LXwvV\nMgX4Jyzo0SSiGOU1/beaZssTVI8sTPJVlHWjhNE3Lc2SaAlKGfGwvt0X3cEZEF+7\noEZIFTkkAF2JhqfnpR3gST0G8Umq1SaVtCPP/zVI8x0=\n-----END CERTIFICATE-----"; + + Assert.True(Utilities.RsaUtil.VerifyWithSHA256(publicKey, plainText, signText)); + Assert.True(Utilities.RsaUtil.VerifyWithSHA256ByCertificate(cerText, plainText, signText)); + } + + [Fact(DisplayName = "使用 RSA 公钥加密")] + public void RsaEncryptTest() + { + string plainText = "This is raw data string."; + string publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgGB6sQqmkc6EyL4FYsW\nmCSb5rx24nM28eTEPVy9SE0hcZE7DbJO0Sh5zu3gUuYpoXiYEMHdtisvl3JUnuwe\nKHbLLv5f/oB6NoKKE2K6wqUKzpKbxjH/EfGiOegUCBfr7KJg71atTaIx1dhapYzM\nBV84Y9hJlOqeoA7/Yi+6tTa358RcfIiXuDoSAeRJOKp9cV8a01IYlC3dr15WyF4U\nXrWUjXCbC7eUcOw+3PBfml9iXIX3qrGRAsClu20ozG1VlgujPTIJAf2iHfD9Mu6h\nIolxSZH5INSPxNbndmqaKbInebXQskUUevjIYV9hAvEtODDeLKFE+4WqjTcV9qyh\n5wIDAQAB\n-----END PUBLIC KEY-----"; + string cerText = "-----BEGIN CERTIFICATE-----\nMIID3DCCAsSgAwIBAgIUGZNrTcamx3sFSJsQli3v9C6gZe8wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjAwODAxMDczNTE4WhcNMjUwNzMxMDczNTE4WjBuMRgwFgYDVQQDDA9U\nZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl\nbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo\nZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOAYHqxCqaRzoTIvgV\nixaYJJvmvHbiczbx5MQ9XL1ITSFxkTsNsk7RKHnO7eBS5imheJgQwd22Ky+XclSe\n7B4odssu/l/+gHo2gooTYrrCpQrOkpvGMf8R8aI56BQIF+vsomDvVq1NojHV2Fql\njMwFXzhj2EmU6p6gDv9iL7q1NrfnxFx8iJe4OhIB5Ek4qn1xXxrTUhiULd2vXlbI\nXhRetZSNcJsLt5Rw7D7c8F+aX2JchfeqsZECwKW7bSjMbVWWC6M9MgkB/aId8P0y\n7qEiiXFJkfkg1I/E1ud2apopsid5tdCyRRR6+MhhX2EC8S04MN4soUT7haqNNxX2\nrKHnAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc\nMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js\nP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ\nKoZIhvcNAQELBQADggEBAJyg2z4oLQmPfftLQWyzbUc9ONhRMtfA+tVlVBgtLLKn\nWuDlsmEntheM07fu84F4pcfs3yHzjD7pAOFbO4Yt1yhQ50DK35sjbRWepPdWJZLl\nni7KBctcmm0o4zq37oB7vonmBEbFqYs9DaINYOjgI3J25iSBkPVC7dBbvFj2xB0L\ncIcXipq30tDdC/oUem27MNzwZAt49WthKhw6u3HSkcE5cO4LyYTsJhSyG/7LXwvV\nMgX4Jyzo0SSiGOU1/beaZssTVI8sTPJVlHWjhNE3Lc2SaAlKGfGwvt0X3cEZEF+7\noEZIFTkkAF2JhqfnpR3gST0G8Umq1SaVtCPP/zVI8x0=\n-----END CERTIFICATE-----"; + + string actualCipherByPublicKey = Utilities.RsaUtil.EncryptWithECB(publicKey, plainText); + string actualCipherByCertificate = Utilities.RsaUtil.EncryptWithECBByCertificate(cerText, plainText); + + Assert.NotNull(actualCipherByPublicKey); + Assert.NotNull(actualCipherByCertificate); + Assert.NotEqual(actualCipherByPublicKey, actualCipherByCertificate); + } + + [Fact(DisplayName = "使用 RSA 私钥解密")] + public void RsaDecryptTest() + { + string cipherText = "WgG5o+hqLrLXhurIvyohPaWh7bWSkgY55xT7r+xwyhpUxXclWR2Hkxq0FFeDFmsc12XR6B0yqW5e4UHpmXCvAlkVeAQj1bUlxYwFu93AaD5kHi6dmoxG7/IcJiGhtb9iVfnSueJv0zc6ng22IAOqT+bmdF8u6wHW0Grkn+0wS0gSrgJ6FKo/E1wxFDxVhm5eRGzpK8wRAAckXGFA8VYkwWMzKC5YWW2CVCAKdScSQCPAp872R5V5PHia1+8Ahl5FsJPjSKrLtIuGlK+b+j+/TFSUOQ5Fq519cFTJ+srF5NbMgGJHhRhSfxOC3CCMwgEV0f33trJE5f1y04Lt43qgQw=="; + string privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCquCFMOUauok1G\noY5K/mmL5p9x4NrRzQ8iK7u2XbYV8NuwQsJ8MA8rn6ukgcF8qbn98FyqXBYIGaOX\ncIw0el8ZRl8zQynVuyUJE8UF6gAWWVQquMjDJFZ7N8W5g3wCOe21tDtBeNPjTqpl\nPYI6kcBjbxPWxPDd8tlcsWHM+d61OBQq5Qjn7BXhdWd7rG1jiuSDmF45nc6/esVV\nmrDtFESetBsA2chsUXZM3eZCcuh51VajlG597e5imxpM0Kv4/g/qcjJYY7UVeO+Z\nLObnseIFVmYBKk9W/bMdaVEL1T6+v2V7akycEoP2L0gseUQYmArJAMgP+Vx/bdaf\n1ldcxYV1AgMBAAECggEBAIwkgTkYX5ymIXeU0cFgXfZ5iHQsWJUXl4++hOaswPf7\n8+wasZrOvPVbqsRtvA8BKWx7byZuV6uomHGN85p0xjJyYV4siWAps7pi3z7+m7m8\n9OnpLO18m/2kiAzFEfyl3yxlWqtha9dSUXCwcIJx+ZPmsEuC+hPI8oQ0HQvuJtNt\ncDmaFBp57kxjlO4Xm0xnvq2waSmAF4cO6Dk62gksu8G7//IyIHXqmRWSpI2b/Yqf\n84XtwLN8Zvq/3otYuWc3pFOaKHg2sJ/JwSU+yGdeIOtEXXFIDSD6p3KvIvjrD47D\na4optYReXP1k6e721z+XPBFP31i58iu1K8KOyjjJfsECgYEA41D6V1TrON31OOsM\n4jAtqyY/LVNdzT+I/S6lQruO9siRRJDYlAOdbM9VZnW/3rduPMBu4undbMkL5i8o\nlnwmLeWSupClA2WmUc8DWHlBO2s0lE+ZDZgOtpZ9qOBfm7L6jbjvzbGoyJgV6SeI\navH5SMQbFku5rlIi12hAb0Kv4uUCgYEAwELkPOKDH06SFOiuOzJcI4VyjK0V5LcW\njceTPkaT9d1evkrNgrHiG8CjYQ3V0lqSKhckFg2PwmPk72rC4n3aFCXurimv96rG\n5sBFFLgPbyoKZ3Z9JoDoe/6u6YIAV/GzxJ5QJaWQQ59MxToILYyq6aA6SrNOqRUP\nsKuvN8jBH1ECgYEA3dJ6yNgcRj0KfIWa5+qd1iMXiZKNuamjc3WeXTWL+DSW1bMH\nNcElUTYuHzMOjjavw2cBjjsrEWpLS09/qwHxe95IRfi6nksGd1Ss7hw9VM9z2rqm\nH4bf7LuEWlTB171bFQuAL1iL3VvUHdavH7WLTr/XsvUod/y89TlNj4UjACUCgYBB\nR3UPZyl2O8tF5isiVlsKhIj8UtiYK8IwqY7JGlWqqVs96VAWDCflnGbc0UHEhpQS\nToEmK7ygGCLnV6yMEoc1SBvebrEcupOGTcom2sgCypd1wbmElUhasYLaLhXHxn1v\nSQGVhr2Q+EmsvaOBM73kTU79hhwzNL97ERARNMy9wQKBgHCogsDPxSh8hEJR/PBo\nm6v/3R+Ou86K8nzulbyHGkDM7I2R//zGx4en1VxWFhsqywsGedugv1BMkgEcCFkT\njIXfYh9Uwn5iGUAZCczR5ZoETYAAzK2a/uaWf92iZEU0bHJaBA4egNxk1bFe+ECF\nTteN8Ag+UVtx0HU6ZNlyfetH\n-----END PRIVATE KEY-----"; + + string actualPlain = Utilities.RsaUtil.DecryptWithECB(privateKey, cipherText); + string expectdPlain = "This is raw data string."; + + Assert.Equal(expectdPlain, actualPlain); + } + + [Fact(DisplayName = "信息摘要(SHA-256)")] + public void Sha256HashTest() + { + string rawData = "This is raw data string."; + + string actualHash = Utilities.Sha256Util.Hash(rawData); + string expectdHash = "5bd1e86d96a5ec138242ee3c743ea004bc8e215ef8ab72178133a6460034f216"; + + Assert.Equal(expectdHash, actualHash, ignoreCase: true); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/appsettings.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/appsettings.json new file mode 100644 index 00000000..0f56110f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/appsettings.json @@ -0,0 +1,10 @@ +{ + "WechatConfig": { + "AppId": "请在此填写用于测试的微信 AppId", + "MerchantId": "请在此填写用于测试的微信商户号", + "MerchantSecret": "请在此填写用于测试的微信商户 API v3 密钥", + "MerchantCertSerialNumber": "请在此填写用于测试的微信商户 API 证书序列号", + "MerchantCertPrivateKey": "请在此填写用于测试的微信商户 API 私钥(字符串格式)", + "OpenId": "请在此填写用于测试的微信用户唯一标识" + } +} \ No newline at end of file